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 | } |
