virtiofs: Retry request submission from worker context
authorVivek Goyal <vgoyal@redhat.com>
Tue, 15 Oct 2019 17:46:26 +0000 (13:46 -0400)
committerMiklos Szeredi <mszeredi@redhat.com>
Mon, 21 Oct 2019 13:57:08 +0000 (15:57 +0200)
commita9bfd9dd3417561d06c81de04f6d6c1e0c9b3d44
tree1e1991a2446f1a3a253d82983a2c6f430f5d7fd2
parentc17ea009610366146ec409fd6dc277e0f2510b10
virtiofs: Retry request submission from worker context

If regular request queue gets full, currently we sleep for a bit and
retrying submission in submitter's context. This assumes submitter is not
holding any spin lock. But this assumption is not true for background
requests. For background requests, we are called with fc->bg_lock held.

This can lead to deadlock where one thread is trying submission with
fc->bg_lock held while request completion thread has called
fuse_request_end() which tries to acquire fc->bg_lock and gets blocked. As
request completion thread gets blocked, it does not make further progress
and that means queue does not get empty and submitter can't submit more
requests.

To solve this issue, retry submission with the help of a worker, instead of
retrying in submitter's context. We already do this for hiprio/forget
requests.

Reported-by: Chirantan Ekbote <chirantan@chromium.org>
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/virtio_fs.c