aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorSowmini Varadhan <sowmini.varadhan@oracle.com>2016-06-30 19:11:16 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-01 16:45:17 -0400
commitb04e8554f7637999af8f54cca4dcfcf49f2ae7c8 (patch)
treeff29f60508fe2d0ee6b10b7f0c66d317288b9308 /net/rds
parent2da43c4a1b517d02e71d9611a2242273e7d399ba (diff)
RDS: TCP: Hooks to set up a single connection path
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>
Diffstat (limited to 'net/rds')
-rw-r--r--net/rds/ib.c2
-rw-r--r--net/rds/ib.h2
-rw-r--r--net/rds/ib_cm.c3
-rw-r--r--net/rds/loop.c6
-rw-r--r--net/rds/rds.h2
-rw-r--r--net/rds/tcp.c2
-rw-r--r--net/rds/tcp.h4
-rw-r--r--net/rds/tcp_connect.c11
-rw-r--r--net/rds/threads.c5
9 files changed, 20 insertions, 17 deletions
diff --git a/net/rds/ib.c b/net/rds/ib.c
index e6ba85671004..7eaf887e46f8 100644
--- a/net/rds/ib.c
+++ b/net/rds/ib.c
@@ -388,7 +388,7 @@ struct rds_transport rds_ib_transport = {
388 .recv_path = rds_ib_recv_path, 388 .recv_path = rds_ib_recv_path,
389 .conn_alloc = rds_ib_conn_alloc, 389 .conn_alloc = rds_ib_conn_alloc,
390 .conn_free = rds_ib_conn_free, 390 .conn_free = rds_ib_conn_free,
391 .conn_connect = rds_ib_conn_connect, 391 .conn_path_connect = rds_ib_conn_path_connect,
392 .conn_path_shutdown = rds_ib_conn_path_shutdown, 392 .conn_path_shutdown = rds_ib_conn_path_shutdown,
393 .inc_copy_to_user = rds_ib_inc_copy_to_user, 393 .inc_copy_to_user = rds_ib_inc_copy_to_user,
394 .inc_free = rds_ib_inc_free, 394 .inc_free = rds_ib_inc_free,
diff --git a/net/rds/ib.h b/net/rds/ib.h
index 579de7e6369c..046f7508c06b 100644
--- a/net/rds/ib.h
+++ b/net/rds/ib.h
@@ -328,7 +328,7 @@ extern struct list_head ib_nodev_conns;
328/* ib_cm.c */ 328/* ib_cm.c */
329int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp); 329int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp);
330void rds_ib_conn_free(void *arg); 330void rds_ib_conn_free(void *arg);
331int rds_ib_conn_connect(struct rds_connection *conn); 331int rds_ib_conn_path_connect(struct rds_conn_path *cp);
332void rds_ib_conn_path_shutdown(struct rds_conn_path *cp); 332void rds_ib_conn_path_shutdown(struct rds_conn_path *cp);
333void rds_ib_state_change(struct sock *sk); 333void rds_ib_state_change(struct sock *sk);
334int rds_ib_listen_init(void); 334int rds_ib_listen_init(void);
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c
index e34ea0b5c16a..5b2ab95afa07 100644
--- a/net/rds/ib_cm.c
+++ b/net/rds/ib_cm.c
@@ -685,8 +685,9 @@ out:
685 return ret; 685 return ret;
686} 686}
687 687
688int rds_ib_conn_connect(struct rds_connection *conn) 688int rds_ib_conn_path_connect(struct rds_conn_path *cp)
689{ 689{
690 struct rds_connection *conn = cp->cp_conn;
690 struct rds_ib_connection *ic = conn->c_transport_data; 691 struct rds_ib_connection *ic = conn->c_transport_data;
691 struct sockaddr_in src, dest; 692 struct sockaddr_in src, dest;
692 int ret; 693 int ret;
diff --git a/net/rds/loop.c b/net/rds/loop.c
index 20284a4dca91..f2bf78de5688 100644
--- a/net/rds/loop.c
+++ b/net/rds/loop.c
@@ -150,9 +150,9 @@ static void rds_loop_conn_free(void *arg)
150 kfree(lc); 150 kfree(lc);
151} 151}
152 152
153static int rds_loop_conn_connect(struct rds_connection *conn) 153static int rds_loop_conn_path_connect(struct rds_conn_path *cp)
154{ 154{
155 rds_connect_complete(conn); 155 rds_connect_complete(cp->cp_conn);
156 return 0; 156 return 0;
157} 157}
158 158
@@ -188,7 +188,7 @@ struct rds_transport rds_loop_transport = {
188 .recv_path = rds_loop_recv_path, 188 .recv_path = rds_loop_recv_path,
189 .conn_alloc = rds_loop_conn_alloc, 189 .conn_alloc = rds_loop_conn_alloc,
190 .conn_free = rds_loop_conn_free, 190 .conn_free = rds_loop_conn_free,
191 .conn_connect = rds_loop_conn_connect, 191 .conn_path_connect = rds_loop_conn_path_connect,
192 .conn_path_shutdown = rds_loop_conn_path_shutdown, 192 .conn_path_shutdown = rds_loop_conn_path_shutdown,
193 .inc_copy_to_user = rds_message_inc_copy_to_user, 193 .inc_copy_to_user = rds_message_inc_copy_to_user,
194 .inc_free = rds_loop_inc_free, 194 .inc_free = rds_loop_inc_free,
diff --git a/net/rds/rds.h b/net/rds/rds.h
index 0faca3011370..6ef07bd27227 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -454,7 +454,7 @@ struct rds_transport {
454 int (*laddr_check)(struct net *net, __be32 addr); 454 int (*laddr_check)(struct net *net, __be32 addr);
455 int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp); 455 int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp);
456 void (*conn_free)(void *data); 456 void (*conn_free)(void *data);
457 int (*conn_connect)(struct rds_connection *conn); 457 int (*conn_path_connect)(struct rds_conn_path *cp);
458 void (*conn_path_shutdown)(struct rds_conn_path *conn); 458 void (*conn_path_shutdown)(struct rds_conn_path *conn);
459 void (*xmit_path_prepare)(struct rds_conn_path *cp); 459 void (*xmit_path_prepare)(struct rds_conn_path *cp);
460 void (*xmit_path_complete)(struct rds_conn_path *cp); 460 void (*xmit_path_complete)(struct rds_conn_path *cp);
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index 7bc136c66dbe..d278432f080b 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -362,7 +362,7 @@ struct rds_transport rds_tcp_transport = {
362 .recv_path = rds_tcp_recv_path, 362 .recv_path = rds_tcp_recv_path,
363 .conn_alloc = rds_tcp_conn_alloc, 363 .conn_alloc = rds_tcp_conn_alloc,
364 .conn_free = rds_tcp_conn_free, 364 .conn_free = rds_tcp_conn_free,
365 .conn_connect = rds_tcp_conn_connect, 365 .conn_path_connect = rds_tcp_conn_path_connect,
366 .conn_path_shutdown = rds_tcp_conn_path_shutdown, 366 .conn_path_shutdown = rds_tcp_conn_path_shutdown,
367 .inc_copy_to_user = rds_tcp_inc_copy_to_user, 367 .inc_copy_to_user = rds_tcp_inc_copy_to_user,
368 .inc_free = rds_tcp_inc_free, 368 .inc_free = rds_tcp_inc_free,
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
index 5a5f91abe1de..1c3160faa963 100644
--- a/net/rds/tcp.h
+++ b/net/rds/tcp.h
@@ -13,7 +13,7 @@ struct rds_tcp_connection {
13 struct list_head t_tcp_node; 13 struct list_head t_tcp_node;
14 struct rds_conn_path *t_cpath; 14 struct rds_conn_path *t_cpath;
15 /* t_conn_path_lock synchronizes the connection establishment between 15 /* t_conn_path_lock synchronizes the connection establishment between
16 * rds_tcp_accept_one and rds_tcp_conn_connect 16 * rds_tcp_accept_one and rds_tcp_conn_path_connect
17 */ 17 */
18 struct mutex t_conn_path_lock; 18 struct mutex t_conn_path_lock;
19 struct socket *t_sock; 19 struct socket *t_sock;
@@ -60,7 +60,7 @@ extern struct rds_transport rds_tcp_transport;
60void rds_tcp_accept_work(struct sock *sk); 60void rds_tcp_accept_work(struct sock *sk);
61 61
62/* tcp_connect.c */ 62/* tcp_connect.c */
63int rds_tcp_conn_connect(struct rds_connection *conn); 63int rds_tcp_conn_path_connect(struct rds_conn_path *cp);
64void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn); 64void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn);
65void rds_tcp_state_change(struct sock *sk); 65void rds_tcp_state_change(struct sock *sk);
66 66
diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c
index 7eddce50e7a3..c916715fbe61 100644
--- a/net/rds/tcp_connect.c
+++ b/net/rds/tcp_connect.c
@@ -74,17 +74,17 @@ out:
74 state_change(sk); 74 state_change(sk);
75} 75}
76 76
77int rds_tcp_conn_connect(struct rds_connection *conn) 77int rds_tcp_conn_path_connect(struct rds_conn_path *cp)
78{ 78{
79 struct socket *sock = NULL; 79 struct socket *sock = NULL;
80 struct sockaddr_in src, dest; 80 struct sockaddr_in src, dest;
81 int ret; 81 int ret;
82 struct rds_tcp_connection *tc = conn->c_transport_data; 82 struct rds_connection *conn = cp->cp_conn;
83 struct rds_conn_path *cp = &conn->c_path[0]; 83 struct rds_tcp_connection *tc = cp->cp_transport_data;
84 84
85 mutex_lock(&tc->t_conn_path_lock); 85 mutex_lock(&tc->t_conn_path_lock);
86 86
87 if (rds_conn_up(conn)) { 87 if (rds_conn_path_up(cp)) {
88 mutex_unlock(&tc->t_conn_path_lock); 88 mutex_unlock(&tc->t_conn_path_lock);
89 return 0; 89 return 0;
90 } 90 }
@@ -118,6 +118,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn)
118 ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), 118 ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest),
119 O_NONBLOCK); 119 O_NONBLOCK);
120 120
121 cp->cp_outgoing = 1;
121 rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret); 122 rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret);
122 if (ret == -EINPROGRESS) 123 if (ret == -EINPROGRESS)
123 ret = 0; 124 ret = 0;
@@ -125,7 +126,7 @@ int rds_tcp_conn_connect(struct rds_connection *conn)
125 rds_tcp_keepalive(sock); 126 rds_tcp_keepalive(sock);
126 sock = NULL; 127 sock = NULL;
127 } else { 128 } else {
128 rds_tcp_restore_callbacks(sock, conn->c_transport_data); 129 rds_tcp_restore_callbacks(sock, cp->cp_transport_data);
129 } 130 }
130 131
131out: 132out:
diff --git a/net/rds/threads.c b/net/rds/threads.c
index f717b69e03f9..e8f0941f0548 100644
--- a/net/rds/threads.c
+++ b/net/rds/threads.c
@@ -152,8 +152,9 @@ void rds_connect_worker(struct work_struct *work)
152 int ret; 152 int ret;
153 153
154 clear_bit(RDS_RECONNECT_PENDING, &cp->cp_flags); 154 clear_bit(RDS_RECONNECT_PENDING, &cp->cp_flags);
155 if (rds_conn_path_transition(cp, RDS_CONN_DOWN, RDS_CONN_CONNECTING)) { 155 ret = rds_conn_path_transition(cp, RDS_CONN_DOWN, RDS_CONN_CONNECTING);
156 ret = conn->c_trans->conn_connect(conn); 156 if (ret) {
157 ret = conn->c_trans->conn_path_connect(cp);
157 rdsdebug("conn %p for %pI4 to %pI4 dispatched, ret %d\n", 158 rdsdebug("conn %p for %pI4 to %pI4 dispatched, ret %d\n",
158 conn, &conn->c_laddr, &conn->c_faddr, ret); 159 conn, &conn->c_laddr, &conn->c_faddr, ret);
159 160