From: Aaron Tomlin <atomlin@atomlin.com>
To: linux-kernel@vger.kernel.org
Cc: tj@kernel.org, jiangshanlai@gmail.com, peterz@infradead.org
Subject: [RFC PATCH 1/2] workqueue: Introduce PF_WQ_RESCUE_WORKER
Date: Sat, 29 Jul 2023 14:53:33 +0100 [thread overview]
Message-ID: <20230729135334.566138-2-atomlin@atomlin.com> (raw)
In-Reply-To: <20230729135334.566138-1-atomlin@atomlin.com>
The Linux kernel does not provide a way to differentiate between a
kworker and a rescue kworker for user-mode.
From user-mode, one can establish if a task is a kworker by testing for
PF_WQ_WORKER in a specified task's flags bit mask (or bitmap) via
/proc/[PID]/stat. Indeed, one can examine /proc/[PID]/stack and search
for the function namely "rescuer_thread". This is only available to the
root user.
It can be useful to identify a rescue kworker since their CPU affinity
cannot be modified and their initial CPU assignment can be safely ignored.
Furthermore, a workqueue that was created with WQ_MEM_RECLAIM and
WQ_SYSFS the cpumask file is not applicable to the rescue kworker.
By design a rescue kworker should run anywhere.
This patch introduces PF_WQ_RESCUE_WORKER and ensures it is set and
cleared appropriately.
Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
---
include/linux/sched.h | 2 +-
kernel/workqueue.c | 19 ++++++++++++-------
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 609bde814cb0..039fcf8d9ed6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1734,7 +1734,7 @@ extern struct pid *cad_pid;
#define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */
#define PF_USER_WORKER 0x00004000 /* Kernel thread cloned from userspace thread */
#define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */
-#define PF__HOLE__00010000 0x00010000
+#define PF_WQ_RESCUE_WORKER 0x00010000 /* I am a rescue workqueue worker */
#define PF_KSWAPD 0x00020000 /* I am kswapd */
#define PF_MEMALLOC_NOFS 0x00040000 /* All allocation requests will inherit GFP_NOFS */
#define PF_MEMALLOC_NOIO 0x00080000 /* All allocation requests will inherit GFP_NOIO */
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 02a8f402eeb5..6d38d714b72b 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -2665,13 +2665,18 @@ static void process_scheduled_works(struct worker *worker)
}
}
-static void set_pf_worker(bool val)
+static void set_pf_worker_and_rescuer(bool worker, bool rescue)
{
mutex_lock(&wq_pool_attach_mutex);
- if (val)
+ if (worker) {
current->flags |= PF_WQ_WORKER;
- else
+ if (rescue)
+ current->flags |= PF_WQ_RESCUE_WORKER;
+ } else {
current->flags &= ~PF_WQ_WORKER;
+ if (rescue)
+ current->flags &= ~PF_WQ_RESCUE_WORKER;
+ }
mutex_unlock(&wq_pool_attach_mutex);
}
@@ -2693,14 +2698,14 @@ static int worker_thread(void *__worker)
struct worker_pool *pool = worker->pool;
/* tell the scheduler that this is a workqueue worker */
- set_pf_worker(true);
+ set_pf_worker_and_rescuer(true, false);
woke_up:
raw_spin_lock_irq(&pool->lock);
/* am I supposed to die? */
if (unlikely(worker->flags & WORKER_DIE)) {
raw_spin_unlock_irq(&pool->lock);
- set_pf_worker(false);
+ set_pf_worker_and_rescuer(false, false);
set_task_comm(worker->task, "kworker/dying");
ida_free(&pool->worker_ida, worker->id);
@@ -2804,7 +2809,7 @@ static int rescuer_thread(void *__rescuer)
* Mark rescuer as worker too. As WORKER_PREP is never cleared, it
* doesn't participate in concurrency management.
*/
- set_pf_worker(true);
+ set_pf_worker_and_rescuer(true, true);
repeat:
set_current_state(TASK_IDLE);
@@ -2903,7 +2908,7 @@ static int rescuer_thread(void *__rescuer)
if (should_stop) {
__set_current_state(TASK_RUNNING);
- set_pf_worker(false);
+ set_pf_worker_and_rescuer(false, true);
return 0;
}
--
2.39.1
next prev parent reply other threads:[~2023-07-29 14:01 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-29 13:53 [RFC PATCH 0/2] workqueue: Introduce PF_WQ_RESCUE_WORKER Aaron Tomlin
2023-07-29 13:53 ` Aaron Tomlin [this message]
2023-07-29 16:07 ` [RFC PATCH 1/2] " Peter Zijlstra
2023-08-01 10:04 ` Aaron Tomlin
2023-07-29 13:53 ` [RFC PATCH 2/2] workqueue: Simplify current_is_workqueue_rescuer() Aaron Tomlin
2023-07-31 23:35 ` [RFC PATCH 0/2] workqueue: Introduce PF_WQ_RESCUE_WORKER Tejun Heo
2023-08-01 10:53 ` Aaron Tomlin
2023-08-02 18:10 ` Tejun Heo
2023-08-03 20:19 ` Aaron Tomlin
2023-08-03 20:34 ` Tejun Heo
2023-08-05 23:45 ` Aaron Tomlin
2023-12-11 14:51 ` Juri Lelli
2023-12-11 18:39 ` Tejun Heo
2023-12-12 9:56 ` Juri Lelli
2023-12-12 17:14 ` Tejun Heo
2023-12-12 19:06 ` Aaron Tomlin
2023-12-12 20:16 ` Tejun Heo
2023-12-13 8:59 ` Juri Lelli
2023-12-13 15:35 ` Tejun Heo
2023-12-13 18:32 ` Juri Lelli
2023-12-13 18:38 ` Tejun Heo
2023-12-14 11:25 ` Juri Lelli
2023-12-14 19:47 ` Tejun Heo
2023-12-15 6:50 ` Juri Lelli
2023-12-19 8:55 ` Juri Lelli
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=20230729135334.566138-2-atomlin@atomlin.com \
--to=atomlin@atomlin.com \
--cc=jiangshanlai@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=tj@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox