Skip to content

Commit 2072b67

Browse files
kcp-gitjfvogel
authored andcommitted
net/rds: Refactor sendmsg ancillary data processing
Add a process_send_cmsg() to struct rds_transport for transport specific sendmsg ancillary data processing. This separates ancillary data processing for each transport for better error handling. Orabug: 31979196 Signed-off-by: Ka-Cheong Poon <ka-cheong.poon@oracle.com> Tested-by: Gerald Gibson <gerald.gibson@oracle.com> Acked-by: Håkon Bugge <haakon.bugge@oracle.com> Reviewed-by: Hans Westgaard Ry <hans.westgaard.ry@oracle.com>
1 parent 1aa3e52 commit 2072b67

File tree

4 files changed

+96
-84
lines changed

4 files changed

+96
-84
lines changed

net/rds/ib.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,8 @@ struct rds_transport rds_ib_transport = {
13421342
.free_mr = rds_ib_free_mr,
13431343
.flush_mrs = rds_ib_flush_mrs,
13441344
.sock_release = rds_rdma_sock_release,
1345+
.process_send_cmsg = rds_rdma_process_send_cmsg,
1346+
13451347
.t_owner = THIS_MODULE,
13461348
.t_name = "infiniband",
13471349
.t_type = RDS_TRANS_IB,

net/rds/rdma.c

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -550,8 +550,8 @@ int rds_rdma_extra_size(struct rds_rdma_args *args)
550550
* The application asks for a RDMA transfer.
551551
* Extract all arguments and set up the rdma_op
552552
*/
553-
int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
554-
struct cmsghdr *cmsg)
553+
static int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
554+
struct cmsghdr *cmsg)
555555
{
556556
struct rds_rdma_args *args;
557557
struct rds_iovec vec;
@@ -705,8 +705,8 @@ int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
705705
* The application wants us to pass an RDMA destination (aka MR)
706706
* to the remote
707707
*/
708-
int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm,
709-
struct cmsghdr *cmsg)
708+
static int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm,
709+
struct cmsghdr *cmsg)
710710
{
711711
unsigned long flags;
712712
struct rds_mr *mr;
@@ -761,8 +761,8 @@ static void dec_rdma_map_pending(struct rds_conn_path *cp)
761761
* in rm->m_rdma_cookie. This causes it to be sent along to the peer
762762
* in an extension header.
763763
*/
764-
int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
765-
struct cmsghdr *cmsg)
764+
static int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
765+
struct cmsghdr *cmsg)
766766
{
767767
int ret;
768768
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct rds_get_mr_args))
@@ -788,8 +788,8 @@ int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
788788
/*
789789
* Fill in rds_message for an atomic request.
790790
*/
791-
int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm,
792-
struct cmsghdr *cmsg)
791+
static int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm,
792+
struct cmsghdr *cmsg)
793793
{
794794
struct page *page = NULL;
795795
struct rds_atomic_args *args;
@@ -861,3 +861,68 @@ int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm,
861861

862862
return ret;
863863
}
864+
865+
static int rds_cmsg_asend(struct rds_sock *rs, struct rds_message *rm,
866+
struct cmsghdr *cmsg)
867+
{
868+
struct rds_asend_args *args;
869+
870+
if (!rds_async_send_enabled)
871+
return -EINVAL;
872+
873+
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct rds_asend_args)))
874+
return -EINVAL;
875+
876+
args = CMSG_DATA(cmsg);
877+
rm->data.op_notifier = kzalloc(sizeof(*rm->data.op_notifier),
878+
GFP_KERNEL);
879+
if (!rm->data.op_notifier)
880+
return -ENOMEM;
881+
882+
rm->data.op_notify = !!(args->flags & RDS_SEND_NOTIFY_ME);
883+
rm->data.op_notifier->n_user_token = args->user_token;
884+
rm->data.op_notifier->n_status = RDS_RDMA_SEND_SUCCESS;
885+
rm->data.op_async = 1;
886+
887+
return 0;
888+
}
889+
890+
int rds_rdma_process_send_cmsg(struct rds_sock *rs, struct rds_message *rm,
891+
struct cmsghdr *cmsg)
892+
{
893+
int ret;
894+
895+
switch (cmsg->cmsg_type) {
896+
case RDS_CMSG_RDMA_ARGS:
897+
ret = rds_cmsg_rdma_args(rs, rm, cmsg);
898+
break;
899+
900+
case RDS_CMSG_RDMA_DEST:
901+
ret = rds_cmsg_rdma_dest(rs, rm, cmsg);
902+
break;
903+
904+
case RDS_CMSG_RDMA_MAP:
905+
ret = rds_cmsg_rdma_map(rs, rm, cmsg);
906+
if (ret == -ENODEV)
907+
/* Accommodate the get_mr() case which can fail
908+
* if connection isn't established yet.
909+
*/
910+
ret = -EAGAIN;
911+
break;
912+
case RDS_CMSG_ATOMIC_CSWP:
913+
case RDS_CMSG_ATOMIC_FADD:
914+
ret = rds_cmsg_atomic(rs, rm, cmsg);
915+
break;
916+
917+
case RDS_CMSG_ASYNC_SEND:
918+
ret = rds_cmsg_asend(rs, rm, cmsg);
919+
break;
920+
921+
default:
922+
ret = -EINVAL;
923+
break;
924+
}
925+
926+
return ret;
927+
}
928+
EXPORT_SYMBOL_GPL(rds_rdma_process_send_cmsg);

