On 23/02/2021 21:53, Pavel Begunkov wrote: > Don't forget to zero locked_free_nr, it's not a disaster but makes it > attempting to flush it with extra locking when there is nothing in the > list. Also, don't traverse a potentially long list freeing requests > under spinlock, splice the list and do it afterwards. Err, it gone totally wrong, will resend > > Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> > --- > fs/io_uring.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index bf9ad810c621..dedcf971e2d5 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -8710,12 +8710,13 @@ static void io_req_caches_free(struct io_ring_ctx *ctx, struct task_struct *tsk) > submit_state->free_reqs = 0; > } > > - io_req_cache_free(&submit_state->comp.free_list, NULL); > - > spin_lock_irq(&ctx->completion_lock); > - io_req_cache_free(&submit_state->comp.locked_free_list, NULL); > + list_splice_init(&cs->locked_free_list, &cs->free_list); > + cs->locked_free_nr = 0; > spin_unlock_irq(&ctx->completion_lock); > > + io_req_cache_free(&submit_state->comp.free_list, NULL); > + > mutex_unlock(&ctx->uring_lock); > } > > -- Pavel Begunkov