diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2016-06-30 19:11:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-01 16:45:17 -0400 |
commit | 2da43c4a1b517d02e71d9611a2242273e7d399ba (patch) | |
tree | 107b08d6a7d188a41fcf2b2559d2be33ed8bf978 /net/rds | |
parent | ea3b1ea53930879c9847044f5cb9c97411cae797 (diff) |
RDS: TCP: make receive path use the rds_conn_path
The ->sk_user_data contains a pointer to the rds_conn_path
for the socket. Use this consistently in the rds_tcp_data_ready
callbacks to get the rds_conn_path for rds_recv_incoming.
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_recv.c | 3 | ||||
-rw-r--r-- | net/rds/loop.c | 4 | ||||
-rw-r--r-- | net/rds/rds.h | 2 | ||||
-rw-r--r-- | net/rds/tcp.c | 2 | ||||
-rw-r--r-- | net/rds/tcp.h | 2 | ||||
-rw-r--r-- | net/rds/tcp_recv.c | 29 | ||||
-rw-r--r-- | net/rds/threads.c | 2 |
9 files changed, 26 insertions, 22 deletions
diff --git a/net/rds/ib.c b/net/rds/ib.c index 1b29ec9445fc..e6ba85671004 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c | |||
@@ -385,7 +385,7 @@ struct rds_transport rds_ib_transport = { | |||
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, |
388 | .recv = rds_ib_recv, | 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_connect = rds_ib_conn_connect, |
diff --git a/net/rds/ib.h b/net/rds/ib.h index 2051f4bd7a66..579de7e6369c 100644 --- a/net/rds/ib.h +++ b/net/rds/ib.h | |||
@@ -354,7 +354,7 @@ void rds_ib_mr_cqe_handler(struct rds_ib_connection *ic, struct ib_wc *wc); | |||
354 | /* ib_recv.c */ | 354 | /* ib_recv.c */ |
355 | int rds_ib_recv_init(void); | 355 | int rds_ib_recv_init(void); |
356 | void rds_ib_recv_exit(void); | 356 | void rds_ib_recv_exit(void); |
357 | int rds_ib_recv(struct rds_connection *conn); | 357 | int rds_ib_recv_path(struct rds_conn_path *conn); |
358 | int rds_ib_recv_alloc_caches(struct rds_ib_connection *ic); | 358 | int rds_ib_recv_alloc_caches(struct rds_ib_connection *ic); |
359 | void rds_ib_recv_free_caches(struct rds_ib_connection *ic); | 359 | void rds_ib_recv_free_caches(struct rds_ib_connection *ic); |
360 | void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp); | 360 | void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp); |
diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c index 4ea8cb17cc7a..606a11f681d2 100644 --- a/net/rds/ib_recv.c +++ b/net/rds/ib_recv.c | |||
@@ -1009,8 +1009,9 @@ void rds_ib_recv_cqe_handler(struct rds_ib_connection *ic, | |||
1009 | rds_ib_recv_refill(conn, 0, GFP_NOWAIT); | 1009 | rds_ib_recv_refill(conn, 0, GFP_NOWAIT); |
1010 | } | 1010 | } |
1011 | 1011 | ||
1012 | int rds_ib_recv(struct rds_connection *conn) | 1012 | int rds_ib_recv_path(struct rds_conn_path *cp) |
1013 | { | 1013 | { |
1014 | struct rds_connection *conn = cp->cp_conn; | ||
1014 | struct rds_ib_connection *ic = conn->c_transport_data; | 1015 | struct rds_ib_connection *ic = conn->c_transport_data; |
1015 | int ret = 0; | 1016 | int ret = 0; |
1016 | 1017 | ||
diff --git a/net/rds/loop.c b/net/rds/loop.c index 318c21d7d8d4..20284a4dca91 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c | |||
@@ -102,7 +102,7 @@ static void rds_loop_inc_free(struct rds_incoming *inc) | |||
102 | } | 102 | } |
103 | 103 | ||
104 | /* we need to at least give the thread something to succeed */ | 104 | /* we need to at least give the thread something to succeed */ |
105 | static int rds_loop_recv(struct rds_connection *conn) | 105 | static int rds_loop_recv_path(struct rds_conn_path *cp) |
106 | { | 106 | { |
107 | return 0; | 107 | return 0; |
108 | } | 108 | } |
@@ -185,7 +185,7 @@ void rds_loop_exit(void) | |||
185 | */ | 185 | */ |
186 | struct rds_transport rds_loop_transport = { | 186 | struct rds_transport rds_loop_transport = { |
187 | .xmit = rds_loop_xmit, | 187 | .xmit = rds_loop_xmit, |
188 | .recv = rds_loop_recv, | 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_connect = rds_loop_conn_connect, |
diff --git a/net/rds/rds.h b/net/rds/rds.h index 5bbad08262f5..0faca3011370 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h | |||
@@ -462,7 +462,7 @@ struct rds_transport { | |||
462 | unsigned int hdr_off, unsigned int sg, unsigned int off); | 462 | unsigned int hdr_off, unsigned int sg, unsigned int off); |
463 | int (*xmit_rdma)(struct rds_connection *conn, struct rm_rdma_op *op); | 463 | int (*xmit_rdma)(struct rds_connection *conn, struct rm_rdma_op *op); |
464 | int (*xmit_atomic)(struct rds_connection *conn, struct rm_atomic_op *op); | 464 | int (*xmit_atomic)(struct rds_connection *conn, struct rm_atomic_op *op); |
465 | int (*recv)(struct rds_connection *conn); | 465 | int (*recv_path)(struct rds_conn_path *cp); |
466 | int (*inc_copy_to_user)(struct rds_incoming *inc, struct iov_iter *to); | 466 | int (*inc_copy_to_user)(struct rds_incoming *inc, struct iov_iter *to); |
467 | void (*inc_free)(struct rds_incoming *inc); | 467 | void (*inc_free)(struct rds_incoming *inc); |
468 | 468 | ||
diff --git a/net/rds/tcp.c b/net/rds/tcp.c index 5658f3e9f601..7bc136c66dbe 100644 --- a/net/rds/tcp.c +++ b/net/rds/tcp.c | |||
@@ -359,7 +359,7 @@ struct rds_transport rds_tcp_transport = { | |||
359 | .xmit_path_prepare = rds_tcp_xmit_path_prepare, | 359 | .xmit_path_prepare = rds_tcp_xmit_path_prepare, |
360 | .xmit_path_complete = rds_tcp_xmit_path_complete, | 360 | .xmit_path_complete = rds_tcp_xmit_path_complete, |
361 | .xmit = rds_tcp_xmit, | 361 | .xmit = rds_tcp_xmit, |
362 | .recv = rds_tcp_recv, | 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_connect = rds_tcp_conn_connect, |
diff --git a/net/rds/tcp.h b/net/rds/tcp.h index 151b09d1af43..5a5f91abe1de 100644 --- a/net/rds/tcp.h +++ b/net/rds/tcp.h | |||
@@ -75,7 +75,7 @@ int rds_tcp_keepalive(struct socket *sock); | |||
75 | int rds_tcp_recv_init(void); | 75 | int rds_tcp_recv_init(void); |
76 | void rds_tcp_recv_exit(void); | 76 | void rds_tcp_recv_exit(void); |
77 | void rds_tcp_data_ready(struct sock *sk); | 77 | void rds_tcp_data_ready(struct sock *sk); |
78 | int rds_tcp_recv(struct rds_connection *conn); | 78 | int rds_tcp_recv_path(struct rds_conn_path *cp); |
79 | void rds_tcp_inc_free(struct rds_incoming *inc); | 79 | 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 | ||
diff --git a/net/rds/tcp_recv.c b/net/rds/tcp_recv.c index aa7a79a00ef7..ad4892e97f91 100644 --- a/net/rds/tcp_recv.c +++ b/net/rds/tcp_recv.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <net/tcp.h> | 35 | #include <net/tcp.h> |
36 | 36 | ||
37 | #include "rds_single_path.h" | ||
38 | #include "rds.h" | 37 | #include "rds.h" |
39 | #include "tcp.h" | 38 | #include "tcp.h" |
40 | 39 | ||
@@ -148,7 +147,7 @@ static void rds_tcp_cong_recv(struct rds_connection *conn, | |||
148 | } | 147 | } |
149 | 148 | ||
150 | struct rds_tcp_desc_arg { | 149 | struct rds_tcp_desc_arg { |
151 | struct rds_connection *conn; | 150 | struct rds_conn_path *conn_path; |
152 | gfp_t gfp; | 151 | gfp_t gfp; |
153 | }; | 152 | }; |
154 | 153 | ||
@@ -156,8 +155,8 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb, | |||
156 | unsigned int offset, size_t len) | 155 | unsigned int offset, size_t len) |
157 | { | 156 | { |
158 | struct rds_tcp_desc_arg *arg = desc->arg.data; | 157 | struct rds_tcp_desc_arg *arg = desc->arg.data; |
159 | struct rds_connection *conn = arg->conn; | 158 | struct rds_conn_path *cp = arg->conn_path; |
160 | struct rds_tcp_connection *tc = conn->c_transport_data; | 159 | struct rds_tcp_connection *tc = cp->cp_transport_data; |
161 | struct rds_tcp_incoming *tinc = tc->t_tinc; | 160 | struct rds_tcp_incoming *tinc = tc->t_tinc; |
162 | struct sk_buff *clone; | 161 | struct sk_buff *clone; |
163 | size_t left = len, to_copy; | 162 | size_t left = len, to_copy; |
@@ -179,7 +178,8 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb, | |||
179 | } | 178 | } |
180 | tc->t_tinc = tinc; | 179 | tc->t_tinc = tinc; |
181 | rdsdebug("alloced tinc %p\n", tinc); | 180 | rdsdebug("alloced tinc %p\n", tinc); |
182 | rds_inc_init(&tinc->ti_inc, conn, conn->c_faddr); | 181 | rds_inc_path_init(&tinc->ti_inc, cp, |
182 | cp->cp_conn->c_faddr); | ||
183 | /* | 183 | /* |
184 | * XXX * we might be able to use the __ variants when | 184 | * XXX * we might be able to use the __ variants when |
185 | * we've already serialized at a higher level. | 185 | * we've already serialized at a higher level. |
@@ -229,6 +229,8 @@ static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb, | |||
229 | } | 229 | } |
230 | 230 | ||
231 | if (tc->t_tinc_hdr_rem == 0 && tc->t_tinc_data_rem == 0) { | 231 | if (tc->t_tinc_hdr_rem == 0 && tc->t_tinc_data_rem == 0) { |
232 | struct rds_connection *conn = cp->cp_conn; | ||
233 | |||
232 | if (tinc->ti_inc.i_hdr.h_flags == RDS_FLAG_CONG_BITMAP) | 234 | if (tinc->ti_inc.i_hdr.h_flags == RDS_FLAG_CONG_BITMAP) |
233 | rds_tcp_cong_recv(conn, tinc); | 235 | rds_tcp_cong_recv(conn, tinc); |
234 | else | 236 | else |
@@ -251,15 +253,15 @@ out: | |||
251 | } | 253 | } |
252 | 254 | ||
253 | /* the caller has to hold the sock lock */ | 255 | /* the caller has to hold the sock lock */ |
254 | static int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp) | 256 | static int rds_tcp_read_sock(struct rds_conn_path *cp, gfp_t gfp) |
255 | { | 257 | { |
256 | struct rds_tcp_connection *tc = conn->c_transport_data; | 258 | struct rds_tcp_connection *tc = cp->cp_transport_data; |
257 | struct socket *sock = tc->t_sock; | 259 | struct socket *sock = tc->t_sock; |
258 | read_descriptor_t desc; | 260 | read_descriptor_t desc; |
259 | struct rds_tcp_desc_arg arg; | 261 | struct rds_tcp_desc_arg arg; |
260 | 262 | ||
261 | /* It's like glib in the kernel! */ | 263 | /* It's like glib in the kernel! */ |
262 | arg.conn = conn; | 264 | arg.conn_path = cp; |
263 | arg.gfp = gfp; | 265 | arg.gfp = gfp; |
264 | desc.arg.data = &arg; | 266 | desc.arg.data = &arg; |
265 | desc.error = 0; | 267 | desc.error = 0; |
@@ -279,16 +281,17 @@ static int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp) | |||
279 | * if we fail to allocate we're in trouble.. blindly wait some time before | 281 | * if we fail to allocate we're in trouble.. blindly wait some time before |
280 | * trying again to see if the VM can free up something for us. | 282 | * trying again to see if the VM can free up something for us. |
281 | */ | 283 | */ |
282 | int rds_tcp_recv(struct rds_connection *conn) | 284 | int rds_tcp_recv_path(struct rds_conn_path *cp) |
283 | { | 285 | { |
284 | struct rds_tcp_connection *tc = conn->c_transport_data; | 286 | struct rds_tcp_connection *tc = cp->cp_transport_data; |
285 | struct socket *sock = tc->t_sock; | 287 | struct socket *sock = tc->t_sock; |
286 | int ret = 0; | 288 | int ret = 0; |
287 | 289 | ||
288 | rdsdebug("recv worker conn %p tc %p sock %p\n", conn, tc, sock); | 290 | rdsdebug("recv worker path [%d] tc %p sock %p\n", |
291 | cp->cp_index, tc, sock); | ||
289 | 292 | ||
290 | lock_sock(sock->sk); | 293 | lock_sock(sock->sk); |
291 | ret = rds_tcp_read_sock(conn, GFP_KERNEL); | 294 | ret = rds_tcp_read_sock(cp, GFP_KERNEL); |
292 | release_sock(sock->sk); | 295 | release_sock(sock->sk); |
293 | 296 | ||
294 | return ret; | 297 | return ret; |
@@ -313,7 +316,7 @@ void rds_tcp_data_ready(struct sock *sk) | |||
313 | ready = tc->t_orig_data_ready; | 316 | ready = tc->t_orig_data_ready; |
314 | rds_tcp_stats_inc(s_tcp_data_ready_calls); | 317 | rds_tcp_stats_inc(s_tcp_data_ready_calls); |
315 | 318 | ||
316 | if (rds_tcp_read_sock(cp->cp_conn, GFP_ATOMIC) == -ENOMEM) | 319 | if (rds_tcp_read_sock(cp, GFP_ATOMIC) == -ENOMEM) |
317 | queue_delayed_work(rds_wq, &cp->cp_recv_w, 0); | 320 | queue_delayed_work(rds_wq, &cp->cp_recv_w, 0); |
318 | out: | 321 | out: |
319 | read_unlock_bh(&sk->sk_callback_lock); | 322 | read_unlock_bh(&sk->sk_callback_lock); |
diff --git a/net/rds/threads.c b/net/rds/threads.c index 9fbe95bb14a9..f717b69e03f9 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c | |||
@@ -203,7 +203,7 @@ void rds_recv_worker(struct work_struct *work) | |||
203 | int ret; | 203 | int ret; |
204 | 204 | ||
205 | if (rds_conn_path_state(cp) == RDS_CONN_UP) { | 205 | if (rds_conn_path_state(cp) == RDS_CONN_UP) { |
206 | ret = cp->cp_conn->c_trans->recv(cp->cp_conn); | 206 | ret = cp->cp_conn->c_trans->recv_path(cp); |
207 | rdsdebug("conn %p ret %d\n", cp->cp_conn, ret); | 207 | rdsdebug("conn %p ret %d\n", cp->cp_conn, ret); |
208 | switch (ret) { | 208 | switch (ret) { |
209 | case -EAGAIN: | 209 | case -EAGAIN: |