diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2016-06-30 19:11:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-01 16:45:17 -0400 |
commit | b04e8554f7637999af8f54cca4dcfcf49f2ae7c8 (patch) | |
tree | ff29f60508fe2d0ee6b10b7f0c66d317288b9308 /net/rds | |
parent | 2da43c4a1b517d02e71d9611a2242273e7d399ba (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.c | 2 | ||||
-rw-r--r-- | net/rds/ib.h | 2 | ||||
-rw-r--r-- | net/rds/ib_cm.c | 3 | ||||
-rw-r--r-- | net/rds/loop.c | 6 | ||||
-rw-r--r-- | net/rds/rds.h | 2 | ||||
-rw-r--r-- | net/rds/tcp.c | 2 | ||||
-rw-r--r-- | net/rds/tcp.h | 4 | ||||
-rw-r--r-- | net/rds/tcp_connect.c | 11 | ||||
-rw-r--r-- | net/rds/threads.c | 5 |
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 */ |
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_path_connect(struct rds_conn_path *cp); |
332 | void rds_ib_conn_path_shutdown(struct rds_conn_path *cp); | 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); |
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 | ||
688 | int rds_ib_conn_connect(struct rds_connection *conn) | 688 | int 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 | ||
153 | static int rds_loop_conn_connect(struct rds_connection *conn) | 153 | static 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; | |||
60 | void rds_tcp_accept_work(struct sock *sk); | 60 | 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_path_connect(struct rds_conn_path *cp); |
64 | void rds_tcp_conn_path_shutdown(struct rds_conn_path *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 | ||
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 | ||
77 | int rds_tcp_conn_connect(struct rds_connection *conn) | 77 | int 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 | ||
131 | out: | 132 | out: |
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 | ||