SUNRPC: Move TCP receive data path into a workqueue context
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 5 Oct 2015 14:53:49 +0000 (10:53 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 8 Oct 2015 12:27:04 +0000 (08:27 -0400)
commitedc1b01cd3b20a5fff049e98f82a2b0d24a34c89
tree1f6a52705eeec5ef5e450963cac1d7e38905f446
parent66d7a56a6254389587d0999dcaab1d2634cd4e24
SUNRPC: Move TCP receive data path into a workqueue context

Stream protocols such as TCP can often build up a backlog of data to be
read due to ordering. Combine this with the fact that some workloads such
as NFS read()-intensive workloads need to receive a lot of data per RPC
call, and it turns out that receiving the data from inside a softirq
context can cause starvation.

The following patch moves the TCP data receive into a workqueue context.
We still end up calling tcp_read_sock(), but we do so from a process
context, meaning that softirqs are enabled for most of the time.

With this patch, I see a doubling of read bandwidth when running a
multi-threaded iozone workload between a virtual client and server setup.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
include/linux/sunrpc/xprtsock.h
net/sunrpc/xprtsock.c