Since commit a2c1c57be8d9fd5b716113c8991d3d702eeacf77, workqueue: consider work function when searching for busy work items work items whose work functions are re-assigned are no longer guaranteed non-reentrancy with the previously assigned work function. For example, PREPARE_WORK(&work, funcA) schedule_work(&work) . < funcA starts > . PREPARE_WORK(&work, funcB) schedule_work(&work) funcA() may run concurrently with funcB(). The work item non-reentrancy guarantee is a crucial design guarantee which, if violated, may not have obvious consequences. For example, the entire firewire subsystem expects the as-documented per-work item non-reentrancy guarantee, which was the behavior prior to the above commit, not the per-work function + per-work item behavior since. Document the known exceptions to this guarantee. Cc: Stefan Richter <stefanr@xxxxxxxxxxxxxxxxx> Cc: <stable@xxxxxxxxxxxxxxx> Signed-off-by: Peter Hurley <peter@xxxxxxxxxxxxxxxxxx> --- Documentation/workqueue.txt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Documentation/workqueue.txt b/Documentation/workqueue.txt index f81a65b..5b49491 100644 --- a/Documentation/workqueue.txt +++ b/Documentation/workqueue.txt @@ -223,9 +223,17 @@ resources, scheduled and executed. This flag is meaningless for unbound wq. -Note that the flag WQ_NON_REENTRANT no longer exists as all workqueues -are now non-reentrant - any work item is guaranteed to be executed by -at most one worker system-wide at any given time. +Note that the flag WQ_NON_REENTRANT no longer exists. +Generally, workqueues are non-reentrant -- a work item will be executed +by at most one worker system-wide at any given time. However, this +non-reentrancy guarantee does not extend to work items whose function +is re-assigned (for example, via PREPARE_WORK/PREPARE_DELAYED_WORK) +and re-queued for execution; the newly scheduled work may run concurrently +with the previous work item function. + +Note that WQ_UNBOUND workqueues, such as system_unbound_wq, have no +non-reentrancy guarantees as these workqueues do not provide concurrency +management. @max_active: -- 1.8.1.2 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html