aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorSowmini Varadhan <sowmini.varadhan@oracle.com>2016-06-30 19:11:10 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-01 16:45:17 -0400
commit226f7a7d97e37220a442f52eb85ebff2cd6fc0d2 (patch)
treeab99e16e093ed09df00fd897eb11f3e3315794a7 /net/rds
parentdc9a20020a73e81766f1a6341bcafb7f00b5f92a (diff)
RDS: Rework path specific indirections
Refactor code to avoid separate indirections for single-path and multipath transports. All transports (both single and mp-capable) will get a pointer to the rds_conn_path, and can trivially derive the rds_connection from the ->cp_conn. 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/connection.c5
-rw-r--r--net/rds/ib.c4
-rw-r--r--net/rds/ib.h4
-rw-r--r--net/rds/ib_cm.c3
-rw-r--r--net/rds/ib_send.c3
-rw-r--r--net/rds/loop.c4
-rw-r--r--net/rds/rds.h3
-rw-r--r--net/rds/send.c16
-rw-r--r--net/rds/tcp.c6
-rw-r--r--net/rds/tcp.h6
-rw-r--r--net/rds/tcp_connect.c7
-rw-r--r--net/rds/tcp_send.c8
12 files changed, 29 insertions, 40 deletions
diff --git a/net/rds/connection.c b/net/rds/connection.c
index a4b07c899d89..17c2f2591ac4 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -326,10 +326,7 @@ void rds_conn_shutdown(struct rds_conn_path *cp)
326 wait_event(cp->cp_waitq, 326 wait_event(cp->cp_waitq,
327 !test_bit(RDS_RECV_REFILL, &cp->cp_flags)); 327 !test_bit(RDS_RECV_REFILL, &cp->cp_flags));
328 328
329 if (!conn->c_trans->t_mp_capable) 329 conn->c_trans->conn_path_shutdown(cp);
330 conn->c_trans->conn_shutdown(conn);
331 else
332 conn->c_trans->conn_path_shutdown(cp);
333 rds_conn_path_reset(cp); 330 rds_conn_path_reset(cp);
334 331
335 if (!rds_conn_path_transition(cp, RDS_CONN_DISCONNECTING, 332 if (!rds_conn_path_transition(cp, RDS_CONN_DISCONNECTING,
diff --git a/net/rds/ib.c b/net/rds/ib.c
index 44946a681a8c..1b29ec9445fc 100644
--- a/net/rds/ib.c
+++ b/net/rds/ib.c
@@ -381,7 +381,7 @@ void rds_ib_exit(void)
381 381
382struct rds_transport rds_ib_transport = { 382struct rds_transport rds_ib_transport = {
383 .laddr_check = rds_ib_laddr_check, 383 .laddr_check = rds_ib_laddr_check,
384 .xmit_complete = rds_ib_xmit_complete, 384 .xmit_path_complete = rds_ib_xmit_path_complete,
385 .xmit = rds_ib_xmit, 385 .xmit = rds_ib_xmit,
386 .xmit_rdma = rds_ib_xmit_rdma, 386 .xmit_rdma = rds_ib_xmit_rdma,
387 .xmit_atomic = rds_ib_xmit_atomic, 387 .xmit_atomic = rds_ib_xmit_atomic,
@@ -389,7 +389,7 @@ struct rds_transport rds_ib_transport = {
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_connect = rds_ib_conn_connect,
392 .conn_shutdown = rds_ib_conn_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,
395 .cm_initiate_connect = rds_ib_cm_initiate_connect, 395 .cm_initiate_connect = rds_ib_cm_initiate_connect,
diff --git a/net/rds/ib.h b/net/rds/ib.h
index 627fb79aee65..2051f4bd7a66 100644
--- a/net/rds/ib.h
+++ b/net/rds/ib.h
@@ -329,7 +329,7 @@ extern struct list_head ib_nodev_conns;
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_connect(struct rds_connection *conn);
332void rds_ib_conn_shutdown(struct rds_connection *conn); 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);
335void rds_ib_listen_stop(void); 335void rds_ib_listen_stop(void);
@@ -384,7 +384,7 @@ u32 rds_ib_ring_completed(struct rds_ib_work_ring *ring, u32 wr_id, u32 oldest);
384extern wait_queue_head_t rds_ib_ring_empty_wait; 384extern wait_queue_head_t rds_ib_ring_empty_wait;
385 385
386/* ib_send.c */ 386/* ib_send.c */
387void rds_ib_xmit_complete(struct rds_connection *conn); 387void rds_ib_xmit_path_complete(struct rds_conn_path *cp);
388int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, 388int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm,
389 unsigned int hdr_off, unsigned int sg, unsigned int off); 389 unsigned int hdr_off, unsigned int sg, unsigned int off);
390void rds_ib_send_cqe_handler(struct rds_ib_connection *ic, struct ib_wc *wc); 390void rds_ib_send_cqe_handler(struct rds_ib_connection *ic, struct ib_wc *wc);
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c
index e48bb1ba3dfc..e34ea0b5c16a 100644
--- a/net/rds/ib_cm.c
+++ b/net/rds/ib_cm.c
@@ -731,8 +731,9 @@ out:
731 * so that it can be called at any point during startup. In fact it 731 * so that it can be called at any point during startup. In fact it
732 * can be called multiple times for a given connection. 732 * can be called multiple times for a given connection.
733 */ 733 */
734void rds_ib_conn_shutdown(struct rds_connection *conn) 734void rds_ib_conn_path_shutdown(struct rds_conn_path *cp)
735{ 735{
736 struct rds_connection *conn = cp->cp_conn;
736 struct rds_ib_connection *ic = conn->c_transport_data; 737 struct rds_ib_connection *ic = conn->c_transport_data;
737 int err = 0; 738 int err = 0;
738 739
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c
index 6e4110aa5135..84d90c97332f 100644
--- a/net/rds/ib_send.c
+++ b/net/rds/ib_send.c
@@ -980,8 +980,9 @@ out:
980 return ret; 980 return ret;
981} 981}
982 982
983void rds_ib_xmit_complete(struct rds_connection *conn) 983void rds_ib_xmit_path_complete(struct rds_conn_path *cp)
984{ 984{
985 struct rds_connection *conn = cp->cp_conn;
985 struct rds_ib_connection *ic = conn->c_transport_data; 986 struct rds_ib_connection *ic = conn->c_transport_data;
986 987
987 /* We may have a pending ACK or window update we were unable 988 /* We may have a pending ACK or window update we were unable
diff --git a/net/rds/loop.c b/net/rds/loop.c
index 15f83db78f0c..318c21d7d8d4 100644
--- a/net/rds/loop.c
+++ b/net/rds/loop.c
@@ -156,7 +156,7 @@ static int rds_loop_conn_connect(struct rds_connection *conn)
156 return 0; 156 return 0;
157} 157}
158 158
159static void rds_loop_conn_shutdown(struct rds_connection *conn) 159static void rds_loop_conn_path_shutdown(struct rds_conn_path *cp)
160{ 160{
161} 161}
162 162
@@ -189,7 +189,7 @@ struct rds_transport rds_loop_transport = {
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_connect = rds_loop_conn_connect,
192 .conn_shutdown = rds_loop_conn_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,
195 .t_name = "loopback", 195 .t_name = "loopback",
diff --git a/net/rds/rds.h b/net/rds/rds.h
index 2e35b738176f..5bbad08262f5 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -455,11 +455,8 @@ struct rds_transport {
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_connect)(struct rds_connection *conn);
458 void (*conn_shutdown)(struct rds_connection *conn);
459 void (*conn_path_shutdown)(struct rds_conn_path *conn); 458 void (*conn_path_shutdown)(struct rds_conn_path *conn);
460 void (*xmit_prepare)(struct rds_connection *conn);
461 void (*xmit_path_prepare)(struct rds_conn_path *cp); 459 void (*xmit_path_prepare)(struct rds_conn_path *cp);
462 void (*xmit_complete)(struct rds_connection *conn);
463 void (*xmit_path_complete)(struct rds_conn_path *cp); 460 void (*xmit_path_complete)(struct rds_conn_path *cp);
464 int (*xmit)(struct rds_connection *conn, struct rds_message *rm, 461 int (*xmit)(struct rds_connection *conn, struct rds_message *rm,
465 unsigned int hdr_off, unsigned int sg, unsigned int off); 462 unsigned int hdr_off, unsigned int sg, unsigned int off);
diff --git a/net/rds/send.c b/net/rds/send.c
index ee43d6b2ea8f..5a9caf1da896 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -183,12 +183,8 @@ restart:
183 goto out; 183 goto out;
184 } 184 }
185 185
186 if (conn->c_trans->t_mp_capable) { 186 if (conn->c_trans->xmit_path_prepare)
187 if (conn->c_trans->xmit_path_prepare) 187 conn->c_trans->xmit_path_prepare(cp);
188 conn->c_trans->xmit_path_prepare(cp);
189 } else if (conn->c_trans->xmit_prepare) {
190 conn->c_trans->xmit_prepare(conn);
191 }
192 188
193 /* 189 /*
194 * spin trying to push headers and data down the connection until 190 * spin trying to push headers and data down the connection until
@@ -403,12 +399,8 @@ restart:
403 } 399 }
404 400
405over_batch: 401over_batch:
406 if (conn->c_trans->t_mp_capable) { 402 if (conn->c_trans->xmit_path_complete)
407 if (conn->c_trans->xmit_path_complete) 403 conn->c_trans->xmit_path_complete(cp);
408 conn->c_trans->xmit_path_complete(cp);
409 } else if (conn->c_trans->xmit_complete) {
410 conn->c_trans->xmit_complete(conn);
411 }
412 release_in_xmit(cp); 404 release_in_xmit(cp);
413 405
414 /* Nuke any messages we decided not to retransmit. */ 406 /* Nuke any messages we decided not to retransmit. */
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index 5217d49ce6d6..b139630daaa4 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -340,14 +340,14 @@ static void rds_tcp_exit(void);
340 340
341struct rds_transport rds_tcp_transport = { 341struct rds_transport rds_tcp_transport = {
342 .laddr_check = rds_tcp_laddr_check, 342 .laddr_check = rds_tcp_laddr_check,
343 .xmit_prepare = rds_tcp_xmit_prepare, 343 .xmit_path_prepare = rds_tcp_xmit_path_prepare,
344 .xmit_complete = rds_tcp_xmit_complete, 344 .xmit_path_complete = rds_tcp_xmit_path_complete,
345 .xmit = rds_tcp_xmit, 345 .xmit = rds_tcp_xmit,
346 .recv = rds_tcp_recv, 346 .recv = rds_tcp_recv,
347 .conn_alloc = rds_tcp_conn_alloc, 347 .conn_alloc = rds_tcp_conn_alloc,
348 .conn_free = rds_tcp_conn_free, 348 .conn_free = rds_tcp_conn_free,
349 .conn_connect = rds_tcp_conn_connect, 349 .conn_connect = rds_tcp_conn_connect,
350 .conn_shutdown = rds_tcp_conn_shutdown, 350 .conn_path_shutdown = rds_tcp_conn_path_shutdown,
351 .inc_copy_to_user = rds_tcp_inc_copy_to_user, 351 .inc_copy_to_user = rds_tcp_inc_copy_to_user,
352 .inc_free = rds_tcp_inc_free, 352 .inc_free = rds_tcp_inc_free,
353 .stats_info_copy = rds_tcp_stats_info_copy, 353 .stats_info_copy = rds_tcp_stats_info_copy,
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
index 7940babf6c71..728abe22c9a3 100644
--- a/net/rds/tcp.h
+++ b/net/rds/tcp.h
@@ -61,7 +61,7 @@ void 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_connect(struct rds_connection *conn);
64void rds_tcp_conn_shutdown(struct rds_connection *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
67/* tcp_listen.c */ 67/* tcp_listen.c */
@@ -80,8 +80,8 @@ void rds_tcp_inc_free(struct rds_incoming *inc);
80int rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to); 80int rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to);
81 81
82/* tcp_send.c */ 82/* tcp_send.c */
83void rds_tcp_xmit_prepare(struct rds_connection *conn); 83void rds_tcp_xmit_path_prepare(struct rds_conn_path *cp);
84void rds_tcp_xmit_complete(struct rds_connection *conn); 84void rds_tcp_xmit_path_complete(struct rds_conn_path *cp);
85int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, 85int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
86 unsigned int hdr_off, unsigned int sg, unsigned int off); 86 unsigned int hdr_off, unsigned int sg, unsigned int off);
87void rds_tcp_write_space(struct sock *sk); 87void rds_tcp_write_space(struct sock *sk);
diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c
index 96c2c4d17909..aa65c1631c4b 100644
--- a/net/rds/tcp_connect.c
+++ b/net/rds/tcp_connect.c
@@ -144,12 +144,13 @@ out:
144 * callbacks to those set by TCP. Our callbacks won't execute again once we 144 * callbacks to those set by TCP. Our callbacks won't execute again once we
145 * hold the sock lock. 145 * hold the sock lock.
146 */ 146 */
147void rds_tcp_conn_shutdown(struct rds_connection *conn) 147void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)
148{ 148{
149 struct rds_tcp_connection *tc = conn->c_transport_data; 149 struct rds_tcp_connection *tc = cp->cp_transport_data;
150 struct socket *sock = tc->t_sock; 150 struct socket *sock = tc->t_sock;
151 151
152 rdsdebug("shutting down conn %p tc %p sock %p\n", conn, tc, sock); 152 rdsdebug("shutting down conn %p tc %p sock %p\n",
153 cp->cp_conn, tc, sock);
153 154
154 if (sock) { 155 if (sock) {
155 sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); 156 sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);
diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c
index 710f1aae97ad..52cda947457b 100644
--- a/net/rds/tcp_send.c
+++ b/net/rds/tcp_send.c
@@ -49,16 +49,16 @@ static void rds_tcp_cork(struct socket *sock, int val)
49 set_fs(oldfs); 49 set_fs(oldfs);
50} 50}
51 51
52void rds_tcp_xmit_prepare(struct rds_connection *conn) 52void rds_tcp_xmit_path_prepare(struct rds_conn_path *cp)
53{ 53{
54 struct rds_tcp_connection *tc = conn->c_transport_data; 54 struct rds_tcp_connection *tc = cp->cp_transport_data;
55 55
56 rds_tcp_cork(tc->t_sock, 1); 56 rds_tcp_cork(tc->t_sock, 1);
57} 57}
58 58
59void rds_tcp_xmit_complete(struct rds_connection *conn) 59void rds_tcp_xmit_path_complete(struct rds_conn_path *cp)
60{ 60{
61 struct rds_tcp_connection *tc = conn->c_transport_data; 61 struct rds_tcp_connection *tc = cp->cp_transport_data;
62 62
63 rds_tcp_cork(tc->t_sock, 0); 63 rds_tcp_cork(tc->t_sock, 0);
64} 64}