|
@@ -945,6 +945,11 @@ static int rds_cmsg_send(struct rds_sock *rs, struct rds_message *rm,
|
|
|
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:
|
|
@@ -1082,8 +1087,12 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
|
|
|
|
|
|
/* 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",
|