[rds-devel] [PATCH 01/19] make rds_connection structure aware of net. - Add struct net into conn bucket hash. - Take struct net into accout when performping connection lookup. - Make use of struct net at rds_conn_create()/__rds_conn_create()/rds_conn_create_outgoing(). - Make use of struct net at rds_sendmsg()/tcp_conn_accept_one(). - Use 'NULL of net' for rdma conn creation to let the code can be compiled for now.

Jie Liu jeff.liu at oracle.com
Sun Oct 7 05:14:00 PDT 2012


Signed-off-by: Jie Liu <jeff.liu at oracle.com>
---
 net/rds/connection.c |   35 +++++++++++++++++++++--------------
 net/rds/ib_cm.c      |    6 +++---
 net/rds/iw_cm.c      |    6 +++---
 net/rds/rds.h        |   11 ++++++++---
 net/rds/send.c       |    7 ++++---
 net/rds/tcp_listen.c |    5 +++--
 6 files changed, 42 insertions(+), 28 deletions(-)

diff --git a/net/rds/connection.c b/net/rds/connection.c
index 9e07c75..909ea1f 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -49,10 +49,11 @@ static unsigned long rds_conn_count;
 static struct hlist_head rds_conn_hash[RDS_CONNECTION_HASH_ENTRIES];
 static struct kmem_cache *rds_conn_slab;
 
-static struct hlist_head *rds_conn_bucket(__be32 laddr, __be32 faddr)
+static struct hlist_head *rds_conn_bucket(struct net *net,
+					  __be32 laddr, __be32 faddr)
 {
 	/* Pass NULL, don't need struct net for hash */
-	unsigned long hash = inet_ehashfn(NULL,
+	unsigned long hash = inet_ehashfn(net,
 					  be32_to_cpu(laddr), 0,
 					  be32_to_cpu(faddr), 0);
 	return &rds_conn_hash[hash & RDS_CONNECTION_HASH_MASK];
@@ -65,6 +66,7 @@ static struct hlist_head *rds_conn_bucket(__be32 laddr, __be32 faddr)
 
 /* rcu read lock must be held or the connection spinlock */
 static struct rds_connection *rds_conn_lookup(struct hlist_head *head,
+					      struct net *net,
 					      __be32 laddr, __be32 faddr,
 					      struct rds_transport *trans)
 {
@@ -73,7 +75,7 @@ static struct rds_connection *rds_conn_lookup(struct hlist_head *head,
 
 	hlist_for_each_entry_rcu(conn, pos, head, c_hash_node) {
 		if (conn->c_faddr == faddr && conn->c_laddr == laddr &&
-				conn->c_trans == trans) {
+		    conn->c_trans == trans && conn->net == net) {
 			ret = conn;
 			break;
 		}
@@ -112,18 +114,19 @@ static void rds_conn_reset(struct rds_connection *conn)
  * For now they are not garbage collected once they're created.  They
  * are torn down as the module is removed, if ever.
  */
-static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr,
-				       struct rds_transport *trans, gfp_t gfp,
-				       int is_outgoing)
+static struct rds_connection *__rds_conn_create(struct net *net,
+						__be32 laddr, __be32 faddr,
+						struct rds_transport *trans,
+						gfp_t gfp, int is_outgoing)
 {
 	struct rds_connection *conn, *parent = NULL;
-	struct hlist_head *head = rds_conn_bucket(laddr, faddr);
+	struct hlist_head *head = rds_conn_bucket(net, laddr, faddr);
 	struct rds_transport *loop_trans;
 	unsigned long flags;
 	int ret;
 
 	rcu_read_lock();
-	conn = rds_conn_lookup(head, laddr, faddr, trans);
+	conn = rds_conn_lookup(head, net, laddr, faddr, trans);
 	if (conn && conn->c_loopback && conn->c_trans != &rds_loop_transport &&
 	    !is_outgoing) {
 		/* This is a looped back IB connection, and we're
@@ -143,6 +146,7 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr,
 		goto out;
 	}
 
+	conn->net = net;
 	INIT_HLIST_NODE(&conn->c_hash_node);
 	conn->c_laddr = laddr;
 	conn->c_faddr = faddr;
@@ -224,7 +228,7 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr,
 		/* Creating normal conn */
 		struct rds_connection *found;
 
-		found = rds_conn_lookup(head, laddr, faddr, trans);
+		found = rds_conn_lookup(head, net, laddr, faddr, trans);
 		if (found) {
 			trans->conn_free(conn->c_transport_data);
 			kmem_cache_free(rds_conn_slab, conn);
@@ -241,17 +245,20 @@ out:
 	return conn;
 }
 
-struct rds_connection *rds_conn_create(__be32 laddr, __be32 faddr,
+struct rds_connection *rds_conn_create(struct net *net,
+				       __be32 laddr, __be32 faddr,
 				       struct rds_transport *trans, gfp_t gfp)
 {
-	return __rds_conn_create(laddr, faddr, trans, gfp, 0);
+	return __rds_conn_create(net, laddr, faddr, trans, gfp, 0);
 }
 EXPORT_SYMBOL_GPL(rds_conn_create);
 
-struct rds_connection *rds_conn_create_outgoing(__be32 laddr, __be32 faddr,
-				       struct rds_transport *trans, gfp_t gfp)
+struct rds_connection *rds_conn_create_outgoing(struct net *net,
+						__be32 laddr, __be32 faddr,
+						struct rds_transport *trans,
+						gfp_t gfp)
 {
-	return __rds_conn_create(laddr, faddr, trans, gfp, 1);
+	return __rds_conn_create(net, laddr, faddr, trans, gfp, 1);
 }
 EXPORT_SYMBOL_GPL(rds_conn_create_outgoing);
 
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c
index a1e1162..6327ac6 100644
--- a/net/rds/ib_cm.c
+++ b/net/rds/ib_cm.c
@@ -444,7 +444,7 @@ static u32 rds_ib_protocol_compatible(struct rdma_cm_event *event)
 }
 
 int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
-				    struct rdma_cm_event *event)
+			     struct rdma_cm_event *event)
 {
 	__be64 lguid = cm_id->route.path_rec->sgid.global.interface_id;
 	__be64 fguid = cm_id->route.path_rec->dgid.global.interface_id;
@@ -467,8 +467,8 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
 		 (unsigned long long)be64_to_cpu(lguid),
 		 (unsigned long long)be64_to_cpu(fguid));
 
-	conn = rds_conn_create(dp->dp_daddr, dp->dp_saddr, &rds_ib_transport,
-			       GFP_KERNEL);
+	conn = rds_conn_create(NULL, dp->dp_daddr, dp->dp_saddr,
+			       &rds_ib_transport, GFP_KERNEL);
 	if (IS_ERR(conn)) {
 		rdsdebug("rds_conn_create failed (%ld)\n", PTR_ERR(conn));
 		conn = NULL;
diff --git a/net/rds/iw_cm.c b/net/rds/iw_cm.c
index a91e1db..77ded4e 100644
--- a/net/rds/iw_cm.c
+++ b/net/rds/iw_cm.c
@@ -375,7 +375,7 @@ static u32 rds_iw_protocol_compatible(const struct rds_iw_connect_private *dp)
 }
 
 int rds_iw_cm_handle_connect(struct rdma_cm_id *cm_id,
-				    struct rdma_cm_event *event)
+			     struct rdma_cm_event *event)
 {
 	const struct rds_iw_connect_private *dp = event->param.conn.private_data;
 	struct rds_iw_connect_private dp_rep;
@@ -395,8 +395,8 @@ int rds_iw_cm_handle_connect(struct rdma_cm_id *cm_id,
 		 &dp->dp_saddr, &dp->dp_daddr,
 		 RDS_PROTOCOL_MAJOR(version), RDS_PROTOCOL_MINOR(version));
 
-	conn = rds_conn_create(dp->dp_daddr, dp->dp_saddr, &rds_iw_transport,
-			       GFP_KERNEL);
+	conn = rds_conn_create(NULL, dp->dp_daddr, dp->dp_saddr,
+			       &rds_iw_transport, GFP_KERNEL);
 	if (IS_ERR(conn)) {
 		rdsdebug("rds_conn_create failed (%ld)\n", PTR_ERR(conn));
 		conn = NULL;
diff --git a/net/rds/rds.h b/net/rds/rds.h
index ec1d731..9c839d0 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -2,6 +2,7 @@
 #define _RDS_RDS_H
 
 #include <net/sock.h>
+#include <net/net_namespace.h>
 #include <linux/scatterlist.h>
 #include <linux/highmem.h>
 #include <rdma/rdma_cm.h>
@@ -82,6 +83,7 @@ enum {
 #define RDS_IN_XMIT		2
 
 struct rds_connection {
+	struct net		*net;
 	struct hlist_node	c_hash_node;
 	__be32			c_laddr;
 	__be32			c_faddr;
@@ -612,10 +614,13 @@ struct rds_message *rds_cong_update_alloc(struct rds_connection *conn);
 /* conn.c */
 int rds_conn_init(void);
 void rds_conn_exit(void);
-struct rds_connection *rds_conn_create(__be32 laddr, __be32 faddr,
+struct rds_connection *rds_conn_create(struct net *net,
+				       __be32 laddr, __be32 faddr,
 				       struct rds_transport *trans, gfp_t gfp);
-struct rds_connection *rds_conn_create_outgoing(__be32 laddr, __be32 faddr,
-			       struct rds_transport *trans, gfp_t gfp);
+struct rds_connection *rds_conn_create_outgoing(struct net *net,
+						__be32 laddr, __be32 faddr,
+						struct rds_transport *trans,
+						gfp_t gfp);
 void rds_conn_shutdown(struct rds_connection *conn);
 void rds_conn_destroy(struct rds_connection *conn);
 void rds_conn_drop(struct rds_connection *conn);
diff --git a/net/rds/send.c b/net/rds/send.c
index 96531d4..11852e1 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -921,6 +921,7 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
 		size_t payload_len)
 {
 	struct sock *sk = sock->sk;
+	struct net *net = sock_net(sk);
 	struct rds_sock *rs = rds_sk_to_rs(sk);
 	struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name;
 	__be32 daddr;
@@ -992,9 +993,9 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
 	if (rs->rs_conn && rs->rs_conn->c_faddr == daddr)
 		conn = rs->rs_conn;
 	else {
-		conn = rds_conn_create_outgoing(rs->rs_bound_addr, daddr,
-					rs->rs_transport,
-					sock->sk->sk_allocation);
+		conn = rds_conn_create_outgoing(net, rs->rs_bound_addr,
+						daddr, rs->rs_transport,
+						sock->sk->sk_allocation);
 		if (IS_ERR(conn)) {
 			ret = PTR_ERR(conn);
 			goto out;
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
index 7298137..31d3a0d 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -47,10 +47,11 @@ static struct socket *rds_tcp_listen_sock;
 
 static int rds_tcp_accept_one(struct socket *sock)
 {
+	struct net *net = sock_net(sock->sk);
 	struct socket *new_sock = NULL;
 	struct rds_connection *conn;
-	int ret;
 	struct inet_sock *inet;
+	int ret;
 
 	ret = sock_create_lite(sock->sk->sk_family, sock->sk->sk_type,
 			       sock->sk->sk_protocol, &new_sock);
@@ -71,7 +72,7 @@ static int rds_tcp_accept_one(struct socket *sock)
 		 &inet->inet_saddr, ntohs(inet->inet_sport),
 		 &inet->inet_daddr, ntohs(inet->inet_dport));
 
-	conn = rds_conn_create(inet->inet_saddr, inet->inet_daddr,
+	conn = rds_conn_create(net, inet->inet_saddr, inet->inet_daddr,
 			       &rds_tcp_transport, GFP_KERNEL);
 	if (IS_ERR(conn)) {
 		ret = PTR_ERR(conn);
-- 
1.7.4.1




More information about the rds-devel mailing list