OSDN Git Service

RDS: TCP: Hooks to set up a single connection path
authorSowmini Varadhan <sowmini.varadhan@oracle.com>
Thu, 30 Jun 2016 23:11:16 +0000 (16:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Jul 2016 20:45:17 +0000 (16:45 -0400)
This patch adds ->conn_path_connect callbacks in the rds_transport
that are used to set up a single connection path.

Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/rds/ib.c
net/rds/ib.h
net/rds/ib_cm.c
net/rds/loop.c
net/rds/rds.h
net/rds/tcp.c
net/rds/tcp.h
net/rds/tcp_connect.c
net/rds/threads.c

index e6ba856..7eaf887 100644 (file)
@@ -388,7 +388,7 @@ struct rds_transport rds_ib_transport = {
        .recv_path              = rds_ib_recv_path,
        .conn_alloc             = rds_ib_conn_alloc,
        .conn_free              = rds_ib_conn_free,
-       .conn_connect           = rds_ib_conn_connect,
+       .conn_path_connect      = rds_ib_conn_path_connect,
        .conn_path_shutdown     = rds_ib_conn_path_shutdown,
        .inc_copy_to_user       = rds_ib_inc_copy_to_user,
        .inc_free               = rds_ib_inc_free,
index 579de7e..046f750 100644 (file)
@@ -328,7 +328,7 @@ extern struct list_head ib_nodev_conns;
 /* ib_cm.c */
 int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp);
 void rds_ib_conn_free(void *arg);
-int rds_ib_conn_connect(struct rds_connection *conn);
+int rds_ib_conn_path_connect(struct rds_conn_path *cp);
 void rds_ib_conn_path_shutdown(struct rds_conn_path *cp);
 void rds_ib_state_change(struct sock *sk);
 int rds_ib_listen_init(void);
index e34ea0b..5b2ab95 100644 (file)
@@ -685,8 +685,9 @@ out:
        return ret;
 }
 
-int rds_ib_conn_connect(struct rds_connection *conn)
+int rds_ib_conn_path_connect(struct rds_conn_path *cp)
 {
+       struct rds_connection *conn = cp->cp_conn;
        struct rds_ib_connection *ic = conn->c_transport_data;
        struct sockaddr_in src, dest;
        int ret;
index 20284a4..f2bf78d 100644 (file)
@@ -150,9 +150,9 @@ static void rds_loop_conn_free(void *arg)
        kfree(lc);
 }
 
-static int rds_loop_conn_connect(struct rds_connection *conn)
+static int rds_loop_conn_path_connect(struct rds_conn_path *cp)
 {
-       rds_connect_complete(conn);
+       rds_connect_complete(cp->cp_conn);
        return 0;
 }
 
@@ -188,7 +188,7 @@ struct rds_transport rds_loop_transport = {
        .recv_path              = rds_loop_recv_path,
        .conn_alloc             = rds_loop_conn_alloc,
        .conn_free              = rds_loop_conn_free,
-       .conn_connect           = rds_loop_conn_connect,
+       .conn_path_connect      = rds_loop_conn_path_connect,
        .conn_path_shutdown     = rds_loop_conn_path_shutdown,
        .inc_copy_to_user       = rds_message_inc_copy_to_user,
        .inc_free               = rds_loop_inc_free,
index 0faca30..6ef07bd 100644 (file)
@@ -454,7 +454,7 @@ struct rds_transport {
        int (*laddr_check)(struct net *net, __be32 addr);
        int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp);
        void (*conn_free)(void *data);
-       int (*conn_connect)(struct rds_connection *conn);
+       int (*conn_path_connect)(struct rds_conn_path *cp);
        void (*conn_path_shutdown)(struct rds_conn_path *conn);
        void (*xmit_path_prepare)(struct rds_conn_path *cp);
        void (*xmit_path_complete)(struct rds_conn_path *cp);
index 7bc136c..d278432 100644 (file)
@@ -362,7 +362,7 @@ struct rds_transport rds_tcp_transport = {
        .recv_path              = rds_tcp_recv_path,
        .conn_alloc             = rds_tcp_conn_alloc,
        .conn_free              = rds_tcp_conn_free,
-       .conn_connect           = rds_tcp_conn_connect,
+       .conn_path_connect      = rds_tcp_conn_path_connect,
        .conn_path_shutdown     = rds_tcp_conn_path_shutdown,
        .inc_copy_to_user       = rds_tcp_inc_copy_to_user,
        .inc_free               = rds_tcp_inc_free,
index 5a5f91a..1c3160f 100644 (file)
@@ -13,7 +13,7 @@ struct rds_tcp_connection {
        struct list_head        t_tcp_node;
        struct rds_conn_path    *t_cpath;
        /* t_conn_path_lock synchronizes the connection establishment between
-        * rds_tcp_accept_one and rds_tcp_conn_connect
+        * rds_tcp_accept_one and rds_tcp_conn_path_connect
         */
        struct mutex            t_conn_path_lock;
        struct socket           *t_sock;
@@ -60,7 +60,7 @@ extern struct rds_transport rds_tcp_transport;
 void rds_tcp_accept_work(struct sock *sk);
 
 /* tcp_connect.c */
-int rds_tcp_conn_connect(struct rds_connection *conn);
+int rds_tcp_conn_path_connect(struct rds_conn_path *cp);
 void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn);
 void rds_tcp_state_change(struct sock *sk);
 
index 7eddce5..c916715 100644 (file)
@@ -74,17 +74,17 @@ out:
        state_change(sk);
 }
 
-int rds_tcp_conn_connect(struct rds_connection *conn)
+int rds_tcp_conn_path_connect(struct rds_conn_path *cp)
 {
        struct socket *sock = NULL;
        struct sockaddr_in src, dest;
        int ret;
-       struct rds_tcp_connection *tc = conn->c_transport_data;
-       struct rds_conn_path *cp = &conn->c_path[0];
+       struct rds_connection *conn = cp->cp_conn;
+       struct rds_tcp_connection *tc = cp->cp_transport_data;
 
        mutex_lock(&tc->t_conn_path_lock);
 
-       if (rds_conn_up(conn)) {
+       if (rds_conn_path_up(cp)) {
                mutex_unlock(&tc->t_conn_path_lock);
                return 0;
        }
@@ -118,6 +118,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn)
        ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest),
                                 O_NONBLOCK);
 
+       cp->cp_outgoing = 1;
        rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret);
        if (ret == -EINPROGRESS)
                ret = 0;
@@ -125,7 +126,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn)
                rds_tcp_keepalive(sock);
                sock = NULL;
        } else {
-               rds_tcp_restore_callbacks(sock, conn->c_transport_data);
+               rds_tcp_restore_callbacks(sock, cp->cp_transport_data);
        }
 
 out:
index f717b69..e8f0941 100644 (file)
@@ -152,8 +152,9 @@ void rds_connect_worker(struct work_struct *work)
        int ret;
 
        clear_bit(RDS_RECONNECT_PENDING, &cp->cp_flags);
-       if (rds_conn_path_transition(cp, RDS_CONN_DOWN, RDS_CONN_CONNECTING)) {
-               ret = conn->c_trans->conn_connect(conn);
+       ret = rds_conn_path_transition(cp, RDS_CONN_DOWN, RDS_CONN_CONNECTING);
+       if (ret) {
+               ret = conn->c_trans->conn_path_connect(cp);
                rdsdebug("conn %p for %pI4 to %pI4 dispatched, ret %d\n",
                        conn, &conn->c_laddr, &conn->c_faddr, ret);