linux/net/sunrpc
David Vrabel a13ca3d638 sunrpc: fix write space race causing stalls
commit d48f9ce73c upstream.

Write space becoming available may race with putting the task to sleep
in xprt_wait_for_buffer_space().  The existing mechanism to avoid the
race does not work.

This (edited) partial trace illustrates the problem:

   [1] rpc_task_run_action: task:43546@5 ... action=call_transmit
   [2] xs_write_space <-xs_tcp_write_space
   [3] xprt_write_space <-xs_write_space
   [4] rpc_task_sleep: task:43546@5 ...
   [5] xs_write_space <-xs_tcp_write_space

[1] Task 43546 runs but is out of write space.

[2] Space becomes available, xs_write_space() clears the
    SOCKWQ_ASYNC_NOSPACE bit.

[3] xprt_write_space() attemts to wake xprt->snd_task (== 43546), but
    this has not yet been queued and the wake up is lost.

[4] xs_nospace() is called which calls xprt_wait_for_buffer_space()
    which queues task 43546.

[5] The call to sk->sk_write_space() at the end of xs_nospace() (which
    is supposed to handle the above race) does not call
    xprt_write_space() as the SOCKWQ_ASYNC_NOSPACE bit is clear and
    thus the task is not woken.

Fix the race by resetting the SOCKWQ_ASYNC_NOSPACE bit in xs_nospace()
so the second call to sk->sk_write_space() calls xprt_write_space().

Suggested-by: Trond Myklebust <trondmy@primarydata.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2016-10-28 03:01:31 -04:00
..
auth_gss SUNRPC: allow for upcalls for same uid but different gss service 2016-09-07 08:32:36 +02:00
xprtrdma NFS client updates for Linux 4.4 2015-11-09 18:11:22 -08:00
addr.c
auth_generic.c
auth_null.c
auth_unix.c
auth.c
backchannel_rqst.c SUNRPC: Fix callback channel 2015-12-07 13:04:59 -08:00
cache.c sunrpc/cache: drop reference when sunrpc_cache_pipe_upcall() detects a race 2016-05-04 14:48:54 -07:00
clnt.c nfsd4/rpc: move backchannel create logic into rpc code 2016-07-27 09:47:30 -07:00
debugfs.c
Kconfig
Makefile
netns.h
rpc_pipe.c
rpcb_clnt.c
sched.c sched/wait: Fix the signal handling fix 2015-12-13 14:30:59 -08:00
socklib.c
stats.c
sunrpc_syms.c
sunrpc.h
svc_xprt.c
svc.c NFS: Don't drop CB requests with invalid principals 2016-10-07 15:23:45 +02:00
svcauth_unix.c
svcauth.c
svcsock.c svcrpc: document lack of some memory barriers 2015-11-10 17:02:47 -05:00
sysctl.c Sunrpc: Supports hexadecimal number for sysctl files of sunrpc debug 2015-11-03 15:56:49 -05:00
timer.c
xdr.c
xprt.c
xprtsock.c sunrpc: fix write space race causing stalls 2016-10-28 03:01:31 -04:00