OSDN Git Service

SUNRPC: Use poll() to fix up the socket requeue races
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 30 Jan 2019 19:51:26 +0000 (14:51 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 20 Feb 2019 22:33:54 +0000 (17:33 -0500)
commit0ffe86f48026b7f34db22d1004bc9992f0db8b33
treedd64e946ccdfdef857fc51476b66fb48efee5de2
parenta1231fda7e944adf37d8368b2e182041a39ea1ca
SUNRPC: Use poll() to fix up the socket requeue races

Because we clear XPRT_SOCK_DATA_READY before reading, we can end up
with a situation where new data arrives, causing xs_data_ready() to
queue up a second receive worker job for the same socket, which then
immediately gets stuck waiting on the transport receive mutex.
The fix is to only clear XPRT_SOCK_DATA_READY once we're done reading,
and then to use poll() to check if we might need to queue up a new
job in order to deal with any new data.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/xprtsock.c