[rds-devel] [PATCH 15/19] Make RDS over TCP statstics really works.

Jie Liu jeff.liu at oracle.com
Sun Oct 7 05:18:07 PDT 2012


- Teach stats_info_copy aware of struct net.
- Teach rds_tcp_stats_inc macro aware of struct net.

Signed-off-by: Jie Liu <jeff.liu at oracle.com>
---
 net/rds/rds.h        |    3 ++-
 net/rds/tcp.h        |    7 ++++---
 net/rds/tcp_listen.c |    4 ++--
 net/rds/tcp_recv.c   |    3 ++-
 net/rds/tcp_send.c   |    7 +++++--
 net/rds/tcp_stats.c  |    3 ++-
 net/rds/transport.c  |    2 +-
 7 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/net/rds/rds.h b/net/rds/rds.h
index f282b7e..a106a0d 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -448,7 +448,8 @@ struct rds_transport {
 	void (*cm_connect_complete)(struct rds_connection *conn,
 				    struct rdma_cm_event *event);
 
-	unsigned int (*stats_info_copy)(struct rds_info_iterator *iter,
+	unsigned int (*stats_info_copy)(struct net *net,
+					struct rds_info_iterator *iter,
 					unsigned int avail);
 	void (*exit)(struct net *net);
 	void *(*get_mr)(struct scatterlist *sg, unsigned long nr_sg,
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
index fee5ef6..68eb685 100644
--- a/net/rds/tcp.h
+++ b/net/rds/tcp.h
@@ -80,9 +80,10 @@ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
 void rds_tcp_write_space(struct sock *sk);
 
 /* tcp_stats.c */
-DECLARE_PER_CPU(struct rds_tcp_statistics, rds_tcp_stats);
-#define rds_tcp_stats_inc(member) rds_stats_inc_which(rds_tcp_stats, member)
-unsigned int rds_tcp_stats_info_copy(struct rds_info_iterator *iter,
+#define rds_tcp_stats_inc(net, member) \
+	rds_stats_inc_which((*(net->rds.rds_tcp_stats)), member)
+unsigned int rds_tcp_stats_info_copy(struct net *net,
+				     struct rds_info_iterator *iter,
 				     unsigned int avail);
 
 #endif
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
index 31d3a0d..1e94ca4 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -84,9 +84,9 @@ static int rds_tcp_accept_one(struct socket *sock)
 	 */
 	if (!rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_CONNECTING)) {
 		if (rds_conn_state(conn) == RDS_CONN_UP)
-			rds_tcp_stats_inc(s_tcp_listen_closed_stale);
+			rds_tcp_stats_inc(net, s_tcp_listen_closed_stale);
 		else
-			rds_tcp_stats_inc(s_tcp_connect_raced);
+			rds_tcp_stats_inc(net, s_tcp_connect_raced);
 		rds_conn_drop(conn);
 		ret = 0;
 		goto out;
diff --git a/net/rds/tcp_recv.c b/net/rds/tcp_recv.c
index 641ab5d..fbf073f 100644
--- a/net/rds/tcp_recv.c
+++ b/net/rds/tcp_recv.c
@@ -319,6 +319,7 @@ int rds_tcp_recv(struct rds_connection *conn)
 
 void rds_tcp_data_ready(struct sock *sk, int bytes)
 {
+	struct net *net = sock_net(sk);
 	void (*ready)(struct sock *sk, int bytes);
 	struct rds_connection *conn;
 	struct rds_tcp_connection *tc;
@@ -334,7 +335,7 @@ void rds_tcp_data_ready(struct sock *sk, int bytes)
 
 	tc = conn->c_transport_data;
 	ready = tc->t_orig_data_ready;
-	rds_tcp_stats_inc(s_tcp_data_ready_calls);
+	rds_tcp_stats_inc(net, s_tcp_data_ready_calls);
 
 	if (rds_tcp_read_sock(conn, GFP_ATOMIC) == -ENOMEM)
 		queue_delayed_work(rds_wq, &conn->c_recv_w, 0);
diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c
index 1b4fd68..85c7b72 100644
--- a/net/rds/tcp_send.c
+++ b/net/rds/tcp_send.c
@@ -140,7 +140,9 @@ out:
 	if (ret <= 0) {
 		/* write_space will hit after EAGAIN, all else fatal */
 		if (ret == -EAGAIN) {
-			rds_tcp_stats_inc(s_tcp_sndbuf_full);
+			struct net *net = rds_conn_to_net(conn);
+
+			rds_tcp_stats_inc(net, s_tcp_sndbuf_full);
 			ret = 0;
 		} else {
 			printk(KERN_WARNING "RDS/tcp: send to %pI4 "
@@ -170,6 +172,7 @@ static int rds_tcp_is_acked(struct rds_message *rm, uint64_t ack)
 
 void rds_tcp_write_space(struct sock *sk)
 {
+	struct net *net = sock_net(sk);
 	void (*write_space)(struct sock *sk);
 	struct rds_connection *conn;
 	struct rds_tcp_connection *tc;
@@ -184,7 +187,7 @@ void rds_tcp_write_space(struct sock *sk)
 	tc = conn->c_transport_data;
 	rdsdebug("write_space for tc %p\n", tc);
 	write_space = tc->t_orig_write_space;
-	rds_tcp_stats_inc(s_tcp_write_space_calls);
+	rds_tcp_stats_inc(net, s_tcp_write_space_calls);
 
 	rdsdebug("tcp una %u\n", rds_tcp_snd_una(tc));
 	tc->t_last_seen_una = rds_tcp_snd_una(tc);
diff --git a/net/rds/tcp_stats.c b/net/rds/tcp_stats.c
index f8a7954..09a3fc0 100644
--- a/net/rds/tcp_stats.c
+++ b/net/rds/tcp_stats.c
@@ -48,7 +48,8 @@ static const char * const rds_tcp_stat_names[] = {
 	"tcp_listen_closed_stale",
 };
 
-unsigned int rds_tcp_stats_info_copy(struct rds_info_iterator *iter,
+unsigned int rds_tcp_stats_info_copy(struct net *net,
+				     struct rds_info_iterator *iter,
 				     unsigned int avail)
 {
 	struct rds_tcp_statistics stats = {0, };
diff --git a/net/rds/transport.c b/net/rds/transport.c
index 28dd771..af1dfad 100644
--- a/net/rds/transport.c
+++ b/net/rds/transport.c
@@ -126,7 +126,7 @@ unsigned int rds_trans_stats_info_copy(struct net *net,
 		if (!trans || !trans->stats_info_copy)
 			continue;
 
-		part = trans->stats_info_copy(iter, avail);
+		part = trans->stats_info_copy(net, iter, avail);
 		avail -= min(avail, part);
 		total += part;
 	}
-- 
1.7.4.1




More information about the rds-devel mailing list