net/rds/rds.h

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,8 @@ struct rds_transport {
775775
void (*check_migration)(struct rds_connection *conn,
776776
struct rdma_cm_event *event);
777777
void (*sock_release)(struct rds_sock *rs);
778+
int (*process_send_cmsg)(struct rds_sock *rs, struct rds_message *rm,
779+
struct cmsghdr *cmsg);
778780

779781
atomic64_t rds_avg_conn_jf;
780782
};
@@ -1283,21 +1285,14 @@ int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen);
12831285
int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen);
12841286
void rds_rdma_drop_keys(struct rds_sock *rs);
12851287
int rds_rdma_extra_size(struct rds_rdma_args *args);
1286-
int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
1287-
struct cmsghdr *cmsg);
1288-
int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm,
1289-
struct cmsghdr *cmsg);
1290-
int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
1291-
struct cmsghdr *cmsg);
1292-
int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
1293-
struct cmsghdr *cmsg);
1288+
1289+
int rds_rdma_process_send_cmsg(struct rds_sock *rs, struct rds_message *rm,
1290+
struct cmsghdr *cmsg);
12941291
void rds_rdma_free_op(struct rm_rdma_op *ro);
12951292
void rds_atomic_free_op(struct rm_atomic_op *ao);
12961293
void rds_rdma_send_complete(struct rds_message *rm, int wc_status);
12971294
void rds_atomic_send_complete(struct rds_message *rm, int wc_status);
12981295
void rds_asend_complete(struct rds_message *rm, int wc_status);
1299-
int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm,
1300-
struct cmsghdr *cmsg);
13011296

13021297
void __rds_put_mr_final(struct kref *kref);
13031298

net/rds/send.c

Lines changed: 16 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,32 +1149,8 @@ static int rds_rm_size(struct msghdr *msg, int data_len)
11491149
return size;
11501150
}
11511151

