diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2016-06-30 19:11:10 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-01 16:45:17 -0400 |
commit | 226f7a7d97e37220a442f52eb85ebff2cd6fc0d2 (patch) | |
tree | ab99e16e093ed09df00fd897eb11f3e3315794a7 /net/rds | |
parent | dc9a20020a73e81766f1a6341bcafb7f00b5f92a (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.c | 5 | ||||
-rw-r--r-- | net/rds/ib.c | 4 | ||||
-rw-r--r-- | net/rds/ib.h | 4 | ||||
-rw-r--r-- | net/rds/ib_cm.c | 3 | ||||
-rw-r--r-- | net/rds/ib_send.c | 3 | ||||
-rw-r--r-- | net/rds/loop.c | 4 | ||||
-rw-r--r-- | net/rds/rds.h | 3 | ||||
-rw-r--r-- | net/rds/send.c | 16 | ||||
-rw-r--r-- | net/rds/tcp.c | 6 | ||||
-rw-r--r-- | net/rds/tcp.h | 6 | ||||
-rw-r--r-- | net/rds/tcp_connect.c | 7 | ||||
-rw-r--r-- | net/rds/tcp_send.c | 8 |
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 | ||
382 | struct rds_transport rds_ib_transport = { | 382 | struct 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; | |||
329 | int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp); | 329 | int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp); |
330 | void rds_ib_conn_free(void *arg); | 330 | void rds_ib_conn_free(void *arg); |
331 | int rds_ib_conn_connect(struct rds_connection *conn); | 331 | int rds_ib_conn_connect(struct rds_connection *conn); |
332 | void rds_ib_conn_shutdown(struct rds_connection *conn); | 332 | void rds_ib_conn_path_shutdown(struct rds_conn_path *cp); |
333 | void rds_ib_state_change(struct sock *sk); | 333 | void rds_ib_state_change(struct sock *sk); |
334 | int rds_ib_listen_init(void); | 334 | int rds_ib_listen_init(void); |
335 | void rds_ib_listen_stop(void); | 335 | void 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); | |||
384 | extern wait_queue_head_t rds_ib_ring_empty_wait; | 384 | extern wait_queue_head_t rds_ib_ring_empty_wait; |
385 | 385 | ||
386 | /* ib_send.c */ | 386 | /* ib_send.c */ |
387 | void rds_ib_xmit_complete(struct rds_connection *conn); | 387 | void rds_ib_xmit_path_complete(struct rds_conn_path *cp); |
388 | int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, | 388 | int 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); |
390 | void rds_ib_send_cqe_handler(struct rds_ib_connection *ic, struct ib_wc *wc); | 390 | void 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 | */ |
734 | void rds_ib_conn_shutdown(struct rds_connection *conn) | 734 | void 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 | ||
983 | void rds_ib_xmit_complete(struct rds_connection *conn) | 983 | void 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 | ||
159 | static void rds_loop_conn_shutdown(struct rds_connection *conn) | 159 | static 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 | ||
405 | over_batch: | 401 | over_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 | ||
341 | struct rds_transport rds_tcp_transport = { | 341 | struct 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 */ |
63 | int rds_tcp_conn_connect(struct rds_connection *conn); | 63 | int rds_tcp_conn_connect(struct rds_connection *conn); |
64 | void rds_tcp_conn_shutdown(struct rds_connection *conn); | 64 | void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn); |
65 | void rds_tcp_state_change(struct sock *sk); | 65 | void 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); | |||
80 | int rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to); | 80 | int rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to); |
81 | 81 | ||
82 | /* tcp_send.c */ | 82 | /* tcp_send.c */ |
83 | void rds_tcp_xmit_prepare(struct rds_connection *conn); | 83 | void rds_tcp_xmit_path_prepare(struct rds_conn_path *cp); |
84 | void rds_tcp_xmit_complete(struct rds_connection *conn); | 84 | void rds_tcp_xmit_path_complete(struct rds_conn_path *cp); |
85 | int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, | 85 | int 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); |
87 | void rds_tcp_write_space(struct sock *sk); | 87 | void 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 | */ |
147 | void rds_tcp_conn_shutdown(struct rds_connection *conn) | 147 | void 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 | ||
52 | void rds_tcp_xmit_prepare(struct rds_connection *conn) | 52 | void 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 | ||
59 | void rds_tcp_xmit_complete(struct rds_connection *conn) | 59 | void 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 | } |