linux/net/sunrpc/xprtrdma
Chuck Lever 68791649a7 xprtrdma: Invalidate in the RPC reply handler
There is a window between the time the RPC reply handler wakes the
waiting RPC task and when xprt_release() invokes ops->buf_free.
During this time, memory regions containing the data payload may
still be accessed by a broken or malicious server, but the RPC
application has already been allowed access to the memory containing
the RPC request's data payloads.

The server should be fenced from client memory containing RPC data
payloads _before_ the RPC application is allowed to continue.

This change also more strongly enforces send queue accounting. There
is a maximum number of RPC calls allowed to be outstanding. When an
RPC/RDMA transport is set up, just enough send queue resources are
allocated to handle registration, Send, and invalidation WRs for
each those RPCs at the same time.

Before, additional RPC calls could be dispatched while invalidation
WRs were still consuming send WQEs. When invalidation WRs backed
up, dispatching additional RPCs resulted in a send queue overrun.

Now, the reply handler prevents RPC dispatch until invalidation is
complete. This prevents RPC call dispatch until there are enough
send queue resources to proceed.

Still to do: If an RPC exits early (say, ^C), the reply handler has
no opportunity to perform invalidation. Currently, xprt_rdma_free()
still frees remaining RDMA resources, which could deadlock.
Additional changes are needed to handle invalidation properly in this
case.

Reported-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Devesh Sharma <devesh.sharma@avagotech.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
2015-12-18 15:34:33 -05:00
..
backchannel.c xprtrdma: Disable RPC/RDMA backchannel debugging messages 2015-12-18 15:34:33 -05:00
fmr_ops.c xprtrdma: Add ro_unmap_sync method for FMR 2015-12-18 15:34:33 -05:00
frwr_ops.c xprtrdma: Add ro_unmap_sync method for FRWR 2015-12-18 15:34:33 -05:00
Makefile xprtrdma: Pre-allocate backward rpc_rqst and send/receive buffers 2015-11-02 13:45:15 -05:00
module.c rpcrdma: Merge svcrdma and xprtrdma modules into one 2015-06-04 16:56:02 -04:00
physical_ops.c xprtrdma: Add ro_unmap_sync method for all-physical registration 2015-12-18 15:34:33 -05:00
rpc_rdma.c xprtrdma: Invalidate in the RPC reply handler 2015-12-18 15:34:33 -05:00
svc_rdma_marshal.c svcrdma: Keep rpcrdma_msg fields in network byte-order 2015-06-04 16:55:59 -04:00
svc_rdma_recvfrom.c Initial 4.4 merge window submission 2015-11-07 13:33:07 -08:00
svc_rdma_sendto.c IB: split struct ib_send_wr 2015-10-08 11:09:10 +01:00
svc_rdma_transport.c NFS client updates for Linux 4.4 2015-11-09 18:11:22 -08:00
svc_rdma.c svcrdma: Add backward direction service for RPC/RDMA transport 2015-11-02 13:45:15 -05:00
transport.c xprtrdma: xprt_rdma_free() must not release backchannel reqs 2015-12-18 15:34:33 -05:00
verbs.c xprtrdma: Fix additional uses of spin_lock_irqsave(rb_lock) 2015-12-18 15:34:33 -05:00
xprt_rdma.h xprtrdma: Add ro_unmap_sync method for FRWR 2015-12-18 15:34:33 -05:00