linux/net/sunrpc/xprtrdma
Chuck Lever d8f532d20e xprtrdma: Invoke rpcrdma_reply_handler directly from RECV completion
I noticed that the soft IRQ thread looked pretty busy under heavy
I/O workloads. perf suggested one area that was expensive was the
queue_work() call in rpcrdma_wc_receive. That gave me some ideas.

Instead of scheduling a separate worker to process RPC Replies,
promote the Receive completion handler to IB_POLL_WORKQUEUE, and
invoke rpcrdma_reply_handler directly.

Note that the poll workqueue is single-threaded. In order to keep
memory invalidation from serializing all RPC Replies, handle any
necessary invalidation tasks in a separate multi-threaded workqueue.

This provides a two-tier scheme, similar to OS I/O interrupt
handlers: A fast interrupt handler that schedules the slow handler
and re-enables the interrupt, and a slower handler that is invoked
for any needed heavy lifting.

Benefits include:
- One less context switch for RPCs that don't register memory
- Receive completion handling is moved out of soft IRQ context to
  make room for other users of soft IRQ
- The same CPU core now DMA syncs and XDR decodes the Receive buffer

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
2017-11-17 13:47:54 -05:00
..
backchannel.c xprtrdma: Clean up rpcrdma_bc_marshal_reply() 2017-08-11 13:20:08 -04:00
fmr_ops.c xprtrdma: Remove ro_unmap_safe 2017-10-16 13:51:27 -04:00
frwr_ops.c xprtrdma: Remove ro_unmap_safe 2017-10-16 13:51:27 -04:00
Makefile svcrdma: Remove svc_rdma_marshal.c 2017-06-28 14:21:43 -04:00
module.c rpcrdma: Merge svcrdma and xprtrdma modules into one 2015-06-04 16:56:02 -04:00
rpc_rdma.c xprtrdma: Invoke rpcrdma_reply_handler directly from RECV completion 2017-11-17 13:47:54 -05:00
svc_rdma_backchannel.c NFS-over-RDMA client updates for Linux 4.14 2017-09-05 15:16:04 -04:00
svc_rdma_recvfrom.c svcrdma: Properly compute .len and .buflen for received RPC Calls 2017-07-12 15:54:57 -04:00
svc_rdma_rw.c svcrdma: Populate tail iovec when receiving 2017-09-05 15:15:29 -04:00
svc_rdma_sendto.c svcrdma: fix an incorrect check on -E2BIG and -EINVAL 2017-07-13 14:18:47 -04:00
svc_rdma_transport.c svcrdma: Estimate Send Queue depth properly 2017-09-05 15:15:31 -04:00
svc_rdma.c svcrdma: Reduce size of sge array in struct svc_rdma_op_ctxt 2017-04-25 17:25:55 -04:00
transport.c xprtrdma: Use ro_unmap_sync in xprt_rdma_send_request 2017-10-16 13:51:27 -04:00
verbs.c xprtrdma: Invoke rpcrdma_reply_handler directly from RECV completion 2017-11-17 13:47:54 -05:00
xprt_rdma.h xprtrdma: Invoke rpcrdma_reply_handler directly from RECV completion 2017-11-17 13:47:54 -05:00