On 10/16/19 10:13 AM, Greg KH wrote: > On Wed, Oct 16, 2019 at 09:04:43AM -0700, gregkh@xxxxxxxxxxxxxxxxxxx wrote: >> >> The patch below does not apply to the 5.3-stable tree. >> If someone wants it applied there, or to any other stable or longterm >> tree, then please email the backport, including the original git commit >> id to <stable@xxxxxxxxxxxxxxx>. >> >> thanks, >> >> greg k-h >> >> ------------------ original commit in Linus's tree ------------------ >> >> >From 8a99734081775c012a4a6c442fdef0379fe52bdf Mon Sep 17 00:00:00 2001 >> From: Jens Axboe <axboe@xxxxxxxxx> >> Date: Wed, 9 Oct 2019 14:40:13 -0600 >> Subject: [PATCH] io_uring: only flush workqueues on fileset removal >> >> We should not remove the workqueue, we just need to ensure that the >> workqueues are synced. The workqueues are torn down on ctx removal. >> >> Cc: stable@xxxxxxxxxxxxxxx >> Fixes: 6b06314c47e1 ("io_uring: add file set registration") >> Reported-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx> >> Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> >> >> diff --git a/fs/io_uring.c b/fs/io_uring.c >> index ceb3497bdd2a..2c44648217bd 100644 >> --- a/fs/io_uring.c >> +++ b/fs/io_uring.c >> @@ -2866,8 +2866,12 @@ static void io_finish_async(struct io_ring_ctx *ctx) >> static void io_destruct_skb(struct sk_buff *skb) >> { >> struct io_ring_ctx *ctx = skb->sk->sk_user_data; >> + int i; >> + >> + for (i = 0; i < ARRAY_SIZE(ctx->sqo_wq); i++) >> + if (ctx->sqo_wq[i]) >> + flush_workqueue(ctx->sqo_wq[i]); >> >> - io_finish_async(ctx); >> unix_destruct_scm(skb); >> } >> >> > > This fails to build as sqo_wq is a pointer in 5.3, not an arrary. > Backporting that array change feels "big" for 5.3, is that needed here, > or can this be fixed differently? Yeah, we don't need to do that. It's just a pointer in 5.3, not an array of pointers, so the below should be all we need for 5.3 (and 5.2/5.1). diff --git a/fs/io_uring.c b/fs/io_uring.c index cfb48bd088e1..e05f302cfb41 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2564,7 +2564,8 @@ static void io_destruct_skb(struct sk_buff *skb) { struct io_ring_ctx *ctx = skb->sk->sk_user_data; - io_finish_async(ctx); + if (ctx->sqo_wq) + flush_workqueue(ctx->sqo_wq); unix_destruct_scm(skb); } -- Jens Axboe