diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2020-07-06 16:59:31 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-07-06 17:06:20 +0200 |
commit | 3fcee5a6d5414df8ff4ee22f2477bde76d34527c (patch) | |
tree | 687e9af32760c89673a2587b188d9d7f1dde48cd /fs/io_uring.c | |
parent | io_uring: fix stopping iopoll'ing too early (diff) | |
download | linux-3fcee5a6d5414df8ff4ee22f2477bde76d34527c.tar.xz linux-3fcee5a6d5414df8ff4ee22f2477bde76d34527c.zip |
io_uring: briefly loose locks while reaping events
It's not nice to hold @uring_lock for too long io_iopoll_reap_events().
For instance, the lock is needed to publish requests to @poll_list, and
that locks out tasks doing that for no good reason. Loose it
occasionally.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io_uring.c')
-rw-r--r-- | fs/io_uring.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index 332008f346e3..6e3169834bf7 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2069,8 +2069,13 @@ static void io_iopoll_reap_events(struct io_ring_ctx *ctx) /* * Ensure we allow local-to-the-cpu processing to take place, * in this case we need to ensure that we reap all events. + * Also let task_work, etc. to progress by releasing the mutex */ - cond_resched(); + if (need_resched()) { + mutex_unlock(&ctx->uring_lock); + cond_resched(); + mutex_lock(&ctx->uring_lock); + } } mutex_unlock(&ctx->uring_lock); } |