| From foo@baz Tue Nov 28 10:58:31 CET 2017 |
| From: Santosh Shilimkar <santosh.shilimkar@oracle.com> |
| Date: Mon, 4 Jul 2016 17:04:37 -0700 |
| Subject: RDS: RDMA: return appropriate error on rdma map failures |
| |
| From: Santosh Shilimkar <santosh.shilimkar@oracle.com> |
| |
| |
| [ Upstream commit 584a8279a44a800dea5a5c1e9d53a002e03016b4 ] |
| |
| The first message to a remote node should prompt a new |
| connection even if it is RDMA operation. For RDMA operation |
| the MR mapping can fail because connections is not yet up. |
| |
| Since the connection establishment is asynchronous, |
| we make sure the map failure because of unavailable |
| connection reach to the user by appropriate error code. |
| Before returning to the user, lets trigger the connection |
| so that its ready for the next retry. |
| |
| Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/rds/send.c | 11 ++++++++++- |
| 1 file changed, 10 insertions(+), 1 deletion(-) |
| |
| --- a/net/rds/send.c |
| +++ b/net/rds/send.c |
| @@ -903,6 +903,11 @@ static int rds_cmsg_send(struct rds_sock |
| ret = rds_cmsg_rdma_map(rs, rm, cmsg); |
| if (!ret) |
| *allocated_mr = 1; |
| + else if (ret == -ENODEV) |
| + /* Accommodate the get_mr() case which can fail |
| + * if connection isn't established yet. |
| + */ |
| + ret = -EAGAIN; |
| break; |
| case RDS_CMSG_ATOMIC_CSWP: |
| case RDS_CMSG_ATOMIC_FADD: |
| @@ -1011,8 +1016,12 @@ int rds_sendmsg(struct kiocb *iocb, stru |
| |
| /* Parse any control messages the user may have included. */ |
| ret = rds_cmsg_send(rs, rm, msg, &allocated_mr); |
| - if (ret) |
| + if (ret) { |
| + /* Trigger connection so that its ready for the next retry */ |
| + if (ret == -EAGAIN) |
| + rds_conn_connect_if_down(conn); |
| goto out; |
| + } |
| |
| if (rm->rdma.op_active && !conn->c_trans->xmit_rdma) { |
| printk_ratelimited(KERN_NOTICE "rdma_op %p conn xmit_rdma %p\n", |