From: Jens Axboe <[email protected]>
To: "Eric W. Biederman" <[email protected]>
Cc: [email protected], [email protected],
[email protected], [email protected], [email protected]
Subject: Re: [PATCH 2/7] io_uring: handle signals for IO threads like a normal thread
Date: Fri, 26 Mar 2021 16:30:28 -0600 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
On 3/26/21 4:23 PM, Eric W. Biederman wrote:
> Jens Axboe <[email protected]> writes:
>
>> On 3/26/21 2:29 PM, Eric W. Biederman wrote:
>>> Jens Axboe <[email protected]> writes:
>>>
>>>> We go through various hoops to disallow signals for the IO threads, but
>>>> there's really no reason why we cannot just allow them. The IO threads
>>>> never return to userspace like a normal thread, and hence don't go through
>>>> normal signal processing. Instead, just check for a pending signal as part
>>>> of the work loop, and call get_signal() to handle it for us if anything
>>>> is pending.
>>>>
>>>> With that, we can support receiving signals, including special ones like
>>>> SIGSTOP.
>>>>
>>>> Signed-off-by: Jens Axboe <[email protected]>
>>>> ---
>>>> fs/io-wq.c | 24 +++++++++++++++++-------
>>>> fs/io_uring.c | 12 ++++++++----
>>>> 2 files changed, 25 insertions(+), 11 deletions(-)
>>>>
>>>> diff --git a/fs/io-wq.c b/fs/io-wq.c
>>>> index b7c1fa932cb3..3e2f059a1737 100644
>>>> --- a/fs/io-wq.c
>>>> +++ b/fs/io-wq.c
>>>> @@ -16,7 +16,6 @@
>>>> #include <linux/rculist_nulls.h>
>>>> #include <linux/cpu.h>
>>>> #include <linux/tracehook.h>
>>>> -#include <linux/freezer.h>
>>>>
>>>> #include "../kernel/sched/sched.h"
>>>> #include "io-wq.h"
>>>> @@ -503,10 +502,16 @@ static int io_wqe_worker(void *data)
>>>> if (io_flush_signals())
>>>> continue;
>>>> ret = schedule_timeout(WORKER_IDLE_TIMEOUT);
>>>> - if (try_to_freeze() || ret)
>>>> + if (signal_pending(current)) {
>>>> + struct ksignal ksig;
>>>> +
>>>> + if (fatal_signal_pending(current))
>>>> + break;
>>>> + if (get_signal(&ksig))
>>>> + continue;
>>> ^^^^^^^^^^^^^^^^^^^^^^
>>>
>>> That is wrong. You are promising to deliver a signal to signal
>>> handler and them simply discarding it. Perhaps:
>>>
>>> if (!get_signal(&ksig))
>>> continue;
>>> WARN_ON(!sig_kernel_stop(ksig->sig));
>>> break;
>>
>> Thanks, updated.
>
> Gah. Kill the WARN_ON.
>
> I was thinking "WARN_ON(!sig_kernel_fatal(ksig->sig));"
> The function sig_kernel_fatal does not exist.
>
> Fatal is the state that is left when a signal is neither
> ignored nor a stop signal, and does not have a handler.
>
> The rest of the logic still works.
I've just come to the same conclusion myself after testing it.
Of the 3 cases, most of them can do the continue, but doesn't
really matter with the way the loop is structured. Anyway, looks
like this now:
commit 769186e30cd437f5e1a000e7cf00286948779da4
Author: Jens Axboe <[email protected]>
Date: Thu Mar 25 18:16:06 2021 -0600
io_uring: handle signals for IO threads like a normal thread
We go through various hoops to disallow signals for the IO threads, but
there's really no reason why we cannot just allow them. The IO threads
never return to userspace like a normal thread, and hence don't go through
normal signal processing. Instead, just check for a pending signal as part
of the work loop, and call get_signal() to handle it for us if anything
is pending.
With that, we can support receiving signals, including special ones like
SIGSTOP.
Signed-off-by: Jens Axboe <[email protected]>
diff --git a/fs/io-wq.c b/fs/io-wq.c
index b7c1fa932cb3..7e5970c8b0be 100644
--- a/fs/io-wq.c
+++ b/fs/io-wq.c
@@ -16,7 +16,6 @@
#include <linux/rculist_nulls.h>
#include <linux/cpu.h>
#include <linux/tracehook.h>
-#include <linux/freezer.h>
#include "../kernel/sched/sched.h"
#include "io-wq.h"
@@ -503,10 +502,16 @@ static int io_wqe_worker(void *data)
if (io_flush_signals())
continue;
ret = schedule_timeout(WORKER_IDLE_TIMEOUT);
- if (try_to_freeze() || ret)
+ if (signal_pending(current)) {
+ struct ksignal ksig;
+
+ if (fatal_signal_pending(current))
+ break;
+ if (!get_signal(&ksig))
+ continue;
+ }
+ if (ret)
continue;
- if (fatal_signal_pending(current))
- break;
/* timed out, exit unless we're the fixed worker */
if (test_bit(IO_WQ_BIT_EXIT, &wq->state) ||
!(worker->flags & IO_WORKER_F_FIXED))
@@ -714,9 +719,15 @@ static int io_wq_manager(void *data)
set_current_state(TASK_INTERRUPTIBLE);
io_wq_check_workers(wq);
schedule_timeout(HZ);
- try_to_freeze();
- if (fatal_signal_pending(current))
- set_bit(IO_WQ_BIT_EXIT, &wq->state);
+ if (signal_pending(current)) {
+ struct ksignal ksig;
+
+ if (fatal_signal_pending(current)) {
+ set_bit(IO_WQ_BIT_EXIT, &wq->state);
+ continue;
+ }
+ get_signal(&ksig);
+ }
} while (!test_bit(IO_WQ_BIT_EXIT, &wq->state));
io_wq_check_workers(wq);
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 54ea561db4a5..1c64e3f9b7a2 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -78,7 +78,6 @@
#include <linux/task_work.h>
#include <linux/pagemap.h>
#include <linux/io_uring.h>
-#include <linux/freezer.h>
#define CREATE_TRACE_POINTS
#include <trace/events/io_uring.h>
@@ -6765,8 +6764,14 @@ static int io_sq_thread(void *data)
timeout = jiffies + sqd->sq_thread_idle;
continue;
}
- if (fatal_signal_pending(current))
- break;
+ if (signal_pending(current)) {
+ struct ksignal ksig;
+
+ if (fatal_signal_pending(current))
+ break;
+ if (!get_signal(&ksig))
+ continue;
+ }
sqt_spin = false;
cap_entries = !list_is_singular(&sqd->ctx_list);
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {
@@ -6809,7 +6814,6 @@ static int io_sq_thread(void *data)
mutex_unlock(&sqd->lock);
schedule();
- try_to_freeze();
mutex_lock(&sqd->lock);
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
io_ring_clear_wakeup_flag(ctx);
--
Jens Axboe
next prev parent reply other threads:[~2021-03-26 22:31 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-26 15:51 [PATCHSET v2 0/7] Allow signals for IO threads Jens Axboe
2021-03-26 15:51 ` [PATCH 1/7] kernel: don't call do_exit() for PF_IO_WORKER threads Jens Axboe
2021-03-26 20:43 ` Eric W. Biederman
2021-03-26 22:11 ` Jens Axboe
2021-03-26 15:51 ` [PATCH 2/7] io_uring: handle signals for IO threads like a normal thread Jens Axboe
2021-03-26 20:29 ` Eric W. Biederman
2021-03-26 22:14 ` Jens Axboe
2021-03-26 22:23 ` Eric W. Biederman
2021-03-26 22:30 ` Jens Axboe [this message]
2021-03-26 22:35 ` Eric W. Biederman
2021-03-26 22:38 ` Jens Axboe
2021-03-26 22:49 ` Jens Axboe
2021-03-27 17:40 ` Eric W. Biederman
2021-03-27 20:08 ` Jens Axboe
2021-03-26 15:51 ` [PATCH 03/10] Revert "signal: don't allow sending any signals to PF_IO_WORKER threads" Jens Axboe
2021-03-26 15:51 ` [PATCH 3/7] kernel: stop masking signals in create_io_thread() Jens Axboe
2021-03-26 20:44 ` Eric W. Biederman
2021-03-26 15:51 ` [PATCH 04/10] Revert "kernel: treat PF_IO_WORKER like PF_KTHREAD for ptrace/signals" Jens Axboe
2021-03-26 15:51 ` [PATCH 4/7] Revert "signal: don't allow sending any signals to PF_IO_WORKER threads" Jens Axboe
2021-03-26 15:51 ` [PATCH 05/10] Revert "kernel: freezer should treat PF_IO_WORKER like PF_KTHREAD for freezing" Jens Axboe
2021-03-26 15:51 ` [PATCH 5/7] Revert "kernel: treat PF_IO_WORKER like PF_KTHREAD for ptrace/signals" Jens Axboe
2021-03-26 15:51 ` [PATCH 6/7] Revert "kernel: freezer should treat PF_IO_WORKER like PF_KTHREAD for freezing" Jens Axboe
2021-03-26 15:51 ` [PATCH 06/10] Revert "signal: don't allow STOP on PF_IO_WORKER threads" Jens Axboe
2021-03-26 15:51 ` [PATCH 7/7] " Jens Axboe
2021-03-26 15:51 ` [PATCH 07/10] io_uring: fix timeout cancel return code Jens Axboe
2021-03-26 15:51 ` [PATCH 08/10] io_uring: do post-completion chore on t-out cancel Jens Axboe
2021-03-26 15:51 ` [PATCH 09/10] io_uring: don't cancel-track common timeouts Jens Axboe
2021-03-26 15:51 ` [PATCH 10/10] io_uring: don't cancel extra on files match Jens Axboe
2021-03-26 15:54 ` [PATCHSET v2 0/7] Allow signals for IO threads Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox