diff options
author | 2020-07-06 17:59:31 +0300 | |
---|---|---|
committer | 2020-07-06 09:06:20 -0600 | |
commit | 3fcee5a6d5414df8ff4ee22f2477bde76d34527c (patch) | |
tree | 687e9af32760c89673a2587b188d9d7f1dde48cd | |
parent | io_uring: fix stopping iopoll'ing too early (diff) | |
download | wireguard-linux-3fcee5a6d5414df8ff4ee22f2477bde76d34527c.tar.xz wireguard-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>
-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); } |