aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-08-02 13:55:32 -0400
committerDavid S. Miller <davem@davemloft.net>2018-08-02 13:55:32 -0400
commit89b1698c93a9dee043154f33d96bca9964e705f1 (patch)
treedd9dcb1965baae8edcf0b496aaa6a70609b6fc11 /net/rds
parentffd7ce3cd9c294f1ff49ec02cdbd1bc7cb913db6 (diff)
parente30cb13c5a09ff5f043a6570c32e49b063bea6a1 (diff)
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
The BTF conflicts were simple overlapping changes. The virtio_net conflict was an overlap of a fix of statistics counter, happening alongisde a move over to a bonafide statistics structure rather than counting value on the stack. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds')
-rw-r--r--net/rds/ib_frmr.c5
-rw-r--r--net/rds/ib_mr.h3
-rw-r--r--net/rds/ib_rdma.c21
-rw-r--r--net/rds/rdma.c13
-rw-r--r--net/rds/rds.h5
-rw-r--r--net/rds/send.c12
6 files changed, 39 insertions, 20 deletions
diff --git a/net/rds/ib_frmr.c b/net/rds/ib_frmr.c
index 48332a6ed738..d152e48ea371 100644
--- a/net/rds/ib_frmr.c
+++ b/net/rds/ib_frmr.c
@@ -344,6 +344,11 @@ struct rds_ib_mr *rds_ib_reg_frmr(struct rds_ib_device *rds_ibdev,
344 struct rds_ib_frmr *frmr; 344 struct rds_ib_frmr *frmr;
345 int ret; 345 int ret;
346 346
347 if (!ic) {
348 /* TODO: Add FRWR support for RDS_GET_MR using proxy qp*/
349 return ERR_PTR(-EOPNOTSUPP);
350 }
351
347 do { 352 do {
348 if (ibmr) 353 if (ibmr)
349 rds_ib_free_frmr(ibmr, true); 354 rds_ib_free_frmr(ibmr, true);
diff --git a/net/rds/ib_mr.h b/net/rds/ib_mr.h
index f440ace584c8..5da12c248431 100644
--- a/net/rds/ib_mr.h
+++ b/net/rds/ib_mr.h
@@ -117,7 +117,8 @@ void rds6_ib_get_mr_info(struct rds_ib_device *rds_ibdev,
117 struct rds6_info_rdma_connection *iinfo6); 117 struct rds6_info_rdma_connection *iinfo6);
118void rds_ib_destroy_mr_pool(struct rds_ib_mr_pool *); 118void rds_ib_destroy_mr_pool(struct rds_ib_mr_pool *);
119void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents, 119void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
120 struct rds_sock *rs, u32 *key_ret); 120 struct rds_sock *rs, u32 *key_ret,
121 struct rds_connection *conn);
121void rds_ib_sync_mr(void *trans_private, int dir); 122void rds_ib_sync_mr(void *trans_private, int dir);
122void rds_ib_free_mr(void *trans_private, int invalidate); 123void rds_ib_free_mr(void *trans_private, int invalidate);
123void rds_ib_flush_mrs(void); 124void rds_ib_flush_mrs(void);
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c
index 99ccafb90410..63c8d107adcf 100644
--- a/net/rds/ib_rdma.c
+++ b/net/rds/ib_rdma.c
@@ -549,11 +549,12 @@ void rds_ib_flush_mrs(void)
549} 549}
550 550
551void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents, 551void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
552 struct rds_sock *rs, u32 *key_ret) 552 struct rds_sock *rs, u32 *key_ret,
553 struct rds_connection *conn)
553{ 554{
554 struct rds_ib_device *rds_ibdev; 555 struct rds_ib_device *rds_ibdev;
555 struct rds_ib_mr *ibmr = NULL; 556 struct rds_ib_mr *ibmr = NULL;
556 struct rds_ib_connection *ic = rs->rs_conn->c_transport_data; 557 struct rds_ib_connection *ic = NULL;
557 int ret; 558 int ret;
558 559
559 rds_ibdev = rds_ib_get_device(rs->rs_bound_addr.s6_addr32[3]); 560 rds_ibdev = rds_ib_get_device(rs->rs_bound_addr.s6_addr32[3]);
@@ -562,6 +563,9 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
562 goto out; 563 goto out;
563 } 564 }
564 565
566 if (conn)
567 ic = conn->c_transport_data;
568
565 if (!rds_ibdev->mr_8k_pool || !rds_ibdev->mr_1m_pool) { 569 if (!rds_ibdev->mr_8k_pool || !rds_ibdev->mr_1m_pool) {
566 ret = -ENODEV; 570 ret = -ENODEV;
567 goto out; 571 goto out;
@@ -571,17 +575,18 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
571 ibmr = rds_ib_reg_frmr(rds_ibdev, ic, sg, nents, key_ret); 575 ibmr = rds_ib_reg_frmr(rds_ibdev, ic, sg, nents, key_ret);
572 else 576 else
573 ibmr = rds_ib_reg_fmr(rds_ibdev, sg, nents, key_ret); 577 ibmr = rds_ib_reg_fmr(rds_ibdev, sg, nents, key_ret);
574 if (ibmr) 578 if (IS_ERR(ibmr)) {
575 rds_ibdev = NULL; 579 ret = PTR_ERR(ibmr);
576
577 out:
578 if (!ibmr)
579 pr_warn("RDS/IB: rds_ib_get_mr failed (errno=%d)\n", ret); 580 pr_warn("RDS/IB: rds_ib_get_mr failed (errno=%d)\n", ret);
581 } else {
582 return ibmr;
583 }
580 584
585 out:
581 if (rds_ibdev) 586 if (rds_ibdev)
582 rds_ib_dev_put(rds_ibdev); 587 rds_ib_dev_put(rds_ibdev);
583 588
584 return ibmr; 589 return ERR_PTR(ret);
585} 590}
586 591
587void rds_ib_destroy_mr_pool(struct rds_ib_mr_pool *pool) 592void rds_ib_destroy_mr_pool(struct rds_ib_mr_pool *pool)
diff --git a/net/rds/rdma.c b/net/rds/rdma.c
index 7b3998026825..98237feb607a 100644
--- a/net/rds/rdma.c
+++ b/net/rds/rdma.c
@@ -170,7 +170,8 @@ static int rds_pin_pages(unsigned long user_addr, unsigned int nr_pages,
170} 170}
171 171
172static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args, 172static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args,
173 u64 *cookie_ret, struct rds_mr **mr_ret) 173 u64 *cookie_ret, struct rds_mr **mr_ret,
174 struct rds_conn_path *cp)
174{ 175{
175 struct rds_mr *mr = NULL, *found; 176 struct rds_mr *mr = NULL, *found;
176 unsigned int nr_pages; 177 unsigned int nr_pages;
@@ -269,7 +270,8 @@ static int __rds_rdma_map(struct rds_sock *rs, struct rds_get_mr_args *args,
269 * Note that dma_map() implies that pending writes are 270 * Note that dma_map() implies that pending writes are
270 * flushed to RAM, so no dma_sync is needed here. */ 271 * flushed to RAM, so no dma_sync is needed here. */
271 trans_private = rs->rs_transport->get_mr(sg, nents, rs, 272 trans_private = rs->rs_transport->get_mr(sg, nents, rs,
272 &mr->r_key); 273 &mr->r_key,
274 cp ? cp->cp_conn : NULL);
273 275
274 if (IS_ERR(trans_private)) { 276 if (IS_ERR(trans_private)) {
275 for (i = 0 ; i < nents; i++) 277 for (i = 0 ; i < nents; i++)
@@ -330,7 +332,7 @@ int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen)
330 sizeof(struct rds_get_mr_args))) 332 sizeof(struct rds_get_mr_args)))
331 return -EFAULT; 333 return -EFAULT;
332 334
333 return __rds_rdma_map(rs, &args, NULL, NULL); 335 return __rds_rdma_map(rs, &args, NULL, NULL, NULL);
334} 336}
335 337
336int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen) 338int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen)
@@ -354,7 +356,7 @@ int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen)
354 new_args.cookie_addr = args.cookie_addr; 356 new_args.cookie_addr = args.cookie_addr;
355 new_args.flags = args.flags; 357 new_args.flags = args.flags;
356 358
357 return __rds_rdma_map(rs, &new_args, NULL, NULL); 359 return __rds_rdma_map(rs, &new_args, NULL, NULL, NULL);
358} 360}
359 361
360/* 362/*
@@ -782,7 +784,8 @@ int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
782 rm->m_rdma_cookie != 0) 784 rm->m_rdma_cookie != 0)
783 return -EINVAL; 785 return -EINVAL;
784 786
785 return __rds_rdma_map(rs, CMSG_DATA(cmsg), &rm->m_rdma_cookie, &rm->rdma.op_rdma_mr); 787 return __rds_rdma_map(rs, CMSG_DATA(cmsg), &rm->m_rdma_cookie,
788 &rm->rdma.op_rdma_mr, rm->m_conn_path);
786} 789}
787 790
788/* 791/*
diff --git a/net/rds/rds.h b/net/rds/rds.h
index ff537bb11411..c4dcf654d8fe 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -470,6 +470,8 @@ struct rds_message {
470 struct scatterlist *op_sg; 470 struct scatterlist *op_sg;
471 } data; 471 } data;
472 }; 472 };
473
474 struct rds_conn_path *m_conn_path;
473}; 475};
474 476
475/* 477/*
@@ -551,7 +553,8 @@ struct rds_transport {
551 unsigned int avail); 553 unsigned int avail);
552 void (*exit)(void); 554 void (*exit)(void);
553 void *(*get_mr)(struct scatterlist *sg, unsigned long nr_sg, 555 void *(*get_mr)(struct scatterlist *sg, unsigned long nr_sg,
554 struct rds_sock *rs, u32 *key_ret); 556 struct rds_sock *rs, u32 *key_ret,
557 struct rds_connection *conn);
555 void (*sync_mr)(void *trans_private, int direction); 558 void (*sync_mr)(void *trans_private, int direction);
556 void (*free_mr)(void *trans_private, int invalidate); 559 void (*free_mr)(void *trans_private, int invalidate);
557 void (*flush_mrs)(void); 560 void (*flush_mrs)(void);
diff --git a/net/rds/send.c b/net/rds/send.c
index 36a5dba56a43..57b3d5a8b2db 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -1255,6 +1255,13 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
1255 rs->rs_conn = conn; 1255 rs->rs_conn = conn;
1256 } 1256 }
1257 1257
1258 if (conn->c_trans->t_mp_capable)
1259 cpath = &conn->c_path[rds_send_mprds_hash(rs, conn)];
1260 else
1261 cpath = &conn->c_path[0];
1262
1263 rm->m_conn_path = cpath;
1264
1258 /* Parse any control messages the user may have included. */ 1265 /* Parse any control messages the user may have included. */
1259 ret = rds_cmsg_send(rs, rm, msg, &allocated_mr); 1266 ret = rds_cmsg_send(rs, rm, msg, &allocated_mr);
1260 if (ret) { 1267 if (ret) {
@@ -1278,11 +1285,6 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
1278 goto out; 1285 goto out;
1279 } 1286 }
1280 1287
1281 if (conn->c_trans->t_mp_capable)
1282 cpath = &conn->c_path[rds_send_mprds_hash(rs, conn)];
1283 else
1284 cpath = &conn->c_path[0];
1285
1286 if (rds_destroy_pending(conn)) { 1288 if (rds_destroy_pending(conn)) {
1287 ret = -EAGAIN; 1289 ret = -EAGAIN;
1288 goto out; 1290 goto out;