[lkml]   [2013]   [Feb]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
Subject[PATCH wq/for-3.9] workqueue: make work->data point to pool after try_to_grab_pending()
From: Lai Jiangshan <>

We plan to use work->data pointing to cwq as the synchronization
invariant when determining whether a given work item is on a locked
pool or not, which requires work->data pointing to cwq only while the
work item is queued on the associated pool.

With delayed_work updated not to overload work->data for target
workqueue recording, the only case where we still have off-queue
work->data pointing to cwq is try_to_grab_pending() which doesn't
update work->data after stealing a queued work item. There's no
reason for try_to_grab_pending() to not update work->data to point to
the pool instead of cwq, like the normal execution does.

This patch adds set_work_pool_and_keep_pending() which makes
work->data point to pool instead of cwq but keeps the pending bit
unlike set_work_pool_and_clear_pending() (surprise!).

After this patch, it's guaranteed that only queued work items point to

This patch doesn't introduce any visible behavior change.

tj: Renamed the new helper function to match
set_work_pool_and_clear_pending() and rewrote the description.

Signed-off-by: Lai Jiangshan <>
Signed-off-by: Tejun Heo <>
kernel/workqueue.c | 10 ++++++++++
1 file changed, 10 insertions(+)

--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -556,6 +556,13 @@ static void set_work_cwq(struct work_str

+static void set_work_pool_and_keep_pending(struct work_struct *work,
+ int pool_id)
+ set_work_data(work, (unsigned long)pool_id << WORK_OFFQ_POOL_SHIFT,
static void set_work_pool_and_clear_pending(struct work_struct *work,
int pool_id)
@@ -1115,6 +1122,9 @@ static int try_to_grab_pending(struct wo

+ /* work->data points to cwq iff queued, point to pool */
+ set_work_pool_and_keep_pending(work, pool->id);
return 1;

 \ /
  Last update: 2013-02-07 02:41    [W:0.187 / U:0.700 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site