Jens Axboe <axboe@xxxxxxxxx> writes: > On 3/26/21 4:38 PM, Jens Axboe wrote: >> OK good point, and follows the same logic even if it won't make a >> difference in my case. I'll make the change. > > Made the suggested edits and ran the quick tests and the KILL/STOP > testing, and no ill effects observed. Kicked off the longer runs now. > > Not a huge amount of changes from the posted series, but please peruse > here if you want to double check: > > https://git.kernel.dk/cgit/linux-block/log/?h=io_uring-5.12 > > And diff against v2 posted is below. Thanks! That looks good. Thanks. Acked-by: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> > > diff --git a/fs/io-wq.c b/fs/io-wq.c > index 3e2f059a1737..7434eb40ca8c 100644 > --- a/fs/io-wq.c > +++ b/fs/io-wq.c > @@ -505,10 +505,9 @@ static int io_wqe_worker(void *data) > if (signal_pending(current)) { > struct ksignal ksig; > > - if (fatal_signal_pending(current)) > - break; > - if (get_signal(&ksig)) > + if (!get_signal(&ksig)) > continue; > + break; > } > if (ret) > continue; > @@ -722,10 +721,9 @@ static int io_wq_manager(void *data) > if (signal_pending(current)) { > struct ksignal ksig; > > - if (fatal_signal_pending(current)) > - set_bit(IO_WQ_BIT_EXIT, &wq->state); > - else if (get_signal(&ksig)) > + if (!get_signal(&ksig)) > continue; > + set_bit(IO_WQ_BIT_EXIT, &wq->state); > } > } while (!test_bit(IO_WQ_BIT_EXIT, &wq->state)); > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index 66ae46874d85..880abd8b6d31 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -6746,10 +6746,9 @@ static int io_sq_thread(void *data) > if (signal_pending(current)) { > struct ksignal ksig; > > - if (fatal_signal_pending(current)) > - break; > - if (get_signal(&ksig)) > + if (!get_signal(&ksig)) > continue; > + break; > } > sqt_spin = false; > cap_entries = !list_is_singular(&sqd->ctx_list); > diff --git a/kernel/signal.c b/kernel/signal.c > index 5b75fbe3d2d6..f2718350bf4b 100644 > --- a/kernel/signal.c > +++ b/kernel/signal.c > @@ -2752,15 +2752,6 @@ bool get_signal(struct ksignal *ksig) > */ > current->flags |= PF_SIGNALED; > > - /* > - * PF_IO_WORKER threads will catch and exit on fatal signals > - * themselves. They have cleanup that must be performed, so > - * we cannot call do_exit() on their behalf. coredumps also > - * do not apply to them. > - */ > - if (current->flags & PF_IO_WORKER) > - return false; > - > if (sig_kernel_coredump(signr)) { > if (print_fatal_signals) > print_fatal_signal(ksig->info.si_signo); > @@ -2776,6 +2767,14 @@ bool get_signal(struct ksignal *ksig) > do_coredump(&ksig->info); > } > > + /* > + * PF_IO_WORKER threads will catch and exit on fatal signals > + * themselves. They have cleanup that must be performed, so > + * we cannot call do_exit() on their behalf. > + */ > + if (current->flags & PF_IO_WORKER) > + goto out; > + > /* > * Death signals, no core dump. > */ > @@ -2783,7 +2782,7 @@ bool get_signal(struct ksignal *ksig) > /* NOTREACHED */ > } > spin_unlock_irq(&sighand->siglock); > - > +out: > ksig->sig = signr; > > if (!(ksig->ka.sa.sa_flags & SA_EXPOSE_TAGBITS))