1152-
static int rds_cmsg_asend(struct rds_sock *rs, struct rds_message *rm,
1153-
struct cmsghdr *cmsg)
1154-
{
1155-
struct rds_asend_args *args;
1156-
1157-
if (!rds_async_send_enabled)
1158-
return -EINVAL;
1159-
1160-
if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct rds_asend_args)))
1161-
return -EINVAL;
1162-
1163-
args = CMSG_DATA(cmsg);
1164-
rm->data.op_notifier = kzalloc(sizeof(*rm->data.op_notifier), GFP_KERNEL);
1165-
if (!rm->data.op_notifier)
1166-
return -ENOMEM;
1167-
1168-
rm->data.op_notify = !!(args->flags & RDS_SEND_NOTIFY_ME);
1169-
rm->data.op_notifier->n_user_token = args->user_token;
1170-
rm->data.op_notifier->n_status = RDS_RDMA_SEND_SUCCESS;
1171-
rm->data.op_async = 1;
1172-
1173-
return 0;
1174-
}
1175-
1176-
static int rds_cmsg_send(struct rds_sock *rs, struct rds_message *rm,
1177-
struct msghdr *msg, int *allocated_mr)
1152+
static int rds_cmsg_send(struct rds_connection *conn, struct rds_sock *rs,
1153+
struct rds_message *rm, struct msghdr *msg)
11781154
{
11791155
struct cmsghdr *cmsg;
11801156
int ret = 0;
@@ -1186,41 +1162,13 @@ static int rds_cmsg_send(struct rds_sock *rs, struct rds_message *rm,
11861162
if (cmsg->cmsg_level != SOL_RDS)
11871163
continue;
11881164

1189-
/* As a side effect, RDMA_DEST and RDMA_MAP will set
1190-
* rm->rdma.m_rdma_cookie and rm->rdma.m_rdma_mr.
1165+
/* Non-transport specific ancillary data should be handled
1166+
* here before calling transport specific ancillary data
1167+
* handler.
11911168
*/
1192-
switch (cmsg->cmsg_type) {
1193-
case RDS_CMSG_RDMA_ARGS:
1194-
ret = rds_cmsg_rdma_args(rs, rm, cmsg);
1195-
break;
1196-
1197-
case RDS_CMSG_RDMA_DEST:
1198-
ret = rds_cmsg_rdma_dest(rs, rm, cmsg);
1199-
break;
1200-
1201-
case RDS_CMSG_RDMA_MAP:
1202-
ret = rds_cmsg_rdma_map(rs, rm, cmsg);
1203-
if (!ret)
1204-
*allocated_mr = 1;
1205-
else if (ret == -ENODEV)
1206-
/* Accomodate the get_mr() case which can fail
1207-
* if connection isn't established yet.
1208-
*/
1209-
ret = -EAGAIN;
1210-
break;
1211-
case RDS_CMSG_ATOMIC_CSWP:
1212-
case RDS_CMSG_ATOMIC_FADD:
1213-
ret = rds_cmsg_atomic(rs, rm, cmsg);
1214-
break;
1215-
1216-
case RDS_CMSG_ASYNC_SEND:
1217-
ret = rds_cmsg_asend(rs, rm, cmsg);
1218-
break;
1219-
1220-
default:
1169+
if (!conn->c_trans->process_send_cmsg)
12211170
return -EINVAL;
1222-
}
1223-
1171+
ret = conn->c_trans->process_send_cmsg(rs, rm, cmsg);
12241172
if (ret)
12251173
break;
12261174
}
@@ -1299,7 +1247,7 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
12991247
struct rds_message *rm = NULL;
13001248
struct rds_connection *conn;
13011249
int ret = 0;
1302-
int queued = 0, allocated_mr = 0;
1250+
int queued = 0;
13031251
int nonblock = msg->msg_flags & MSG_DONTWAIT;
13041252
long timeo = sock_sndtimeo(sk, nonblock);
13051253
size_t total_payload_len = payload_len, rdma_payload_len = 0;
@@ -1542,10 +1490,10 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
15421490
rm->m_conn_path = cpath;
15431491

15441492
/* Parse any control messages the user may have included. */
1545-
ret = rds_cmsg_send(rs, rm, msg, &allocated_mr);
1493+
ret = rds_cmsg_send(conn, rs, rm, msg);
15461494
if (ret) {
15471495
/* Trigger connection so that its ready for the next retry */
1548-
if ( ret == -EAGAIN)
1496+
if (ret == -EAGAIN)
15491497
rds_conn_connect_if_down(conn);
15501498
goto out;
15511499
}
@@ -1643,11 +1591,13 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
16431591
/* If the user included a RDMA_MAP cmsg, we allocated a MR on the fly.
16441592
* If the sendmsg goes through, we keep the MR. If it fails with EAGAIN
16451593
* or in any other way, we need to destroy the MR again */
1646-
if (allocated_mr)
1647-
rds_rdma_unuse(rs, rds_rdma_cookie_key(rm->m_rdma_cookie), 1);
1648-
1649-
if (rm)
1594+
if (rm) {
1595+
if (rm->rdma.op_implicit_mr)
1596+
rds_rdma_unuse(rs,
1597+
rds_rdma_cookie_key(rm->m_rdma_cookie),
1598+
1);
16501599
rds_message_put(rm);
1600+
}
16511601
return ret;
16521602
}
16531603

0 commit comments

Comments
 (0)