diff options
author | Tejun Heo <tj@kernel.org> | 2010-07-02 04:03:51 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-07-02 04:59:57 -0400 |
commit | bdbc5dd7de5d07d6c9d3536e598956165a031d4c (patch) | |
tree | 1f0f263126c2fc2e07a032df1e9ad3fecb534c9a /include/linux | |
parent | ad72cf9885c536e3adae03f8337557ac9dd1e4bb (diff) |
workqueue: prepare for WQ_UNBOUND implementation
In preparation of WQ_UNBOUND addition, make the following changes.
* Add WORK_CPU_* constants for pseudo cpu id numbers used (currently
only WORK_CPU_NONE) and use them instead of NR_CPUS. This is to
allow another pseudo cpu id for unbound cpu.
* Reorder WQ_* flags.
* Make workqueue_struct->cpu_wq a union which contains a percpu
pointer, regular pointer and an unsigned long value and use
kzalloc/kfree() in UP allocation path. This will be used to
implement unbound workqueues which will use only one cwq on SMPs.
* Move alloc_cwqs() allocation after initialization of wq fields, so
that alloc_cwqs() has access to wq->flags.
* Trivial relocation of wq local variables in freeze functions.
These changes don't cause any functional change.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/workqueue.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 3f36d37ac5ba..139069a6286c 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
@@ -50,6 +50,10 @@ enum { | |||
50 | WORK_NR_COLORS = (1 << WORK_STRUCT_COLOR_BITS) - 1, | 50 | WORK_NR_COLORS = (1 << WORK_STRUCT_COLOR_BITS) - 1, |
51 | WORK_NO_COLOR = WORK_NR_COLORS, | 51 | WORK_NO_COLOR = WORK_NR_COLORS, |
52 | 52 | ||
53 | /* special cpu IDs */ | ||
54 | WORK_CPU_NONE = NR_CPUS, | ||
55 | WORK_CPU_LAST = WORK_CPU_NONE, | ||
56 | |||
53 | /* | 57 | /* |
54 | * Reserve 6 bits off of cwq pointer w/ debugobjects turned | 58 | * Reserve 6 bits off of cwq pointer w/ debugobjects turned |
55 | * off. This makes cwqs aligned to 64 bytes which isn't too | 59 | * off. This makes cwqs aligned to 64 bytes which isn't too |
@@ -60,7 +64,7 @@ enum { | |||
60 | 64 | ||
61 | WORK_STRUCT_FLAG_MASK = (1UL << WORK_STRUCT_FLAG_BITS) - 1, | 65 | WORK_STRUCT_FLAG_MASK = (1UL << WORK_STRUCT_FLAG_BITS) - 1, |
62 | WORK_STRUCT_WQ_DATA_MASK = ~WORK_STRUCT_FLAG_MASK, | 66 | WORK_STRUCT_WQ_DATA_MASK = ~WORK_STRUCT_FLAG_MASK, |
63 | WORK_STRUCT_NO_CPU = NR_CPUS << WORK_STRUCT_FLAG_BITS, | 67 | WORK_STRUCT_NO_CPU = WORK_CPU_NONE << WORK_STRUCT_FLAG_BITS, |
64 | 68 | ||
65 | /* bit mask for work_busy() return values */ | 69 | /* bit mask for work_busy() return values */ |
66 | WORK_BUSY_PENDING = 1 << 0, | 70 | WORK_BUSY_PENDING = 1 << 0, |
@@ -227,9 +231,9 @@ static inline unsigned int work_static(struct work_struct *work) { return 0; } | |||
227 | clear_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)) | 231 | clear_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)) |
228 | 232 | ||
229 | enum { | 233 | enum { |
230 | WQ_FREEZEABLE = 1 << 0, /* freeze during suspend */ | 234 | WQ_NON_REENTRANT = 1 << 0, /* guarantee non-reentrance */ |
231 | WQ_SINGLE_CPU = 1 << 1, /* only single cpu at a time */ | 235 | WQ_SINGLE_CPU = 1 << 1, /* only single cpu at a time */ |
232 | WQ_NON_REENTRANT = 1 << 2, /* guarantee non-reentrance */ | 236 | WQ_FREEZEABLE = 1 << 2, /* freeze during suspend */ |
233 | WQ_RESCUER = 1 << 3, /* has an rescue worker */ | 237 | WQ_RESCUER = 1 << 3, /* has an rescue worker */ |
234 | WQ_HIGHPRI = 1 << 4, /* high priority */ | 238 | WQ_HIGHPRI = 1 << 4, /* high priority */ |
235 | WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */ | 239 | WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */ |