Messages in this thread Patch in this message | | | From | Peter Hurley <> | Subject | [PATCH] workqueue: Document exceptions to work item non-reentrancy guarantee | Date | Sat, 15 Feb 2014 14:38:39 -0500 |
| |
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@s5r6.in-berlin.de> Cc: <stable@vger.kernel.org> Signed-off-by: Peter Hurley <peter@hurleysoftware.com> --- 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
| |