From: Tejun Heo <tj@kernel.org>
To: jiangshanlai@gmail.com
Cc: torvalds@linux-foundation.org, linux-kernel@vger.kernel.org,
allen.lkml@gmail.com, kernel-team@meta.com,
Tejun Heo <tj@kernel.org>
Subject: [PATCH 4/7] workqueue: Remember whether a work item was on a BH workqueue
Date: Wed, 21 Feb 2024 07:43:02 -1000 [thread overview]
Message-ID: <20240221174333.700197-5-tj@kernel.org> (raw)
In-Reply-To: <20240221174333.700197-1-tj@kernel.org>
Add an off-queue flag, WORK_OFFQ_BH, that indicates whether the last
workqueue the work item was on was a BH one. This will be used to sanity
check the context cancel_sync operations can be called from for the work
item.
Signed-off-by: Tejun Heo <tj@kernel.org>
---
include/linux/workqueue.h | 4 +++-
kernel/workqueue.c | 10 ++++++++--
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index 86483743ad28..7710cd52f7f0 100644
--- a/include/linux/workqueue.h
+++ b/include/linux/workqueue.h
@@ -52,9 +52,10 @@ enum work_bits {
*
* MSB
* [ pool ID ] [ disable depth ] [ OFFQ flags ] [ STRUCT flags ]
- * 16 bits 0 bits 4 or 5 bits
+ * 16 bits 1 bit 4 or 5 bits
*/
WORK_OFFQ_FLAG_SHIFT = WORK_STRUCT_FLAG_BITS,
+ WORK_OFFQ_BH_BIT = WORK_OFFQ_FLAG_SHIFT,
WORK_OFFQ_FLAG_END,
WORK_OFFQ_FLAG_BITS = WORK_OFFQ_FLAG_END - WORK_OFFQ_FLAG_SHIFT,
@@ -98,6 +99,7 @@ enum wq_misc_consts {
};
/* Convenience constants - of type 'unsigned long', not 'enum'! */
+#define WORK_OFFQ_BH (1ul << WORK_OFFQ_BH_BIT)
#define WORK_OFFQ_FLAG_MASK (((1ul << WORK_OFFQ_FLAG_BITS) - 1) << WORK_OFFQ_FLAG_SHIFT)
#define WORK_OFFQ_DISABLE_MASK (((1ul << WORK_OFFQ_DISABLE_BITS) - 1) << WORK_OFFQ_DISABLE_SHIFT)
#define WORK_OFFQ_POOL_NONE ((1ul << WORK_OFFQ_POOL_BITS) - 1)
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 9529ab1d9464..a03252ef3c8f 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -759,6 +759,11 @@ static int work_next_color(int color)
return (color + 1) % WORK_NR_COLORS;
}
+static unsigned long pool_offq_flags(struct worker_pool *pool)
+{
+ return (pool->flags & POOL_BH) ? WORK_OFFQ_BH : 0;
+}
+
/*
* While queued, %WORK_STRUCT_PWQ is set and non flag bits of a work's data
* contain the pointer to the queued pwq. Once execution starts, the flag
@@ -2111,7 +2116,8 @@ static int try_to_grab_pending(struct work_struct *work, u32 cflags,
* this destroys work->data needed by the next step, stash it.
*/
work_data = *work_data_bits(work);
- set_work_pool_and_keep_pending(work, pool->id, 0);
+ set_work_pool_and_keep_pending(work, pool->id,
+ pool_offq_flags(pool));
/* must be the last step, see the function comment */
pwq_dec_nr_in_flight(pwq, work_data);
@@ -3163,7 +3169,7 @@ __acquires(&pool->lock)
* PENDING and queued state changes happen together while IRQ is
* disabled.
*/
- set_work_pool_and_clear_pending(work, pool->id, 0);
+ set_work_pool_and_clear_pending(work, pool->id, pool_offq_flags(pool));
pwq->stats[PWQ_STAT_STARTED]++;
raw_spin_unlock_irq(&pool->lock);
--
2.43.2
next prev parent reply other threads:[~2024-02-21 17:43 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-21 17:42 [PATCHSET v2 wq/6.10] workqueue: Implement disable/enable_work() Tejun Heo
2024-02-21 17:42 ` [PATCH 1/7] workqueue: Preserve OFFQ bits in cancel[_sync] paths Tejun Heo
2024-02-22 4:35 ` Lai Jiangshan
2024-02-22 8:05 ` Tejun Heo
2024-02-21 17:43 ` [PATCH 2/7] workqueue: Implement disable/enable for (delayed) work items Tejun Heo
2024-02-22 4:34 ` Lai Jiangshan
2024-02-22 8:22 ` Tejun Heo
2024-02-21 17:43 ` [PATCH 3/7] workqueue: Remove WORK_OFFQ_CANCELING Tejun Heo
2024-02-21 17:43 ` Tejun Heo [this message]
2024-02-21 17:43 ` [PATCH 5/7] workqueue: Update how start_flush_work() is called Tejun Heo
2024-02-21 17:43 ` [PATCH 6/7] workqueue: Allow cancel_work_sync() and disable_work() from atomic contexts on BH work items Tejun Heo
2024-02-22 4:36 ` Lai Jiangshan
2024-02-22 8:32 ` Tejun Heo
2024-02-21 17:43 ` [PATCH 7/7] r8152: Convert from tasklet to BH workqueue Tejun Heo
2024-02-22 3:33 ` [PATCHSET v2 wq/6.10] workqueue: Implement disable/enable_work() Lai Jiangshan
2024-02-22 4:59 ` Lai Jiangshan
2024-02-22 8:56 ` Tejun Heo
2024-02-22 9:16 ` Tejun Heo
2024-02-25 10:55 ` Lai Jiangshan
2024-02-26 18:53 ` Tejun Heo
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=20240221174333.700197-5-tj@kernel.org \
--to=tj@kernel.org \
--cc=allen.lkml@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox