[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