Skip to content

Commit 82011c8

Browse files
committed
SUNRPC: Move svc_xprt_received() call sites
Currently, XPT_BUSY is not cleared until xpo_recvfrom returns. That effectively blocks the receipt and handling of the next RPC message until the current one has been taken off the transport. This strict ordering is a requirement for socket transports. For our kernel RPC/RDMA transport implementation, however, dequeuing an ingress message is nothing more than a list_del(). The transport can safely be marked un-busy as soon as that is done. To keep the changes simpler, this patch just moves the svc_xprt_received() call site from svc_handle_xprt() into the transports, so that the actual optimization can be done in a subsequent patch. Signed-off-by: Chuck Lever <[email protected]>
1 parent 7dcfbd8 commit 82011c8

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

net/sunrpc/svc_xprt.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -820,8 +820,10 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt)
820820
newxpt->xpt_cred = get_cred(xprt->xpt_cred);
821821
svc_add_new_temp_xprt(serv, newxpt);
822822
trace_svc_xprt_accept(newxpt, serv->sv_name);
823-
} else
823+
} else {
824824
module_put(xprt->xpt_class->xcl_owner);
825+
}
826+
svc_xprt_received(xprt);
825827
} else if (svc_xprt_reserve_slot(rqstp, xprt)) {
826828
/* XPT_DATA|XPT_DEFERRED case: */
827829
dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n",
@@ -836,8 +838,6 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt)
836838
rqstp->rq_reserved = serv->sv_max_mesg;
837839
atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved);
838840
}
839-
/* clear XPT_BUSY: */
840-
svc_xprt_received(xprt);
841841
out:
842842
trace_svc_handle_xprt(xprt, len);
843843
return len;
@@ -1248,6 +1248,7 @@ static noinline int svc_deferred_recv(struct svc_rqst *rqstp)
12481248
rqstp->rq_xprt_hlen = dr->xprt_hlen;
12491249
rqstp->rq_daddr = dr->daddr;
12501250
rqstp->rq_respages = rqstp->rq_pages;
1251+
svc_xprt_received(rqstp->rq_xprt);
12511252
return (dr->argslen<<2) - dr->xprt_hlen;
12521253
}
12531254

net/sunrpc/svcsock.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
519519
if (serv->sv_stats)
520520
serv->sv_stats->netudpcnt++;
521521

522+
svc_xprt_received(rqstp->rq_xprt);
522523
return len;
523524

524525
out_recv_err:
@@ -527,7 +528,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
527528
set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
528529
}
529530
trace_svcsock_udp_recv_err(&svsk->sk_xprt, err);
530-
return 0;
531+
goto out_clear_busy;
531532
out_cmsg_err:
532533
net_warn_ratelimited("svc: received unknown control message %d/%d; dropping RPC reply datagram\n",
533534
cmh->cmsg_level, cmh->cmsg_type);
@@ -536,6 +537,8 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
536537
local_bh_enable();
537538
out_free:
538539
kfree_skb(skb);
540+
out_clear_busy:
541+
svc_xprt_received(rqstp->rq_xprt);
539542
return 0;
540543
}
541544

@@ -1033,6 +1036,7 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp)
10331036
if (serv->sv_stats)
10341037
serv->sv_stats->nettcpcnt++;
10351038

1039+
svc_xprt_received(rqstp->rq_xprt);
10361040
return rqstp->rq_arg.len;
10371041

10381042
err_incomplete:
@@ -1050,13 +1054,14 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp)
10501054
if (len != -EAGAIN)
10511055
goto err_delete;
10521056
trace_svcsock_tcp_recv_eagain(&svsk->sk_xprt, 0);
1053-
return 0;
1057+
goto err_noclose;
10541058
err_nuts:
10551059
svsk->sk_datalen = 0;
10561060
err_delete:
10571061
trace_svcsock_tcp_recv_err(&svsk->sk_xprt, len);
10581062
svc_xprt_deferred_close(&svsk->sk_xprt);
10591063
err_noclose:
1064+
svc_xprt_received(rqstp->rq_xprt);
10601065
return 0; /* record not complete */
10611066
}
10621067

net/sunrpc/xprtrdma/svc_rdma_recvfrom.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,7 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
846846
/* No new incoming requests, terminate the loop */
847847
clear_bit(XPT_DATA, &xprt->xpt_flags);
848848
spin_unlock(&rdma_xprt->sc_rq_dto_lock);
849+
svc_xprt_received(xprt);
849850
return 0;
850851
}
851852
list_del(&ctxt->rc_list);
@@ -883,28 +884,33 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
883884
rqstp->rq_xprt_ctxt = ctxt;
884885
rqstp->rq_prot = IPPROTO_MAX;
885886
svc_xprt_copy_addrs(rqstp, xprt);
887+
svc_xprt_received(xprt);
886888
return rqstp->rq_arg.len;
887889

888890
out_readlist:
889891
ret = svc_rdma_process_read_list(rdma_xprt, rqstp, ctxt);
890892
if (ret < 0)
891893
goto out_readfail;
894+
svc_xprt_received(xprt);
892895
return 0;
893896

894897
out_err:
895898
svc_rdma_send_error(rdma_xprt, ctxt, ret);
896899
svc_rdma_recv_ctxt_put(rdma_xprt, ctxt);
900+
svc_xprt_received(xprt);
897901
return 0;
898902

899903
out_readfail:
900904
if (ret == -EINVAL)
901905
svc_rdma_send_error(rdma_xprt, ctxt, ret);
902906
svc_rdma_recv_ctxt_put(rdma_xprt, ctxt);
907+
svc_xprt_received(xprt);
903908
return ret;
904909

905910
out_backchannel:
906911
svc_rdma_handle_bc_reply(rqstp, ctxt);
907912
out_drop:
908913
svc_rdma_recv_ctxt_put(rdma_xprt, ctxt);
914+
svc_xprt_received(xprt);
909915
return 0;
910916
}

0 commit comments

Comments
 (0)