All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@kernel.dk>
To: io-uring@vger.kernel.org
Cc: torvalds@linux-foundation.org, ebiederm@xmission.com,
	metze@samba.org, oleg@redhat.com, linux-kernel@vger.kernel.org,
	Jens Axboe <axboe@kernel.dk>
Subject: [PATCH 1/8] io_uring: handle signals for IO threads like a normal thread
Date: Thu, 25 Mar 2021 18:39:24 -0600	[thread overview]
Message-ID: <20210326003928.978750-2-axboe@kernel.dk> (raw)
In-Reply-To: <20210326003928.978750-1-axboe@kernel.dk>

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 <axboe@kernel.dk>
---
 fs/io-wq.c    | 21 +++++++++++++++++----
 fs/io_uring.c | 10 ++++++++--
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/fs/io-wq.c b/fs/io-wq.c
index b7c1fa932cb3..2dbdc552f3ba 100644
--- a/fs/io-wq.c
+++ b/fs/io-wq.c
@@ -505,8 +505,14 @@ static int io_wqe_worker(void *data)
 		ret = schedule_timeout(WORKER_IDLE_TIMEOUT);
 		if (try_to_freeze() || ret)
 			continue;
-		if (fatal_signal_pending(current))
-			break;
+		if (signal_pending(current)) {
+			struct ksignal ksig;
+
+			if (fatal_signal_pending(current))
+				break;
+			get_signal(&ksig);
+			continue;
+		}
 		/* timed out, exit unless we're the fixed worker */
 		if (test_bit(IO_WQ_BIT_EXIT, &wq->state) ||
 		    !(worker->flags & IO_WORKER_F_FIXED))
@@ -715,8 +721,15 @@ static int io_wq_manager(void *data)
 		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);
+			else
+				get_signal(&ksig);
+			continue;
+		}
 	} 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..3a9d021db328 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -6765,8 +6765,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;
+			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) {
-- 
2.31.0


  reply	other threads:[~2021-03-26  0:41 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-26  0:39 [PATCH 0/6] Allow signals for IO threads Jens Axboe
2021-03-26  0:39 ` Jens Axboe [this message]
2021-03-26  0:39 ` [PATCH 2/8] kernel: unmask SIGSTOP " Jens Axboe
2021-03-26 13:48   ` Oleg Nesterov
2021-03-26 15:01     ` Jens Axboe
2021-03-26 15:23       ` Stefan Metzmacher
2021-03-26 15:29         ` Jens Axboe
2021-03-26 18:01           ` Stefan Metzmacher
2021-03-26 18:59             ` Jens Axboe
2021-04-01 14:53             ` Stefan Metzmacher
2021-03-26  0:39 ` [PATCH 3/8] Revert "signal: don't allow sending any signals to PF_IO_WORKER threads" Jens Axboe
2021-03-26  0:39 ` [PATCH 4/8] Revert "kernel: treat PF_IO_WORKER like PF_KTHREAD for ptrace/signals" Jens Axboe
2021-03-26  0:39 ` [PATCH 5/8] Revert "kernel: freezer should treat PF_IO_WORKER like PF_KTHREAD for freezing" Jens Axboe
2021-03-26  0:39 ` [PATCH 6/8] Revert "signal: don't allow STOP on PF_IO_WORKER threads" Jens Axboe
2021-03-26 11:48 ` [PATCH 0/6] Allow signals for IO threads Stefan Metzmacher
2021-03-26 12:56   ` Jens Axboe
2021-03-26 13:31     ` Stefan Metzmacher
2021-03-26 13:54       ` Jens Axboe
2021-03-26 13:59         ` Jens Axboe
2021-03-26 14:38           ` Jens Axboe
2021-03-26 14:43             ` Stefan Metzmacher
2021-03-26 14:45               ` Stefan Metzmacher
2021-03-26 14:53                 ` Jens Axboe
2021-03-26 14:55                   ` Jens Axboe
2021-03-26 15:08                     ` Stefan Metzmacher
2021-03-26 15:10                       ` Jens Axboe
2021-03-26 15:11                         ` Stefan Metzmacher
2021-03-26 15:12                           ` Jens Axboe
2021-03-26 15:04                   ` Stefan Metzmacher
2021-03-26 15:09                     ` Jens Axboe
2021-03-26 14:50               ` Jens Axboe
2021-03-27  1:46       ` Stefan Metzmacher
2021-03-27 16:41         ` Jens Axboe
2021-04-01 14:58         ` Stefan Metzmacher
2021-04-01 15:39           ` Linus Torvalds
2021-04-01 16:00             ` Stefan Metzmacher
2021-04-01 16:24               ` Linus Torvalds
2021-04-01 16:55                 ` Stefan Metzmacher
2021-04-03  0:48                 ` Stefan Metzmacher

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 \
    --in-reply-to=20210326003928.978750-2-axboe@kernel.dk \
    --to=axboe@kernel.dk \
    --cc=ebiederm@xmission.com \
    --cc=io-uring@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=metze@samba.org \
    --cc=oleg@redhat.com \
    --cc=torvalds@linux-foundation.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.