forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'wq-for-5.19-rc1-fixes' of git://git.kernel.org/pub/scm/lin…
…ux/kernel/git/tj/wq Pull workqueue fixes from Tejun Heo: "Tetsuo's patch to trigger build warnings if system-wide wq's are flushed along with a TP type update and trivial comment update" * tag 'wq-for-5.19-rc1-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq: workqueue: Switch to new kerneldoc syntax for named variable macro argument workqueue: Fix type of cpu in trace event workqueue: Wrap flush_workqueue() using a macro
- Loading branch information
Showing
3 changed files
with
73 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -406,7 +406,7 @@ alloc_workqueue(const char *fmt, unsigned int flags, int max_active, ...); | |
* alloc_ordered_workqueue - allocate an ordered workqueue | ||
* @fmt: printf format for the name of the workqueue | ||
* @flags: WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful) | ||
* @args...: args for @fmt | ||
* @args: args for @fmt | ||
* | ||
* Allocate an ordered workqueue. An ordered workqueue executes at | ||
* most one work item at any given time in the queued order. They are | ||
|
@@ -445,7 +445,7 @@ extern bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq, | |
struct delayed_work *dwork, unsigned long delay); | ||
extern bool queue_rcu_work(struct workqueue_struct *wq, struct rcu_work *rwork); | ||
|
||
extern void flush_workqueue(struct workqueue_struct *wq); | ||
extern void __flush_workqueue(struct workqueue_struct *wq); | ||
extern void drain_workqueue(struct workqueue_struct *wq); | ||
|
||
extern int schedule_on_each_cpu(work_func_t func); | ||
|
@@ -563,15 +563,23 @@ static inline bool schedule_work(struct work_struct *work) | |
return queue_work(system_wq, work); | ||
} | ||
|
||
/* | ||
* Detect attempt to flush system-wide workqueues at compile time when possible. | ||
* | ||
* See https://lkml.kernel.org/r/[email protected] | ||
* for reasons and steps for converting system-wide workqueues into local workqueues. | ||
*/ | ||
extern void __warn_flushing_systemwide_wq(void) | ||
__compiletime_warning("Please avoid flushing system-wide workqueues."); | ||
|
||
/** | ||
* flush_scheduled_work - ensure that any scheduled work has run to completion. | ||
* | ||
* Forces execution of the kernel-global workqueue and blocks until its | ||
* completion. | ||
* | ||
* Think twice before calling this function! It's very easy to get into | ||
* trouble if you don't take great care. Either of the following situations | ||
* will lead to deadlock: | ||
* It's very easy to get into trouble if you don't take great care. | ||
* Either of the following situations will lead to deadlock: | ||
* | ||
* One of the work items currently on the workqueue needs to acquire | ||
* a lock held by your code or its caller. | ||
|
@@ -586,11 +594,51 @@ static inline bool schedule_work(struct work_struct *work) | |
* need to know that a particular work item isn't queued and isn't running. | ||
* In such cases you should use cancel_delayed_work_sync() or | ||
* cancel_work_sync() instead. | ||
* | ||
* Please stop calling this function! A conversion to stop flushing system-wide | ||
* workqueues is in progress. This function will be removed after all in-tree | ||
* users stopped calling this function. | ||
*/ | ||
static inline void flush_scheduled_work(void) | ||
{ | ||
flush_workqueue(system_wq); | ||
} | ||
/* | ||
* The background of commit 771c035372a036f8 ("deprecate the | ||
* '__deprecated' attribute warnings entirely and for good") is that, | ||
* since Linus builds all modules between every single pull he does, | ||
* the standard kernel build needs to be _clean_ in order to be able to | ||
* notice when new problems happen. Therefore, don't emit warning while | ||
* there are in-tree users. | ||
*/ | ||
#define flush_scheduled_work() \ | ||
({ \ | ||
if (0) \ | ||
__warn_flushing_systemwide_wq(); \ | ||
__flush_workqueue(system_wq); \ | ||
}) | ||
|
||
/* | ||
* Although there is no longer in-tree caller, for now just emit warning | ||
* in order to give out-of-tree callers time to update. | ||
*/ | ||
#define flush_workqueue(wq) \ | ||
({ \ | ||
struct workqueue_struct *_wq = (wq); \ | ||
\ | ||
if ((__builtin_constant_p(_wq == system_wq) && \ | ||
_wq == system_wq) || \ | ||
(__builtin_constant_p(_wq == system_highpri_wq) && \ | ||
_wq == system_highpri_wq) || \ | ||
(__builtin_constant_p(_wq == system_long_wq) && \ | ||
_wq == system_long_wq) || \ | ||
(__builtin_constant_p(_wq == system_unbound_wq) && \ | ||
_wq == system_unbound_wq) || \ | ||
(__builtin_constant_p(_wq == system_freezable_wq) && \ | ||
_wq == system_freezable_wq) || \ | ||
(__builtin_constant_p(_wq == system_power_efficient_wq) && \ | ||
_wq == system_power_efficient_wq) || \ | ||
(__builtin_constant_p(_wq == system_freezable_power_efficient_wq) && \ | ||
_wq == system_freezable_power_efficient_wq)) \ | ||
__warn_flushing_systemwide_wq(); \ | ||
__flush_workqueue(_wq); \ | ||
}) | ||
|
||
/** | ||
* schedule_delayed_work_on - queue work in global workqueue on CPU after delay | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters