diff options
author | Tejun Heo <tj@kernel.org> | 2017-07-23 08:36:15 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2017-07-25 13:28:56 -0400 |
commit | 0a94efb5acbb6980d7c9ab604372d93cd507e4d8 (patch) | |
tree | f3ac747f0130dd53b5a704e56f1ccede24d90f31 /include/linux/workqueue.h | |
parent | 5c0338c68706be53b3dc472e4308961c36e4ece1 (diff) |
workqueue: implicit ordered attribute should be overridable
5c0338c68706 ("workqueue: restore WQ_UNBOUND/max_active==1 to be
ordered") automatically enabled ordered attribute for unbound
workqueues w/ max_active == 1. Because ordered workqueues reject
max_active and some attribute changes, this implicit ordered mode
broke cases where the user creates an unbound workqueue w/ max_active
== 1 and later explicitly changes the related attributes.
This patch distinguishes explicit and implicit ordered setting and
overrides from attribute changes if implict.
Signed-off-by: Tejun Heo <tj@kernel.org>
Fixes: 5c0338c68706 ("workqueue: restore WQ_UNBOUND/max_active==1 to be ordered")
Diffstat (limited to 'include/linux/workqueue.h')
-rw-r--r-- | include/linux/workqueue.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index c102ef65cb64..db6dc9dc0482 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
@@ -323,6 +323,7 @@ enum { | |||
323 | 323 | ||
324 | __WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */ | 324 | __WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */ |
325 | __WQ_ORDERED = 1 << 17, /* internal: workqueue is ordered */ | 325 | __WQ_ORDERED = 1 << 17, /* internal: workqueue is ordered */ |
326 | __WQ_ORDERED_EXPLICIT = 1 << 18, /* internal: alloc_ordered_workqueue() */ | ||
326 | __WQ_LEGACY = 1 << 18, /* internal: create*_workqueue() */ | 327 | __WQ_LEGACY = 1 << 18, /* internal: create*_workqueue() */ |
327 | 328 | ||
328 | WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */ | 329 | WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */ |
@@ -422,7 +423,8 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, | |||
422 | * Pointer to the allocated workqueue on success, %NULL on failure. | 423 | * Pointer to the allocated workqueue on success, %NULL on failure. |
423 | */ | 424 | */ |
424 | #define alloc_ordered_workqueue(fmt, flags, args...) \ | 425 | #define alloc_ordered_workqueue(fmt, flags, args...) \ |
425 | alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args) | 426 | alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | \ |
427 | __WQ_ORDERED_EXPLICIT | (flags), 1, ##args) | ||
426 | 428 | ||
427 | #define create_workqueue(name) \ | 429 | #define create_workqueue(name) \ |
428 | alloc_workqueue("%s", __WQ_LEGACY | WQ_MEM_RECLAIM, 1, (name)) | 430 | alloc_workqueue("%s", __WQ_LEGACY | WQ_MEM_RECLAIM, 1, (name)) |