aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorSowmini Varadhan <sowmini.varadhan@oracle.com>2016-06-30 19:11:15 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-01 16:45:17 -0400
commit2da43c4a1b517d02e71d9611a2242273e7d399ba (patch)
tree107b08d6a7d188a41fcf2b2559d2be33ed8bf978 /net/rds
parentea3b1ea53930879c9847044f5cb9c97411cae797 (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.c2
-rw-r--r--net/rds/ib.h2
-rw-r--r--net/rds/ib_recv.c3
-rw-r--r--net/rds/loop.c4
-rw-r--r--net/rds/rds.h2
-rw-r--r--net/rds/tcp.c2
-rw-r--r--net/rds/tcp.h2
-rw-r--r--net/rds/tcp_recv.c29
-rw-r--r--net/rds/threads.c2
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 */
355int rds_ib_recv_init(void); 355int rds_ib_recv_init(void);
356void rds_ib_recv_exit(void); 356void rds_ib_recv_exit(void);
357int rds_ib_recv(struct rds_connection *conn); 357int rds_ib_recv_path(struct rds_conn_path *conn);
358int rds_ib_recv_alloc_caches(struct rds_ib_connection *ic); 358int rds_ib_recv_alloc_caches(struct rds_ib_connection *ic);
359void rds_ib_recv_free_caches(struct rds_ib_connection *ic); 359void rds_ib_recv_free_caches(struct rds_ib_connection *ic);
360void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp); 360void 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
1012int rds_ib_recv(struct rds_connection *conn) 1012int 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 */
105static int rds_loop_recv(struct rds_connection *conn) 105static 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 */
186struct rds_transport rds_loop_transport = { 186struct 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);
75int rds_tcp_recv_init(void); 75int rds_tcp_recv_init(void);
76void rds_tcp_recv_exit(void); 76void rds_tcp_recv_exit(void);
77void rds_tcp_data_ready(struct sock *sk); 77void rds_tcp_data_ready(struct sock *sk);
78int rds_tcp_recv(struct rds_connection *conn); 78int rds_tcp_recv_path(struct rds_conn_path *cp);
79void rds_tcp_inc_free(struct rds_incoming *inc); 79void 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
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
150struct rds_tcp_desc_arg { 149struct 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 */
254static int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp) 256static 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 */
282int rds_tcp_recv(struct rds_connection *conn) 284int 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);
318out: 321out:
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: