sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}(hhparenthuba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget&/translations/zh_CN/core-api/workqueuemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}(hhhh2ubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_TW/core-api/workqueuemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}(hhhhFubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/it_IT/core-api/workqueuemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}(hhhhZubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ja_JP/core-api/workqueuemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}(hhhhnubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ko_KR/core-api/workqueuemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}(hhhhubah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/sp_SP/core-api/workqueuemodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(h Workqueueh]h Workqueue}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh@/var/lib/git/docbuild/linux/Documentation/core-api/workqueue.rsthKubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hDateh]hDate}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(hSeptember, 2010h]h paragraph)}(hhh]hSeptember, 2010}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hAuthorh]hAuthor}(hhhhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(hTejun Heo h]h)}(hjh](h Tejun Heo <}(h Tejun Heo }(h>hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hAuthorh]hAuthor}(hj=hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hhhKubh)}(h'Florian Mickler h]h)}(h%Florian Mickler h](hFlorian Mickler <}(hFlorian Mickler }(hj%hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjIubah}(h]h ]h"]h$]h&]uh1hhj8ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK ubh)}(hThere are many cases where an asynchronous process execution context is needed and the workqueue (wq) API is the most commonly used mechanism for such cases.h]hThere are many cases where an asynchronous process execution context is needed and the workqueue (wq) API is the most commonly used mechanism for such cases.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjhhubh)}(hWhen such an asynchronous execution context is needed, a work item describing which function to execute is put on a queue. An independent thread serves as the asynchronous execution context. The queue is called workqueue and the thread is called worker.h]hWhen such an asynchronous execution context is needed, a work item describing which function to execute is put on a queue. An independent thread serves as the asynchronous execution context. The queue is called workqueue and the thread is called worker.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXWhile there are work items on the workqueue the worker executes the functions associated with the work items one after the other. When there is no work item left on the workqueue the worker becomes idle. When a new work item gets queued, the worker begins executing again.h]hXWhile there are work items on the workqueue the worker executes the functions associated with the work items one after the other. When there is no work item left on the workqueue the worker becomes idle. When a new work item gets queued, the worker begins executing again.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(h"Why Concurrency Managed Workqueue?h]h"Why Concurrency Managed Workqueue?}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXIn the original wq implementation, a multi threaded (MT) wq had one worker thread per CPU and a single threaded (ST) wq had one worker thread system-wide. A single MT wq needed to keep around the same number of workers as the number of CPUs. The kernel grew a lot of MT wq users over the years and with the number of CPU cores continuously rising, some systems saturated the default 32k PID space just booting up.h]hXIn the original wq implementation, a multi threaded (MT) wq had one worker thread per CPU and a single threaded (ST) wq had one worker thread system-wide. A single MT wq needed to keep around the same number of workers as the number of CPUs. The kernel grew a lot of MT wq users over the years and with the number of CPU cores continuously rising, some systems saturated the default 32k PID space just booting up.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXAlthough MT wq wasted a lot of resource, the level of concurrency provided was unsatisfactory. The limitation was common to both ST and MT wq albeit less severe on MT. Each wq maintained its own separate worker pool. An MT wq could provide only one execution context per CPU while an ST wq one for the whole system. Work items had to compete for those very limited execution contexts leading to various problems including proneness to deadlocks around the single execution context.h]hXAlthough MT wq wasted a lot of resource, the level of concurrency provided was unsatisfactory. The limitation was common to both ST and MT wq albeit less severe on MT. Each wq maintained its own separate worker pool. An MT wq could provide only one execution context per CPU while an ST wq one for the whole system. Work items had to compete for those very limited execution contexts leading to various problems including proneness to deadlocks around the single execution context.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjhhubh)}(hXThe tension between the provided level of concurrency and resource usage also forced its users to make unnecessary tradeoffs like libata choosing to use ST wq for polling PIOs and accepting an unnecessary limitation that no two polling PIOs can progress at the same time. As MT wq don't provide much better concurrency, users which require higher level of concurrency, like async or fscache, had to implement their own thread pool.h]hXThe tension between the provided level of concurrency and resource usage also forced its users to make unnecessary tradeoffs like libata choosing to use ST wq for polling PIOs and accepting an unnecessary limitation that no two polling PIOs can progress at the same time. As MT wq don’t provide much better concurrency, users which require higher level of concurrency, like async or fscache, had to implement their own thread pool.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjhhubh)}(hcConcurrency Managed Workqueue (cmwq) is a reimplementation of wq with focus on the following goals.h]hcConcurrency Managed Workqueue (cmwq) is a reimplementation of wq with focus on the following goals.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjhhubh bullet_list)}(hhh](h list_item)}(h8Maintain compatibility with the original workqueue API. h]h)}(h7Maintain compatibility with the original workqueue API.h]h7Maintain compatibility with the original workqueue API.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hUse per-CPU unified worker pools shared by all wq to provide flexible level of concurrency on demand without wasting a lot of resource. h]h)}(hUse per-CPU unified worker pools shared by all wq to provide flexible level of concurrency on demand without wasting a lot of resource.h]hUse per-CPU unified worker pools shared by all wq to provide flexible level of concurrency on demand without wasting a lot of resource.}(hj3hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK= 3, ::h](hAnd with cmwq with }(hAnd with cmwq with hjhhhNhNubj)}(h``@max_active``h]h @max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh >= 3,}(h >= 3,hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM%hjZhhubj)}(hXhTIME IN MSECS EVENT 0 w0 starts and burns CPU 5 w0 sleeps 5 w1 starts and burns CPU 10 w1 sleeps 10 w2 starts and burns CPU 15 w2 sleeps 15 w0 wakes up and burns CPU 20 w0 finishes 20 w1 wakes up and finishes 25 w2 wakes up and finishesh]hXhTIME IN MSECS EVENT 0 w0 starts and burns CPU 5 w0 sleeps 5 w1 starts and burns CPU 10 w1 sleeps 10 w2 starts and burns CPU 15 w2 sleeps 15 w0 wakes up and burns CPU 20 w0 finishes 20 w1 wakes up and finishes 25 w2 wakes up and finishes}(hhhjubah}(h]h ]h"]h$]h&]jjuh1jhhhM'hjZhhubh)}(hIf ``@max_active`` == 2, ::h](hIf }(hIf hjhhhNhNubj)}(h``@max_active``h]h @max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh == 2,}(h == 2,hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM3hjZhhubj)}(hXhTIME IN MSECS EVENT 0 w0 starts and burns CPU 5 w0 sleeps 5 w1 starts and burns CPU 10 w1 sleeps 15 w0 wakes up and burns CPU 20 w0 finishes 20 w1 wakes up and finishes 20 w2 starts and burns CPU 25 w2 sleeps 35 w2 wakes up and finishesh]hXhTIME IN MSECS EVENT 0 w0 starts and burns CPU 5 w0 sleeps 5 w1 starts and burns CPU 10 w1 sleeps 15 w0 wakes up and burns CPU 20 w0 finishes 20 w1 wakes up and finishes 20 w2 starts and burns CPU 25 w2 sleeps 35 w2 wakes up and finishes}(hhhjubah}(h]h ]h"]h$]h&]jjuh1jhhhM5hjZhhubh)}(hbNow, let's assume w1 and w2 are queued to a different wq q1 which has ``WQ_CPU_INTENSIVE`` set, ::h](hHNow, let’s assume w1 and w2 are queued to a different wq q1 which has }(hFNow, let's assume w1 and w2 are queued to a different wq q1 which has hjhhhNhNubj)}(h``WQ_CPU_INTENSIVE``h]hWQ_CPU_INTENSIVE}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh set,}(h set,hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMAhjZhhubj)}(hXFTIME IN MSECS EVENT 0 w0 starts and burns CPU 5 w0 sleeps 5 w1 and w2 start and burn CPU 10 w1 sleeps 15 w2 sleeps 15 w0 wakes up and burns CPU 20 w0 finishes 20 w1 wakes up and finishes 25 w2 wakes up and finishesh]hXFTIME IN MSECS EVENT 0 w0 starts and burns CPU 5 w0 sleeps 5 w1 and w2 start and burn CPU 10 w1 sleeps 15 w2 sleeps 15 w0 wakes up and burns CPU 20 w0 finishes 20 w1 wakes up and finishes 25 w2 wakes up and finishes}(hhhj5ubah}(h]h ]h"]h$]h&]jjuh1jhhhMDhjZhhubeh}(h]example-execution-scenariosah ]h"]example execution scenariosah$]h&]uh1hhhhhhhhM ubh)}(hhh](h)}(h Guidelinesh]h Guidelines}(hjPhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhhhhhMQubj)}(hhh](j)}(hXMDo not forget to use ``WQ_MEM_RECLAIM`` if a wq may process work items which are used during memory reclaim. Each wq with ``WQ_MEM_RECLAIM`` set has an execution context reserved for it. If there is dependency among multiple work items used during memory reclaim, they should be queued to separate wq each with ``WQ_MEM_RECLAIM``. h]h)}(hXLDo not forget to use ``WQ_MEM_RECLAIM`` if a wq may process work items which are used during memory reclaim. Each wq with ``WQ_MEM_RECLAIM`` set has an execution context reserved for it. If there is dependency among multiple work items used during memory reclaim, they should be queued to separate wq each with ``WQ_MEM_RECLAIM``.h](hDo not forget to use }(hDo not forget to use hjchhhNhNubj)}(h``WQ_MEM_RECLAIM``h]hWQ_MEM_RECLAIM}(hhhjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubhT if a wq may process work items which are used during memory reclaim. Each wq with }(hT if a wq may process work items which are used during memory reclaim. Each wq with hjchhhNhNubj)}(h``WQ_MEM_RECLAIM``h]hWQ_MEM_RECLAIM}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh set has an execution context reserved for it. If there is dependency among multiple work items used during memory reclaim, they should be queued to separate wq each with }(h set has an execution context reserved for it. If there is dependency among multiple work items used during memory reclaim, they should be queued to separate wq each with hjchhhNhNubj)}(h``WQ_MEM_RECLAIM``h]hWQ_MEM_RECLAIM}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh.}(h.hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMShj_ubah}(h]h ]h"]h$]h&]uh1jhj\hhhhhNubj)}(hCUnless strict ordering is required, there is no need to use ST wq. h]h)}(hBUnless strict ordering is required, there is no need to use ST wq.h]hBUnless strict ordering is required, there is no need to use ST wq.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhjubah}(h]h ]h"]h$]h&]uh1jhj\hhhhhNubj)}(hUnless there is a specific need, using 0 for @max_active is recommended. In most use cases, concurrency level usually stays well under the default limit. h]h)}(hUnless there is a specific need, using 0 for @max_active is recommended. In most use cases, concurrency level usually stays well under the default limit.h]hUnless there is a specific need, using 0 for @max_active is recommended. In most use cases, concurrency level usually stays well under the default limit.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM\hjubah}(h]h ]h"]h$]h&]uh1jhj\hhhhhNubj)}(hXA wq serves as a domain for forward progress guarantee (``WQ_MEM_RECLAIM``, flush and work item attributes. Work items which are not involved in memory reclaim and don't need to be flushed as a part of a group of work items, and don't require any special attribute, can use one of the system wq. There is no difference in execution characteristics between using a dedicated wq and a system wq. h]h)}(hXA wq serves as a domain for forward progress guarantee (``WQ_MEM_RECLAIM``, flush and work item attributes. Work items which are not involved in memory reclaim and don't need to be flushed as a part of a group of work items, and don't require any special attribute, can use one of the system wq. There is no difference in execution characteristics between using a dedicated wq and a system wq.h](h8A wq serves as a domain for forward progress guarantee (}(h8A wq serves as a domain for forward progress guarantee (hjhhhNhNubj)}(h``WQ_MEM_RECLAIM``h]hWQ_MEM_RECLAIM}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhXE, flush and work item attributes. Work items which are not involved in memory reclaim and don’t need to be flushed as a part of a group of work items, and don’t require any special attribute, can use one of the system wq. There is no difference in execution characteristics between using a dedicated wq and a system wq.}(hXA, flush and work item attributes. Work items which are not involved in memory reclaim and don't need to be flushed as a part of a group of work items, and don't require any special attribute, can use one of the system wq. There is no difference in execution characteristics between using a dedicated wq and a system wq.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM`hjubah}(h]h ]h"]h$]h&]uh1jhj\hhhhhNubj)}(hUnless work items are expected to consume a huge amount of CPU cycles, using a bound wq is usually beneficial due to the increased level of locality in wq operations and work item execution. h]h)}(hUnless work items are expected to consume a huge amount of CPU cycles, using a bound wq is usually beneficial due to the increased level of locality in wq operations and work item execution.h]hUnless work items are expected to consume a huge amount of CPU cycles, using a bound wq is usually beneficial due to the increased level of locality in wq operations and work item execution.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhhj ubah}(h]h ]h"]h$]h&]uh1jhj\hhhhhNubeh}(h]h ]h"]h$]h&]jcjduh1jhhhMShjKhhubeh}(h] guidelinesah ]h"] guidelinesah$]h&]uh1hhhhhhhhMQubh)}(hhh](h)}(hAffinity Scopesh]hAffinity Scopes}(hj8 hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3 hhhhhMnubh)}(hXAn unbound workqueue groups CPUs according to its affinity scope to improve cache locality. For example, if a workqueue is using the default affinity scope of "cache", it will group CPUs according to last level cache boundaries. A work item queued on the workqueue will be assigned to a worker on one of the CPUs which share the last level cache with the issuing CPU. Once started, the worker may or may not be allowed to move outside the scope depending on the ``affinity_strict`` setting of the scope.h](hXAn unbound workqueue groups CPUs according to its affinity scope to improve cache locality. For example, if a workqueue is using the default affinity scope of “cache”, it will group CPUs according to last level cache boundaries. A work item queued on the workqueue will be assigned to a worker on one of the CPUs which share the last level cache with the issuing CPU. Once started, the worker may or may not be allowed to move outside the scope depending on the }(hXAn unbound workqueue groups CPUs according to its affinity scope to improve cache locality. For example, if a workqueue is using the default affinity scope of "cache", it will group CPUs according to last level cache boundaries. A work item queued on the workqueue will be assigned to a worker on one of the CPUs which share the last level cache with the issuing CPU. Once started, the worker may or may not be allowed to move outside the scope depending on the hjD hhhNhNubj)}(h``affinity_strict``h]haffinity_strict}(hhhjM hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD ubh setting of the scope.}(h setting of the scope.hjD hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMphj3 hhubh)}(h;Workqueue currently supports the following affinity scopes.h]h;Workqueue currently supports the following affinity scopes.}(hjh hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMxhj3 hhubjd)}(hhh](ji)}(h``default`` Use the scope in module parameter ``workqueue.default_affinity_scope`` which is always set to one of the scopes below. h](jo)}(h ``default``h]j)}(hj} h]hdefault}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ ubah}(h]h ]h"]h$]h&]uh1jnhhhM|hjw ubj)}(hhh]h)}(hvUse the scope in module parameter ``workqueue.default_affinity_scope`` which is always set to one of the scopes below.h](h"Use the scope in module parameter }(h"Use the scope in module parameter hj hhhNhNubj)}(h$``workqueue.default_affinity_scope``h]h workqueue.default_affinity_scope}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh0 which is always set to one of the scopes below.}(h0 which is always set to one of the scopes below.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM{hj ubah}(h]h ]h"]h$]h&]uh1jhjw ubeh}(h]h ]h"]h$]h&]uh1jhhhhM|hjt ubji)}(h``cpu`` CPUs are not grouped. A work item issued on one CPU is processed by a worker on the same CPU. This makes unbound workqueues behave as per-cpu workqueues without concurrency management. h](jo)}(h``cpu``h]j)}(hj h]hcpu}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jnhhhMhj ubj)}(hhh]h)}(hCPUs are not grouped. A work item issued on one CPU is processed by a worker on the same CPU. This makes unbound workqueues behave as per-cpu workqueues without concurrency management.h]hCPUs are not grouped. A work item issued on one CPU is processed by a worker on the same CPU. This makes unbound workqueues behave as per-cpu workqueues without concurrency management.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhhMhjt hhubji)}(h``smt`` CPUs are grouped according to SMT boundaries. This usually means that the logical threads of each physical CPU core are grouped together. h](jo)}(h``smt``h]j)}(hj h]hsmt}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jnhhhMhj ubj)}(hhh]h)}(hCPUs are grouped according to SMT boundaries. This usually means that the logical threads of each physical CPU core are grouped together.h]hCPUs are grouped according to SMT boundaries. This usually means that the logical threads of each physical CPU core are grouped together.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhhMhjt hhubji)}(h``cache`` CPUs are grouped according to cache boundaries. Which specific cache boundary is used is determined by the arch code. L3 is used in a lot of cases. This is the default affinity scope. h](jo)}(h ``cache``h]j)}(hj9 h]hcache}(hhhj; hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7 ubah}(h]h ]h"]h$]h&]uh1jnhhhMhj3 ubj)}(hhh]h)}(hCPUs are grouped according to cache boundaries. Which specific cache boundary is used is determined by the arch code. L3 is used in a lot of cases. This is the default affinity scope.h]hCPUs are grouped according to cache boundaries. Which specific cache boundary is used is determined by the arch code. L3 is used in a lot of cases. This is the default affinity scope.}(hjS hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjN ubah}(h]h ]h"]h$]h&]uh1jhj3 ubeh}(h]h ]h"]h$]h&]uh1jhhhhMhjt hhubji)}(h8``numa`` CPUs are grouped according to NUMA boundaries. h](jo)}(h``numa``h]j)}(hjq h]hnuma}(hhhjs hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo ubah}(h]h ]h"]h$]h&]uh1jnhhhMhjk ubj)}(hhh]h)}(h.CPUs are grouped according to NUMA boundaries.h]h.CPUs are grouped according to NUMA boundaries.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhjk ubeh}(h]h ]h"]h$]h&]uh1jhhhhMhjt hhubji)}(h``system`` All CPUs are put in the same group. Workqueue makes no effort to process a work item on a CPU close to the issuing CPU. h](jo)}(h ``system``h]j)}(hj h]hsystem}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jnhhhMhj ubj)}(hhh]h)}(hwAll CPUs are put in the same group. Workqueue makes no effort to process a work item on a CPU close to the issuing CPU.h]hwAll CPUs are put in the same group. Workqueue makes no effort to process a work item on a CPU close to the issuing CPU.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhhMhjt hhubeh}(h]h ]h"]h$]h&]uh1jchj3 hhhhhNubh)}(hThe default affinity scope can be changed with the module parameter ``workqueue.default_affinity_scope`` and a specific workqueue's affinity scope can be changed using ``apply_workqueue_attrs()``.h](hDThe default affinity scope can be changed with the module parameter }(hDThe default affinity scope can be changed with the module parameter hj hhhNhNubj)}(h$``workqueue.default_affinity_scope``h]h workqueue.default_affinity_scope}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhB and a specific workqueue’s affinity scope can be changed using }(h@ and a specific workqueue's affinity scope can be changed using hj hhhNhNubj)}(h``apply_workqueue_attrs()``h]happly_workqueue_attrs()}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh.}(hjhj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj3 hhubh)}(hIf ``WQ_SYSFS`` is set, the workqueue will have the following affinity scope related interface files under its ``/sys/devices/virtual/workqueue/WQ_NAME/`` directory.h](hIf }(hIf hj hhhNhNubj)}(h ``WQ_SYSFS``h]hWQ_SYSFS}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh` is set, the workqueue will have the following affinity scope related interface files under its }(h` is set, the workqueue will have the following affinity scope related interface files under its hj hhhNhNubj)}(h+``/sys/devices/virtual/workqueue/WQ_NAME/``h]h'/sys/devices/virtual/workqueue/WQ_NAME/}(hhhj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh directory.}(h directory.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj3 hhubjd)}(hhh](ji)}(h``affinity_scope`` Read to see the current affinity scope. Write to change. When default is the current scope, reading this file will also show the current effective scope in parentheses, for example, ``default (cache)``. h](jo)}(h``affinity_scope``h]j)}(hjS h]haffinity_scope}(hhhjU hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ ubah}(h]h ]h"]h$]h&]uh1jnhhhMhjM ubj)}(hhh](h)}(h8Read to see the current affinity scope. Write to change.h]h8Read to see the current affinity scope. Write to change.}(hjm hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjh ubh)}(hWhen default is the current scope, reading this file will also show the current effective scope in parentheses, for example, ``default (cache)``.h](h}When default is the current scope, reading this file will also show the current effective scope in parentheses, for example, }(h}When default is the current scope, reading this file will also show the current effective scope in parentheses, for example, hjy hhhNhNubj)}(h``default (cache)``h]hdefault (cache)}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy ubh.}(hjhjy hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjh ubeh}(h]h ]h"]h$]h&]uh1jhjM ubeh}(h]h ]h"]h$]h&]uh1jhhhhMhjJ ubji)}(hX``affinity_strict`` 0 by default indicating that affinity scopes are not strict. When a work item starts execution, workqueue makes a best-effort attempt to ensure that the worker is inside its affinity scope, which is called repatriation. Once started, the scheduler is free to move the worker anywhere in the system as it sees fit. This enables benefiting from scope locality while still being able to utilize other CPUs if necessary and available. If set to 1, all workers of the scope are guaranteed always to be in the scope. This may be useful when crossing affinity scopes has other implications, for example, in terms of power consumption or workload isolation. Strict NUMA scope can also be used to match the workqueue behavior of older kernels. #h](jo)}(h``affinity_strict``h]j)}(hj h]haffinity_strict}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jnhhhMhj ubj)}(hhh](h)}(hX0 by default indicating that affinity scopes are not strict. When a work item starts execution, workqueue makes a best-effort attempt to ensure that the worker is inside its affinity scope, which is called repatriation. Once started, the scheduler is free to move the worker anywhere in the system as it sees fit. This enables benefiting from scope locality while still being able to utilize other CPUs if necessary and available.h]hX0 by default indicating that affinity scopes are not strict. When a work item starts execution, workqueue makes a best-effort attempt to ensure that the worker is inside its affinity scope, which is called repatriation. Once started, the scheduler is free to move the worker anywhere in the system as it sees fit. This enables benefiting from scope locality while still being able to utilize other CPUs if necessary and available.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(hX/If set to 1, all workers of the scope are guaranteed always to be in the scope. This may be useful when crossing affinity scopes has other implications, for example, in terms of power consumption or workload isolation. Strict NUMA scope can also be used to match the workqueue behavior of older kernels.h]hX/If set to 1, all workers of the scope are guaranteed always to be in the scope. This may be useful when crossing affinity scopes has other implications, for example, in terms of power consumption or workload isolation. Strict NUMA scope can also be used to match the workqueue behavior of older kernels.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhhMhjJ hhubeh}(h]h ]h"]h$]h&]uh1jchj3 hhhhhNubeh}(h]affinity-scopesah ]h"]affinity scopesah$]h&]uh1hhhhhhhhMnubh)}(hhh](h)}(hAffinity Scopes and Performanceh]hAffinity Scopes and Performance}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(hX%It'd be ideal if an unbound workqueue's behavior is optimal for vast majority of use cases without further tuning. Unfortunately, in the current kernel, there exists a pronounced trade-off between locality and utilization necessitating explicit configurations when workqueues are heavily used.h]hX)It’d be ideal if an unbound workqueue’s behavior is optimal for vast majority of use cases without further tuning. Unfortunately, in the current kernel, there exists a pronounced trade-off between locality and utilization necessitating explicit configurations when workqueues are heavily used.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hXcHigher locality leads to higher efficiency where more work is performed for the same number of consumed CPU cycles. However, higher locality may also cause lower overall system utilization if the work items are not spread enough across the affinity scopes by the issuers. The following performance testing with dm-crypt clearly illustrates this trade-off.h]hXcHigher locality leads to higher efficiency where more work is performed for the same number of consumed CPU cycles. However, higher locality may also cause lower overall system utilization if the work items are not spread enough across the affinity scopes by the issuers. The following performance testing with dm-crypt clearly illustrates this trade-off.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hXThe tests are run on a CPU with 12-cores/24-threads split across four L3 caches (AMD Ryzen 9 3900x). CPU clock boost is turned off for consistency. ``/dev/dm-0`` is a dm-crypt device created on NVME SSD (Samsung 990 PRO) and opened with ``cryptsetup`` with default settings.h](hThe tests are run on a CPU with 12-cores/24-threads split across four L3 caches (AMD Ryzen 9 3900x). CPU clock boost is turned off for consistency. }(hThe tests are run on a CPU with 12-cores/24-threads split across four L3 caches (AMD Ryzen 9 3900x). CPU clock boost is turned off for consistency. hj' hhhNhNubj)}(h ``/dev/dm-0``h]h /dev/dm-0}(hhhj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj' ubhL is a dm-crypt device created on NVME SSD (Samsung 990 PRO) and opened with }(hL is a dm-crypt device created on NVME SSD (Samsung 990 PRO) and opened with hj' hhhNhNubj)}(h``cryptsetup``h]h cryptsetup}(hhhjC hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj' ubh with default settings.}(h with default settings.hj' hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hhh](h)}(h=Scenario 1: Enough issuers and work spread across the machineh]h=Scenario 1: Enough issuers and work spread across the machine}(hja hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\ hhhhhMubh)}(hThe command used: ::h]hThe command used:}(hThe command used:hjm hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj\ hhubj)}(h$ fio --filename=/dev/dm-0 --direct=1 --rw=randrw --bs=32k --ioengine=libaio \ --iodepth=64 --runtime=60 --numjobs=24 --time_based --group_reporting \ --name=iops-test-job --verify=sha512h]h$ fio --filename=/dev/dm-0 --direct=1 --rw=randrw --bs=32k --ioengine=libaio \ --iodepth=64 --runtime=60 --numjobs=24 --time_based --group_reporting \ --name=iops-test-job --verify=sha512}(hhhj| ubah}(h]h ]h"]h$]h&]jjuh1jhhhMhj\ hhubh)}(hXThere are 24 issuers, each issuing 64 IOs concurrently. ``--verify=sha512`` makes ``fio`` generate and read back the content each time which makes execution locality matter between the issuer and ``kcryptd``. The following are the read bandwidths and CPU utilizations depending on different affinity scope settings on ``kcryptd`` measured over five runs. Bandwidths are in MiBps, and CPU util in percents.h](h8There are 24 issuers, each issuing 64 IOs concurrently. }(h8There are 24 issuers, each issuing 64 IOs concurrently. hj hhhNhNubj)}(h``--verify=sha512``h]h--verify=sha512}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh makes }(h makes hj hhhNhNubj)}(h``fio``h]hfio}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhk generate and read back the content each time which makes execution locality matter between the issuer and }(hk generate and read back the content each time which makes execution locality matter between the issuer and hj hhhNhNubj)}(h ``kcryptd``h]hkcryptd}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubho. The following are the read bandwidths and CPU utilizations depending on different affinity scope settings on }(ho. The following are the read bandwidths and CPU utilizations depending on different affinity scope settings on hj hhhNhNubj)}(h ``kcryptd``h]hkcryptd}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhL measured over five runs. Bandwidths are in MiBps, and CPU util in percents.}(hL measured over five runs. Bandwidths are in MiBps, and CPU util in percents.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj\ hhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]j Kuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]j Kuh1j hj ubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hAffinityh]hAffinity}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(hBandwidth (MiBps)h]hBandwidth (MiBps)}(hj5 hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj0 ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h CPU util (%)h]h CPU util (%)}(hjL hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjG ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1j hj ubhtbody)}(hhh](j )}(hhh](j )}(hhh]h)}(hsystemh]hsystem}(hjw hju hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjr ubah}(h]h ]h"]h$]h&]uh1j hjo ubj )}(hhh]h)}(h1159.40 ±1.34h]h1159.40 ±1.34}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j hjo ubj )}(hhh]h)}(h 99.31 ±0.02h]h 99.31 ±0.02}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j hjo ubeh}(h]h ]h"]h$]h&]uh1j hjl ubj )}(hhh](j )}(hhh]h)}(hcacheh]hcache}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h1166.40 ±0.89h]h1166.40 ±0.89}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h 99.34 ±0.01h]h 99.34 ±0.01}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjl ubj )}(hhh](j )}(hhh]h)}(hcache (strict)h]hcache (strict)}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h1166.00 ±0.71h]h1166.00 ±0.71}(hj*hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj%ubah}(h]h ]h"]h$]h&]uh1j hj ubj )}(hhh]h)}(h 99.35 ±0.01h]h 99.35 ±0.01}(hjAhj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj<ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hjl ubeh}(h]h ]h"]h$]h&]uh1jj hj ubeh}(h]h ]h"]h$]h&]colsKuh1j hj ubah}(h]h ]colwidths-givenah"]h$]h&]uh1j hj\ hhhNhNubh)}(hWith enough issuers spread across the system, there is no downside to "cache", strict or otherwise. All three configurations saturate the whole machine but the cache-affine ones outperform by 0.6% thanks to improved locality.h]hWith enough issuers spread across the system, there is no downside to “cache”, strict or otherwise. All three configurations saturate the whole machine but the cache-affine ones outperform by 0.6% thanks to improved locality.}(hjohjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj\ hhubeh}(h]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMbhj-hhubj)}(hXb$ tools/workqueue/wq_dump.py Affinity Scopes =============== wq_unbound_cpumask=0000000f CPU nr_pods 4 pod_cpus [0]=00000001 [1]=00000002 [2]=00000004 [3]=00000008 pod_node [0]=0 [1]=0 [2]=1 [3]=1 cpu_pod [0]=0 [1]=1 [2]=2 [3]=3 SMT nr_pods 4 pod_cpus [0]=00000001 [1]=00000002 [2]=00000004 [3]=00000008 pod_node [0]=0 [1]=0 [2]=1 [3]=1 cpu_pod [0]=0 [1]=1 [2]=2 [3]=3 CACHE (default) nr_pods 2 pod_cpus [0]=00000003 [1]=0000000c pod_node [0]=0 [1]=1 cpu_pod [0]=0 [1]=0 [2]=1 [3]=1 NUMA nr_pods 2 pod_cpus [0]=00000003 [1]=0000000c pod_node [0]=0 [1]=1 cpu_pod [0]=0 [1]=0 [2]=1 [3]=1 SYSTEM nr_pods 1 pod_cpus [0]=0000000f pod_node [0]=-1 cpu_pod [0]=0 [1]=0 [2]=0 [3]=0 Worker Pools ============ pool[00] ref= 1 nice= 0 idle/workers= 4/ 4 cpu= 0 pool[01] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 0 pool[02] ref= 1 nice= 0 idle/workers= 4/ 4 cpu= 1 pool[03] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 1 pool[04] ref= 1 nice= 0 idle/workers= 4/ 4 cpu= 2 pool[05] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 2 pool[06] ref= 1 nice= 0 idle/workers= 3/ 3 cpu= 3 pool[07] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 3 pool[08] ref=42 nice= 0 idle/workers= 6/ 6 cpus=0000000f pool[09] ref=28 nice= 0 idle/workers= 3/ 3 cpus=00000003 pool[10] ref=28 nice= 0 idle/workers= 17/ 17 cpus=0000000c pool[11] ref= 1 nice=-20 idle/workers= 1/ 1 cpus=0000000f pool[12] ref= 2 nice=-20 idle/workers= 1/ 1 cpus=00000003 pool[13] ref= 2 nice=-20 idle/workers= 1/ 1 cpus=0000000c Workqueue CPU -> pool ===================== [ workqueue \ CPU 0 1 2 3 dfl] events percpu 0 2 4 6 events_highpri percpu 1 3 5 7 events_long percpu 0 2 4 6 events_unbound unbound 9 9 10 10 8 events_freezable percpu 0 2 4 6 events_power_efficient percpu 0 2 4 6 events_freezable_pwr_ef percpu 0 2 4 6 rcu_gp percpu 0 2 4 6 rcu_par_gp percpu 0 2 4 6 slub_flushwq percpu 0 2 4 6 netns ordered 8 8 8 8 8 ...h]hXb$ tools/workqueue/wq_dump.py Affinity Scopes =============== wq_unbound_cpumask=0000000f CPU nr_pods 4 pod_cpus [0]=00000001 [1]=00000002 [2]=00000004 [3]=00000008 pod_node [0]=0 [1]=0 [2]=1 [3]=1 cpu_pod [0]=0 [1]=1 [2]=2 [3]=3 SMT nr_pods 4 pod_cpus [0]=00000001 [1]=00000002 [2]=00000004 [3]=00000008 pod_node [0]=0 [1]=0 [2]=1 [3]=1 cpu_pod [0]=0 [1]=1 [2]=2 [3]=3 CACHE (default) nr_pods 2 pod_cpus [0]=00000003 [1]=0000000c pod_node [0]=0 [1]=1 cpu_pod [0]=0 [1]=0 [2]=1 [3]=1 NUMA nr_pods 2 pod_cpus [0]=00000003 [1]=0000000c pod_node [0]=0 [1]=1 cpu_pod [0]=0 [1]=0 [2]=1 [3]=1 SYSTEM nr_pods 1 pod_cpus [0]=0000000f pod_node [0]=-1 cpu_pod [0]=0 [1]=0 [2]=0 [3]=0 Worker Pools ============ pool[00] ref= 1 nice= 0 idle/workers= 4/ 4 cpu= 0 pool[01] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 0 pool[02] ref= 1 nice= 0 idle/workers= 4/ 4 cpu= 1 pool[03] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 1 pool[04] ref= 1 nice= 0 idle/workers= 4/ 4 cpu= 2 pool[05] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 2 pool[06] ref= 1 nice= 0 idle/workers= 3/ 3 cpu= 3 pool[07] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 3 pool[08] ref=42 nice= 0 idle/workers= 6/ 6 cpus=0000000f pool[09] ref=28 nice= 0 idle/workers= 3/ 3 cpus=00000003 pool[10] ref=28 nice= 0 idle/workers= 17/ 17 cpus=0000000c pool[11] ref= 1 nice=-20 idle/workers= 1/ 1 cpus=0000000f pool[12] ref= 2 nice=-20 idle/workers= 1/ 1 cpus=00000003 pool[13] ref= 2 nice=-20 idle/workers= 1/ 1 cpus=0000000c Workqueue CPU -> pool ===================== [ workqueue \ CPU 0 1 2 3 dfl] events percpu 0 2 4 6 events_highpri percpu 1 3 5 7 events_long percpu 0 2 4 6 events_unbound unbound 9 9 10 10 8 events_freezable percpu 0 2 4 6 events_power_efficient percpu 0 2 4 6 events_freezable_pwr_ef percpu 0 2 4 6 rcu_gp percpu 0 2 4 6 rcu_par_gp percpu 0 2 4 6 slub_flushwq percpu 0 2 4 6 netns ordered 8 8 8 8 8 ...}(hhhjMubah}(h]h ]h"]h$]h&]jjuh1jhhhMehj-hhubh)}(h-See the command's help message for more info.h]h/See the command’s help message for more info.}(hj]hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj-hhubeh}(h]examining-configurationah ]h"]examining configurationah$]h&]uh1hhhhhhhhM`ubh)}(hhh](h)}(h Monitoringh]h Monitoring}(hjvhjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhhhhhMubh)}(hEUse tools/workqueue/wq_monitor.py to monitor workqueue operations: ::h]hBUse tools/workqueue/wq_monitor.py to monitor workqueue operations:}(hBUse tools/workqueue/wq_monitor.py to monitor workqueue operations:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjqhhubj)}(hX$ tools/workqueue/wq_monitor.py events total infl CPUtime CPUhog CMW/RPR mayday rescued events 18545 0 6.1 0 5 - - events_highpri 8 0 0.0 0 0 - - events_long 3 0 0.0 0 0 - - events_unbound 38306 0 0.1 - 7 - - events_freezable 0 0 0.0 0 0 - - events_power_efficient 29598 0 0.2 0 0 - - events_freezable_pwr_ef 10 0 0.0 0 0 - - sock_diag_events 0 0 0.0 0 0 - - total infl CPUtime CPUhog CMW/RPR mayday rescued events 18548 0 6.1 0 5 - - events_highpri 8 0 0.0 0 0 - - events_long 3 0 0.0 0 0 - - events_unbound 38322 0 0.1 - 7 - - events_freezable 0 0 0.0 0 0 - - events_power_efficient 29603 0 0.2 0 0 - - events_freezable_pwr_ef 10 0 0.0 0 0 - - sock_diag_events 0 0 0.0 0 0 - - ...h]hX$ tools/workqueue/wq_monitor.py events total infl CPUtime CPUhog CMW/RPR mayday rescued events 18545 0 6.1 0 5 - - events_highpri 8 0 0.0 0 0 - - events_long 3 0 0.0 0 0 - - events_unbound 38306 0 0.1 - 7 - - events_freezable 0 0 0.0 0 0 - - events_power_efficient 29598 0 0.2 0 0 - - events_freezable_pwr_ef 10 0 0.0 0 0 - - sock_diag_events 0 0 0.0 0 0 - - total infl CPUtime CPUhog CMW/RPR mayday rescued events 18548 0 6.1 0 5 - - events_highpri 8 0 0.0 0 0 - - events_long 3 0 0.0 0 0 - - events_unbound 38322 0 0.1 - 7 - - events_freezable 0 0 0.0 0 0 - - events_power_efficient 29603 0 0.2 0 0 - - events_freezable_pwr_ef 10 0 0.0 0 0 - - sock_diag_events 0 0 0.0 0 0 - - ...}(hhhjubah}(h]h ]h"]h$]h&]jjuh1jhhhMhjqhhubh)}(h-See the command's help message for more info.h]h/See the command’s help message for more info.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjqhhubeh}(h] monitoringah ]h"] monitoringah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(h Debuggingh]h Debugging}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hBecause the work functions are executed by generic worker threads there are a few tricks needed to shed some light on misbehaving workqueue users.h]hBecause the work functions are executed by generic worker threads there are a few tricks needed to shed some light on misbehaving workqueue users.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(h1Worker threads show up in the process list as: ::h]h.Worker threads show up in the process list as:}(h.Worker threads show up in the process list as:hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hX;root 5671 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/0:1] root 5672 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/1:2] root 5673 0.0 0.0 0 0 ? S 12:12 0:00 [kworker/0:0] root 5674 0.0 0.0 0 0 ? S 12:13 0:00 [kworker/1:0]h]hX;root 5671 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/0:1] root 5672 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/1:2] root 5673 0.0 0.0 0 0 ? S 12:12 0:00 [kworker/0:0] root 5674 0.0 0.0 0 0 ? S 12:13 0:00 [kworker/1:0]}(hhhjubah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubh)}(h[If kworkers are going crazy (using too much cpu), there are two types of possible problems:h]h[If kworkers are going crazy (using too much cpu), there are two types of possible problems:}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubjz)}(hhh]henumerated_list)}(hhh](j)}(h-Something being scheduled in rapid successionh]h)}(hj h]h-Something being scheduled in rapid succession}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h4A single work item that consumes lots of cpu cycles h]h)}(h3A single work item that consumes lots of cpu cyclesh]h3A single work item that consumes lots of cpu cycles}(hj$hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffixjuh1jhjubah}(h]h ]h"]h$]h&]uh1jyhjhhhNhNubh)}(h.The first one can be tracked using tracing: ::h]h+The first one can be tracked using tracing:}(h+The first one can be tracked using tracing:hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(h$ echo workqueue:workqueue_queue_work > /sys/kernel/tracing/set_event $ cat /sys/kernel/tracing/trace_pipe > out.txt (wait a few secs) ^Ch]h$ echo workqueue:workqueue_queue_work > /sys/kernel/tracing/set_event $ cat /sys/kernel/tracing/trace_pipe > out.txt (wait a few secs) ^C}(hhhjUubah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubh)}(hIf something is busy looping on work queueing, it would be dominating the output and the offender can be determined with the work item function.h]hIf something is busy looping on work queueing, it would be dominating the output and the offender can be determined with the work item function.}(hjehjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hvFor the second type of problems it should be possible to just check the stack trace of the offending worker thread. ::h]hsFor the second type of problems it should be possible to just check the stack trace of the offending worker thread.}(hsFor the second type of problems it should be possible to just check the stack trace of the offending worker thread.hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(h'$ cat /proc/THE_OFFENDING_KWORKER/stackh]h'$ cat /proc/THE_OFFENDING_KWORKER/stack}(hhhjubah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubh)}(hHThe work item's function should be trivially visible in the stack trace.h]hJThe work item’s function should be trivially visible in the stack trace.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h] debuggingah ]h"] debuggingah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hNon-reentrance Conditionsh]hNon-reentrance Conditions}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hzWorkqueue guarantees that a work item cannot be re-entrant if the following conditions hold after a work item gets queued:h]hzWorkqueue guarantees that a work item cannot be re-entrant if the following conditions hold after a work item gets queued:}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubjz)}(hhh]j)}(hhh](j)}(h&The work function hasn't been changed.h]h)}(hjh]h(The work function hasn’t been changed.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h1No one queues the work item to another workqueue.h]h)}(hjh]h1No one queues the work item to another workqueue.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h'The work item hasn't been reinitiated. h]h)}(h&The work item hasn't been reinitiated.h]h(The work item hasn’t been reinitiated.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j<j=j>hj?juh1jhjubah}(h]h ]h"]h$]h&]uh1jyhjhhhNhNubh)}(hIn other words, if the above conditions hold, the work item is guaranteed to be executed by at most one worker system-wide at any given time.h]hIn other words, if the above conditions hold, the work item is guaranteed to be executed by at most one worker system-wide at any given time.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hNote that requeuing the work item (to the same queue) in the self function doesn't break these conditions, so it's safe to do. Otherwise, caution is required when breaking the conditions inside a work function.h]hNote that requeuing the work item (to the same queue) in the self function doesn’t break these conditions, so it’s safe to do. Otherwise, caution is required when breaking the conditions inside a work function.}(hj+hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]non-reentrance-conditionsah ]h"]non-reentrance conditionsah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(h&Kernel Inline Documentations Referenceh]h&Kernel Inline Documentations Reference}(hjDhjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hhhhhMubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleworkqueue_attrs (C struct)c.workqueue_attrshNtauh1jPhj?hhhNhNubhdesc)}(hhh](hdesc_signature)}(hworkqueue_attrsh]hdesc_signature_line)}(hstruct workqueue_attrsh](hdesc_sig_keyword)}(hstructh]hstruct}(hhhjthhhNhNubah}(h]h ]kah"]h$]h&]uh1jrhjnhhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKubhdesc_sig_space)}(h h]h }(hhhjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjnhhhjhKubh desc_name)}(hworkqueue_attrsh]h desc_sig_name)}(hjjh]hworkqueue_attrs}(hhhjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1jhjnhhhjhKubeh}(h]h ]h"]h$]h&]jj add_permalinkuh1jlsphinx_line_type declaratorhjhhhhjhKubah}(h]j_ah ](sig sig-objecteh"]h$]h&] is_multilineuh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjchhubh desc_content)}(hhh]h)}(h"A struct for workqueue attributes.h]h"A struct for workqueue attributes.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjchhhjhKubeh}(h]h ](cstructeh"]h$]h&]domainjobjtypejdesctypejnoindexuh1jahhhj?hNhNubh container)}(hX**Definition**:: struct workqueue_attrs { int nice; cpumask_var_t cpumask; cpumask_var_t __pod_cpumask; bool affn_strict; enum wq_affn_scope affn_scope; bool ordered; }; **Members** ``nice`` nice level ``cpumask`` allowed CPUs Work items in this workqueue are affine to these CPUs and not allowed to execute on other CPUs. A pool serving a workqueue must have the same **cpumask**. ``__pod_cpumask`` internal attribute used to create per-pod pools Internal use only. Per-pod unbound worker pools are used to improve locality. Always a subset of ->cpumask. A workqueue can be associated with multiple worker pools with disjoint **__pod_cpumask**'s. Whether the enforcement of a pool's **__pod_cpumask** is strict depends on **affn_strict**. ``affn_strict`` affinity scope is strict If clear, workqueue will make a best-effort attempt at starting the worker inside **__pod_cpumask** but the scheduler is free to migrate it outside. If set, workers are only allowed to run inside **__pod_cpumask**. ``affn_scope`` unbound CPU affinity scope CPU pods are used to improve execution locality of unbound work items. There are multiple pod types, one for each wq_affn_scope, and every CPU in the system belongs to one pod in every pod type. CPUs that belong to the same pod share the worker pool. For example, selecting ``WQ_AFFN_NUMA`` makes the workqueue use a separate worker pool for each NUMA node. ``ordered`` work items must be executed one by one in queueing orderh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(h:hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubj)}(hstruct workqueue_attrs { int nice; cpumask_var_t cpumask; cpumask_var_t __pod_cpumask; bool affn_strict; enum wq_affn_scope affn_scope; bool ordered; };h]hstruct workqueue_attrs { int nice; cpumask_var_t cpumask; cpumask_var_t __pod_cpumask; bool affn_strict; enum wq_affn_scope affn_scope; bool ordered; };}(hhhjubah}(h]h ]h"]h$]h&]jjuh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubh)}(h **Members**h]j)}(hj!h]hMembers}(hhhj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubjd)}(hhh](ji)}(h``nice`` nice level h](jo)}(h``nice``h]j)}(hj@h]hnice}(hhhjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhj:ubj)}(hhh]h)}(h nice levelh]h nice level}(hj[hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhKhjVubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhhjUhKhj7ubji)}(h``cpumask`` allowed CPUs Work items in this workqueue are affine to these CPUs and not allowed to execute on other CPUs. A pool serving a workqueue must have the same **cpumask**. h](jo)}(h ``cpumask``h]j)}(hjyh]hcpumask}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjsubj)}(hhh](h)}(h allowed CPUsh]h allowed CPUs}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubh)}(hWork items in this workqueue are affine to these CPUs and not allowed to execute on other CPUs. A pool serving a workqueue must have the same **cpumask**.h](hWork items in this workqueue are affine to these CPUs and not allowed to execute on other CPUs. A pool serving a workqueue must have the same }(hWork items in this workqueue are affine to these CPUs and not allowed to execute on other CPUs. A pool serving a workqueue must have the same hjhhhNhNubj)}(h **cpumask**h]hcpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jhhjhKhj7ubji)}(hXh``__pod_cpumask`` internal attribute used to create per-pod pools Internal use only. Per-pod unbound worker pools are used to improve locality. Always a subset of ->cpumask. A workqueue can be associated with multiple worker pools with disjoint **__pod_cpumask**'s. Whether the enforcement of a pool's **__pod_cpumask** is strict depends on **affn_strict**. h](jo)}(h``__pod_cpumask``h]j)}(hjh]h __pod_cpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubj)}(hhh](h)}(h/internal attribute used to create per-pod poolsh]h/internal attribute used to create per-pod pools}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubh)}(hInternal use only.h]hInternal use only.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubh)}(hXPer-pod unbound worker pools are used to improve locality. Always a subset of ->cpumask. A workqueue can be associated with multiple worker pools with disjoint **__pod_cpumask**'s. Whether the enforcement of a pool's **__pod_cpumask** is strict depends on **affn_strict**.h](hPer-pod unbound worker pools are used to improve locality. Always a subset of ->cpumask. A workqueue can be associated with multiple worker pools with disjoint }(hPer-pod unbound worker pools are used to improve locality. Always a subset of ->cpumask. A workqueue can be associated with multiple worker pools with disjoint hj hhhNhNubj)}(h**__pod_cpumask**h]h __pod_cpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh,’s. Whether the enforcement of a pool’s }(h('s. Whether the enforcement of a pool's hj hhhNhNubj)}(h**__pod_cpumask**h]h __pod_cpumask}(hhhj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh is strict depends on }(h is strict depends on hj hhhNhNubj)}(h**affn_strict**h]h affn_strict}(hhhj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh.}(hjhj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhKhj7ubji)}(hX``affn_strict`` affinity scope is strict If clear, workqueue will make a best-effort attempt at starting the worker inside **__pod_cpumask** but the scheduler is free to migrate it outside. If set, workers are only allowed to run inside **__pod_cpumask**. h](jo)}(h``affn_strict``h]j)}(hjfh]h affn_strict}(hhhjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhj`ubj)}(hhh](h)}(haffinity scope is stricth]haffinity scope is strict}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhj|ubh)}(hIf clear, workqueue will make a best-effort attempt at starting the worker inside **__pod_cpumask** but the scheduler is free to migrate it outside.h](hRIf clear, workqueue will make a best-effort attempt at starting the worker inside }(hRIf clear, workqueue will make a best-effort attempt at starting the worker inside hjhhhNhNubj)}(h**__pod_cpumask**h]h __pod_cpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh1 but the scheduler is free to migrate it outside.}(h1 but the scheduler is free to migrate it outside.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhj|ubh)}(hAIf set, workers are only allowed to run inside **__pod_cpumask**.h](h/If set, workers are only allowed to run inside }(h/If set, workers are only allowed to run inside hjhhhNhNubj)}(h**__pod_cpumask**h]h __pod_cpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj{hKhj|ubeh}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhhj{hKhj7ubji)}(hX``affn_scope`` unbound CPU affinity scope CPU pods are used to improve execution locality of unbound work items. There are multiple pod types, one for each wq_affn_scope, and every CPU in the system belongs to one pod in every pod type. CPUs that belong to the same pod share the worker pool. For example, selecting ``WQ_AFFN_NUMA`` makes the workqueue use a separate worker pool for each NUMA node. h](jo)}(h``affn_scope``h]j)}(hjh]h affn_scope}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubj)}(hhh](h)}(hunbound CPU affinity scopeh]hunbound CPU affinity scope}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubh)}(hXeCPU pods are used to improve execution locality of unbound work items. There are multiple pod types, one for each wq_affn_scope, and every CPU in the system belongs to one pod in every pod type. CPUs that belong to the same pod share the worker pool. For example, selecting ``WQ_AFFN_NUMA`` makes the workqueue use a separate worker pool for each NUMA node.h](hXCPU pods are used to improve execution locality of unbound work items. There are multiple pod types, one for each wq_affn_scope, and every CPU in the system belongs to one pod in every pod type. CPUs that belong to the same pod share the worker pool. For example, selecting }(hXCPU pods are used to improve execution locality of unbound work items. There are multiple pod types, one for each wq_affn_scope, and every CPU in the system belongs to one pod in every pod type. CPUs that belong to the same pod share the worker pool. For example, selecting hj hhhNhNubj)}(h``WQ_AFFN_NUMA``h]h WQ_AFFN_NUMA}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhC makes the workqueue use a separate worker pool for each NUMA node.}(hC makes the workqueue use a separate worker pool for each NUMA node.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhKhj7ubji)}(hD``ordered`` work items must be executed one by one in queueing orderh](jo)}(h ``ordered``h]j)}(hjAh]hordered}(hhhjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhj;ubj)}(hhh]h)}(h8work items must be executed one by one in queueing orderh]h8work items must be executed one by one in queueing order}(hj\hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhhjVhKhj7ubeh}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhj?hhubh)}(h>This can be used to change attributes of an unbound workqueue.h]h>This can be used to change attributes of an unbound workqueue.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhKhj?hhubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]work_pending (C macro)c.work_pendinghNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h work_pendingh]jm)}(h work_pendingh]j)}(h work_pendingh]j)}(hjh]h work_pending}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMcubah}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMcubah}(h]jah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMbhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMcubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubh)}(h``work_pending (work)``h]j)}(hjh]hwork_pending (work)}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMdhj?hhubjz)}(hhh]h)}(h1Find out whether a work item is currently pendingh]h1Find out whether a work item is currently pending}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhM_hjubah}(h]h ]h"]h$]h&]uh1jyhj?hhhNhNubj)}(h4**Parameters** ``work`` The work item in questionh](h)}(h**Parameters**h]j)}(hj-h]h Parameters}(hhhj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMchj'ubjd)}(hhh]ji)}(h"``work`` The work item in questionh](jo)}(h``work``h]j)}(hjLh]hwork}(hhhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMehjFubj)}(hhh]h)}(hThe work item in questionh]hThe work item in question}(hjghjehhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhM`hjbubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhhjahMehjCubah}(h]h ]h"]h$]h&]uh1jchj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]delayed_work_pending (C macro)c.delayed_work_pendinghNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hdelayed_work_pendingh]jm)}(hdelayed_work_pendingh]j)}(hdelayed_work_pendingh]j)}(hjh]hdelayed_work_pending}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMkubah}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMkubah}(h]jah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMjhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhMkubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubh)}(h``delayed_work_pending (w)``h]j)}(hjh]hdelayed_work_pending (w)}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMlhj?hhubjz)}(hhh]h)}(h;Find out whether a delayable work item is currently pendingh]h;Find out whether a delayable work item is currently pending}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMfhjubah}(h]h ]h"]h$]h&]uh1jyhj?hhhNhNubj)}(h1**Parameters** ``w`` The work item in questionh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMjhj ubjd)}(hhh]ji)}(h``w`` The work item in questionh](jo)}(h``w``h]j)}(hj0h]hw}(hhhj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMlhj*ubj)}(hhh]h)}(hThe work item in questionh]hThe work item in question}(hjKhjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhhjFubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhhjEhMlhj'ubah}(h]h ]h"]h$]h&]uh1jchj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]alloc_workqueue (C function)c.alloc_workqueuehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hdstruct workqueue_struct * alloc_workqueue (const char *fmt, unsigned int flags, int max_active, ...)h]jm)}(hbstruct workqueue_struct *alloc_workqueue(const char *fmt, unsigned int flags, int max_active, ...)h](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jalloc_workqueuesbc.alloc_workqueueasbuh1hhjhhhjhMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubhdesc_sig_punctuation)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjhhhjhMubj)}(halloc_workqueueh]j)}(hjh]halloc_workqueue}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubhdesc_parameterlist)}(h:(const char *fmt, unsigned int flags, int max_active, ...)h](hdesc_parameter)}(hconst char *fmth](js)}(hconsth]hconst}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubhdesc_sig_keyword_type)}(hcharh]hchar}(hhhj1hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfmth]hfmt}(hhhj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj)}(hunsigned int flagsh](j0)}(hunsignedh]hunsigned}(hhhjthhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjpubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjpubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hflagsh]hflags}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj)}(hint max_activeh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h max_activeh]h max_active}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj)}(h...h]j)}(h...h]h...}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]j}ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjhhubj)}(hhh]h)}(hallocate a workqueueh]hallocate a workqueue}(hj'hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj"hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=juh1jahhhj?hNhNubj)}(hX**Parameters** ``const char *fmt`` printf format for the name of the workqueue ``unsigned int flags`` WQ_* flags ``int max_active`` max in-flight work items, 0 for default ``...`` args for **fmt** **Description** For a per-cpu workqueue, **max_active** limits the number of in-flight work items for each CPU. e.g. **max_active** of 1 indicates that each CPU can be executing at most one work item for the workqueue. For unbound workqueues, **max_active** limits the number of in-flight work items for the whole system. e.g. **max_active** of 16 indicates that that there can be at most 16 work items executing for the workqueue in the whole system. As sharing the same active counter for an unbound workqueue across multiple NUMA nodes can be expensive, **max_active** is distributed to each NUMA node according to the proportion of the number of online CPUs and enforced independently. Depending on online CPU distribution, a node may end up with per-node max_active which is significantly lower than **max_active**, which can lead to deadlocks if the per-node concurrency limit is lower than the maximum number of interdependent work items for the workqueue. To guarantee forward progress regardless of online CPU distribution, the concurrency limit on every node is guaranteed to be equal to or greater than min_active which is set to min(**max_active**, ``WQ_DFL_MIN_ACTIVE``). This means that the sum of per-node max_active's may be larger than **max_active**. For detailed information on ``WQ_*`` flags, please refer to Documentation/core-api/workqueue.rst. **Return** Pointer to the allocated workqueue on success, ``NULL`` on failure.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hhhjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubjd)}(hhh](ji)}(h@``const char *fmt`` printf format for the name of the workqueue h](jo)}(h``const char *fmt``h]j)}(hjfh]hconst char *fmt}(hhhjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj`ubj)}(hhh]h)}(h+printf format for the name of the workqueueh]h+printf format for the name of the workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj|ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhhj{hMhj]ubji)}(h"``unsigned int flags`` WQ_* flags h](jo)}(h``unsigned int flags``h]j)}(hjh]hunsigned int flags}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjubj)}(hhh]h)}(h WQ_* flagsh]h WQ_* flags}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhj]ubji)}(h;``int max_active`` max in-flight work items, 0 for default h](jo)}(h``int max_active``h]j)}(hjh]hint max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjubj)}(hhh]h)}(h'max in-flight work items, 0 for defaulth]h'max in-flight work items, 0 for default}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhj]ubji)}(h``...`` args for **fmt** h](jo)}(h``...``h]j)}(hjh]h...}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj ubj)}(hhh]h)}(hargs for **fmt**h](h args for }(h args for hj*hhhNhNubj)}(h**fmt**h]hfmt}(hhhj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1hhj&hMhj'ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj&hMhj]ubeh}(h]h ]h"]h$]h&]uh1jchjAubh)}(h**Description**h]j)}(hj[h]h Description}(hhhj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(hFor a per-cpu workqueue, **max_active** limits the number of in-flight work items for each CPU. e.g. **max_active** of 1 indicates that each CPU can be executing at most one work item for the workqueue.h](hFor a per-cpu workqueue, }(hFor a per-cpu workqueue, hjqhhhNhNubj)}(h**max_active**h]h max_active}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh> limits the number of in-flight work items for each CPU. e.g. }(h> limits the number of in-flight work items for each CPU. e.g. hjqhhhNhNubj)}(h**max_active**h]h max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubhW of 1 indicates that each CPU can be executing at most one work item for the workqueue.}(hW of 1 indicates that each CPU can be executing at most one work item for the workqueue.hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(hFor unbound workqueues, **max_active** limits the number of in-flight work items for the whole system. e.g. **max_active** of 16 indicates that that there can be at most 16 work items executing for the workqueue in the whole system.h](hFor unbound workqueues, }(hFor unbound workqueues, hjhhhNhNubj)}(h**max_active**h]h max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhF limits the number of in-flight work items for the whole system. e.g. }(hF limits the number of in-flight work items for the whole system. e.g. hjhhhNhNubj)}(h**max_active**h]h max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhn of 16 indicates that that there can be at most 16 work items executing for the workqueue in the whole system.}(hn of 16 indicates that that there can be at most 16 work items executing for the workqueue in the whole system.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(hAs sharing the same active counter for an unbound workqueue across multiple NUMA nodes can be expensive, **max_active** is distributed to each NUMA node according to the proportion of the number of online CPUs and enforced independently.h](hiAs sharing the same active counter for an unbound workqueue across multiple NUMA nodes can be expensive, }(hiAs sharing the same active counter for an unbound workqueue across multiple NUMA nodes can be expensive, hjhhhNhNubj)}(h**max_active**h]h max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhv is distributed to each NUMA node according to the proportion of the number of online CPUs and enforced independently.}(hv is distributed to each NUMA node according to the proportion of the number of online CPUs and enforced independently.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(hXDepending on online CPU distribution, a node may end up with per-node max_active which is significantly lower than **max_active**, which can lead to deadlocks if the per-node concurrency limit is lower than the maximum number of interdependent work items for the workqueue.h](hsDepending on online CPU distribution, a node may end up with per-node max_active which is significantly lower than }(hsDepending on online CPU distribution, a node may end up with per-node max_active which is significantly lower than hjhhhNhNubj)}(h**max_active**h]h max_active}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, which can lead to deadlocks if the per-node concurrency limit is lower than the maximum number of interdependent work items for the workqueue.}(h, which can lead to deadlocks if the per-node concurrency limit is lower than the maximum number of interdependent work items for the workqueue.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(hX0To guarantee forward progress regardless of online CPU distribution, the concurrency limit on every node is guaranteed to be equal to or greater than min_active which is set to min(**max_active**, ``WQ_DFL_MIN_ACTIVE``). This means that the sum of per-node max_active's may be larger than **max_active**.h](hTo guarantee forward progress regardless of online CPU distribution, the concurrency limit on every node is guaranteed to be equal to or greater than min_active which is set to min(}(hTo guarantee forward progress regardless of online CPU distribution, the concurrency limit on every node is guaranteed to be equal to or greater than min_active which is set to min(hj#hhhNhNubj)}(h**max_active**h]h max_active}(hhhj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh, }(h, hj#hhhNhNubj)}(h``WQ_DFL_MIN_ACTIVE``h]hWQ_DFL_MIN_ACTIVE}(hhhj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubhI). This means that the sum of per-node max_active’s may be larger than }(hG). This means that the sum of per-node max_active's may be larger than hj#hhhNhNubj)}(h**max_active**h]h max_active}(hhhjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh.}(hjhj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(haFor detailed information on ``WQ_*`` flags, please refer to Documentation/core-api/workqueue.rst.h](hFor detailed information on }(hFor detailed information on hjkhhhNhNubj)}(h``WQ_*``h]hWQ_*}(hhhjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh= flags, please refer to Documentation/core-api/workqueue.rst.}(h= flags, please refer to Documentation/core-api/workqueue.rst.hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubh)}(hCPointer to the allocated workqueue on success, ``NULL`` on failure.h](h/Pointer to the allocated workqueue on success, }(h/Pointer to the allocated workqueue on success, hjhhhNhNubj)}(h``NULL``h]hNULL}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on failure.}(h on failure.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!alloc_ordered_workqueue (C macro)c.alloc_ordered_workqueuehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(halloc_ordered_workqueueh]jm)}(halloc_ordered_workqueueh]j)}(halloc_ordered_workqueueh]j)}(hjh]halloc_ordered_workqueue}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhM ubah}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhM hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jmacroeh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubh)}(h1``alloc_ordered_workqueue (fmt, flags, args...)``h]j)}(hj h]h-alloc_ordered_workqueue (fmt, flags, args...)}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhM hj?hhubjz)}(hhh]h)}(hallocate an ordered workqueueh]hallocate an ordered workqueue}(hj;hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj6ubah}(h]h ]h"]h$]h&]uh1jyhj?hhhNhNubj)}(hX**Parameters** ``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** **Description** Allocate an ordered workqueue. An ordered workqueue executes at most one work item at any given time in the queued order. They are implemented as unbound workqueues with **max_active** of one. **Return** Pointer to the allocated workqueue on success, ``NULL`` on failure.h](h)}(h**Parameters**h]j)}(hjTh]h Parameters}(hhhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjNubjd)}(hhh](ji)}(h4``fmt`` printf format for the name of the workqueue h](jo)}(h``fmt``h]j)}(hjsh]hfmt}(hhhjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjmubj)}(hhh]h)}(h+printf format for the name of the workqueueh]h+printf format for the name of the workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjjubji)}(hK``flags`` WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful) h](jo)}(h ``flags``h]j)}(hjh]hflags}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjubj)}(hhh]h)}(h@WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful)h]h@WQ_* flags (only WQ_FREEZABLE and WQ_MEM_RECLAIM are meaningful)}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjjubji)}(h``args...`` args for **fmt** h](jo)}(h ``args...``h]j)}(hjh]hargs...}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjubj)}(hhh]h)}(hargs for **fmt**h](h args for }(h args for hjhhhNhNubj)}(h**fmt**h]hfmt}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjjubeh}(h]h ]h"]h$]h&]uh1jchjNubh)}(h**Description**h]j)}(hj/ h]h Description}(hhhj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj- ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjNubh)}(hAllocate an ordered workqueue. An ordered workqueue executes at most one work item at any given time in the queued order. They are implemented as unbound workqueues with **max_active** of one.h](hAllocate an ordered workqueue. An ordered workqueue executes at most one work item at any given time in the queued order. They are implemented as unbound workqueues with }(hAllocate an ordered workqueue. An ordered workqueue executes at most one work item at any given time in the queued order. They are implemented as unbound workqueues with hjE hhhNhNubj)}(h**max_active**h]h max_active}(hhhjN hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE ubh of one.}(h of one.hjE hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjNubh)}(h **Return**h]j)}(hjj h]hReturn}(hhhjl hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjNubh)}(hCPointer to the allocated workqueue on success, ``NULL`` on failure.h](h/Pointer to the allocated workqueue on success, }(h/Pointer to the allocated workqueue on success, hj hhhNhNubj)}(h``NULL``h]hNULL}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh on failure.}(h on failure.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhM hjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]queue_work (C function) c.queue_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hGbool queue_work (struct workqueue_struct *wq, struct work_struct *work)h]jm)}(hFbool queue_work(struct workqueue_struct *wq, struct work_struct *work)h](j0)}(hboolh]hbool}(hhhj hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMUubj)}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMUubj)}(h queue_workh]j)}(h queue_workh]h queue_work}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj hhhj hMUubj)}(h7(struct workqueue_struct *wq, struct work_struct *work)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj ubj)}(h h]h }(hhhj !hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj !modnameN classnameNjj)}j]j)}jj sb c.queue_workasbuh1hhj ubj)}(h h]h }(hhhj>!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjdh]h*}(hhhjL!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hwqh]hwq}(hhhjY!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjr!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjn!ubj)}(h h]h }(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn!ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj!modnameN classnameNjj)}j]j:! c.queue_workasbuh1hhjn!ubj)}(h h]h }(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn!ubj)}(hjdh]h*}(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn!ubj)}(hworkh]hwork}(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1jhj hhhj hMUubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj hhhj hMUubah}(h]j ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMjhj hhubj)}(hhh]h)}(hqueue work on a workqueueh]hqueue work on a workqueue}(hj!hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMThj!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMUubeh}(h]h ](jfunctioneh"]h$]h&]jjjj "jj "juh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` workqueue to use ``struct work_struct *work`` work to queue **Description** Returns ``false`` if **work** was already on a queue, ``true`` otherwise. We queue the work to the CPU on which it was submitted, but if the CPU dies it can be processed by another CPU. Memory-ordering properties: If it returns ``true``, guarantees that all stores preceding the call to queue_work() in the program order will be visible from the CPU which will execute **work** by the time such work executes, e.g., { x is initially 0 } CPU0 CPU1 WRITE_ONCE(x, 1); [ **work** is being executed ] r0 = queue_work(wq, work); r1 = READ_ONCE(x); Forbids: r0 == true && r1 == 0h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMXhj"ubjd)}(hhh](ji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj5"h]hstruct workqueue_struct *wq}(hhhj7"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3"ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMUhj/"ubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hjP"hjN"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJ"hMUhjK"ubah}(h]h ]h"]h$]h&]uh1jhj/"ubeh}(h]h ]h"]h$]h&]uh1jhhjJ"hMUhj,"ubji)}(h+``struct work_struct *work`` work to queue h](jo)}(h``struct work_struct *work``h]j)}(hjn"h]hstruct work_struct *work}(hhhjp"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl"ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMVhjh"ubj)}(hhh]h)}(h work to queueh]h work to queue}(hj"hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMVhj"ubah}(h]h ]h"]h$]h&]uh1jhjh"ubeh}(h]h ]h"]h$]h&]uh1jhhj"hMVhj,"ubeh}(h]h ]h"]h$]h&]uh1jchj"ubh)}(h**Description**h]j)}(hj"h]h Description}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMXhj"ubh)}(hIReturns ``false`` if **work** was already on a queue, ``true`` otherwise.h](hReturns }(hReturns hj"hhhNhNubj)}(h ``false``h]hfalse}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh if }(h if hj"hhhNhNubj)}(h**work**h]hwork}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh was already on a queue, }(h was already on a queue, hj"hhhNhNubj)}(h``true``h]htrue}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh otherwise.}(h otherwise.hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMXhj"ubh)}(hoWe queue the work to the CPU on which it was submitted, but if the CPU dies it can be processed by another CPU.h]hoWe queue the work to the CPU on which it was submitted, but if the CPU dies it can be processed by another CPU.}(hj #hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMZhj"ubh)}(hMemory-ordering properties: If it returns ``true``, guarantees that all stores preceding the call to queue_work() in the program order will be visible from the CPU which will execute **work** by the time such work executes, e.g.,h](h+Memory-ordering properties: If it returns }(h+Memory-ordering properties: If it returns hj#hhhNhNubj)}(h``true``h]htrue}(hhhj #hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh, guarantees that all stores preceding the call to queue_work() in the program order will be visible from the CPU which will execute }(h, guarantees that all stores preceding the call to queue_work() in the program order will be visible from the CPU which will execute hj#hhhNhNubj)}(h**work**h]hwork}(hhhj3#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh& by the time such work executes, e.g.,}(h& by the time such work executes, e.g.,hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhM]hj"ubh)}(h{ x is initially 0 }h]h{ x is initially 0 }}(hjO#hjM#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMahj"ubjz)}(hhh](h)}(h'CPU0 CPU1h]h'CPU0 CPU1}(hja#hj_#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMchj\#ubh)}(hyWRITE_ONCE(x, 1); [ **work** is being executed ] r0 = queue_work(wq, work); r1 = READ_ONCE(x);h](h%WRITE_ONCE(x, 1); [ }(h%WRITE_ONCE(x, 1); [ hjn#hhhNhNubj)}(h**work**h]hwork}(hhhjw#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn#ubhL is being executed ] r0 = queue_work(wq, work); r1 = READ_ONCE(x);}(hL is being executed ] r0 = queue_work(wq, work); r1 = READ_ONCE(x);hjn#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMehj\#ubeh}(h]h ]h"]h$]h&]uh1jyhj"ubh)}(hForbids: r0 == true && r1 == 0h]hForbids: r0 == true && r1 == 0}(hj#hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]queue_delayed_work (C function)c.queue_delayed_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hfbool queue_delayed_work (struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h]jm)}(hebool queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j0)}(hj h]hbool}(hhhj#hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj#hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMrubj)}(h h]h }(hhhj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj#hMrubj)}(hqueue_delayed_workh]j)}(hqueue_delayed_workh]hqueue_delayed_work}(hhhj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj#hhhj#hMrubj)}(hN(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj#ubj)}(h h]h }(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj $hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj"$modnameN classnameNjj)}j]j)}jj#sbc.queue_delayed_workasbuh1hhj#ubj)}(h h]h }(hhhj@$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hjdh]h*}(hhhjN$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hwqh]hwq}(hhhj[$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhjt$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjp$ubj)}(h h]h }(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp$ubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjj)}j]j<$c.queue_delayed_workasbuh1hhjp$ubj)}(h h]h }(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp$ubj)}(hjdh]h*}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp$ubj)}(hdworkh]hdwork}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj)}(hunsigned long delayh](j0)}(hunsignedh]hunsigned}(hhhj$hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj$ubj)}(h h]h }(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj0)}(hlongh]hlong}(hhhj%hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj$ubj)}(h h]h }(hhhj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hdelayh]hdelay}(hhhj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubeh}(h]h ]h"]h$]h&]jjuh1jhj#hhhj#hMrubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj#hhhj#hMrubah}(h]j#ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMxhj#hhubj)}(hhh]h)}(h%queue work on a workqueue after delayh]h%queue work on a workqueue after delay}(hjI%hjG%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMqhjD%hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj#hMrubeh}(h]h ](jfunctioneh"]h$]h&]jjjj_%jj_%juh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` workqueue to use ``struct delayed_work *dwork`` delayable work to queue ``unsigned long delay`` number of jiffies to wait before queueing **Description** Equivalent to queue_delayed_work_on() but tries to use the local CPU.h](h)}(h**Parameters**h]j)}(hji%h]h Parameters}(hhhjk%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg%ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMuhjc%ubjd)}(hhh](ji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj%h]hstruct workqueue_struct *wq}(hhhj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMrhj%ubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hj%hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMrhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhhj%hMrhj%ubji)}(h7``struct delayed_work *dwork`` delayable work to queue h](jo)}(h``struct delayed_work *dwork``h]j)}(hj%h]hstruct delayed_work *dwork}(hhhj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMshj%ubj)}(hhh]h)}(hdelayable work to queueh]hdelayable work to queue}(hj%hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMshj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhhj%hMshj%ubji)}(hB``unsigned long delay`` number of jiffies to wait before queueing h](jo)}(h``unsigned long delay``h]j)}(hj%h]hunsigned long delay}(hhhj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMthj%ubj)}(hhh]h)}(h)number of jiffies to wait before queueingh]h)number of jiffies to wait before queueing}(hj&hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMthj&ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhhj&hMthj%ubeh}(h]h ]h"]h$]h&]uh1jchjc%ubh)}(h**Description**h]j)}(hj5&h]h Description}(hhhj7&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3&ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMvhjc%ubh)}(hEEquivalent to queue_delayed_work_on() but tries to use the local CPU.h]hEEquivalent to queue_delayed_work_on() but tries to use the local CPU.}(hjM&hjK&hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMvhjc%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]mod_delayed_work (C function)c.mod_delayed_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hdbool mod_delayed_work (struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h]jm)}(hcbool mod_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j0)}(hj h]hbool}(hhhjz&hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjv&hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMubj)}(h h]h }(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv&hhhj&hMubj)}(hmod_delayed_workh]j)}(hmod_delayed_workh]hmod_delayed_work}(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjv&hhhj&hMubj)}(hN(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj&ubj)}(h h]h }(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj&modnameN classnameNjj)}j]j)}jj&sbc.mod_delayed_workasbuh1hhj&ubj)}(h h]h }(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hjdh]h*}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hwqh]hwq}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubj)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhj('hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj$'ubj)}(h h]h }(hhhj5'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$'ubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhjF'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC'ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjH'modnameN classnameNjj)}j]j&c.mod_delayed_workasbuh1hhj$'ubj)}(h h]h }(hhhjd'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$'ubj)}(hjdh]h*}(hhhjr'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$'ubj)}(hdworkh]hdwork}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubj)}(hunsigned long delayh](j0)}(hunsignedh]hunsigned}(hhhj'hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj'ubj)}(h h]h }(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj0)}(hlongh]hlong}(hhhj'hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj'ubj)}(h h]h }(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hdelayh]hdelay}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubeh}(h]h ]h"]h$]h&]jjuh1jhjv&hhhj&hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjr&hhhj&hMubah}(h]jm&ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjo&hhubj)}(hhh]h)}(h'modify delay of or queue a delayed workh]h'modify delay of or queue a delayed work}(hj'hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj'hhubah}(h]h ]h"]h$]h&]uh1jhjo&hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj(jj(juh1jahhhj?hNhNubj)}(h**Parameters** ``struct workqueue_struct *wq`` workqueue to use ``struct delayed_work *dwork`` work to queue ``unsigned long delay`` number of jiffies to wait before queueing **Description** mod_delayed_work_on() on local CPU.h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hhhj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj(ubjd)}(hhh](ji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj<(h]hstruct workqueue_struct *wq}(hhhj>(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:(ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj6(ubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hjW(hjU(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ(hMhjR(ubah}(h]h ]h"]h$]h&]uh1jhj6(ubeh}(h]h ]h"]h$]h&]uh1jhhjQ(hMhj3(ubji)}(h-``struct delayed_work *dwork`` work to queue h](jo)}(h``struct delayed_work *dwork``h]j)}(hju(h]hstruct delayed_work *dwork}(hhhjw(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs(ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjo(ubj)}(hhh]h)}(h work to queueh]h work to queue}(hj(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jhjo(ubeh}(h]h ]h"]h$]h&]uh1jhhj(hMhj3(ubji)}(hB``unsigned long delay`` number of jiffies to wait before queueing h](jo)}(h``unsigned long delay``h]j)}(hj(h]hunsigned long delay}(hhhj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj(ubj)}(hhh]h)}(h)number of jiffies to wait before queueingh]h)number of jiffies to wait before queueing}(hj(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhhj(hMhj3(ubeh}(h]h ]h"]h$]h&]uh1jchj(ubh)}(h**Description**h]j)}(hj(h]h Description}(hhhj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj(ubh)}(h#mod_delayed_work_on() on local CPU.h]h#mod_delayed_work_on() on local CPU.}(hj)hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]schedule_work_on (C function)c.schedule_work_onhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h9bool schedule_work_on (int cpu, struct work_struct *work)h]jm)}(h8bool schedule_work_on(int cpu, struct work_struct *work)h](j0)}(hj h]hbool}(hhhj.)hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj*)hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMubj)}(h h]h }(hhhj<)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*)hhhj;)hMubj)}(hschedule_work_onh]j)}(hschedule_work_onh]hschedule_work_on}(hhhjN)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ)ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj*)hhhj;)hMubj)}(h#(int cpu, struct work_struct *work)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhjj)hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjf)ubj)}(h h]h }(hhhjx)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf)ubj)}(hcpuh]hcpu}(hhhj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjb)ubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj)ubj)}(h h]h }(hhhj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj)modnameN classnameNjj)}j]j)}jjP)sbc.schedule_work_onasbuh1hhj)ubj)}(h h]h }(hhhj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjdh]h*}(hhhj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hworkh]hwork}(hhhj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjb)ubeh}(h]h ]h"]h$]h&]jjuh1jhj*)hhhj;)hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj&)hhhj;)hMubah}(h]j!)ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj#)hhubj)}(hhh]h)}(hput work task on a specific cpuh]hput work task on a specific cpu}(hj%*hj#*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj *hhubah}(h]h ]h"]h$]h&]uh1jhj#)hhhj;)hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj;*jj;*juh1jahhhj?hNhNubj)}(h**Parameters** ``int cpu`` cpu to put the work task on ``struct work_struct *work`` job to be done **Description** This puts a job on a specific cpuh](h)}(h**Parameters**h]j)}(hjE*h]h Parameters}(hhhjG*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC*ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj?*ubjd)}(hhh](ji)}(h(``int cpu`` cpu to put the work task on h](jo)}(h ``int cpu``h]j)}(hjd*h]hint cpu}(hhhjf*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb*ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj^*ubj)}(hhh]h)}(hcpu to put the work task onh]hcpu to put the work task on}(hj*hj}*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy*hMhjz*ubah}(h]h ]h"]h$]h&]uh1jhj^*ubeh}(h]h ]h"]h$]h&]uh1jhhjy*hMhj[*ubji)}(h,``struct work_struct *work`` job to be done h](jo)}(h``struct work_struct *work``h]j)}(hj*h]hstruct work_struct *work}(hhhj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj*ubj)}(hhh]h)}(hjob to be doneh]hjob to be done}(hj*hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhhj*hMhj[*ubeh}(h]h ]h"]h$]h&]uh1jchj?*ubh)}(h**Description**h]j)}(hj*h]h Description}(hhhj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj?*ubh)}(h!This puts a job on a specific cpuh]h!This puts a job on a specific cpu}(hj*hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj?*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]schedule_work (C function)c.schedule_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h-bool schedule_work (struct work_struct *work)h]jm)}(h,bool schedule_work(struct work_struct *work)h](j0)}(hj h]hbool}(hhhj+hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj+hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMubj)}(h h]h }(hhhj++hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhj*+hMubj)}(h schedule_workh]j)}(h schedule_workh]h schedule_work}(hhhj=+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9+ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj+hhhj*+hMubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjY+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjU+ubj)}(h h]h }(hhhjf+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU+ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjw+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt+ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjy+modnameN classnameNjj)}j]j)}jj?+sbc.schedule_workasbuh1hhjU+ubj)}(h h]h }(hhhj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU+ubj)}(hjdh]h*}(hhhj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU+ubj)}(hworkh]hwork}(hhhj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjQ+ubah}(h]h ]h"]h$]h&]jjuh1jhj+hhhj*+hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj+hhhj*+hMubah}(h]j+ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj+hhubj)}(hhh]h)}(h!put work task in global workqueueh]h!put work task in global workqueue}(hj+hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj+hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj*+hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+jj+juh1jahhhj?hNhNubj)}(hX**Parameters** ``struct work_struct *work`` job to be done **Description** Returns ``false`` if **work** was already on the kernel-global workqueue and ``true`` otherwise. This puts a job in the kernel-global workqueue if it was not already queued and leaves it in the same position on the kernel-global workqueue otherwise. Shares the same memory-ordering properties of queue_work(), cf. the DocBook header of queue_work().h](h)}(h**Parameters**h]j)}(hj+h]h Parameters}(hhhj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj+ubjd)}(hhh]ji)}(h,``struct work_struct *work`` job to be done h](jo)}(h``struct work_struct *work``h]j)}(hj,h]hstruct work_struct *work}(hhhj ,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj,ubj)}(hhh]h)}(hjob to be doneh]hjob to be done}(hj9,hj7,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3,hMhj4,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhhj3,hMhj,ubah}(h]h ]h"]h$]h&]uh1jchj+ubh)}(h**Description**h]j)}(hjY,h]h Description}(hhhj[,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW,ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj+ubh)}(h`Returns ``false`` if **work** was already on the kernel-global workqueue and ``true`` otherwise.h](hReturns }(hReturns hjo,hhhNhNubj)}(h ``false``h]hfalse}(hhhjx,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo,ubh if }(h if hjo,hhhNhNubj)}(h**work**h]hwork}(hhhj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo,ubh0 was already on the kernel-global workqueue and }(h0 was already on the kernel-global workqueue and hjo,hhhNhNubj)}(h``true``h]htrue}(hhhj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo,ubh otherwise.}(h otherwise.hjo,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj+ubh)}(hThis puts a job in the kernel-global workqueue if it was not already queued and leaves it in the same position on the kernel-global workqueue otherwise.h]hThis puts a job in the kernel-global workqueue if it was not already queued and leaves it in the same position on the kernel-global workqueue otherwise.}(hj,hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj+ubh)}(hcShares the same memory-ordering properties of queue_work(), cf. the DocBook header of queue_work().h]hcShares the same memory-ordering properties of queue_work(), cf. the DocBook header of queue_work().}(hj,hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]"enable_and_queue_work (C function)c.enable_and_queue_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hRbool enable_and_queue_work (struct workqueue_struct *wq, struct work_struct *work)h]jm)}(hQbool enable_and_queue_work(struct workqueue_struct *wq, struct work_struct *work)h](j0)}(hj h]hbool}(hhhj,hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj,hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMubj)}(h h]h }(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj-hMubj)}(henable_and_queue_workh]j)}(henable_and_queue_workh]henable_and_queue_work}(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj,hhhj-hMubj)}(h7(struct workqueue_struct *wq, struct work_struct *work)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj2-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj.-ubj)}(h h]h }(hhhj?-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.-ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjP-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjR-modnameN classnameNjj)}j]j)}jj-sbc.enable_and_queue_workasbuh1hhj.-ubj)}(h h]h }(hhhjp-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.-ubj)}(hjdh]h*}(hhhj~-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.-ubj)}(hwqh]hwq}(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj*-ubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj-ubj)}(h h]h }(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj-modnameN classnameNjj)}j]jl-c.enable_and_queue_workasbuh1hhj-ubj)}(h h]h }(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hjdh]h*}(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hworkh]hwork}(hhhj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj*-ubeh}(h]h ]h"]h$]h&]jjuh1jhj,hhhj-hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj,hhhj-hMubah}(h]j,ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj,hhubj)}(hhh]h)}(h4Enable and queue a work item on a specific workqueueh]h4Enable and queue a work item on a specific workqueue}(hj(.hj&.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj#.hhubah}(h]h ]h"]h$]h&]uh1jhj,hhhj-hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj>.jj>.juh1jahhhj?hNhNubj)}(hX **Parameters** ``struct workqueue_struct *wq`` The target workqueue ``struct work_struct *work`` The work item to be enabled and queued **Description** This function combines the operations of enable_work() and queue_work(), providing a convenient way to enable and queue a work item in a single call. It invokes enable_work() on **work** and then queues it if the disable depth reached 0. Returns ``true`` if the disable depth reached 0 and **work** is queued, and ``false`` otherwise. Note that **work** is always queued when disable depth reaches zero. If the desired behavior is queueing only if certain events took place while **work** is disabled, the user should implement the necessary state tracking and perform explicit conditional queueing after enable_work().h](h)}(h**Parameters**h]j)}(hjH.h]h Parameters}(hhhjJ.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF.ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjB.ubjd)}(hhh](ji)}(h5``struct workqueue_struct *wq`` The target workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjg.h]hstruct workqueue_struct *wq}(hhhji.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje.ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhja.ubj)}(hhh]h)}(hThe target workqueueh]hThe target workqueue}(hj.hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|.hMhj}.ubah}(h]h ]h"]h$]h&]uh1jhja.ubeh}(h]h ]h"]h$]h&]uh1jhhj|.hMhj^.ubji)}(hD``struct work_struct *work`` The work item to be enabled and queued h](jo)}(h``struct work_struct *work``h]j)}(hj.h]hstruct work_struct *work}(hhhj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj.ubj)}(hhh]h)}(h&The work item to be enabled and queuedh]h&The work item to be enabled and queued}(hj.hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hMhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhhj.hMhj^.ubeh}(h]h ]h"]h$]h&]uh1jchjB.ubh)}(h**Description**h]j)}(hj.h]h Description}(hhhj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjB.ubh)}(hXNThis function combines the operations of enable_work() and queue_work(), providing a convenient way to enable and queue a work item in a single call. It invokes enable_work() on **work** and then queues it if the disable depth reached 0. Returns ``true`` if the disable depth reached 0 and **work** is queued, and ``false`` otherwise.h](hThis function combines the operations of enable_work() and queue_work(), providing a convenient way to enable and queue a work item in a single call. It invokes enable_work() on }(hThis function combines the operations of enable_work() and queue_work(), providing a convenient way to enable and queue a work item in a single call. It invokes enable_work() on hj.hhhNhNubj)}(h**work**h]hwork}(hhhj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh< and then queues it if the disable depth reached 0. Returns }(h< and then queues it if the disable depth reached 0. Returns hj.hhhNhNubj)}(h``true``h]htrue}(hhhj /hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh$ if the disable depth reached 0 and }(h$ if the disable depth reached 0 and hj.hhhNhNubj)}(h**work**h]hwork}(hhhj /hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh is queued, and }(h is queued, and hj.hhhNhNubj)}(h ``false``h]hfalse}(hhhj3/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh otherwise.}(h otherwise.hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjB.ubh)}(hXNote that **work** is always queued when disable depth reaches zero. If the desired behavior is queueing only if certain events took place while **work** is disabled, the user should implement the necessary state tracking and perform explicit conditional queueing after enable_work().h](h Note that }(h Note that hjM/hhhNhNubj)}(h**work**h]hwork}(hhhjV/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM/ubh is always queued when disable depth reaches zero. If the desired behavior is queueing only if certain events took place while }(h is always queued when disable depth reaches zero. If the desired behavior is queueing only if certain events took place while hjM/hhhNhNubj)}(h**work**h]hwork}(hhhji/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM/ubh is disabled, the user should implement the necessary state tracking and perform explicit conditional queueing after enable_work().}(h is disabled, the user should implement the necessary state tracking and perform explicit conditional queueing after enable_work().hjM/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjB.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]%schedule_delayed_work_on (C function)c.schedule_delayed_work_onhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hXbool schedule_delayed_work_on (int cpu, struct delayed_work *dwork, unsigned long delay)h]jm)}(hWbool schedule_delayed_work_on(int cpu, struct delayed_work *dwork, unsigned long delay)h](j0)}(hj h]hbool}(hhhj/hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj/hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMubj)}(h h]h }(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhj/hMubj)}(hschedule_delayed_work_onh]j)}(hschedule_delayed_work_onh]hschedule_delayed_work_on}(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj/hhhj/hMubj)}(h:(int cpu, struct delayed_work *dwork, unsigned long delay)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhj/hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj/ubj)}(h h]h }(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hcpuh]hcpu}(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubj)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj0ubj)}(h h]h }(hhhj!0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhj20hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/0ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj40modnameN classnameNjj)}j]j)}jj/sbc.schedule_delayed_work_onasbuh1hhj0ubj)}(h h]h }(hhhjR0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hjdh]h*}(hhhj`0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hdworkh]hdwork}(hhhjm0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubj)}(hunsigned long delayh](j0)}(hunsignedh]hunsigned}(hhhj0hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj0ubj)}(h h]h }(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj0)}(hlongh]hlong}(hhhj0hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj0ubj)}(h h]h }(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hdelayh]hdelay}(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubeh}(h]h ]h"]h$]h&]jjuh1jhj/hhhj/hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj/hhhj/hMubah}(h]j/ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj/hhubj)}(hhh]h)}(h1queue work in global workqueue on CPU after delayh]h1queue work in global workqueue on CPU after delay}(hj0hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj0hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj/hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1juh1jahhhj?hNhNubj)}(hX**Parameters** ``int cpu`` cpu to use ``struct delayed_work *dwork`` job to be done ``unsigned long delay`` number of jiffies to wait **Description** After waiting for a given time this puts a job in the kernel-global workqueue on the specified CPU.h](h)}(h**Parameters**h]j)}(hj 1h]h Parameters}(hhhj 1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 1ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj1ubjd)}(hhh](ji)}(h``int cpu`` cpu to use h](jo)}(h ``int cpu``h]j)}(hj*1h]hint cpu}(hhhj,1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(1ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj$1ubj)}(hhh]h)}(h cpu to useh]h cpu to use}(hjE1hjC1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?1hMhj@1ubah}(h]h ]h"]h$]h&]uh1jhj$1ubeh}(h]h ]h"]h$]h&]uh1jhhj?1hMhj!1ubji)}(h.``struct delayed_work *dwork`` job to be done h](jo)}(h``struct delayed_work *dwork``h]j)}(hjc1h]hstruct delayed_work *dwork}(hhhje1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja1ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj]1ubj)}(hhh]h)}(hjob to be doneh]hjob to be done}(hj~1hj|1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjx1hMhjy1ubah}(h]h ]h"]h$]h&]uh1jhj]1ubeh}(h]h ]h"]h$]h&]uh1jhhjx1hMhj!1ubji)}(h2``unsigned long delay`` number of jiffies to wait h](jo)}(h``unsigned long delay``h]j)}(hj1h]hunsigned long delay}(hhhj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj1ubj)}(hhh]h)}(hnumber of jiffies to waith]hnumber of jiffies to wait}(hj1hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhhj1hMhj!1ubeh}(h]h ]h"]h$]h&]uh1jchj1ubh)}(h**Description**h]j)}(hj1h]h Description}(hhhj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj1ubh)}(hcAfter waiting for a given time this puts a job in the kernel-global workqueue on the specified CPU.h]hcAfter waiting for a given time this puts a job in the kernel-global workqueue on the specified CPU.}(hj1hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]"schedule_delayed_work (C function)c.schedule_delayed_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hLbool schedule_delayed_work (struct delayed_work *dwork, unsigned long delay)h]jm)}(hKbool schedule_delayed_work(struct delayed_work *dwork, unsigned long delay)h](j0)}(hj h]hbool}(hhhj2hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj2hhh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMubj)}(h h]h }(hhhj*2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2hhhj)2hMubj)}(hschedule_delayed_workh]j)}(hschedule_delayed_workh]hschedule_delayed_work}(hhhj<2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj82ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj2hhhj)2hMubj)}(h1(struct delayed_work *dwork, unsigned long delay)h](j)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhjX2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjT2ubj)}(h h]h }(hhhje2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT2ubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhjv2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjs2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjx2modnameN classnameNjj)}j]j)}jj>2sbc.schedule_delayed_workasbuh1hhjT2ubj)}(h h]h }(hhhj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT2ubj)}(hjdh]h*}(hhhj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT2ubj)}(hdworkh]hdwork}(hhhj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjP2ubj)}(hunsigned long delayh](j0)}(hunsignedh]hunsigned}(hhhj2hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj2ubj)}(h h]h }(hhhj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj0)}(hlongh]hlong}(hhhj2hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj2ubj)}(h h]h }(hhhj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hdelayh]hdelay}(hhhj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjP2ubeh}(h]h ]h"]h$]h&]jjuh1jhj2hhhj)2hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj2hhhj)2hMubah}(h]j2ah ](jjeh"]h$]h&]juh1jfh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj2hhubj)}(hhh]h)}(h-put work task in global workqueue after delayh]h-put work task in global workqueue after delay}(hj/3hj-3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj*3hhubah}(h]h ]h"]h$]h&]uh1jhj2hhhj)2hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjE3jjE3juh1jahhhj?hNhNubj)}(h**Parameters** ``struct delayed_work *dwork`` job to be done ``unsigned long delay`` number of jiffies to wait or 0 for immediate execution **Description** After waiting for a given time this puts a job in the kernel-global workqueue.h](h)}(h**Parameters**h]j)}(hjO3h]h Parameters}(hhhjQ3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM3ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjI3ubjd)}(hhh](ji)}(h.``struct delayed_work *dwork`` job to be done h](jo)}(h``struct delayed_work *dwork``h]j)}(hjn3h]hstruct delayed_work *dwork}(hhhjp3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl3ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjh3ubj)}(hhh]h)}(hjob to be doneh]hjob to be done}(hj3hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhjh3ubeh}(h]h ]h"]h$]h&]uh1jhhj3hMhje3ubji)}(hO``unsigned long delay`` number of jiffies to wait or 0 for immediate execution h](jo)}(h``unsigned long delay``h]j)}(hj3h]hunsigned long delay}(hhhj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jnh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhj3ubj)}(hhh]h)}(h6number of jiffies to wait or 0 for immediate executionh]h6number of jiffies to wait or 0 for immediate execution}(hj3hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhhj3hMhje3ubeh}(h]h ]h"]h$]h&]uh1jchjI3ubh)}(h**Description**h]j)}(hj3h]h Description}(hhhj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjI3ubh)}(hNAfter waiting for a given time this puts a job in the kernel-global workqueue.h]hNAfter waiting for a given time this puts a job in the kernel-global workqueue.}(hj3hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:776: ./include/linux/workqueue.hhMhjI3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]for_each_pool (C macro)c.for_each_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h for_each_poolh]jm)}(h for_each_poolh]j)}(h for_each_poolh]j)}(hj!4h]h for_each_pool}(hhhj+4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'4ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj#4hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM7ubah}(h]h ]h"]h$]h&]jjjuh1jljjhj4hhhj>4hM7ubah}(h]j4ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6hj4hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj4hhhj>4hM7ubeh}(h]h ](jmacroeh"]h$]h&]jjjjX4jjX4juh1jahhhj?hNhNubh)}(h``for_each_pool (pool, pi)``h]j)}(hj^4h]hfor_each_pool (pool, pi)}(hhhj`4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\4ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM8hj?hhubjz)}(hhh]h)}(h.iterate through all worker_pools in the systemh]h.iterate through all worker_pools in the system}(hjy4hjw4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM+hjt4ubah}(h]h ]h"]h$]h&]uh1jyhj?hhhNhNubj)}(hXz**Parameters** ``pool`` iteration cursor ``pi`` integer used for iteration **Description** This must be called either with wq_pool_mutex held or RCU read locked. If the pool needs to be used beyond the locking in effect, the caller is responsible for guaranteeing that the pool stays online. The if/else clause exists only for the lockdep assertion and can be ignored.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hhhj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/hj4ubjd)}(hhh](ji)}(h``pool`` iteration cursor h](jo)}(h``pool``h]j)}(hj4h]hpool}(hhhj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM,hj4ubj)}(hhh]h)}(hiteration cursorh]hiteration cursor}(hj4hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hM,hj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhhj4hM,hj4ubji)}(h"``pi`` integer used for iteration h](jo)}(h``pi``h]j)}(hj4h]hpi}(hhhj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM-hj4ubj)}(hhh]h)}(hinteger used for iterationh]hinteger used for iteration}(hj5hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4hM-hj5ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhhj4hM-hj4ubeh}(h]h ]h"]h$]h&]uh1jchj4ubh)}(h**Description**h]j)}(hj%5h]h Description}(hhhj'5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#5ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/hj4ubh)}(hThis must be called either with wq_pool_mutex held or RCU read locked. If the pool needs to be used beyond the locking in effect, the caller is responsible for guaranteeing that the pool stays online.h]hThis must be called either with wq_pool_mutex held or RCU read locked. If the pool needs to be used beyond the locking in effect, the caller is responsible for guaranteeing that the pool stays online.}(hj=5hj;5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/hj4ubh)}(hLThe if/else clause exists only for the lockdep assertion and can be ignored.h]hLThe if/else clause exists only for the lockdep assertion and can be ignored.}(hjL5hjJ5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM3hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]for_each_pool_worker (C macro)c.for_each_pool_workerhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hfor_each_pool_workerh]jm)}(hfor_each_pool_workerh]j)}(hfor_each_pool_workerh]j)}(hjs5h]hfor_each_pool_worker}(hhhj}5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy5ubah}(h]h ](jjeh"]h$]h&]jjuh1jhju5hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMFubah}(h]h ]h"]h$]h&]jjjuh1jljjhjq5hhhj5hMFubah}(h]jl5ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMEhjn5hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjn5hhhj5hMFubeh}(h]h ](jmacroeh"]h$]h&]jjjj5jj5juh1jahhhj?hNhNubh)}(h'``for_each_pool_worker (worker, pool)``h]j)}(hj5h]h#for_each_pool_worker (worker, pool)}(hhhj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMGhj?hhubjz)}(hhh]h)}(h,iterate through all workers of a worker_poolh]h,iterate through all workers of a worker_pool}(hj5hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM<hj5ubah}(h]h ]h"]h$]h&]uh1jyhj?hhhNhNubj)}(h**Parameters** ``worker`` iteration cursor ``pool`` worker_pool to iterate workers of **Description** This must be called with wq_pool_attach_mutex. The if/else clause exists only for the lockdep assertion and can be ignored.h](h)}(h**Parameters**h]j)}(hj5h]h Parameters}(hhhj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM@hj5ubjd)}(hhh](ji)}(h``worker`` iteration cursor h](jo)}(h ``worker``h]j)}(hj6h]hworker}(hhhj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM=hj5ubj)}(hhh]h)}(hiteration cursorh]hiteration cursor}(hj6hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hM=hj6ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhhj6hM=hj5ubji)}(h+``pool`` worker_pool to iterate workers of h](jo)}(h``pool``h]j)}(hj<6h]hpool}(hhhj>6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:6ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM>hj66ubj)}(hhh]h)}(h!worker_pool to iterate workers ofh]h!worker_pool to iterate workers of}(hjW6hjU6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ6hM>hjR6ubah}(h]h ]h"]h$]h&]uh1jhj66ubeh}(h]h ]h"]h$]h&]uh1jhhjQ6hM>hj5ubeh}(h]h ]h"]h$]h&]uh1jchj5ubh)}(h**Description**h]j)}(hjw6h]h Description}(hhhjy6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju6ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM@hj5ubh)}(h.This must be called with wq_pool_attach_mutex.h]h.This must be called with wq_pool_attach_mutex.}(hj6hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM@hj5ubh)}(hLThe if/else clause exists only for the lockdep assertion and can be ignored.h]hLThe if/else clause exists only for the lockdep assertion and can be ignored.}(hj6hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMBhj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]for_each_pwq (C macro)c.for_each_pwqhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h for_each_pwqh]jm)}(h for_each_pwqh]j)}(h for_each_pwqh]j)}(hj6h]h for_each_pwq}(hhhj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj6hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMWubah}(h]h ]h"]h$]h&]jjjuh1jljjhj6hhhj6hMWubah}(h]j6ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMVhj6hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj6hhhj6hMWubeh}(h]h ](jmacroeh"]h$]h&]jjjj6jj6juh1jahhhj?hNhNubh)}(h``for_each_pwq (pwq, wq)``h]j)}(hj7h]hfor_each_pwq (pwq, wq)}(hhhj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMXhj?hhubjz)}(hhh]h)}(h>iterate through all pool_workqueues of the specified workqueueh]h>iterate through all pool_workqueues of the specified workqueue}(hj7hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMKhj7ubah}(h]h ]h"]h$]h&]uh1jyhj?hhhNhNubj)}(hXl**Parameters** ``pwq`` iteration cursor ``wq`` the target workqueue **Description** This must be called either with wq->mutex held or RCU read locked. If the pwq needs to be used beyond the locking in effect, the caller is responsible for guaranteeing that the pwq stays online. The if/else clause exists only for the lockdep assertion and can be ignored.h](h)}(h**Parameters**h]j)}(hj67h]h Parameters}(hhhj87hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj47ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOhj07ubjd)}(hhh](ji)}(h``pwq`` iteration cursor h](jo)}(h``pwq``h]j)}(hjU7h]hpwq}(hhhjW7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS7ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMLhjO7ubj)}(hhh]h)}(hiteration cursorh]hiteration cursor}(hjp7hjn7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjj7hMLhjk7ubah}(h]h ]h"]h$]h&]uh1jhjO7ubeh}(h]h ]h"]h$]h&]uh1jhhjj7hMLhjL7ubji)}(h``wq`` the target workqueue h](jo)}(h``wq``h]j)}(hj7h]hwq}(hhhj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMMhj7ubj)}(hhh]h)}(hthe target workqueueh]hthe target workqueue}(hj7hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMMhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhhj7hMMhjL7ubeh}(h]h ]h"]h$]h&]uh1jchj07ubh)}(h**Description**h]j)}(hj7h]h Description}(hhhj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOhj07ubh)}(hThis must be called either with wq->mutex held or RCU read locked. If the pwq needs to be used beyond the locking in effect, the caller is responsible for guaranteeing that the pwq stays online.h]hThis must be called either with wq->mutex held or RCU read locked. If the pwq needs to be used beyond the locking in effect, the caller is responsible for guaranteeing that the pwq stays online.}(hj7hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOhj07ubh)}(hLThe if/else clause exists only for the lockdep assertion and can be ignored.h]hLThe if/else clause exists only for the lockdep assertion and can be ignored.}(hj7hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMShj07ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]"worker_pool_assign_id (C function)c.worker_pool_assign_idhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4int worker_pool_assign_id (struct worker_pool *pool)h]jm)}(h3int worker_pool_assign_id(struct worker_pool *pool)h](j0)}(hinth]hint}(hhhj8hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj8hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj,8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhj+8hMubj)}(hworker_pool_assign_idh]j)}(hworker_pool_assign_idh]hworker_pool_assign_id}(hhhj>8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:8ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj8hhhj+8hMubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjZ8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjV8ubj)}(h h]h }(hhhjg8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV8ubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjx8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju8ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjz8modnameN classnameNjj)}j]j)}jj@8sbc.worker_pool_assign_idasbuh1hhjV8ubj)}(h h]h }(hhhj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV8ubj)}(hjdh]h*}(hhhj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV8ubj)}(hpoolh]hpool}(hhhj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjR8ubah}(h]h ]h"]h$]h&]jjuh1jhj8hhhj+8hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj8hhhj+8hMubah}(h]j8ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj8hhubj)}(hhh]h)}(h%allocate ID and assign it to **pool**h](hallocate ID and assign it to }(hallocate ID and assign it to hj8hhhNhNubj)}(h**pool**h]hpool}(hhhj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj8hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj+8hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj9jj9juh1jahhhj?hNhNubj)}(h**Parameters** ``struct worker_pool *pool`` the pool pointer of interest **Description** Returns 0 if ID in [0, WORK_OFFQ_POOL_NONE) is allocated and assigned successfully, -errno on failure.h](h)}(h**Parameters**h]j)}(hj9h]h Parameters}(hhhj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 9ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj 9ubjd)}(hhh]ji)}(h:``struct worker_pool *pool`` the pool pointer of interest h](jo)}(h``struct worker_pool *pool``h]j)}(hj.9h]hstruct worker_pool *pool}(hhhj09hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,9ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj(9ubj)}(hhh]h)}(hthe pool pointer of interesth]hthe pool pointer of interest}(hjI9hjG9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC9hMhjD9ubah}(h]h ]h"]h$]h&]uh1jhj(9ubeh}(h]h ]h"]h$]h&]uh1jhhjC9hMhj%9ubah}(h]h ]h"]h$]h&]uh1jchj 9ubh)}(h**Description**h]j)}(hji9h]h Description}(hhhjk9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg9ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj 9ubh)}(hfReturns 0 if ID in [0, WORK_OFFQ_POOL_NONE) is allocated and assigned successfully, -errno on failure.h]hfReturns 0 if ID in [0, WORK_OFFQ_POOL_NONE) is allocated and assigned successfully, -errno on failure.}(hj9hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj 9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]&unbound_effective_cpumask (C function)c.unbound_effective_cpumaskhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hHstruct cpumask * unbound_effective_cpumask (struct workqueue_struct *wq)h]jm)}(hFstruct cpumask *unbound_effective_cpumask(struct workqueue_struct *wq)h](js)}(hjvh]hstruct}(hhhj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj9hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9hhhj9hMubh)}(hhh]j)}(hcpumaskh]hcpumask}(hhhj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj9modnameN classnameNjj)}j]j)}junbound_effective_cpumasksbc.unbound_effective_cpumaskasbuh1hhj9hhhj9hMubj)}(h h]h }(hhhj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9hhhj9hMubj)}(hjdh]h*}(hhhj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9hhhj9hMubj)}(hunbound_effective_cpumaskh]j)}(hj9h]hunbound_effective_cpumask}(hhhj :hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj :ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj9hhhj9hMubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj(:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj$:ubj)}(h h]h }(hhhj5:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$:ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjF:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjH:modnameN classnameNjj)}j]j9c.unbound_effective_cpumaskasbuh1hhj$:ubj)}(h h]h }(hhhjd:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$:ubj)}(hjdh]h*}(hhhjr:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$:ubj)}(hwqh]hwq}(hhhj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj :ubah}(h]h ]h"]h$]h&]jjuh1jhj9hhhj9hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj9hhhj9hMubah}(h]j9ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj9hhubj)}(hhh]h)}(h)effective cpumask of an unbound workqueueh]h)effective cpumask of an unbound workqueue}(hj:hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:hhubah}(h]h ]h"]h$]h&]uh1jhj9hhhj9hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj:jj:juh1jahhhj?hNhNubj)}(hX@**Parameters** ``struct workqueue_struct *wq`` workqueue of interest **Description** **wq->unbound_attrs->cpumask** contains the cpumask requested by the user which is masked with wq_unbound_cpumask to determine the effective cpumask. The default pwq is always mapped to the pool with the current effective cpumask.h](h)}(h**Parameters**h]j)}(hj:h]h Parameters}(hhhj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:ubjd)}(hhh]ji)}(h6``struct workqueue_struct *wq`` workqueue of interest h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj:h]hstruct workqueue_struct *wq}(hhhj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:ubj)}(hhh]h)}(hworkqueue of interesth]hworkqueue of interest}(hj;hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhhj;hMhj:ubah}(h]h ]h"]h$]h&]uh1jchj:ubh)}(h**Description**h]j)}(hj&;h]h Description}(hhhj(;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$;ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:ubh)}(h**wq->unbound_attrs->cpumask** contains the cpumask requested by the user which is masked with wq_unbound_cpumask to determine the effective cpumask. The default pwq is always mapped to the pool with the current effective cpumask.h](j)}(h**wq->unbound_attrs->cpumask**h]hwq->unbound_attrs->cpumask}(hhhj@;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<;ubh contains the cpumask requested by the user which is masked with wq_unbound_cpumask to determine the effective cpumask. The default pwq is always mapped to the pool with the current effective cpumask.}(h contains the cpumask requested by the user which is masked with wq_unbound_cpumask to determine the effective cpumask. The default pwq is always mapped to the pool with the current effective cpumask.hj<;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]get_work_pool (C function)c.get_work_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h=struct worker_pool * get_work_pool (struct work_struct *work)h]jm)}(h;struct worker_pool *get_work_pool(struct work_struct *work)h](js)}(hjvh]hstruct}(hhhjz;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjv;hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbubj)}(h h]h }(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv;hhhj;hMbubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj;modnameN classnameNjj)}j]j)}j get_work_poolsbc.get_work_poolasbuh1hhjv;hhhj;hMbubj)}(h h]h }(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv;hhhj;hMbubj)}(hjdh]h*}(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv;hhhj;hMbubj)}(h get_work_poolh]j)}(hj;h]h get_work_pool}(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjv;hhhj;hMbubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj;ubj)}(h h]h }(hhhj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj<modnameN classnameNjj)}j]j;c.get_work_poolasbuh1hhj;ubj)}(h h]h }(hhhj0<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hjdh]h*}(hhhj><hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hworkh]hwork}(hhhjK<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj;ubah}(h]h ]h"]h$]h&]jjuh1jhjv;hhhj;hMbubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjr;hhhj;hMbubah}(h]jm;ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMohjo;hhubj)}(hhh]h)}(h7return the worker_pool a given work was associated withh]h7return the worker_pool a given work was associated with}(hjx<hjv<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMahjs<hhubah}(h]h ]h"]h$]h&]uh1jhjo;hhhj;hMbubeh}(h]h ](jfunctioneh"]h$]h&]jjjj<jj<juh1jahhhj?hNhNubj)}(hXi**Parameters** ``struct work_struct *work`` the work item of interest **Description** Pools are created and destroyed under wq_pool_mutex, and allows read access under RCU read lock. As such, this function should be called under wq_pool_mutex or inside of a rcu_read_lock() region. All fields of the returned pool are accessible as long as the above mentioned locking is in effect. If the returned pool needs to be used beyond the critical section, the caller is responsible for ensuring the returned pool is and stays online. **Return** The worker_pool **work** was last associated with. ``NULL`` if none.h](h)}(h**Parameters**h]j)}(hj<h]h Parameters}(hhhj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehj<ubjd)}(hhh]ji)}(h7``struct work_struct *work`` the work item of interest h](jo)}(h``struct work_struct *work``h]j)}(hj<h]hstruct work_struct *work}(hhhj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbhj<ubj)}(hhh]h)}(hthe work item of interesth]hthe work item of interest}(hj<hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMbhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhhj<hMbhj<ubah}(h]h ]h"]h$]h&]uh1jchj<ubh)}(h**Description**h]j)}(hj<h]h Description}(hhhj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdhj<ubh)}(hPools are created and destroyed under wq_pool_mutex, and allows read access under RCU read lock. As such, this function should be called under wq_pool_mutex or inside of a rcu_read_lock() region.h]hPools are created and destroyed under wq_pool_mutex, and allows read access under RCU read lock. As such, this function should be called under wq_pool_mutex or inside of a rcu_read_lock() region.}(hj =hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdhj<ubh)}(hAll fields of the returned pool are accessible as long as the above mentioned locking is in effect. If the returned pool needs to be used beyond the critical section, the caller is responsible for ensuring the returned pool is and stays online.h]hAll fields of the returned pool are accessible as long as the above mentioned locking is in effect. If the returned pool needs to be used beyond the critical section, the caller is responsible for ensuring the returned pool is and stays online.}(hj=hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhhj<ubh)}(h **Return**h]j)}(hj(=h]hReturn}(hhhj*=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&=ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMmhj<ubh)}(hEThe worker_pool **work** was last associated with. ``NULL`` if none.h](hThe worker_pool }(hThe worker_pool hj>=hhhNhNubj)}(h**work**h]hwork}(hhhjG=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>=ubh was last associated with. }(h was last associated with. hj>=hhhNhNubj)}(h``NULL``h]hNULL}(hhhjZ=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>=ubh if none.}(h if none.hj>=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMmhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]worker_set_flags (C function)c.worker_set_flagshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hAvoid worker_set_flags (struct worker *worker, unsigned int flags)h]jm)}(h@void worker_set_flags(struct worker *worker, unsigned int flags)h](j0)}(hvoidh]hvoid}(hhhj=hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj=hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj=hMubj)}(hworker_set_flagsh]j)}(hworker_set_flagsh]hworker_set_flags}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj=hhhj=hMubj)}(h+(struct worker *worker, unsigned int flags)h](j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj=ubj)}(h h]h }(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubh)}(hhh]j)}(hworkerh]hworker}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj=modnameN classnameNjj)}j]j)}jj=sbc.worker_set_flagsasbuh1hhj=ubj)}(h h]h }(hhhj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hjdh]h*}(hhhj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(hworkerh]hworker}(hhhj*>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubj)}(hunsigned int flagsh](j0)}(hunsignedh]hunsigned}(hhhjC>hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj?>ubj)}(h h]h }(hhhjQ>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?>ubj0)}(hinth]hint}(hhhj_>hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj?>ubj)}(h h]h }(hhhjm>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?>ubj)}(hflagsh]hflags}(hhhj{>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubeh}(h]h ]h"]h$]h&]jjuh1jhj=hhhj=hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj=hhhj=hMubah}(h]j=ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj=hhubj)}(hhh]h)}(h2set worker flags and adjust nr_running accordinglyh]h2set worker flags and adjust nr_running accordingly}(hj>hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj=hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj>jj>juh1jahhhj?hNhNubj)}(h**Parameters** ``struct worker *worker`` self ``unsigned int flags`` flags to set **Description** Set **flags** in **worker->flags** and adjust nr_running accordingly.h](h)}(h**Parameters**h]j)}(hj>h]h Parameters}(hhhj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj>ubjd)}(hhh](ji)}(h``struct worker *worker`` self h](jo)}(h``struct worker *worker``h]j)}(hj>h]hstruct worker *worker}(hhhj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj>ubj)}(hhh]h)}(hselfh]hself}(hj?hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhhj>hMhj>ubji)}(h$``unsigned int flags`` flags to set h](jo)}(h``unsigned int flags``h]j)}(hj ?h]hunsigned int flags}(hhhj"?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj?ubj)}(hhh]h)}(h flags to seth]h flags to set}(hj;?hj9?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5?hMhj6?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhhj5?hMhj>ubeh}(h]h ]h"]h$]h&]uh1jchj>ubh)}(h**Description**h]j)}(hj[?h]h Description}(hhhj]?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY?ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj>ubh)}(hESet **flags** in **worker->flags** and adjust nr_running accordingly.h](hSet }(hSet hjq?hhhNhNubj)}(h **flags**h]hflags}(hhhjz?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq?ubh in }(h in hjq?hhhNhNubj)}(h**worker->flags**h]h worker->flags}(hhhj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq?ubh# and adjust nr_running accordingly.}(h# and adjust nr_running accordingly.hjq?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]worker_clr_flags (C function)c.worker_clr_flagshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hAvoid worker_clr_flags (struct worker *worker, unsigned int flags)h]jm)}(h@void worker_clr_flags(struct worker *worker, unsigned int flags)h](j0)}(hvoidh]hvoid}(hhhj?hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj?hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMubj)}(hworker_clr_flagsh]j)}(hworker_clr_flagsh]hworker_clr_flags}(hhhj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj?hhhj?hMubj)}(h+(struct worker *worker, unsigned int flags)h](j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj@ubj)}(h h]h }(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubh)}(hhh]j)}(hworkerh]hworker}(hhhj"@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$@modnameN classnameNjj)}j]j)}jj?sbc.worker_clr_flagsasbuh1hhj@ubj)}(h h]h }(hhhjB@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hjdh]h*}(hhhjP@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hworkerh]hworker}(hhhj]@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj?ubj)}(hunsigned int flagsh](j0)}(hunsignedh]hunsigned}(hhhjv@hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjr@ubj)}(h h]h }(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr@ubj0)}(hinth]hint}(hhhj@hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjr@ubj)}(h h]h }(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr@ubj)}(hflagsh]hflags}(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj?ubeh}(h]h ]h"]h$]h&]jjuh1jhj?hhhj?hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj?hhhj?hMubah}(h]j?ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj?hhubj)}(hhh]h)}(h4clear worker flags and adjust nr_running accordinglyh]h4clear worker flags and adjust nr_running accordingly}(hj@hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj@hhubah}(h]h ]h"]h$]h&]uh1jhj?hhhj?hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj@jj@juh1jahhhj?hNhNubj)}(h**Parameters** ``struct worker *worker`` self ``unsigned int flags`` flags to clear **Description** Clear **flags** in **worker->flags** and adjust nr_running accordingly.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hhhj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj@ubjd)}(hhh](ji)}(h``struct worker *worker`` self h](jo)}(h``struct worker *worker``h]j)}(hjAh]hstruct worker *worker}(hhhjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjAubj)}(hhh]h)}(hselfh]hself}(hj5Ahj3AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/AhMhj0Aubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhhj/AhMhjAubji)}(h&``unsigned int flags`` flags to clear h](jo)}(h``unsigned int flags``h]j)}(hjSAh]hunsigned int flags}(hhhjUAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQAubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMAubj)}(hhh]h)}(hflags to clearh]hflags to clear}(hjnAhjlAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhAhMhjiAubah}(h]h ]h"]h$]h&]uh1jhjMAubeh}(h]h ]h"]h$]h&]uh1jhhjhAhMhjAubeh}(h]h ]h"]h$]h&]uh1jchj@ubh)}(h**Description**h]j)}(hjAh]h Description}(hhhjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj@ubh)}(hGClear **flags** in **worker->flags** and adjust nr_running accordingly.h](hClear }(hClear hjAhhhNhNubj)}(h **flags**h]hflags}(hhhjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh in }(h in hjAhhhNhNubj)}(h**worker->flags**h]h worker->flags}(hhhjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh# and adjust nr_running accordingly.}(h# and adjust nr_running accordingly.hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]worker_enter_idle (C function)c.worker_enter_idlehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h.void worker_enter_idle (struct worker *worker)h]jm)}(h-void worker_enter_idle(struct worker *worker)h](j0)}(hvoidh]hvoid}(hhhjAhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjAhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h :h]h }(hhhj BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhjBhMubj)}(hworker_enter_idleh]j)}(hworker_enter_idleh]hworker_enter_idle}(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]jjuh1jhjAhhhjBhMubj)}(h(struct worker *worker)h]j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhj7BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj3Bubj)}(h h]h }(hhhjDBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Bubh)}(hhh]j)}(hworkerh]hworker}(hhhjUBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRBubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjWBmodnameN classnameNjj)}j]j)}jjBsbc.worker_enter_idleasbuh1hhj3Bubj)}(h h]h }(hhhjuBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Bubj)}(hjdh]h*}(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Bubj)}(hworkerh]hworker}(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Bubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/Bubah}(h]h ]h"]h$]h&]jjuh1jhjAhhhjBhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjAhhhjBhMubah}(h]jAah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjAhhubj)}(hhh]h)}(henter idle stateh]henter idle state}(hjBhjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjBhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjBjjBjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct worker *worker`` worker which is entering idle state **Description** **worker** is entering idle state. Update stats and idle timer if necessary. LOCKING: raw_spin_lock_irq(pool->lock).h](h)}(h**Parameters**h]j)}(hjBh]h Parameters}(hhhjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubjd)}(hhh]ji)}(h>``struct worker *worker`` worker which is entering idle state h](jo)}(h``struct worker *worker``h]j)}(hjBh]hstruct worker *worker}(hhhjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubj)}(hhh]h)}(h#worker which is entering idle stateh]h#worker which is entering idle state}(hjChjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjCubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhhjChMhjBubah}(h]h ]h"]h$]h&]uh1jchjBubh)}(h**Description**h]j)}(hj7Ch]h Description}(hhhj9ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5Cubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubh)}(hM**worker** is entering idle state. Update stats and idle timer if necessary.h](j)}(h **worker**h]hworker}(hhhjQChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMCubhC is entering idle state. Update stats and idle timer if necessary.}(hC is entering idle state. Update stats and idle timer if necessary.hjMChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubh)}(h'LOCKING: raw_spin_lock_irq(pool->lock).h]h'LOCKING: raw_spin_lock_irq(pool->lock).}(hjmChjkChhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]worker_leave_idle (C function)c.worker_leave_idlehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h.void worker_leave_idle (struct worker *worker)h]jm)}(h-void worker_leave_idle(struct worker *worker)h](j0)}(hvoidh]hvoid}(hhhjChhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjChhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM"ubj)}(h h]h }(hhhjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhjChM"ubj)}(hworker_leave_idleh]j)}(hworker_leave_idleh]hworker_leave_idle}(hhhjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jhjChhhjChM"ubj)}(h(struct worker *worker)h]j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjCubj)}(h h]h }(hhhjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubh)}(hhh]j)}(hworkerh]hworker}(hhhjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCmodnameN classnameNjj)}j]j)}jjCsbc.worker_leave_idleasbuh1hhjCubj)}(h h]h }(hhhjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjdh]h*}(hhhj#DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hworkerh]hworker}(hhhj0DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjCubah}(h]h ]h"]h$]h&]jjuh1jhjChhhjChM"ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjChhhjChM"ubah}(h]jCah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM)hjChhubj)}(hhh]h)}(hleave idle stateh]hleave idle state}(hj]Dhj[DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM!hjXDhhubah}(h]h ]h"]h$]h&]uh1jhjChhhjChM"ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsDjjsDjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct worker *worker`` worker which is leaving idle state **Description** **worker** is leaving idle state. Update stats. LOCKING: raw_spin_lock_irq(pool->lock).h](h)}(h**Parameters**h]j)}(hj}Dh]h Parameters}(hhhjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{Dubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM%hjwDubjd)}(hhh]ji)}(h=``struct worker *worker`` worker which is leaving idle state h](jo)}(h``struct worker *worker``h]j)}(hjDh]hstruct worker *worker}(hhhjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM"hjDubj)}(hhh]h)}(h"worker which is leaving idle stateh]h"worker which is leaving idle state}(hjDhjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhM"hjDubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhhjDhM"hjDubah}(h]h ]h"]h$]h&]uh1jchjwDubh)}(h**Description**h]j)}(hjDh]h Description}(hhhjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM$hjwDubh)}(h0**worker** is leaving idle state. Update stats.h](j)}(h **worker**h]hworker}(hhhjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh& is leaving idle state. Update stats.}(h& is leaving idle state. Update stats.hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM$hjwDubh)}(h'LOCKING: raw_spin_lock_irq(pool->lock).h]h'LOCKING: raw_spin_lock_irq(pool->lock).}(hj Ehj EhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM&hjwDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]'find_worker_executing_work (C function)c.find_worker_executing_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h_struct worker * find_worker_executing_work (struct worker_pool *pool, struct work_struct *work)h]jm)}(h]struct worker *find_worker_executing_work(struct worker_pool *pool, struct work_struct *work)h](js)}(hjvh]hstruct}(hhhj:EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj6EhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6ubj)}(h h]h }(hhhjHEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6EhhhjGEhM6ubh)}(hhh]j)}(hworkerh]hworker}(hhhjYEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVEubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj[EmodnameN classnameNjj)}j]j)}jfind_worker_executing_worksbc.find_worker_executing_workasbuh1hhj6EhhhjGEhM6ubj)}(h h]h }(hhhjzEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6EhhhjGEhM6ubj)}(hjdh]h*}(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6EhhhjGEhM6ubj)}(hfind_worker_executing_workh]j)}(hjwEh]hfind_worker_executing_work}(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jhj6EhhhjGEhM6ubj)}(h4(struct worker_pool *pool, struct work_struct *work)h](j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjEubj)}(h h]h }(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEmodnameN classnameNjj)}j]juEc.find_worker_executing_workasbuh1hhjEubj)}(h h]h }(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hjdh]h*}(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hpoolh]hpool}(hhhj FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjEubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhj$FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj Fubj)}(h h]h }(hhhj1FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Fubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjBFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?Fubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjDFmodnameN classnameNjj)}j]juEc.find_worker_executing_workasbuh1hhj Fubj)}(h h]h }(hhhj`FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Fubj)}(hjdh]h*}(hhhjnFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Fubj)}(hworkh]hwork}(hhhj{FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Fubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjEubeh}(h]h ]h"]h$]h&]jjuh1jhj6EhhhjGEhM6ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj2EhhhjGEhM6ubah}(h]j-Eah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMUhj/Ehhubj)}(hhh]h)}(h%find worker which is executing a workh]h%find worker which is executing a work}(hjFhjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM5hjFhhubah}(h]h ]h"]h$]h&]uh1jhj/EhhhjGEhM6ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjFjjFjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct worker_pool *pool`` pool of interest ``struct work_struct *work`` work to find worker for **Description** Find a worker which is executing **work** on **pool** by searching **pool->busy_hash** which is keyed by the address of **work**. For a worker to match, its current execution should match the address of **work** and its work function. This is to avoid unwanted dependency between unrelated work executions through a work item being recycled while still being executed. This is a bit tricky. A work item may be freed once its execution starts and nothing prevents the freed area from being recycled for another work item. If the same work item address ends up being reused before the original execution finishes, workqueue will identify the recycled work item as currently executing and make it wait until the current execution finishes, introducing an unwanted dependency. This function checks the work item address and work function to avoid false positives. Note that this isn't complete as one may construct a work function which can introduce dependency onto itself through a recycled work item. Well, if somebody wants to shoot oneself in the foot that badly, there's only so much we can do, and if such deadlock actually occurs, it should be easy to locate the culprit work function. **Context** raw_spin_lock_irq(pool->lock). **Return** Pointer to worker which is executing **work** if found, ``NULL`` otherwise.h](h)}(h**Parameters**h]j)}(hjFh]h Parameters}(hhhjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM9hjFubjd)}(hhh](ji)}(h.``struct worker_pool *pool`` pool of interest h](jo)}(h``struct worker_pool *pool``h]j)}(hjFh]hstruct worker_pool *pool}(hhhjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6hjFubj)}(hhh]h)}(hpool of interesth]hpool of interest}(hjGhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhM6hjFubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhhjFhM6hjFubji)}(h5``struct work_struct *work`` work to find worker for h](jo)}(h``struct work_struct *work``h]j)}(hj Gh]hstruct work_struct *work}(hhhj"GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM7hjGubj)}(hhh]h)}(hwork to find worker forh]hwork to find worker for}(hj;Ghj9GhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5GhM7hj6Gubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhhj5GhM7hjFubeh}(h]h ]h"]h$]h&]uh1jchjFubh)}(h**Description**h]j)}(hj[Gh]h Description}(hhhj]GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYGubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM9hjFubh)}(hXrFind a worker which is executing **work** on **pool** by searching **pool->busy_hash** which is keyed by the address of **work**. For a worker to match, its current execution should match the address of **work** and its work function. This is to avoid unwanted dependency between unrelated work executions through a work item being recycled while still being executed.h](h!Find a worker which is executing }(h!Find a worker which is executing hjqGhhhNhNubj)}(h**work**h]hwork}(hhhjzGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqGubh on }(h on hjqGhhhNhNubj)}(h**pool**h]hpool}(hhhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqGubh by searching }(h by searching hjqGhhhNhNubj)}(h**pool->busy_hash**h]hpool->busy_hash}(hhhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqGubh" which is keyed by the address of }(h" which is keyed by the address of hjqGhhhNhNubj)}(h**work**h]hwork}(hhhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqGubhL. For a worker to match, its current execution should match the address of }(hL. For a worker to match, its current execution should match the address of hjqGhhhNhNubj)}(h**work**h]hwork}(hhhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqGubh and its work function. This is to avoid unwanted dependency between unrelated work executions through a work item being recycled while still being executed.}(h and its work function. This is to avoid unwanted dependency between unrelated work executions through a work item being recycled while still being executed.hjqGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM9hjFubh)}(hXThis is a bit tricky. A work item may be freed once its execution starts and nothing prevents the freed area from being recycled for another work item. If the same work item address ends up being reused before the original execution finishes, workqueue will identify the recycled work item as currently executing and make it wait until the current execution finishes, introducing an unwanted dependency.h]hXThis is a bit tricky. A work item may be freed once its execution starts and nothing prevents the freed area from being recycled for another work item. If the same work item address ends up being reused before the original execution finishes, workqueue will identify the recycled work item as currently executing and make it wait until the current execution finishes, introducing an unwanted dependency.}(hjGhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM@hjFubh)}(hXThis function checks the work item address and work function to avoid false positives. Note that this isn't complete as one may construct a work function which can introduce dependency onto itself through a recycled work item. Well, if somebody wants to shoot oneself in the foot that badly, there's only so much we can do, and if such deadlock actually occurs, it should be easy to locate the culprit work function.h]hXThis function checks the work item address and work function to avoid false positives. Note that this isn’t complete as one may construct a work function which can introduce dependency onto itself through a recycled work item. Well, if somebody wants to shoot oneself in the foot that badly, there’s only so much we can do, and if such deadlock actually occurs, it should be easy to locate the culprit work function.}(hjGhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMGhjFubh)}(h **Context**h]j)}(hjHh]hContext}(hhhjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMNhjFubh)}(hraw_spin_lock_irq(pool->lock).h]hraw_spin_lock_irq(pool->lock).}(hjHhjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMPhjFubh)}(h **Return**h]j)}(hj'Hh]hReturn}(hhhj)HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%Hubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRhjFubh)}(hKPointer to worker which is executing **work** if found, ``NULL`` otherwise.h](h%Pointer to worker which is executing }(h%Pointer to worker which is executing hj=HhhhNhNubj)}(h**work**h]hwork}(hhhjFHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Hubh if found, }(h if found, hj=HhhhNhNubj)}(h``NULL``h]hNULL}(hhhjYHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Hubh otherwise.}(h otherwise.hj=HhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMShjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]move_linked_works (C function)c.move_linked_workshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hevoid move_linked_works (struct work_struct *work, struct list_head *head, struct work_struct **nextp)h]jm)}(hdvoid move_linked_works(struct work_struct *work, struct list_head *head, struct work_struct **nextp)h](j0)}(hvoidh]hvoid}(hhhjHhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjHhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMeubj)}(h h]h }(hhhjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHhhhjHhMeubj)}(hmove_linked_worksh]j)}(hmove_linked_worksh]hmove_linked_works}(hhhjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1jhjHhhhjHhMeubj)}(hN(struct work_struct *work, struct list_head *head, struct work_struct **nextp)h](j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjHubj)}(h h]h }(hhhjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjHmodnameN classnameNjj)}j]j)}jjHsbc.move_linked_worksasbuh1hhjHubj)}(h h]h }(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hjdh]h*}(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hworkh]hwork}(hhhj)IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjHubj)}(hstruct list_head *headh](js)}(hjvh]hstruct}(hhhjBIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj>Iubj)}(h h]h }(hhhjOIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Iubh)}(hhh]j)}(h list_headh]h list_head}(hhhj`IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]Iubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjbImodnameN classnameNjj)}j]j Ic.move_linked_worksasbuh1hhj>Iubj)}(h h]h }(hhhj~IhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Iubj)}(hjdh]h*}(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Iubj)}(hheadh]hhead}(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Iubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjHubj)}(hstruct work_struct **nextph](js)}(hjvh]hstruct}(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjIubj)}(h h]h }(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjImodnameN classnameNjj)}j]j Ic.move_linked_worksasbuh1hhjIubj)}(h h]h }(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hjdh]h*}(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hjdh]h*}(hhhj JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(hnextph]hnextp}(hhhjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjHubeh}(h]h ]h"]h$]h&]jjuh1jhjHhhhjHhMeubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjHhhhjHhMeubah}(h]jHah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMqhjHhhubj)}(hhh]h)}(hmove linked works to a listh]hmove linked works to a list}(hjCJhjAJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdhj>Jhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjHhMeubeh}(h]h ](jfunctioneh"]h$]h&]jjjjYJjjYJjuh1jahhhj?hNhNubj)}(hX **Parameters** ``struct work_struct *work`` start of series of works to be scheduled ``struct list_head *head`` target list to append **work** to ``struct work_struct **nextp`` out parameter for nested worklist walking **Description** Schedule linked works starting from **work** to **head**. Work series to be scheduled starts at **work** and includes any consecutive work with WORK_STRUCT_LINKED set in its predecessor. See assign_work() for details on **nextp**. **Context** raw_spin_lock_irq(pool->lock).h](h)}(h**Parameters**h]j)}(hjcJh]h Parameters}(hhhjeJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaJubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhhj]Jubjd)}(hhh](ji)}(hF``struct work_struct *work`` start of series of works to be scheduled h](jo)}(h``struct work_struct *work``h]j)}(hjJh]hstruct work_struct *work}(hhhjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehj|Jubj)}(hhh]h)}(h(start of series of works to be scheduledh]h(start of series of works to be scheduled}(hjJhjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMehjJubah}(h]h ]h"]h$]h&]uh1jhj|Jubeh}(h]h ]h"]h$]h&]uh1jhhjJhMehjyJubji)}(h=``struct list_head *head`` target list to append **work** to h](jo)}(h``struct list_head *head``h]j)}(hjJh]hstruct list_head *head}(hhhjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMfhjJubj)}(hhh]h)}(h!target list to append **work** toh](htarget list to append }(htarget list to append hjJhhhNhNubj)}(h**work**h]hwork}(hhhjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh to}(h tohjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjJhMfhjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhhjJhMfhjyJubji)}(hI``struct work_struct **nextp`` out parameter for nested worklist walking h](jo)}(h``struct work_struct **nextp``h]j)}(hjKh]hstruct work_struct **nextp}(hhhj KhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMghjKubj)}(hhh]h)}(h)out parameter for nested worklist walkingh]h)out parameter for nested worklist walking}(hj#Khj!KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMghjKubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhhjKhMghjyJubeh}(h]h ]h"]h$]h&]uh1jchj]Jubh)}(h**Description**h]j)}(hjCKh]h Description}(hhhjEKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAKubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMihj]Jubh)}(hSchedule linked works starting from **work** to **head**. Work series to be scheduled starts at **work** and includes any consecutive work with WORK_STRUCT_LINKED set in its predecessor. See assign_work() for details on **nextp**.h](h$Schedule linked works starting from }(h$Schedule linked works starting from hjYKhhhNhNubj)}(h**work**h]hwork}(hhhjbKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYKubh to }(h to hjYKhhhNhNubj)}(h**head**h]hhead}(hhhjuKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYKubh(. Work series to be scheduled starts at }(h(. Work series to be scheduled starts at hjYKhhhNhNubj)}(h**work**h]hwork}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYKubht and includes any consecutive work with WORK_STRUCT_LINKED set in its predecessor. See assign_work() for details on }(ht and includes any consecutive work with WORK_STRUCT_LINKED set in its predecessor. See assign_work() for details on hjYKhhhNhNubj)}(h **nextp**h]hnextp}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYKubh.}(hjhjYKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMihj]Jubh)}(h **Context**h]j)}(hjKh]hContext}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMnhj]Jubh)}(hraw_spin_lock_irq(pool->lock).h]hraw_spin_lock_irq(pool->lock).}(hjKhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMphj]Jubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]assign_work (C function) c.assign_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h^bool assign_work (struct work_struct *work, struct worker *worker, struct work_struct **nextp)h]jm)}(h]bool assign_work(struct work_struct *work, struct worker *worker, struct work_struct **nextp)h](j0)}(hj h]hbool}(hhhjKhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjKhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKhhhjLhMubj)}(h assign_workh]j)}(h assign_workh]h assign_work}(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]jjuh1jhjKhhhjLhMubj)}(hM(struct work_struct *work, struct worker *worker, struct work_struct **nextp)h](j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhj7LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj3Lubj)}(h h]h }(hhhjDLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Lubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjULhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRLubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjWLmodnameN classnameNjj)}j]j)}jjLsb c.assign_workasbuh1hhj3Lubj)}(h h]h }(hhhjuLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Lubj)}(hjdh]h*}(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Lubj)}(hworkh]hwork}(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Lubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/Lubj)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjLubj)}(h h]h }(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubh)}(hhh]j)}(hworkerh]hworker}(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjLmodnameN classnameNjj)}j]jqL c.assign_workasbuh1hhjLubj)}(h h]h }(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hjdh]h*}(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hworkerh]hworker}(hhhjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/Lubj)}(hstruct work_struct **nextph](js)}(hjvh]hstruct}(hhhjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjMubj)}(h h]h }(hhhj&MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj7MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4Mubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj9MmodnameN classnameNjj)}j]jqL c.assign_workasbuh1hhjMubj)}(h h]h }(hhhjUMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hjdh]h*}(hhhjcMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hjdh]h*}(hhhjpMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hnextph]hnextp}(hhhj}MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/Lubeh}(h]h ]h"]h$]h&]jjuh1jhjKhhhjLhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjKhhhjLhMubah}(h]jKah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjKhhubj)}(hhh]h)}(h8assign a work item and its linked work items to a workerh]h8assign a work item and its linked work items to a worker}(hjMhjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjLhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct work_struct *work`` work to assign ``struct worker *worker`` worker to assign to ``struct work_struct **nextp`` out parameter for nested worklist walking **Description** Assign **work** and its linked work items to **worker**. If **work** is already being executed by another worker in the same pool, it'll be punted there. If **nextp** is not NULL, it's updated to point to the next work of the last scheduled work. This allows assign_work() to be nested inside list_for_each_entry_safe(). Returns ``true`` if **work** was successfully assigned to **worker**. ``false`` if **work** was punted to another worker already executing it.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hhhjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMubjd)}(hhh](ji)}(h,``struct work_struct *work`` work to assign h](jo)}(h``struct work_struct *work``h]j)}(hjMh]hstruct work_struct *work}(hhhjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMubj)}(hhh]h)}(hwork to assignh]hwork to assign}(hjNhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhhjMhMhjMubji)}(h.``struct worker *worker`` worker to assign to h](jo)}(h``struct worker *worker``h]j)}(hj"Nh]hstruct worker *worker}(hhhj$NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Nubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjNubj)}(hhh]h)}(hworker to assign toh]hworker to assign to}(hj=Nhj;NhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7NhMhj8Nubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhhj7NhMhjMubji)}(hI``struct work_struct **nextp`` out parameter for nested worklist walking h](jo)}(h``struct work_struct **nextp``h]j)}(hj[Nh]hstruct work_struct **nextp}(hhhj]NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYNubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjUNubj)}(hhh]h)}(h)out parameter for nested worklist walkingh]h)out parameter for nested worklist walking}(hjvNhjtNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjpNhMhjqNubah}(h]h ]h"]h$]h&]uh1jhjUNubeh}(h]h ]h"]h$]h&]uh1jhhjpNhMhjMubeh}(h]h ]h"]h$]h&]uh1jchjMubh)}(h**Description**h]j)}(hjNh]h Description}(hhhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMubh)}(hAssign **work** and its linked work items to **worker**. If **work** is already being executed by another worker in the same pool, it'll be punted there.h](hAssign }(hAssign hjNhhhNhNubj)}(h**work**h]hwork}(hhhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubh and its linked work items to }(h and its linked work items to hjNhhhNhNubj)}(h **worker**h]hworker}(hhhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubh. If }(h. If hjNhhhNhNubj)}(h**work**h]hwork}(hhhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubhW is already being executed by another worker in the same pool, it’ll be punted there.}(hU is already being executed by another worker in the same pool, it'll be punted there.hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMubh)}(hIf **nextp** is not NULL, it's updated to point to the next work of the last scheduled work. This allows assign_work() to be nested inside list_for_each_entry_safe().h](hIf }(hIf hjNhhhNhNubj)}(h **nextp**h]hnextp}(hhhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubh is not NULL, it’s updated to point to the next work of the last scheduled work. This allows assign_work() to be nested inside list_for_each_entry_safe().}(h is not NULL, it's updated to point to the next work of the last scheduled work. This allows assign_work() to be nested inside list_for_each_entry_safe().hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMubh)}(hReturns ``true`` if **work** was successfully assigned to **worker**. ``false`` if **work** was punted to another worker already executing it.h](hReturns }(hReturns hjOhhhNhNubj)}(h``true``h]htrue}(hhhj!OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh if }(h if hjOhhhNhNubj)}(h**work**h]hwork}(hhhj4OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh was successfully assigned to }(h was successfully assigned to hjOhhhNhNubj)}(h **worker**h]hworker}(hhhjGOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh. }(h. hjOhhhNhNubj)}(h ``false``h]hfalse}(hhhjZOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh if }(hj3OhjOubj)}(h**work**h]hwork}(hhhjlOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh3 was punted to another worker already executing it.}(h3 was punted to another worker already executing it.hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]kick_pool (C function) c.kick_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h)bool kick_pool (struct worker_pool *pool)h]jm)}(h(bool kick_pool(struct worker_pool *pool)h](j0)}(hj h]hbool}(hhhjOhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjOhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjOhMubj)}(h kick_poolh]j)}(h kick_poolh]h kick_pool}(hhhjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1jhjOhhhjOhMubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjOubj)}(h h]h }(hhhjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjPmodnameN classnameNjj)}j]j)}jjOsb c.kick_poolasbuh1hhjOubj)}(h h]h }(hhhj PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(hjdh]h*}(hhhj.PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(hpoolh]hpool}(hhhj;PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubah}(h]h ]h"]h$]h&]jjuh1jhjOhhhjOhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjOhhhjOhMubah}(h]jOah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjOhhubj)}(hhh]h)}(h#wake up an idle worker if necessaryh]h#wake up an idle worker if necessary}(hjhPhjfPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjcPhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhjOhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj~Pjj~Pjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct worker_pool *pool`` pool to kick **Description** **pool** may have pending work items. Wake up worker if necessary. Returns whether a worker was woken up.h](h)}(h**Parameters**h]j)}(hjPh]h Parameters}(hhhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjPubjd)}(hhh]ji)}(h*``struct worker_pool *pool`` pool to kick h](jo)}(h``struct worker_pool *pool``h]j)}(hjPh]hstruct worker_pool *pool}(hhhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjPubj)}(hhh]h)}(h pool to kickh]h pool to kick}(hjPhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMhjPubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhhjPhMhjPubah}(h]h ]h"]h$]h&]uh1jchjPubh)}(h**Description**h]j)}(hjPh]h Description}(hhhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjPubh)}(hi**pool** may have pending work items. Wake up worker if necessary. Returns whether a worker was woken up.h](j)}(h**pool**h]hpool}(hhhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubha may have pending work items. Wake up worker if necessary. Returns whether a worker was woken up.}(ha may have pending work items. Wake up worker if necessary. Returns whether a worker was woken up.hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]wq_worker_running (C function)c.wq_worker_runninghNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h1void wq_worker_running (struct task_struct *task)h]jm)}(h0void wq_worker_running(struct task_struct *task)h](j0)}(hvoidh]hvoid}(hhhj6QhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj2QhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMeubj)}(h h]h }(hhhjEQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2QhhhjDQhMeubj)}(hwq_worker_runningh]j)}(hwq_worker_runningh]hwq_worker_running}(hhhjWQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSQubah}(h]h ](jjeh"]h$]h&]jjuh1jhj2QhhhjDQhMeubj)}(h(struct task_struct *task)h]j)}(hstruct task_struct *taskh](js)}(hjvh]hstruct}(hhhjsQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjoQubj)}(h h]h }(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoQubh)}(hhh]j)}(h task_structh]h task_struct}(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjQmodnameN classnameNjj)}j]j)}jjYQsbc.wq_worker_runningasbuh1hhjoQubj)}(h h]h }(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoQubj)}(hjdh]h*}(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoQubj)}(htaskh]htask}(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoQubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjkQubah}(h]h ]h"]h$]h&]jjuh1jhj2QhhhjDQhMeubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj.QhhhjDQhMeubah}(h]j)Qah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMihj+Qhhubj)}(hhh]h)}(ha worker is running againh]ha worker is running again}(hjQhjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdhjQhhubah}(h]h ]h"]h$]h&]uh1jhj+QhhhjDQhMeubeh}(h]h ](jfunctioneh"]h$]h&]jjjjRjjRjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct task_struct *task`` task waking up **Description** This function is called when a worker returns from schedule()h](h)}(h**Parameters**h]j)}(hjRh]h Parameters}(hhhjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhhjRubjd)}(hhh]ji)}(h,``struct task_struct *task`` task waking up h](jo)}(h``struct task_struct *task``h]j)}(hj8Rh]hstruct task_struct *task}(hhhj:RhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6Rubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehj2Rubj)}(hhh]h)}(htask waking uph]htask waking up}(hjSRhjQRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMRhMehjNRubah}(h]h ]h"]h$]h&]uh1jhj2Rubeh}(h]h ]h"]h$]h&]uh1jhhjMRhMehj/Rubah}(h]h ]h"]h$]h&]uh1jchjRubh)}(h**Description**h]j)}(hjsRh]h Description}(hhhjuRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqRubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMghjRubh)}(h=This function is called when a worker returns from schedule()h]h=This function is called when a worker returns from schedule()}(hjRhjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMghjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]wq_worker_sleeping (C function)c.wq_worker_sleepinghNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h2void wq_worker_sleeping (struct task_struct *task)h]jm)}(h1void wq_worker_sleeping(struct task_struct *task)h](j0)}(hvoidh]hvoid}(hhhjRhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjRhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhjRhMubj)}(hwq_worker_sleepingh]j)}(hwq_worker_sleepingh]hwq_worker_sleeping}(hhhjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]jjuh1jhjRhhhjRhMubj)}(h(struct task_struct *task)h]j)}(hstruct task_struct *taskh](js)}(hjvh]hstruct}(hhhjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjRubj)}(h h]h }(hhhjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubh)}(hhh]j)}(h task_structh]h task_struct}(hhhjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjSmodnameN classnameNjj)}j]j)}jjRsbc.wq_worker_sleepingasbuh1hhjRubj)}(h h]h }(hhhj3ShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj)}(hjdh]h*}(hhhjAShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj)}(htaskh]htask}(hhhjNShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRubah}(h]h ]h"]h$]h&]jjuh1jhjRhhhjRhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjRhhhjRhMubah}(h]jRah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjRhhubj)}(hhh]h)}(ha worker is going to sleeph]ha worker is going to sleep}(hj{ShjyShhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjvShhubah}(h]h ]h"]h$]h&]uh1jhjRhhhjRhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjSjjSjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct task_struct *task`` task going to sleep **Description** This function is called from schedule() when a busy worker is going to sleep.h](h)}(h**Parameters**h]j)}(hjSh]h Parameters}(hhhjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubjd)}(hhh]ji)}(h1``struct task_struct *task`` task going to sleep h](jo)}(h``struct task_struct *task``h]j)}(hjSh]hstruct task_struct *task}(hhhjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubj)}(hhh]h)}(htask going to sleeph]htask going to sleep}(hjShjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhhjShMhjSubah}(h]h ]h"]h$]h&]uh1jchjSubh)}(h**Description**h]j)}(hjSh]h Description}(hhhjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubh)}(hMThis function is called from schedule() when a busy worker is going to sleep.h]hMThis function is called from schedule() when a busy worker is going to sleep.}(hj Thj ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]wq_worker_tick (C function)c.wq_worker_tickhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h.void wq_worker_tick (struct task_struct *task)h]jm)}(h-void wq_worker_tick(struct task_struct *task)h](j0)}(hvoidh]hvoid}(hhhj:ThhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj6ThhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjIThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ThhhjHThMubj)}(hwq_worker_tickh]j)}(hwq_worker_tickh]hwq_worker_tick}(hhhj[ThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWTubah}(h]h ](jjeh"]h$]h&]jjuh1jhj6ThhhjHThMubj)}(h(struct task_struct *task)h]j)}(hstruct task_struct *taskh](js)}(hjvh]hstruct}(hhhjwThhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjsTubj)}(h h]h }(hhhjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsTubh)}(hhh]j)}(h task_structh]h task_struct}(hhhjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjTmodnameN classnameNjj)}j]j)}jj]Tsbc.wq_worker_tickasbuh1hhjsTubj)}(h h]h }(hhhjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsTubj)}(hjdh]h*}(hhhjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsTubj)}(htaskh]htask}(hhhjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoTubah}(h]h ]h"]h$]h&]jjuh1jhj6ThhhjHThMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj2ThhhjHThMubah}(h]j-Tah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj/Thhubj)}(hhh]h)}(h4a scheduler tick occurred while a kworker is runningh]h4a scheduler tick occurred while a kworker is running}(hjThjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjThhubah}(h]h ]h"]h$]h&]uh1jhj/ThhhjHThMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUjjUjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct task_struct *task`` task currently running **Description** Called from sched_tick(). We're in the IRQ context and the current worker's fields which follow the 'K' locking rule can be accessed safely.h](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hhhjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjUubjd)}(hhh]ji)}(h4``struct task_struct *task`` task currently running h](jo)}(h``struct task_struct *task``h]j)}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:Uubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj6Uubj)}(hhh]h)}(htask currently runningh]htask currently running}(hjWUhjUUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQUhMhjRUubah}(h]h ]h"]h$]h&]uh1jhj6Uubeh}(h]h ]h"]h$]h&]uh1jhhjQUhMhj3Uubah}(h]h ]h"]h$]h&]uh1jchjUubh)}(h**Description**h]j)}(hjwUh]h Description}(hhhjyUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuUubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjUubh)}(hCalled from sched_tick(). We're in the IRQ context and the current worker's fields which follow the 'K' locking rule can be accessed safely.h]hCalled from sched_tick(). We’re in the IRQ context and the current worker’s fields which follow the ‘K’ locking rule can be accessed safely.}(hjUhjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] wq_worker_last_func (C function)c.wq_worker_last_funchNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h:work_func_t wq_worker_last_func (struct task_struct *task)h]jm)}(h9work_func_t wq_worker_last_func(struct task_struct *task)h](h)}(hhh]j)}(h work_func_th]h work_func_t}(hhhjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjUmodnameN classnameNjj)}j]j)}jwq_worker_last_funcsbc.wq_worker_last_funcasbuh1hhjUhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjUhMubj)}(hwq_worker_last_funch]j)}(hjUh]hwq_worker_last_func}(hhhjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ](jjeh"]h$]h&]jjuh1jhjUhhhjUhMubj)}(h(struct task_struct *task)h]j)}(hstruct task_struct *taskh](js)}(hjvh]hstruct}(hhhjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj Vubj)}(h h]h }(hhhjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Vubh)}(hhh]j)}(h task_structh]h task_struct}(hhhj,VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)Vubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj.VmodnameN classnameNjj)}j]jUc.wq_worker_last_funcasbuh1hhj Vubj)}(h h]h }(hhhjJVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Vubj)}(hjdh]h*}(hhhjXVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Vubj)}(htaskh]htask}(hhhjeVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Vubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubah}(h]h ]h"]h$]h&]jjuh1jhjUhhhjUhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjUhhhjUhMubah}(h]jUah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjUhhubj)}(hhh]h)}(h$retrieve worker's last work functionh]h&retrieve worker’s last work function}(hjVhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVhhubah}(h]h ]h"]h$]h&]uh1jhjUhhhjUhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjuh1jahhhj?hNhNubj)}(hX{**Parameters** ``struct task_struct *task`` Task to retrieve last work function of. **Description** Determine the last function a worker executed. This is called from the scheduler to get a worker's last known identity. This function is called during schedule() when a kworker is going to sleep. It's used by psi to identify aggregation workers during dequeuing, to allow periodic aggregation to shut-off when that worker is the last task in the system or cgroup to go to sleep. As this function doesn't involve any workqueue-related locking, it only returns stable values when called from inside the scheduler's queuing and dequeuing paths, when **task**, which must be a kworker, is guaranteed to not be processing any works. **Context** raw_spin_lock_irq(rq->lock) **Return** The last work function ``current`` executed as a worker, NULL if it hasn't executed any work yet.h](h)}(h**Parameters**h]j)}(hjVh]h Parameters}(hhhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubjd)}(hhh]ji)}(hE``struct task_struct *task`` Task to retrieve last work function of. h](jo)}(h``struct task_struct *task``h]j)}(hjVh]hstruct task_struct *task}(hhhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubj)}(hhh]h)}(h'Task to retrieve last work function of.h]h'Task to retrieve last work function of.}(hjVhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jchjVubh)}(h**Description**h]j)}(hj Wh]h Description}(hhhjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Wubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubh)}(hwDetermine the last function a worker executed. This is called from the scheduler to get a worker's last known identity.h]hyDetermine the last function a worker executed. This is called from the scheduler to get a worker’s last known identity.}(hj$Whj"WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubh)}(hXThis function is called during schedule() when a kworker is going to sleep. It's used by psi to identify aggregation workers during dequeuing, to allow periodic aggregation to shut-off when that worker is the last task in the system or cgroup to go to sleep.h]hXThis function is called during schedule() when a kworker is going to sleep. It’s used by psi to identify aggregation workers during dequeuing, to allow periodic aggregation to shut-off when that worker is the last task in the system or cgroup to go to sleep.}(hj3Whj1WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubh)}(hAs this function doesn't involve any workqueue-related locking, it only returns stable values when called from inside the scheduler's queuing and dequeuing paths, when **task**, which must be a kworker, is guaranteed to not be processing any works.h](hAs this function doesn’t involve any workqueue-related locking, it only returns stable values when called from inside the scheduler’s queuing and dequeuing paths, when }(hAs this function doesn't involve any workqueue-related locking, it only returns stable values when called from inside the scheduler's queuing and dequeuing paths, when hj@WhhhNhNubj)}(h**task**h]htask}(hhhjIWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@WubhH, which must be a kworker, is guaranteed to not be processing any works.}(hH, which must be a kworker, is guaranteed to not be processing any works.hj@WhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubh)}(h **Context**h]j)}(hjeWh]hContext}(hhhjgWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcWubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubh)}(hraw_spin_lock_irq(rq->lock)h]hraw_spin_lock_irq(rq->lock)}(hj}Whj{WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubh)}(h **Return**h]j)}(hjWh]hReturn}(hhhjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubh)}(haThe last work function ``current`` executed as a worker, NULL if it hasn't executed any work yet.h](hThe last work function }(hThe last work function hjWhhhNhNubj)}(h ``current``h]hcurrent}(hhhjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubhA executed as a worker, NULL if it hasn’t executed any work yet.}(h? executed as a worker, NULL if it hasn't executed any work yet.hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]wq_node_nr_active (C function)c.wq_node_nr_activehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hTstruct wq_node_nr_active * wq_node_nr_active (struct workqueue_struct *wq, int node)h]jm)}(hRstruct wq_node_nr_active *wq_node_nr_active(struct workqueue_struct *wq, int node)h](js)}(hjvh]hstruct}(hhhjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjWhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWhhhjWhMubh)}(hhh]j)}(hwq_node_nr_activeh]hwq_node_nr_active}(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjXmodnameN classnameNjj)}j]j)}jwq_node_nr_activesbc.wq_node_nr_activeasbuh1hhjWhhhjWhMubj)}(h h]h }(hhhj%XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWhhhjWhMubj)}(hjdh]h*}(hhhj3XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWhhhjWhMubj)}(hwq_node_nr_activeh]j)}(hj"Xh]hwq_node_nr_active}(hhhjDXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Xubah}(h]h ](jjeh"]h$]h&]jjuh1jhjWhhhjWhMubj)}(h'(struct workqueue_struct *wq, int node)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj_XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj[Xubj)}(h h]h }(hhhjlXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Xubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj}XhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzXubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjXmodnameN classnameNjj)}j]j Xc.wq_node_nr_activeasbuh1hhj[Xubj)}(h h]h }(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Xubj)}(hjdh]h*}(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Xubj)}(hwqh]hwq}(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[Xubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjWXubj)}(hint nodeh](j0)}(hinth]hint}(hhhjXhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjXubj)}(h h]h }(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hnodeh]hnode}(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjWXubeh}(h]h ]h"]h$]h&]jjuh1jhjWhhhjWhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjWhhhjWhMubah}(h]jWah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjWhhubj)}(hhh]h)}(h"Determine wq_node_nr_active to useh]h"Determine wq_node_nr_active to use}(hjYhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjYhhubah}(h]h ]h"]h$]h&]uh1jhjWhhhjWhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj.Yjj.Yjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` workqueue of interest ``int node`` NUMA node, can be ``NUMA_NO_NODE`` **Description** Determine wq_node_nr_active to use for **wq** on **node**. Returns: - ``NULL`` for per-cpu workqueues as they don't need to use shared nr_active. - node_nr_active[nr_node_ids] if **node** is ``NUMA_NO_NODE``. - Otherwise, node_nr_active[**node**].h](h)}(h**Parameters**h]j)}(hj8Yh]h Parameters}(hhhj:YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6Yubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj2Yubjd)}(hhh](ji)}(h6``struct workqueue_struct *wq`` workqueue of interest h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjWYh]hstruct workqueue_struct *wq}(hhhjYYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUYubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQYubj)}(hhh]h)}(hworkqueue of interesth]hworkqueue of interest}(hjrYhjpYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlYhMhjmYubah}(h]h ]h"]h$]h&]uh1jhjQYubeh}(h]h ]h"]h$]h&]uh1jhhjlYhMhjNYubji)}(h0``int node`` NUMA node, can be ``NUMA_NO_NODE`` h](jo)}(h ``int node``h]j)}(hjYh]hint node}(hhhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjYubj)}(hhh]h)}(h"NUMA node, can be ``NUMA_NO_NODE``h](hNUMA node, can be }(hNUMA node, can be hjYhhhNhNubj)}(h``NUMA_NO_NODE``h]h NUMA_NO_NODE}(hhhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1hhjYhMhjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhhjYhMhjNYubeh}(h]h ]h"]h$]h&]uh1jchj2Yubh)}(h**Description**h]j)}(hjYh]h Description}(hhhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj2Yubh)}(hCDetermine wq_node_nr_active to use for **wq** on **node**. Returns:h](h'Determine wq_node_nr_active to use for }(h'Determine wq_node_nr_active to use for hjYhhhNhNubj)}(h**wq**h]hwq}(hhhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh on }(h on hjYhhhNhNubj)}(h**node**h]hnode}(hhhj ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh . Returns:}(h . Returns:hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj2Yubj)}(hhh](j)}(hL``NULL`` for per-cpu workqueues as they don't need to use shared nr_active. h]h)}(hK``NULL`` for per-cpu workqueues as they don't need to use shared nr_active.h](j)}(h``NULL``h]hNULL}(hhhj1ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ZubhE for per-cpu workqueues as they don’t need to use shared nr_active.}(hC for per-cpu workqueues as they don't need to use shared nr_active.hj-ZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj)Zubah}(h]h ]h"]h$]h&]uh1jhj&Zubj)}(h=node_nr_active[nr_node_ids] if **node** is ``NUMA_NO_NODE``. h]h)}(h[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;[ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@[modnameN classnameNjj)}j]j)}jj[sbc.wq_update_node_max_activeasbuh1hhj[ubj)}(h h]h }(hhhj^[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hjdh]h*}(hhhjl[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hwqh]hwq}(hhhjy[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj[ubj)}(h int off_cpuh](j0)}(hinth]hint}(hhhj[hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj[ubj)}(h h]h }(hhhj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hoff_cpuh]hoff_cpu}(hhhj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj[ubeh}(h]h ]h"]h$]h&]jjuh1jhjZhhhjZhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjZhhhjZhMubah}(h]jZah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM%hjZhhubj)}(hhh]h)}(h"Update per-node max_actives to useh]h"Update per-node max_actives to use}(hj[hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj[hhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjZhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj[jj[juh1jahhhj?hNhNubj)}(hX{**Parameters** ``struct workqueue_struct *wq`` workqueue to update ``int off_cpu`` CPU that's going down, -1 if a CPU is not going down **Description** Update **wq->node_nr_active**[]->max. **wq** must be unbound. max_active is distributed among nodes according to the proportions of numbers of online cpus. The result is always between **wq->min_active** and max_active.h](h)}(h**Parameters**h]j)}(hj[h]h Parameters}(hhhj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM!hj[ubjd)}(hhh](ji)}(h4``struct workqueue_struct *wq`` workqueue to update h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj\h]hstruct workqueue_struct *wq}(hhhj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj\ubj)}(hhh]h)}(hworkqueue to updateh]hworkqueue to update}(hj5\hj3\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/\hMhj0\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhhj/\hMhj\ubji)}(hE``int off_cpu`` CPU that's going down, -1 if a CPU is not going down h](jo)}(h``int off_cpu``h]j)}(hjS\h]h int off_cpu}(hhhjU\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ\ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjM\ubj)}(hhh]h)}(h4CPU that's going down, -1 if a CPU is not going downh]h6CPU that’s going down, -1 if a CPU is not going down}(hjn\hjl\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjh\hMhji\ubah}(h]h ]h"]h$]h&]uh1jhjM\ubeh}(h]h ]h"]h$]h&]uh1jhhjh\hMhj\ubeh}(h]h ]h"]h$]h&]uh1jchj[ubh)}(h**Description**h]j)}(hj\h]h Description}(hhhj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM!hj[ubh)}(hUpdate **wq->node_nr_active**[]->max. **wq** must be unbound. max_active is distributed among nodes according to the proportions of numbers of online cpus. The result is always between **wq->min_active** and max_active.h](hUpdate }(hUpdate hj\hhhNhNubj)}(h%**wq->node_nr_active**[]->max. **wq**h]h!wq->node_nr_active**[]->max. **wq}(hhhj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh must be unbound. max_active is distributed among nodes according to the proportions of numbers of online cpus. The result is always between }(h must be unbound. max_active is distributed among nodes according to the proportions of numbers of online cpus. The result is always between hj\hhhNhNubj)}(h**wq->min_active**h]hwq->min_active}(hhhj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh and max_active.}(h and max_active.hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM!hj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]get_pwq (C function) c.get_pwqhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h)void get_pwq (struct pool_workqueue *pwq)h]jm)}(h(void get_pwq(struct pool_workqueue *pwq)h](j0)}(hvoidh]hvoid}(hhhj\hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj\hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRubj)}(h h]h }(hhhj ]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\hhhj]hMRubj)}(hget_pwqh]j)}(hget_pwqh]hget_pwq}(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj\hhhj]hMRubj)}(h(struct pool_workqueue *pwq)h]j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhj7]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj3]ubj)}(h h]h }(hhhjD]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3]ubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhjU]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR]ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjW]modnameN classnameNjj)}j]j)}jj]sb c.get_pwqasbuh1hhj3]ubj)}(h h]h }(hhhju]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3]ubj)}(hjdh]h*}(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3]ubj)}(hpwqh]hpwq}(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3]ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/]ubah}(h]h ]h"]h$]h&]jjuh1jhj\hhhj]hMRubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj\hhhj]hMRubah}(h]j\ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMWhj\hhubj)}(hhh]h)}(h6get an extra reference on the specified pool_workqueueh]h6get an extra reference on the specified pool_workqueue}(hj]hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMQhj]hhubah}(h]h ]h"]h$]h&]uh1jhj\hhhj]hMRubeh}(h]h ](jfunctioneh"]h$]h&]jjjj]jj]juh1jahhhj?hNhNubj)}(h**Parameters** ``struct pool_workqueue *pwq`` pool_workqueue to get **Description** Obtain an extra reference on **pwq**. The caller should guarantee that **pwq** has positive refcnt and be holding the matching pool->lock.h](h)}(h**Parameters**h]j)}(hj]h]h Parameters}(hhhj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMUhj]ubjd)}(hhh]ji)}(h5``struct pool_workqueue *pwq`` pool_workqueue to get h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hj]h]hstruct pool_workqueue *pwq}(hhhj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRhj]ubj)}(hhh]h)}(hpool_workqueue to geth]hpool_workqueue to get}(hj^hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hMRhj^ubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhhj^hMRhj]ubah}(h]h ]h"]h$]h&]uh1jchj]ubh)}(h**Description**h]j)}(hj7^h]h Description}(hhhj9^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5^ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMThj]ubh)}(hObtain an extra reference on **pwq**. The caller should guarantee that **pwq** has positive refcnt and be holding the matching pool->lock.h](hObtain an extra reference on }(hObtain an extra reference on hjM^hhhNhNubj)}(h**pwq**h]hpwq}(hhhjV^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM^ubh$. The caller should guarantee that }(h$. The caller should guarantee that hjM^hhhNhNubj)}(h**pwq**h]hpwq}(hhhji^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM^ubh< has positive refcnt and be holding the matching pool->lock.}(h< has positive refcnt and be holding the matching pool->lock.hjM^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMThj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]put_pwq (C function) c.put_pwqhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h)void put_pwq (struct pool_workqueue *pwq)h]jm)}(h(void put_pwq(struct pool_workqueue *pwq)h](j0)}(hvoidh]hvoid}(hhhj^hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj^hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM`ubj)}(h h]h }(hhhj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhj^hM`ubj)}(hput_pwqh]j)}(hput_pwqh]hput_pwq}(hhhj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj^hhhj^hM`ubj)}(h(struct pool_workqueue *pwq)h]j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj^ubj)}(h h]h }(hhhj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj_modnameN classnameNjj)}j]j)}jj^sb c.put_pwqasbuh1hhj^ubj)}(h h]h }(hhhj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hjdh]h*}(hhhj,_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hpwqh]hpwq}(hhhj9_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^ubah}(h]h ]h"]h$]h&]jjuh1jhj^hhhj^hM`ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj^hhhj^hM`ubah}(h]j^ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehj^hhubj)}(hhh]h)}(hput a pool_workqueue referenceh]hput a pool_workqueue reference}(hjf_hjd_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM_hja_hhubah}(h]h ]h"]h$]h&]uh1jhj^hhhj^hM`ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|_jj|_juh1jahhhj?hNhNubj)}(h**Parameters** ``struct pool_workqueue *pwq`` pool_workqueue to put **Description** Drop a reference of **pwq**. If its refcnt reaches zero, schedule its destruction. The caller should be holding the matching pool->lock.h](h)}(h**Parameters**h]j)}(hj_h]h Parameters}(hhhj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMchj_ubjd)}(hhh]ji)}(h5``struct pool_workqueue *pwq`` pool_workqueue to put h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hj_h]hstruct pool_workqueue *pwq}(hhhj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM`hj_ubj)}(hhh]h)}(hpool_workqueue to puth]hpool_workqueue to put}(hj_hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hM`hj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhhj_hM`hj_ubah}(h]h ]h"]h$]h&]uh1jchj_ubh)}(h**Description**h]j)}(hj_h]h Description}(hhhj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbhj_ubh)}(hDrop a reference of **pwq**. If its refcnt reaches zero, schedule its destruction. The caller should be holding the matching pool->lock.h](hDrop a reference of }(hDrop a reference of hj_hhhNhNubj)}(h**pwq**h]hpwq}(hhhj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubho. If its refcnt reaches zero, schedule its destruction. The caller should be holding the matching pool->lock.}(ho. If its refcnt reaches zero, schedule its destruction. The caller should be holding the matching pool->lock.hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]put_pwq_unlocked (C function)c.put_pwq_unlockedhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h2void put_pwq_unlocked (struct pool_workqueue *pwq)h]jm)}(h1void put_pwq_unlocked(struct pool_workqueue *pwq)h](j0)}(hvoidh]hvoid}(hhhj9`hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj5`hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMsubj)}(h h]h }(hhhjH`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5`hhhjG`hMsubj)}(hput_pwq_unlockedh]j)}(hput_pwq_unlockedh]hput_pwq_unlocked}(hhhjZ`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV`ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj5`hhhjG`hMsubj)}(h(struct pool_workqueue *pwq)h]j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhjv`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjr`ubj)}(h h]h }(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr`ubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj`modnameN classnameNjj)}j]j)}jj\`sbc.put_pwq_unlockedasbuh1hhjr`ubj)}(h h]h }(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr`ubj)}(hjdh]h*}(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr`ubj)}(hpwqh]hpwq}(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr`ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjn`ubah}(h]h ]h"]h$]h&]jjuh1jhj5`hhhjG`hMsubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj1`hhhjG`hMsubah}(h]j,`ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMwhj.`hhubj)}(hhh]h)}(h+put_pwq() with surrounding pool lock/unlockh]h+put_pwq() with surrounding pool lock/unlock}(hj`hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMrhj`hhubah}(h]h ]h"]h$]h&]uh1jhj.`hhhjG`hMsubeh}(h]h ](jfunctioneh"]h$]h&]jjjjajjajuh1jahhhj?hNhNubj)}(h**Parameters** ``struct pool_workqueue *pwq`` pool_workqueue to put (can be ``NULL``) **Description** put_pwq() with locking. This function also allows ``NULL`` **pwq**.h](h)}(h**Parameters**h]j)}(hjah]h Parameters}(hhhjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMvhjaubjd)}(hhh]ji)}(hG``struct pool_workqueue *pwq`` pool_workqueue to put (can be ``NULL``) h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hj;ah]hstruct pool_workqueue *pwq}(hhhj=ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9aubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMshj5aubj)}(hhh]h)}(h'pool_workqueue to put (can be ``NULL``)h](hpool_workqueue to put (can be }(hpool_workqueue to put (can be hjTahhhNhNubj)}(h``NULL``h]hNULL}(hhhj]ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTaubh)}(h)hjTahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjPahMshjQaubah}(h]h ]h"]h$]h&]uh1jhj5aubeh}(h]h ]h"]h$]h&]uh1jhhjPahMshj2aubah}(h]h ]h"]h$]h&]uh1jchjaubh)}(h**Description**h]j)}(hjah]h Description}(hhhjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMuhjaubh)}(hDput_pwq() with locking. This function also allows ``NULL`` **pwq**.h](h3put_pwq() with locking. This function also allows }(h3put_pwq() with locking. This function also allows hjahhhNhNubj)}(h``NULL``h]hNULL}(hhhjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh }(h hjahhhNhNubj)}(h**pwq**h]hpwq}(hhhjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh.}(hjhjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMuhjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]pwq_activate_work (C function)c.pwq_activate_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hMbool pwq_activate_work (struct pool_workqueue *pwq, struct work_struct *work)h]jm)}(hLbool pwq_activate_work(struct pool_workqueue *pwq, struct work_struct *work)h](j0)}(hj h]hbool}(hhhjahhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjahhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjbhMubj)}(hpwq_activate_workh]j)}(hpwq_activate_workh]hpwq_activate_work}(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ](jjeh"]h$]h&]jjuh1jhjahhhjbhMubj)}(h6(struct pool_workqueue *pwq, struct work_struct *work)h](j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhj1bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj-bubj)}(h h]h }(hhhj>bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-bubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhjObhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLbubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjQbmodnameN classnameNjj)}j]j)}jjbsbc.pwq_activate_workasbuh1hhj-bubj)}(h h]h }(hhhjobhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-bubj)}(hjdh]h*}(hhhj}bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-bubj)}(hpwqh]hpwq}(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-bubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj)bubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjbubj)}(h h]h }(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjbmodnameN classnameNjj)}j]jkbc.pwq_activate_workasbuh1hhjbubj)}(h h]h }(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj)}(hjdh]h*}(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj)}(hworkh]hwork}(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj)bubeh}(h]h ]h"]h$]h&]jjuh1jhjahhhjbhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjahhhjbhMubah}(h]jaah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjahhubj)}(hhh]h)}(h Activate a work item if inactiveh]h Activate a work item if inactive}(hj'chj%chhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj"chhubah}(h]h ]h"]h$]h&]uh1jhjahhhjbhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=cjj=cjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct pool_workqueue *pwq`` pool_workqueue **work** belongs to ``struct work_struct *work`` work item to activate **Description** Returns ``true`` if activated. ``false`` if already active.h](h)}(h**Parameters**h]j)}(hjGch]h Parameters}(hhhjIchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEcubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjAcubjd)}(hhh](ji)}(hB``struct pool_workqueue *pwq`` pool_workqueue **work** belongs to h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hjfch]hstruct pool_workqueue *pwq}(hhhjhchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdcubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj`cubj)}(hhh]h)}(h"pool_workqueue **work** belongs toh](hpool_workqueue }(hpool_workqueue hjchhhNhNubj)}(h**work**h]hwork}(hhhjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh belongs to}(h belongs tohjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj{chMhj|cubah}(h]h ]h"]h$]h&]uh1jhj`cubeh}(h]h ]h"]h$]h&]uh1jhhj{chMhj]cubji)}(h3``struct work_struct *work`` work item to activate h](jo)}(h``struct work_struct *work``h]j)}(hjch]hstruct work_struct *work}(hhhjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjcubj)}(hhh]h)}(hwork item to activateh]hwork item to activate}(hjchjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhjchMhjcubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhhjchMhj]cubeh}(h]h ]h"]h$]h&]uh1jchjAcubh)}(h**Description**h]j)}(hjch]h Description}(hhhjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjAcubh)}(h;Returns ``true`` if activated. ``false`` if already active.h](hReturns }(hReturns hjdhhhNhNubj)}(h``true``h]htrue}(hhhj dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubh if activated. }(h if activated. hjdhhhNhNubj)}(h ``false``h]hfalse}(hhhj dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubh if already active.}(h if already active.hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjAcubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!pwq_tryinc_nr_active (C function)c.pwq_tryinc_nr_activehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hAbool pwq_tryinc_nr_active (struct pool_workqueue *pwq, bool fill)h]jm)}(h@bool pwq_tryinc_nr_active(struct pool_workqueue *pwq, bool fill)h](j0)}(hj h]hbool}(hhhjZdhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjVdhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVdhhhjgdhMubj)}(hpwq_tryinc_nr_activeh]j)}(hpwq_tryinc_nr_activeh]hpwq_tryinc_nr_active}(hhhjzdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvdubah}(h]h ](jjeh"]h$]h&]jjuh1jhjVdhhhjgdhMubj)}(h'(struct pool_workqueue *pwq, bool fill)h](j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjdubj)}(h h]h }(hhhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjdmodnameN classnameNjj)}j]j)}jj|dsbc.pwq_tryinc_nr_activeasbuh1hhjdubj)}(h h]h }(hhhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hjdh]h*}(hhhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hpwqh]hpwq}(hhhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdubj)}(h bool fillh](j0)}(hj h]hbool}(hhhjehhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjeubj)}(h h]h }(hhhjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hfillh]hfill}(hhhj#ehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdubeh}(h]h ]h"]h$]h&]jjuh1jhjVdhhhjgdhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjRdhhhjgdhMubah}(h]jMdah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjOdhhubj)}(hhh]h)}(h$Try to increment nr_active for a pwqh]h$Try to increment nr_active for a pwq}(hjPehjNehhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjKehhubah}(h]h ]h"]h$]h&]uh1jhjOdhhhjgdhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfejjfejuh1jahhhj?hNhNubj)}(hX-**Parameters** ``struct pool_workqueue *pwq`` pool_workqueue of interest ``bool fill`` max_active may have increased, try to increase concurrency level **Description** Try to increment nr_active for **pwq**. Returns ``true`` if an nr_active count is successfully obtained. ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjpeh]h Parameters}(hhhjrehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjneubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjjeubjd)}(hhh](ji)}(h:``struct pool_workqueue *pwq`` pool_workqueue of interest h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hjeh]hstruct pool_workqueue *pwq}(hhhjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjeubj)}(hhh]h)}(hpool_workqueue of interesth]hpool_workqueue of interest}(hjehjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjeubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhhjehMhjeubji)}(hO``bool fill`` max_active may have increased, try to increase concurrency level h](jo)}(h ``bool fill``h]j)}(hjeh]h bool fill}(hhhjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjeubj)}(hhh]h)}(h@max_active may have increased, try to increase concurrency levelh]h@max_active may have increased, try to increase concurrency level}(hjehjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjeubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhhjehMhjeubeh}(h]h ]h"]h$]h&]uh1jchjjeubh)}(h**Description**h]j)}(hjfh]h Description}(hhhjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjjeubh)}(h}Try to increment nr_active for **pwq**. Returns ``true`` if an nr_active count is successfully obtained. ``false`` otherwise.h](hTry to increment nr_active for }(hTry to increment nr_active for hjfhhhNhNubj)}(h**pwq**h]hpwq}(hhhj"fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh . Returns }(h . Returns hjfhhhNhNubj)}(h``true``h]htrue}(hhhj5fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh1 if an nr_active count is successfully obtained. }(h1 if an nr_active count is successfully obtained. hjfhhhNhNubj)}(h ``false``h]hfalse}(hhhjHfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh otherwise.}(h otherwise.hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j](pwq_activate_first_inactive (C function)c.pwq_activate_first_inactivehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hHbool pwq_activate_first_inactive (struct pool_workqueue *pwq, bool fill)h]jm)}(hGbool pwq_activate_first_inactive(struct pool_workqueue *pwq, bool fill)h](j0)}(hj h]hbool}(hhhjfhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj~fhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~fhhhjfhMubj)}(hpwq_activate_first_inactiveh]j)}(hpwq_activate_first_inactiveh]hpwq_activate_first_inactive}(hhhjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ](jjeh"]h$]h&]jjuh1jhj~fhhhjfhMubj)}(h'(struct pool_workqueue *pwq, bool fill)h](j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjfubj)}(h h]h }(hhhjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjfmodnameN classnameNjj)}j]j)}jjfsbc.pwq_activate_first_inactiveasbuh1hhjfubj)}(h h]h }(hhhjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hjdh]h*}(hhhj ghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hpwqh]hpwq}(hhhjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjfubj)}(h bool fillh](j0)}(hj h]hbool}(hhhj0ghhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj,gubj)}(h h]h }(hhhj=ghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,gubj)}(hfillh]hfill}(hhhjKghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,gubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjfubeh}(h]h ]h"]h$]h&]jjuh1jhj~fhhhjfhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjzfhhhjfhMubah}(h]jufah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjwfhhubj)}(hhh]h)}(h.Activate the first inactive work item on a pwqh]h.Activate the first inactive work item on a pwq}(hjxghjvghhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjsghhubah}(h]h ]h"]h$]h&]uh1jhjwfhhhjfhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjgjjgjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct pool_workqueue *pwq`` pool_workqueue of interest ``bool fill`` max_active may have increased, try to increase concurrency level **Description** Activate the first inactive work item of **pwq** if available and allowed by max_active limit. Returns ``true`` if an inactive work item has been activated. ``false`` if no inactive work item is found or max_active limit is reached.h](h)}(h**Parameters**h]j)}(hjgh]h Parameters}(hhhjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjgubjd)}(hhh](ji)}(h:``struct pool_workqueue *pwq`` pool_workqueue of interest h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hjgh]hstruct pool_workqueue *pwq}(hhhjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjgubj)}(hhh]h)}(hpool_workqueue of interesth]hpool_workqueue of interest}(hjghjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjgubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhhjghMhjgubji)}(hO``bool fill`` max_active may have increased, try to increase concurrency level h](jo)}(h ``bool fill``h]j)}(hjgh]h bool fill}(hhhjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjgubj)}(hhh]h)}(h@max_active may have increased, try to increase concurrency levelh]h@max_active may have increased, try to increase concurrency level}(hj hhj hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjhubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhhjhhMhjgubeh}(h]h ]h"]h$]h&]uh1jchjgubh)}(h**Description**h]j)}(hj+hh]h Description}(hhhj-hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)hubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjgubh)}(h^Activate the first inactive work item of **pwq** if available and allowed by max_active limit.h](h)Activate the first inactive work item of }(h)Activate the first inactive work item of hjAhhhhNhNubj)}(h**pwq**h]hpwq}(hhhjJhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAhubh. if available and allowed by max_active limit.}(h. if available and allowed by max_active limit.hjAhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjgubh)}(hReturns ``true`` if an inactive work item has been activated. ``false`` if no inactive work item is found or max_active limit is reached.h](hReturns }(hReturns hjdhhhhNhNubj)}(h``true``h]htrue}(hhhjmhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdhubh. if an inactive work item has been activated. }(h. if an inactive work item has been activated. hjdhhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdhubhB if no inactive work item is found or max_active limit is reached.}(hB if no inactive work item is found or max_active limit is reached.hjdhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]unplug_oldest_pwq (C function)c.unplug_oldest_pwqhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4void unplug_oldest_pwq (struct workqueue_struct *wq)h]jm)}(h3void unplug_oldest_pwq(struct workqueue_struct *wq)h](j0)}(hvoidh]hvoid}(hhhjhhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM'ubj)}(h h]h }(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjhhM'ubj)}(hunplug_oldest_pwqh]j)}(hunplug_oldest_pwqh]hunplug_oldest_pwq}(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhhjhhM'ubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjhubj)}(h h]h }(hhhjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjimodnameN classnameNjj)}j]j)}jjhsbc.unplug_oldest_pwqasbuh1hhjhubj)}(h h]h }(hhhj5ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hjdh]h*}(hhhjCihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hwqh]hwq}(hhhjPihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubah}(h]h ]h"]h$]h&]jjuh1jhjhhhhjhhM'ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhhjhhM'ubah}(h]jhah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM;hjhhhubj)}(hhh]h)}(h unplug the oldest pool_workqueueh]h unplug the oldest pool_workqueue}(hj}ihj{ihhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM&hjxihhubah}(h]h ]h"]h$]h&]uh1jhjhhhhjhhM'ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjijjijuh1jahhhj?hNhNubj)}(hX!**Parameters** ``struct workqueue_struct *wq`` workqueue_struct where its oldest pwq is to be unplugged **Description** This function should only be called for ordered workqueues where only the oldest pwq is unplugged, the others are plugged to suspend execution to ensure proper work item ordering:: dfl_pwq --------------+ [P] - plugged | v pwqs -> A -> B [P] -> C [P] (newest) | | | 1 3 5 | | | 2 4 6 When the oldest pwq is drained and removed, this function should be called to unplug the next oldest one to start its work item execution. Note that pwq's are linked into wq->pwqs with the oldest first, so the first one in the list is the oldest.h](h)}(h**Parameters**h]j)}(hjih]h Parameters}(hhhjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM*hjiubjd)}(hhh]ji)}(hY``struct workqueue_struct *wq`` workqueue_struct where its oldest pwq is to be unplugged h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjih]hstruct workqueue_struct *wq}(hhhjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM'hjiubj)}(hhh]h)}(h8workqueue_struct where its oldest pwq is to be unpluggedh]h8workqueue_struct where its oldest pwq is to be unplugged}(hjihjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihM'hjiubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhhjihM'hjiubah}(h]h ]h"]h$]h&]uh1jchjiubh)}(h**Description**h]j)}(hjih]h Description}(hhhjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM)hjiubh)}(hThis function should only be called for ordered workqueues where only the oldest pwq is unplugged, the others are plugged to suspend execution to ensure proper work item ordering::h]hThis function should only be called for ordered workqueues where only the oldest pwq is unplugged, the others are plugged to suspend execution to ensure proper work item ordering:}(hThis function should only be called for ordered workqueues where only the oldest pwq is unplugged, the others are plugged to suspend execution to ensure proper work item ordering:hj jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM)hjiubj)}(hdfl_pwq --------------+ [P] - plugged | v pwqs -> A -> B [P] -> C [P] (newest) | | | 1 3 5 | | | 2 4 6h]hdfl_pwq --------------+ [P] - plugged | v pwqs -> A -> B [P] -> C [P] (newest) | | | 1 3 5 | | | 2 4 6}(hhhjjubah}(h]h ]h"]h$]h&]jjuh1jhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM-hjiubh)}(hWhen the oldest pwq is drained and removed, this function should be called to unplug the next oldest one to start its work item execution. Note that pwq's are linked into wq->pwqs with the oldest first, so the first one in the list is the oldest.h]hWhen the oldest pwq is drained and removed, this function should be called to unplug the next oldest one to start its work item execution. Note that pwq’s are linked into wq->pwqs with the oldest first, so the first one in the list is the oldest.}(hj.jhj,jhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6hjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]&node_activate_pending_pwq (C function)c.node_activate_pending_pwqhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h_void node_activate_pending_pwq (struct wq_node_nr_active *nna, struct worker_pool *caller_pool)h]jm)}(h^void node_activate_pending_pwq(struct wq_node_nr_active *nna, struct worker_pool *caller_pool)h](j0)}(hvoidh]hvoid}(hhhj[jhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjWjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOubj)}(h h]h }(hhhjjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWjhhhjijhMOubj)}(hnode_activate_pending_pwqh]j)}(hnode_activate_pending_pwqh]hnode_activate_pending_pwq}(hhhj|j3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjWjhhhjijhMOubj)}(h@(struct wq_node_nr_active *nna, struct worker_pool *caller_pool)h](j)}(hstruct wq_node_nr_active *nnah](js)}(hjvh]hstruct}(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjjubj)}(h h]h }(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubh)}(hhh]j)}(hwq_node_nr_activeh]hwq_node_nr_active}(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjjmodnameN classnameNjj)}j]j)}jj~jsbc.node_activate_pending_pwqasbuh1hhjjubj)}(h h]h }(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hjdh]h*}(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hnnah]hnna}(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjjubj)}(hstruct worker_pool *caller_poolh](js)}(hjvh]hstruct}(hhhj khhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjkubj)}(h h]h }(hhhjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhj(khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%kubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj*kmodnameN classnameNjj)}j]jjc.node_activate_pending_pwqasbuh1hhjkubj)}(h h]h }(hhhjFkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hjdh]h*}(hhhjTkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(h caller_poolh]h caller_pool}(hhhjakhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjjubeh}(h]h ]h"]h$]h&]jjuh1jhjWjhhhjijhMOubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjSjhhhjijhMOubah}(h]jNjah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMUhjPjhhubj)}(hhh]h)}(h-Activate a pending pwq on a wq_node_nr_activeh]h-Activate a pending pwq on a wq_node_nr_active}(hjkhjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMNhjkhhubah}(h]h ]h"]h$]h&]uh1jhjPjhhhjijhMOubeh}(h]h ](jfunctioneh"]h$]h&]jjjjkjjkjuh1jahhhj?hNhNubj)}(hXT**Parameters** ``struct wq_node_nr_active *nna`` wq_node_nr_active to activate a pending pwq for ``struct worker_pool *caller_pool`` worker_pool the caller is locking **Description** Activate a pwq in **nna->pending_pwqs**. Called with **caller_pool** locked. **caller_pool** may be unlocked and relocked to lock other worker_pools.h](h)}(h**Parameters**h]j)}(hjkh]h Parameters}(hhhjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRhjkubjd)}(hhh](ji)}(hR``struct wq_node_nr_active *nna`` wq_node_nr_active to activate a pending pwq for h](jo)}(h!``struct wq_node_nr_active *nna``h]j)}(hjkh]hstruct wq_node_nr_active *nna}(hhhjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOhjkubj)}(hhh]h)}(h/wq_node_nr_active to activate a pending pwq forh]h/wq_node_nr_active to activate a pending pwq for}(hjkhjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMOhjkubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhhjkhMOhjkubji)}(hF``struct worker_pool *caller_pool`` worker_pool the caller is locking h](jo)}(h#``struct worker_pool *caller_pool``h]j)}(hjlh]hstruct worker_pool *caller_pool}(hhhjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMPhjlubj)}(hhh]h)}(h!worker_pool the caller is lockingh]h!worker_pool the caller is locking}(hj!lhjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhMPhjlubah}(h]h ]h"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]uh1jhhjlhMPhjkubeh}(h]h ]h"]h$]h&]uh1jchjkubh)}(h**Description**h]j)}(hjAlh]h Description}(hhhjClhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?lubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRhjkubh)}(hActivate a pwq in **nna->pending_pwqs**. Called with **caller_pool** locked. **caller_pool** may be unlocked and relocked to lock other worker_pools.h](hActivate a pwq in }(hActivate a pwq in hjWlhhhNhNubj)}(h**nna->pending_pwqs**h]hnna->pending_pwqs}(hhhj`lhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWlubh. Called with }(h. Called with hjWlhhhNhNubj)}(h**caller_pool**h]h caller_pool}(hhhjslhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWlubh locked. }(h locked. hjWlhhhNhNubj)}(h**caller_pool**h]h caller_pool}(hhhjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWlubh9 may be unlocked and relocked to lock other worker_pools.}(h9 may be unlocked and relocked to lock other worker_pools.hjWlhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]pwq_dec_nr_active (C function)c.pwq_dec_nr_activehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h3void pwq_dec_nr_active (struct pool_workqueue *pwq)h]jm)}(h2void pwq_dec_nr_active(struct pool_workqueue *pwq)h](j0)}(hvoidh]hvoid}(hhhjlhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjlhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhjlhMubj)}(hpwq_dec_nr_activeh]j)}(hpwq_dec_nr_activeh]hpwq_dec_nr_active}(hhhjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jjuh1jhjlhhhjlhMubj)}(h(struct pool_workqueue *pwq)h]j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjlubj)}(h h]h }(hhhj mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmmodnameN classnameNjj)}j]j)}jjlsbc.pwq_dec_nr_activeasbuh1hhjlubj)}(h h]h }(hhhj;mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hjdh]h*}(hhhjImhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hpwqh]hpwq}(hhhjVmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjlubah}(h]h ]h"]h$]h&]jjuh1jhjlhhhjlhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjlhhhjlhMubah}(h]jlah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjlhhubj)}(hhh]h)}(hRetire an active counth]hRetire an active count}(hjmhjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj~mhhubah}(h]h ]h"]h$]h&]uh1jhjlhhhjlhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjmjjmjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct pool_workqueue *pwq`` pool_workqueue of interest **Description** Decrement **pwq**'s nr_active and try to activate the first inactive work item. For unbound workqueues, this function may temporarily drop **pwq->pool->lock**.h](h)}(h**Parameters**h]j)}(hjmh]h Parameters}(hhhjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjmubjd)}(hhh]ji)}(h:``struct pool_workqueue *pwq`` pool_workqueue of interest h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hjmh]hstruct pool_workqueue *pwq}(hhhjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjmubj)}(hhh]h)}(hpool_workqueue of interesth]hpool_workqueue of interest}(hjmhjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMhjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhhjmhMhjmubah}(h]h ]h"]h$]h&]uh1jchjmubh)}(h**Description**h]j)}(hjmh]h Description}(hhhjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjmubh)}(hDecrement **pwq**'s nr_active and try to activate the first inactive work item. For unbound workqueues, this function may temporarily drop **pwq->pool->lock**.h](h Decrement }(h Decrement hjnhhhNhNubj)}(h**pwq**h]hpwq}(hhhjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh|’s nr_active and try to activate the first inactive work item. For unbound workqueues, this function may temporarily drop }(hz's nr_active and try to activate the first inactive work item. For unbound workqueues, this function may temporarily drop hjnhhhNhNubj)}(h**pwq->pool->lock**h]hpwq->pool->lock}(hhhj/nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh.}(hjhjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!pwq_dec_nr_in_flight (C function)c.pwq_dec_nr_in_flighthNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hOvoid pwq_dec_nr_in_flight (struct pool_workqueue *pwq, unsigned long work_data)h]jm)}(hNvoid pwq_dec_nr_in_flight(struct pool_workqueue *pwq, unsigned long work_data)h](j0)}(hvoidh]hvoid}(hhhjhnhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjdnhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjwnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdnhhhjvnhMubj)}(hpwq_dec_nr_in_flighth]j)}(hpwq_dec_nr_in_flighth]hpwq_dec_nr_in_flight}(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1jhjdnhhhjvnhMubj)}(h5(struct pool_workqueue *pwq, unsigned long work_data)h](j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjnubj)}(h h]h }(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjnmodnameN classnameNjj)}j]j)}jjnsbc.pwq_dec_nr_in_flightasbuh1hhjnubj)}(h h]h }(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hjdh]h*}(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hpwqh]hpwq}(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj)}(hunsigned long work_datah](j0)}(hunsignedh]hunsigned}(hhhjohhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjoubj)}(h h]h }(hhhj%ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj0)}(hlongh]hlong}(hhhj3ohhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjoubj)}(h h]h }(hhhjAohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(h work_datah]h work_data}(hhhjOohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubeh}(h]h ]h"]h$]h&]jjuh1jhjdnhhhjvnhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj`nhhhjvnhMubah}(h]j[nah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj]nhhubj)}(hhh]h)}(hdecrement pwq's nr_in_flighth]hdecrement pwq’s nr_in_flight}(hj|ohjzohhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjwohhubah}(h]h ]h"]h$]h&]uh1jhj]nhhhjvnhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjojjojuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct pool_workqueue *pwq`` pwq of interest ``unsigned long work_data`` work_data of work which left the queue **Description** A work either has completed or is removed from pending queue, decrement nr_in_flight of its pwq and handle workqueue flushing. **NOTE** For unbound workqueues, this function may temporarily drop **pwq->pool->lock** and thus should be called after all other state updates for the in-flight work item is complete. **Context** raw_spin_lock_irq(pool->lock).h](h)}(h**Parameters**h]j)}(hjoh]h Parameters}(hhhjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubjd)}(hhh](ji)}(h/``struct pool_workqueue *pwq`` pwq of interest h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hjoh]hstruct pool_workqueue *pwq}(hhhjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubj)}(hhh]h)}(hpwq of interesth]hpwq of interest}(hjohjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMhjoubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhhjohMhjoubji)}(hC``unsigned long work_data`` work_data of work which left the queue h](jo)}(h``unsigned long work_data``h]j)}(hjoh]hunsigned long work_data}(hhhjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubj)}(hhh]h)}(h&work_data of work which left the queueh]h&work_data of work which left the queue}(hjphj phhhNhNubah}(h]h ]h"]h$]h&]uh1hhj phMhj pubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhhj phMhjoubeh}(h]h ]h"]h$]h&]uh1jchjoubh)}(h**Description**h]j)}(hj/ph]h Description}(hhhj1phhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-pubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubh)}(h~A work either has completed or is removed from pending queue, decrement nr_in_flight of its pwq and handle workqueue flushing.h]h~A work either has completed or is removed from pending queue, decrement nr_in_flight of its pwq and handle workqueue flushing.}(hjGphjEphhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubh)}(h**NOTE**h]j)}(hjVph]hNOTE}(hhhjXphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTpubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubh)}(hFor unbound workqueues, this function may temporarily drop **pwq->pool->lock** and thus should be called after all other state updates for the in-flight work item is complete.h](h;For unbound workqueues, this function may temporarily drop }(h;For unbound workqueues, this function may temporarily drop hjlphhhNhNubj)}(h**pwq->pool->lock**h]hpwq->pool->lock}(hhhjuphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlpubha and thus should be called after all other state updates for the in-flight work item is complete.}(ha and thus should be called after all other state updates for the in-flight work item is complete.hjlphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubh)}(h **Context**h]j)}(hjph]hContext}(hhhjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubh)}(hraw_spin_lock_irq(pool->lock).h]hraw_spin_lock_irq(pool->lock).}(hjphjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] try_to_grab_pending (C function)c.try_to_grab_pendinghNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hXint try_to_grab_pending (struct work_struct *work, u32 cflags, unsigned long *irq_flags)h]jm)}(hWint try_to_grab_pending(struct work_struct *work, u32 cflags, unsigned long *irq_flags)h](j0)}(hinth]hint}(hhhjphhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjphhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjphhhjphMubj)}(htry_to_grab_pendingh]j)}(htry_to_grab_pendingh]htry_to_grab_pending}(hhhjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1jhjphhhjphMubj)}(h@(struct work_struct *work, u32 cflags, unsigned long *irq_flags)h](j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjqubj)}(h h]h }(hhhj qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj1qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.qubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj3qmodnameN classnameNjj)}j]j)}jjpsbc.try_to_grab_pendingasbuh1hhjqubj)}(h h]h }(hhhjQqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hjdh]h*}(hhhj_qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hworkh]hwork}(hhhjlqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj qubj)}(h u32 cflagsh](h)}(hhh]j)}(hu32h]hu32}(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjqmodnameN classnameNjj)}j]jMqc.try_to_grab_pendingasbuh1hhjqubj)}(h h]h }(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hcflagsh]hcflags}(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj qubj)}(hunsigned long *irq_flagsh](j0)}(hunsignedh]hunsigned}(hhhjqhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjqubj)}(h h]h }(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj0)}(hlongh]hlong}(hhhjqhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjqubj)}(h h]h }(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hjdh]h*}(hhhjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(h irq_flagsh]h irq_flags}(hhhjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj qubeh}(h]h ]h"]h$]h&]jjuh1jhjphhhjphMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjphhhjphMubah}(h]jpah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjphhubj)}(hhh]h)}(h-steal work item from worklist and disable irqh]h-steal work item from worklist and disable irq}(hj?rhj=rhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:rhhubah}(h]h ]h"]h$]h&]uh1jhjphhhjphMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjUrjjUrjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct work_struct *work`` work item to steal ``u32 cflags`` ``WORK_CANCEL_`` flags ``unsigned long *irq_flags`` place to store irq state **Description** Try to grab PENDING bit of **work**. This function can handle **work** in any stable state - idle, on timer or on worklist. On successful return, >= 0, irq is disabled and the caller is responsible for releasing it using local_irq_restore(***irq_flags**). This function is safe to call from any context including IRQ handler. **Return** ======== ================================================================ 1 if **work** was pending and we successfully stole PENDING 0 if **work** was idle and we claimed PENDING -EAGAIN if PENDING couldn't be grabbed at the moment, safe to busy-retry ======== ================================================================ **Note** On >= 0 return, the caller owns **work**'s PENDING bit. To avoid getting interrupted while holding PENDING and **work** off queue, irq must be disabled on entry. This, combined with delayed_work->timer being irqsafe, ensures that we return -EAGAIN for finite short period of time.h](h)}(h**Parameters**h]j)}(hj_rh]h Parameters}(hhhjarhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]rubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjYrubjd)}(hhh](ji)}(h0``struct work_struct *work`` work item to steal h](jo)}(h``struct work_struct *work``h]j)}(hj~rh]hstruct work_struct *work}(hhhjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|rubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjxrubj)}(hhh]h)}(hwork item to stealh]hwork item to steal}(hjrhjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhMhjrubah}(h]h ]h"]h$]h&]uh1jhjxrubeh}(h]h ]h"]h$]h&]uh1jhhjrhMhjurubji)}(h&``u32 cflags`` ``WORK_CANCEL_`` flags h](jo)}(h``u32 cflags``h]j)}(hjrh]h u32 cflags}(hhhjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjrubj)}(hhh]h)}(h``WORK_CANCEL_`` flagsh](j)}(h``WORK_CANCEL_``h]h WORK_CANCEL_}(hhhjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubh flags}(h flagshjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjrhMhjrubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhhjrhMhjurubji)}(h6``unsigned long *irq_flags`` place to store irq state h](jo)}(h``unsigned long *irq_flags``h]j)}(hjrh]hunsigned long *irq_flags}(hhhjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjrubj)}(hhh]h)}(hplace to store irq stateh]hplace to store irq state}(hjshjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjshMhjsubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhhjshMhjurubeh}(h]h ]h"]h$]h&]uh1jchjYrubh)}(h**Description**h]j)}(hj:sh]h Description}(hhhj= 0, irq is disabled and the caller is responsible for releasing it using local_irq_restore(***irq_flags**).h](hsOn successful return, >= 0, irq is disabled and the caller is responsible for releasing it using local_irq_restore(}(hsOn successful return, >= 0, irq is disabled and the caller is responsible for releasing it using local_irq_restore(hjshhhNhNubj)}(h***irq_flags**h]h *irq_flags}(hhhjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubh).}(h).hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjYrubh)}(hEThis function is safe to call from any context including IRQ handler.h]hEThis function is safe to call from any context including IRQ handler.}(hjshjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjYrubh)}(h **Return**h]j)}(hjsh]hReturn}(hhhjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjYrubjz)}(hhh]j )}(hhh]j )}(hhh](j )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hjsubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthK@uh1j hjsubjk )}(hhh](j )}(hhh](j )}(hhh]h)}(h1h]h1}(hjshjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjsubah}(h]h ]h"]h$]h&]uh1j hjsubj )}(hhh]h)}(h9if **work** was pending and we successfully stole PENDINGh](hif }(hif hjthhhNhNubj)}(h**work**h]hwork}(hhhjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh. was pending and we successfully stole PENDING}(h. was pending and we successfully stole PENDINGhjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjthM hj tubah}(h]h ]h"]h$]h&]uh1j hjsubeh}(h]h ]h"]h$]h&]uh1j hjsubj )}(hhh](j )}(hhh]h)}(h0h]h0}(hjDthjBthhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj?tubah}(h]h ]h"]h$]h&]uh1j hj= 0 return, the caller owns **work**'s PENDING bit. To avoid getting interrupted while holding PENDING and **work** off queue, irq must be disabled on entry. This, combined with delayed_work->timer being irqsafe, ensures that we return -EAGAIN for finite short period of time.h](h On >= 0 return, the caller owns }(h On >= 0 return, the caller owns hjthhhNhNubj)}(h**work**h]hwork}(hhhjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubhJ’s PENDING bit. To avoid getting interrupted while holding PENDING and }(hH's PENDING bit. To avoid getting interrupted while holding PENDING and hjthhhNhNubj)}(h**work**h]hwork}(hhhj uhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh off queue, irq must be disabled on entry. This, combined with delayed_work->timer being irqsafe, ensures that we return -EAGAIN for finite short period of time.}(h off queue, irq must be disabled on entry. This, combined with delayed_work->timer being irqsafe, ensures that we return -EAGAIN for finite short period of time.hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjYrubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]work_grab_pending (C function)c.work_grab_pendinghNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hWbool work_grab_pending (struct work_struct *work, u32 cflags, unsigned long *irq_flags)h]jm)}(hVbool work_grab_pending(struct work_struct *work, u32 cflags, unsigned long *irq_flags)h](j0)}(hj h]hbool}(hhhjGuhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjCuhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMrubj)}(h h]h }(hhhjUuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCuhhhjTuhMrubj)}(hwork_grab_pendingh]j)}(hwork_grab_pendingh]hwork_grab_pending}(hhhjguhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcuubah}(h]h ](jjeh"]h$]h&]jjuh1jhjCuhhhjTuhMrubj)}(h@(struct work_struct *work, u32 cflags, unsigned long *irq_flags)h](j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjuubj)}(h h]h }(hhhjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjumodnameN classnameNjj)}j]j)}jjiusbc.work_grab_pendingasbuh1hhjuubj)}(h h]h }(hhhjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj)}(hjdh]h*}(hhhjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj)}(hworkh]hwork}(hhhjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{uubj)}(h u32 cflagsh](h)}(hhh]j)}(hu32h]hu32}(hhhjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjumodnameN classnameNjj)}j]juc.work_grab_pendingasbuh1hhjuubj)}(h h]h }(hhhjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj)}(hcflagsh]hcflags}(hhhj$vhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{uubj)}(hunsigned long *irq_flagsh](j0)}(hunsignedh]hunsigned}(hhhj=vhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj9vubj)}(h h]h }(hhhjKvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9vubj0)}(hlongh]hlong}(hhhjYvhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj9vubj)}(h h]h }(hhhjgvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9vubj)}(hjdh]h*}(hhhjuvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9vubj)}(h irq_flagsh]h irq_flags}(hhhjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9vubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{uubeh}(h]h ]h"]h$]h&]jjuh1jhjCuhhhjTuhMrubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj?uhhhjTuhMrubah}(h]j:uah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-yubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjOyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLyubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjQymodnameN classnameNjj)}j]jx c.insert_workasbuh1hhj-yubj)}(h h]h }(hhhjmyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-yubj)}(hjdh]h*}(hhhj{yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-yubj)}(hworkh]hwork}(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-yubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubj)}(hstruct list_head *headh](js)}(hjvh]hstruct}(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjyubj)}(h h]h }(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubh)}(hhh]j)}(h list_headh]h list_head}(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjymodnameN classnameNjj)}j]jx c.insert_workasbuh1hhjyubj)}(h h]h }(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hjdh]h*}(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hheadh]hhead}(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubj)}(hunsigned int extra_flagsh](j0)}(hunsignedh]hunsigned}(hhhjzhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj zubj)}(h h]h }(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj zubj0)}(hinth]hint}(hhhj-zhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj zubj)}(h h]h }(hhhj;zhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj zubj)}(h extra_flagsh]h extra_flags}(hhhjIzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj zubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubeh}(h]h ]h"]h$]h&]jjuh1jhj~xhhhjxhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjzxhhhjxhMubah}(h]juxah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjwxhhubj)}(hhh]h)}(hinsert a work into a poolh]hinsert a work into a pool}(hjvzhjtzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjqzhhubah}(h]h ]h"]h$]h&]uh1jhjwxhhhjxhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjzjjzjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct pool_workqueue *pwq`` pwq **work** belongs to ``struct work_struct *work`` work to insert ``struct list_head *head`` insertion point ``unsigned int extra_flags`` extra WORK_STRUCT_* flags to set **Description** Insert **work** which belongs to **pwq** after **head**. **extra_flags** is or'd to work_struct flags. **Context** raw_spin_lock_irq(pool->lock).h](h)}(h**Parameters**h]j)}(hjzh]h Parameters}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubjd)}(hhh](ji)}(h7``struct pool_workqueue *pwq`` pwq **work** belongs to h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hjzh]hstruct pool_workqueue *pwq}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubj)}(hhh]h)}(hpwq **work** belongs toh](hpwq }(hpwq hjzhhhNhNubj)}(h**work**h]hwork}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubh belongs to}(h belongs tohjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjzhMhjzubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhhjzhMhjzubji)}(h,``struct work_struct *work`` work to insert h](jo)}(h``struct work_struct *work``h]j)}(hj{h]hstruct work_struct *work}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubj)}(hhh]h)}(hwork to inserth]hwork to insert}(hj{hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhhj{hMhjzubji)}(h+``struct list_head *head`` insertion point h](jo)}(h``struct list_head *head``h]j)}(hj;{h]hstruct list_head *head}(hhhj={hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9{ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj5{ubj)}(hhh]h)}(hinsertion pointh]hinsertion point}(hjV{hjT{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjP{hMhjQ{ubah}(h]h ]h"]h$]h&]uh1jhj5{ubeh}(h]h ]h"]h$]h&]uh1jhhjP{hMhjzubji)}(h>``unsigned int extra_flags`` extra WORK_STRUCT_* flags to set h](jo)}(h``unsigned int extra_flags``h]j)}(hjt{h]hunsigned int extra_flags}(hhhjv{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr{ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjn{ubj)}(hhh]h)}(h extra WORK_STRUCT_* flags to seth]h extra WORK_STRUCT_* flags to set}(hj{hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMhj{ubah}(h]h ]h"]h$]h&]uh1jhjn{ubeh}(h]h ]h"]h$]h&]uh1jhhj{hMhjzubeh}(h]h ]h"]h$]h&]uh1jchjzubh)}(h**Description**h]j)}(hj{h]h Description}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubh)}(hgInsert **work** which belongs to **pwq** after **head**. **extra_flags** is or'd to work_struct flags.h](hInsert }(hInsert hj{hhhNhNubj)}(h**work**h]hwork}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh which belongs to }(h which belongs to hj{hhhNhNubj)}(h**pwq**h]hpwq}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh after }(h after hj{hhhNhNubj)}(h**head**h]hhead}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh. }(h. hj{hhhNhNubj)}(h**extra_flags**h]h extra_flags}(hhhj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh is or’d to work_struct flags.}(h is or'd to work_struct flags.hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubh)}(h **Context**h]j)}(hj#|h]hContext}(hhhj%|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!|ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubh)}(hraw_spin_lock_irq(pool->lock).h]hraw_spin_lock_irq(pool->lock).}(hj;|hj9|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]queue_work_on (C function)c.queue_work_onhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hSbool queue_work_on (int cpu, struct workqueue_struct *wq, struct work_struct *work)h]jm)}(hRbool queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work)h](j0)}(hj h]hbool}(hhhjh|hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjd|hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMT ubj)}(h h]h }(hhhjv|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd|hhhju|hMT ubj)}(h queue_work_onh]j)}(h queue_work_onh]h queue_work_on}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjd|hhhju|hMT ubj)}(h@(int cpu, struct workqueue_struct *wq, struct work_struct *work)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhj|hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj|ubj)}(h h]h }(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hcpuh]hcpu}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj|ubj)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj|ubj)}(h h]h }(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj|modnameN classnameNjj)}j]j)}jj|sbc.queue_work_onasbuh1hhj|ubj)}(h h]h }(hhhj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hjdh]h*}(hhhj%}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hwqh]hwq}(hhhj2}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj|ubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjK}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjG}ubj)}(h h]h }(hhhjX}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG}ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhji}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf}ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjk}modnameN classnameNjj)}j]j}c.queue_work_onasbuh1hhjG}ubj)}(h h]h }(hhhj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG}ubj)}(hjdh]h*}(hhhj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG}ubj)}(hworkh]hwork}(hhhj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG}ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj|ubeh}(h]h ]h"]h$]h&]jjuh1jhjd|hhhju|hMT ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj`|hhhju|hMT ubah}(h]j[|ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM` hj]|hhubj)}(hhh]h)}(hqueue work on specific cpuh]hqueue work on specific cpu}(hj}hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMS hj}hhubah}(h]h ]h"]h$]h&]uh1jhj]|hhhju|hMT ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj}jj}juh1jahhhj?hNhNubj)}(hX**Parameters** ``int cpu`` CPU number to execute work on ``struct workqueue_struct *wq`` workqueue to use ``struct work_struct *work`` work to queue **Description** We queue the work to a specific CPU, the caller must ensure it can't go away. Callers that fail to ensure that the specified CPU cannot go away will execute on a randomly chosen CPU. But note well that callers specifying a CPU that never has been online will get a splat. **Return** ``false`` if **work** was already on a queue, ``true`` otherwise.h](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hhhj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMW hj}ubjd)}(hhh](ji)}(h*``int cpu`` CPU number to execute work on h](jo)}(h ``int cpu``h]j)}(hj~h]hint cpu}(hhhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ~ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMT hj~ubj)}(hhh]h)}(hCPU number to execute work onh]hCPU number to execute work on}(hj)~hj'~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#~hMT hj$~ubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jhhj#~hMT hj~ubji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjG~h]hstruct workqueue_struct *wq}(hhhjI~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE~ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMU hjA~ubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hjb~hj`~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\~hMU hj]~ubah}(h]h ]h"]h$]h&]uh1jhjA~ubeh}(h]h ]h"]h$]h&]uh1jhhj\~hMU hj~ubji)}(h+``struct work_struct *work`` work to queue h](jo)}(h``struct work_struct *work``h]j)}(hj~h]hstruct work_struct *work}(hhhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~~ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMV hjz~ubj)}(hhh]h)}(h work to queueh]h work to queue}(hj~hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMV hj~ubah}(h]h ]h"]h$]h&]uh1jhjz~ubeh}(h]h ]h"]h$]h&]uh1jhhj~hMV hj~ubeh}(h]h ]h"]h$]h&]uh1jchj}ubh)}(h**Description**h]j)}(hj~h]h Description}(hhhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMX hj}ubh)}(hXWe queue the work to a specific CPU, the caller must ensure it can't go away. Callers that fail to ensure that the specified CPU cannot go away will execute on a randomly chosen CPU. But note well that callers specifying a CPU that never has been online will get a splat.h]hXWe queue the work to a specific CPU, the caller must ensure it can’t go away. Callers that fail to ensure that the specified CPU cannot go away will execute on a randomly chosen CPU. But note well that callers specifying a CPU that never has been online will get a splat.}(hj~hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMX hj}ubh)}(h **Return**h]j)}(hj~h]hReturn}(hhhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM^ hj}ubh)}(hA``false`` if **work** was already on a queue, ``true`` otherwise.h](j)}(h ``false``h]hfalse}(hhhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh if }(h if hj~hhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh was already on a queue, }(h was already on a queue, hj~hhhNhNubj)}(h``true``h]htrue}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh otherwise.}(h otherwise.hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM^ hj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!select_numa_node_cpu (C function)c.select_numa_node_cpuhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h#int select_numa_node_cpu (int node)h]jm)}(h"int select_numa_node_cpu(int node)h](j0)}(hinth]hint}(hhhj\hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjXhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMu ubj)}(h h]h }(hhhjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhhjjhMu ubj)}(hselect_numa_node_cpuh]j)}(hselect_numa_node_cpuh]hselect_numa_node_cpu}(hhhj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1jhjXhhhjjhMu ubj)}(h (int node)h]j)}(hint nodeh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnodeh]hnode}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjXhhhjjhMu ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjThhhjjhMu ubah}(h]jOah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM| hjQhhubj)}(hhh]h)}(hSelect a CPU based on NUMA nodeh]hSelect a CPU based on NUMA node}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMt hjhhubah}(h]h ]h"]h$]h&]uh1jhjQhhhjjhMu ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX\**Parameters** ``int node`` NUMA node ID that we want to select a CPU from **Description** This function will attempt to find a "random" cpu available on a given node. If there are no CPUs available on the given node it will return WORK_CPU_UNBOUND indicating that we should just schedule to any available CPU if we need to schedule this work.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMx hjubjd)}(hhh]ji)}(h<``int node`` NUMA node ID that we want to select a CPU from h](jo)}(h ``int node``h]j)}(hj!h]hint node}(hhhj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMu hjubj)}(hhh]h)}(h.NUMA node ID that we want to select a CPU fromh]h.NUMA node ID that we want to select a CPU from}(hj<hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMu hj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj6hMu hjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj\h]h Description}(hhhj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMw hjubh)}(hThis function will attempt to find a "random" cpu available on a given node. If there are no CPUs available on the given node it will return WORK_CPU_UNBOUND indicating that we should just schedule to any available CPU if we need to schedule this work.h]hXThis function will attempt to find a “random” cpu available on a given node. If there are no CPUs available on the given node it will return WORK_CPU_UNBOUND indicating that we should just schedule to any available CPU if we need to schedule this work.}(hjthjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMw hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]queue_work_node (C function)c.queue_work_nodehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hVbool queue_work_node (int node, struct workqueue_struct *wq, struct work_struct *work)h]jm)}(hUbool queue_work_node(int node, struct workqueue_struct *wq, struct work_struct *work)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubj)}(hqueue_work_nodeh]j)}(hqueue_work_nodeh]hqueue_work_node}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM ubj)}(hA(int node, struct workqueue_struct *wq, struct work_struct *work)h](j)}(hint nodeh](j0)}(hinth]hint}(hhhj݀hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjـubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjـubj)}(hnodeh]hnode}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjـubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjՀubj)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j)}jjÀsbc.queue_work_nodeasbuh1hhjubj)}(h h]h }(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjՀubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jLc.queue_work_nodeasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj΁hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkh]hwork}(hhhjہhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjՀubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubj)}(hhh]h)}(h2queue work on a "random" cpu for a given NUMA nodeh]h6queue work on a “random” cpu for a given NUMA node}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hXH**Parameters** ``int node`` NUMA node that we are targeting the work for ``struct workqueue_struct *wq`` workqueue to use ``struct work_struct *work`` work to queue **Description** We queue the work to a "random" CPU within a given NUMA node. The basic idea here is to provide a way to somehow associate work with a given NUMA node. This function will only make a best effort attempt at getting this onto the right NUMA node. If no node is requested or the requested node is offline then we just fall back to standard queue_work behavior. Currently the "random" CPU ends up being the first available CPU in the intersection of cpu_online_mask and the cpumask of the node, unless we are running on the node. In that case we just use the current CPU. **Return** ``false`` if **work** was already on a queue, ``true`` otherwise.h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hhhj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj"ubjd)}(hhh](ji)}(h:``int node`` NUMA node that we are targeting the work for h](jo)}(h ``int node``h]j)}(hjGh]hint node}(hhhjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjAubj)}(hhh]h)}(h,NUMA node that we are targeting the work forh]h,NUMA node that we are targeting the work for}(hjbhj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM hj]ubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhhj\hM hj>ubji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjh]hstruct workqueue_struct *wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjzubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhhjhM hj>ubji)}(h+``struct work_struct *work`` work to queue h](jo)}(h``struct work_struct *work``h]j)}(hjh]hstruct work_struct *work}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(h work to queueh]h work to queue}(hjԂhj҂hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj΂hM hjςubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj΂hM hj>ubeh}(h]h ]h"]h$]h&]uh1jchj"ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj"ubh)}(hWe queue the work to a "random" CPU within a given NUMA node. The basic idea here is to provide a way to somehow associate work with a given NUMA node.h]hWe queue the work to a “random” CPU within a given NUMA node. The basic idea here is to provide a way to somehow associate work with a given NUMA node.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj"ubh)}(hThis function will only make a best effort attempt at getting this onto the right NUMA node. If no node is requested or the requested node is offline then we just fall back to standard queue_work behavior.h]hThis function will only make a best effort attempt at getting this onto the right NUMA node. If no node is requested or the requested node is offline then we just fall back to standard queue_work behavior.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj"ubh)}(hCurrently the "random" CPU ends up being the first available CPU in the intersection of cpu_online_mask and the cpumask of the node, unless we are running on the node. In that case we just use the current CPU.h]hCurrently the “random” CPU ends up being the first available CPU in the intersection of cpu_online_mask and the cpumask of the node, unless we are running on the node. In that case we just use the current CPU.}(hj*hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj"ubh)}(h **Return**h]j)}(hj9h]hReturn}(hhhj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj"ubh)}(hA``false`` if **work** was already on a queue, ``true`` otherwise.h](j)}(h ``false``h]hfalse}(hhhjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh if }(h if hjOhhhNhNubj)}(h**work**h]hwork}(hhhjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh was already on a queue, }(h was already on a queue, hjOhhhNhNubj)}(h``true``h]htrue}(hhhjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubh otherwise.}(h otherwise.hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]"queue_delayed_work_on (C function)c.queue_delayed_work_onhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hrbool queue_delayed_work_on (int cpu, struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h]jm)}(hqbool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubj)}(hqueue_delayed_work_onh]j)}(hqueue_delayed_work_onh]hqueue_delayed_work_on}(hhhjӃhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjσubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM ubj)}(hW(int cpu, struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpuh]hcpu}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj ubj)}(h h]h }(hhhj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjDmodnameN classnameNjj)}j]j)}jjՃsbc.queue_delayed_work_onasbuh1hhj ubj)}(h h]h }(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjdh]h*}(hhhjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hwqh]hwq}(hhhj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j^c.queue_delayed_work_onasbuh1hhjubj)}(h h]h }(hhhj҄hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdworkh]hdwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hunsigned long delayh](j0)}(hunsignedh]hunsigned}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj0)}(hlongh]hlong}(hhhj"hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdelayh]hdelay}(hhhj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubj)}(hhh]h)}(h&queue work on specific CPU after delayh]h&queue work on specific CPU after delay}(hjkhjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjfhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``int cpu`` CPU number to execute work on ``struct workqueue_struct *wq`` workqueue to use ``struct delayed_work *dwork`` work to queue ``unsigned long delay`` number of jiffies to wait before queueing **Return** ``false`` if **work** was already on a queue, ``true`` otherwise. If **delay** is zero and **dwork** is idle, it will be scheduled for immediate execution.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubjd)}(hhh](ji)}(h*``int cpu`` CPU number to execute work on h](jo)}(h ``int cpu``h]j)}(hjh]hint cpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(hCPU number to execute work onh]hCPU number to execute work on}(hjŅhjÅhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjh]hstruct workqueue_struct *wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj݅ubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj݅ubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubji)}(h-``struct delayed_work *dwork`` work to queue h](jo)}(h``struct delayed_work *dwork``h]j)}(hjh]hstruct delayed_work *dwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(h work to queueh]h work to queue}(hj7hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hM hj2ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj1hM hjubji)}(hB``unsigned long delay`` number of jiffies to wait before queueing h](jo)}(h``unsigned long delay``h]j)}(hjUh]hunsigned long delay}(hhhjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjOubj)}(hhh]h)}(h)number of jiffies to wait before queueingh]h)number of jiffies to wait before queueing}(hjphjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhM hjkubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhhjjhM hjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubh)}(h``false`` if **work** was already on a queue, ``true`` otherwise. If **delay** is zero and **dwork** is idle, it will be scheduled for immediate execution.h](j)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(h if hjhhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh was already on a queue, }(h was already on a queue, hjhhhNhNubj)}(h``true``h]htrue}(hhhjІhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise. If }(h otherwise. If hjhhhNhNubj)}(h **delay**h]hdelay}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is zero and }(h is zero and hjhhhNhNubj)}(h **dwork**h]hdwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh7 is idle, it will be scheduled for immediate execution.}(h7 is idle, it will be scheduled for immediate execution.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] mod_delayed_work_on (C function)c.mod_delayed_work_onhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hpbool mod_delayed_work_on (int cpu, struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h]jm)}(hobool mod_delayed_work_on(int cpu, struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j0)}(hj h]hbool}(hhhj0hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj,hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj=hM ubj)}(hmod_delayed_work_onh]j)}(hmod_delayed_work_onh]hmod_delayed_work_on}(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]jjuh1jhj,hhhj=hM ubj)}(hW(int cpu, struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhjlhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhubj)}(h h]h }(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hcpuh]hcpu}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdubj)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjRsbc.mod_delayed_work_onasbuh1hhjubj)}(h h]h }(hhhj߇hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdubj)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj3modnameN classnameNjj)}j]jۇc.mod_delayed_work_onasbuh1hhjubj)}(h h]h }(hhhjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdworkh]hdwork}(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdubj)}(hunsigned long delayh](j0)}(hunsignedh]hunsigned}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj0)}(hlongh]hlong}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdelayh]hdelay}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdubeh}(h]h ]h"]h$]h&]jjuh1jhj,hhhj=hM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj(hhhj=hM ubah}(h]j#ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM' hj%hhubj)}(hhh]h)}(h7modify delay of or queue a delayed work on specific CPUh]h7modify delay of or queue a delayed work on specific CPU}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj=hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``int cpu`` CPU number to execute work on ``struct workqueue_struct *wq`` workqueue to use ``struct delayed_work *dwork`` work to queue ``unsigned long delay`` number of jiffies to wait before queueing **Description** If **dwork** is idle, equivalent to queue_delayed_work_on(); otherwise, modify **dwork**'s timer so that it expires after **delay**. If **delay** is zero, **work** is guaranteed to be scheduled immediately regardless of its current state. This function is safe to call from any context including IRQ handler. See try_to_grab_pending() for details. **Return** ``false`` if **dwork** was idle and queued, ``true`` if **dwork** was pending and its timer was modified.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubjd)}(hhh](ji)}(h*``int cpu`` CPU number to execute work on h](jo)}(h ``int cpu``h]j)}(hj'h]hint cpu}(hhhj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj!ubj)}(hhh]h)}(hCPU number to execute work onh]hCPU number to execute work on}(hjBhj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hM hj=ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhhj<hM hjubji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj`h]hstruct workqueue_struct *wq}(hhhjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjZubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hj{hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhM hjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhhjuhM hjubji)}(h-``struct delayed_work *dwork`` work to queue h](jo)}(h``struct delayed_work *dwork``h]j)}(hjh]hstruct delayed_work *dwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(h work to queueh]h work to queue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubji)}(hB``unsigned long delay`` number of jiffies to wait before queueing h](jo)}(h``unsigned long delay``h]j)}(hj҉h]hunsigned long delay}(hhhjԉhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjЉubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj̉ubj)}(hhh]h)}(h)number of jiffies to wait before queueingh]h)number of jiffies to wait before queueing}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj̉ubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj h]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubh)}(hIf **dwork** is idle, equivalent to queue_delayed_work_on(); otherwise, modify **dwork**'s timer so that it expires after **delay**. If **delay** is zero, **work** is guaranteed to be scheduled immediately regardless of its current state.h](hIf }(hIf hj#hhhNhNubj)}(h **dwork**h]hdwork}(hhhj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubhC is idle, equivalent to queue_delayed_work_on(); otherwise, modify }(hC is idle, equivalent to queue_delayed_work_on(); otherwise, modify hj#hhhNhNubj)}(h **dwork**h]hdwork}(hhhj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh$’s timer so that it expires after }(h"'s timer so that it expires after hj#hhhNhNubj)}(h **delay**h]hdelay}(hhhjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh. If }(h. If hj#hhhNhNubj)}(h **delay**h]hdelay}(hhhjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh is zero, }(h is zero, hj#hhhNhNubj)}(h**work**h]hwork}(hhhjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubhK is guaranteed to be scheduled immediately regardless of its current state.}(hK is guaranteed to be scheduled immediately regardless of its current state.hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubh)}(hlThis function is safe to call from any context including IRQ handler. See try_to_grab_pending() for details.h]hlThis function is safe to call from any context including IRQ handler. See try_to_grab_pending() for details.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM! hjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM$ hjubh)}(hi``false`` if **dwork** was idle and queued, ``true`` if **dwork** was pending and its timer was modified.h](j)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(h if hjhhhNhNubj)}(h **dwork**h]hdwork}(hhhjЊhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh was idle and queued, }(h was idle and queued, hjhhhNhNubj)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(hjϊhjubj)}(h **dwork**h]hdwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( was pending and its timer was modified.}(h( was pending and its timer was modified.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM! hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]queue_rcu_work (C function)c.queue_rcu_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hIbool queue_rcu_work (struct workqueue_struct *wq, struct rcu_work *rwork)h]jm)}(hHbool queue_rcu_work(struct workqueue_struct *wq, struct rcu_work *rwork)h](j0)}(hj h]hbool}(hhhj/hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj+hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMC ubj)}(h h]h }(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhj<hMC ubj)}(hqueue_rcu_workh]j)}(hqueue_rcu_workh]hqueue_rcu_work}(hhhjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]jjuh1jhj+hhhj<hMC ubj)}(h5(struct workqueue_struct *wq, struct rcu_work *rwork)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjgubj)}(h h]h }(hhhjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjQsbc.queue_rcu_workasbuh1hhjgubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hwqh]hwq}(hhhjċhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjcubj)}(hstruct rcu_work *rworkh](js)}(hjvh]hstruct}(hhhj݋hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjًubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjًubh)}(hhh]j)}(hrcu_workh]hrcu_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.queue_rcu_workasbuh1hhjًubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjًubj)}(hjdh]h*}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjًubj)}(hrworkh]hrwork}(hhhj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjًubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjcubeh}(h]h ]h"]h$]h&]jjuh1jhj+hhhj<hMC ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj'hhhj<hMC ubah}(h]j"ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMK hj$hhubj)}(hhh]h)}(h#queue work after a RCU grace periodh]h#queue work after a RCU grace period}(hjahj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMB hj\hhubah}(h]h ]h"]h$]h&]uh1jhj$hhhj<hMC ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjwjjwjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` workqueue to use ``struct rcu_work *rwork`` work to queue **Return** ``false`` if **rwork** was already pending, ``true`` otherwise. Note that a full RCU grace period is guaranteed only after a ``true`` return. While **rwork** is guaranteed to be executed after a ``false`` return, the execution may happen before a full RCU grace period has passed.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMF hj{ubjd)}(hhh](ji)}(h1``struct workqueue_struct *wq`` workqueue to use h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjh]hstruct workqueue_struct *wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMC hjubj)}(hhh]h)}(hworkqueue to useh]hworkqueue to use}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMC hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMC hjubji)}(h)``struct rcu_work *rwork`` work to queue h](jo)}(h``struct rcu_work *rwork``h]j)}(hjٌh]hstruct rcu_work *rwork}(hhhjیhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj׌ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMD hjӌubj)}(hhh]h)}(h work to queueh]h work to queue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMD hjubah}(h]h ]h"]h$]h&]uh1jhjӌubeh}(h]h ]h"]h$]h&]uh1jhhjhMD hjubeh}(h]h ]h"]h$]h&]uh1jchj{ubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMF hj{ubh)}(hX``false`` if **rwork** was already pending, ``true`` otherwise. Note that a full RCU grace period is guaranteed only after a ``true`` return. While **rwork** is guaranteed to be executed after a ``false`` return, the execution may happen before a full RCU grace period has passed.h](j)}(h ``false``h]hfalse}(hhhj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh if }(h if hj*hhhNhNubj)}(h **rwork**h]hrwork}(hhhjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh was already pending, }(h was already pending, hj*hhhNhNubj)}(h``true``h]htrue}(hhhjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubhJ otherwise. Note that a full RCU grace period is guaranteed only after a }(hJ otherwise. Note that a full RCU grace period is guaranteed only after a hj*hhhNhNubj)}(h``true``h]htrue}(hhhjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh return. While }(h return. While hj*hhhNhNubj)}(h **rwork**h]hrwork}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh& is guaranteed to be executed after a }(h& is guaranteed to be executed after a hj*hhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubhL return, the execution may happen before a full RCU grace period has passed.}(hL return, the execution may happen before a full RCU grace period has passed.hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMF hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]"worker_attach_to_pool (C function)c.worker_attach_to_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hLvoid worker_attach_to_pool (struct worker *worker, struct worker_pool *pool)h]jm)}(hKvoid worker_attach_to_pool(struct worker *worker, struct worker_pool *pool)h](j0)}(hvoidh]hvoid}(hhhjǍhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjÍhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMw ubj)}(h h]h }(hhhj֍hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÍhhhjՍhMw ubj)}(hworker_attach_to_poolh]j)}(hworker_attach_to_poolh]hworker_attach_to_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjÍhhhjՍhMw ubj)}(h1(struct worker *worker, struct worker_pool *pool)h](j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkerh]hworker}(hhhj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjj)}j]j)}jjsbc.worker_attach_to_poolasbuh1hhjubj)}(h h]h }(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkerh]hworker}(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjrubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j>c.worker_attach_to_poolasbuh1hhjrubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hpoolh]hpool}(hhhj͎hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjÍhhhjՍhMw ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjՍhMw ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM~ hjhhubj)}(hhh]h)}(hattach a worker to a poolh]hattach a worker to a pool}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMv hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjՍhMw ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX(**Parameters** ``struct worker *worker`` worker to be attached ``struct worker_pool *pool`` the target pool **Description** Attach **worker** to **pool**. Once attached, the ``WORKER_UNBOUND`` flag and cpu-binding of **worker** are kept coordinated with the pool across cpu-[un]hotplugs.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMz hjubjd)}(hhh](ji)}(h0``struct worker *worker`` worker to be attached h](jo)}(h``struct worker *worker``h]j)}(hj9h]hstruct worker *worker}(hhhj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMw hj3ubj)}(hhh]h)}(hworker to be attachedh]hworker to be attached}(hjThjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMw hjOubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhhjNhMw hj0ubji)}(h-``struct worker_pool *pool`` the target pool h](jo)}(h``struct worker_pool *pool``h]j)}(hjrh]hstruct worker_pool *pool}(hhhjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMx hjlubj)}(hhh]h)}(hthe target poolh]hthe target pool}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMx hjubah}(h]h ]h"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]uh1jhhjhMx hj0ubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMz hjubh)}(hAttach **worker** to **pool**. Once attached, the ``WORKER_UNBOUND`` flag and cpu-binding of **worker** are kept coordinated with the pool across cpu-[un]hotplugs.h](hAttach }(hAttach hjÏhhhNhNubj)}(h **worker**h]hworker}(hhhj̏hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÏubh to }(h to hjÏhhhNhNubj)}(h**pool**h]hpool}(hhhjߏhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÏubh. Once attached, the }(h. Once attached, the hjÏhhhNhNubj)}(h``WORKER_UNBOUND``h]hWORKER_UNBOUND}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÏubh flag and cpu-binding of }(h flag and cpu-binding of hjÏhhhNhNubj)}(h **worker**h]hworker}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÏubh< are kept coordinated with the pool across cpu-[un]hotplugs.}(h< are kept coordinated with the pool across cpu-[un]hotplugs.hjÏhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMz hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]$worker_detach_from_pool (C function)c.worker_detach_from_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4void worker_detach_from_pool (struct worker *worker)h]jm)}(h3void worker_detach_from_pool(struct worker *worker)h](j0)}(hvoidh]hvoid}(hhhj?hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj;hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhjMhM ubj)}(hworker_detach_from_poolh]j)}(hworker_detach_from_poolh]hworker_detach_from_pool}(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj;hhhjMhM ubj)}(h(struct worker *worker)h]j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjxubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubh)}(hhh]j)}(hworkerh]hworker}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjbsbc.worker_detach_from_poolasbuh1hhjxubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hjdh]h*}(hhhjȐhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hworkerh]hworker}(hhhjՐhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjtubah}(h]h ]h"]h$]h&]jjuh1jhj;hhhjMhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj7hhhjMhM ubah}(h]j2ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj4hhubj)}(hhh]h)}(hdetach a worker from its poolh]hdetach a worker from its pool}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhj4hhhjMhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct worker *worker`` worker which is attached to its pool **Description** Undo the attaching which had been done in worker_attach_to_pool(). The caller worker shouldn't access to the pool after detached except it has other reference to the pool.h](h)}(h**Parameters**h]j)}(hj"h]h Parameters}(hhhj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubjd)}(hhh]ji)}(h?``struct worker *worker`` worker which is attached to its pool h](jo)}(h``struct worker *worker``h]j)}(hjAh]hstruct worker *worker}(hhhjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj;ubj)}(hhh]h)}(h$worker which is attached to its poolh]h$worker which is attached to its pool}(hj\hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhM hjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhhjVhM hj8ubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj|h]h Description}(hhhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubh)}(hUndo the attaching which had been done in worker_attach_to_pool(). The caller worker shouldn't access to the pool after detached except it has other reference to the pool.h]hUndo the attaching which had been done in worker_attach_to_pool(). The caller worker shouldn’t access to the pool after detached except it has other reference to the pool.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]create_worker (C function)c.create_workerhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h8struct worker * create_worker (struct worker_pool *pool)h]jm)}(h6struct worker *create_worker(struct worker_pool *pool)h](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjϑhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjΑhM ubh)}(hhh]j)}(hworkerh]hworker}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjݑubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}j create_workersbc.create_workerasbuh1hhjhhhjΑhM ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjΑhM ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjΑhM ubj)}(h create_workerh]j)}(hjh]h create_worker}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjΑhM ubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj7ubj)}(h h]h }(hhhjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj[modnameN classnameNjj)}j]jc.create_workerasbuh1hhj7ubj)}(h h]h }(hhhjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hpoolh]hpool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjΑhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjΑhM ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubj)}(hhh]h)}(hcreate a new workqueue workerh]hcreate a new workqueue worker}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjΑhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjՒjjՒjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct worker_pool *pool`` pool the new worker will belong to **Description** Create and start a new worker which is attached to **pool**. **Context** Might sleep. Does GFP_KERNEL allocations. **Return** Pointer to the newly created worker.h](h)}(h**Parameters**h]j)}(hjߒh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݒubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjْubjd)}(hhh]ji)}(h@``struct worker_pool *pool`` pool the new worker will belong to h](jo)}(h``struct worker_pool *pool``h]j)}(hjh]hstruct worker_pool *pool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(h"pool the new worker will belong toh]h"pool the new worker will belong to}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubah}(h]h ]h"]h$]h&]uh1jchjْubh)}(h**Description**h]j)}(hj9h]h Description}(hhhj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjْubh)}(hidle_list and into list **Description** Tag **worker** for destruction and adjust **pool** stats accordingly. The worker should be idle. **Context** raw_spin_lock_irq(pool->lock).h](h)}(h**Parameters**h]j)}(hj2h]h Parameters}(hhhj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM3 hj,ubjd)}(hhh](ji)}(h1``struct worker *worker`` worker to be destroyed h](jo)}(h``struct worker *worker``h]j)}(hjQh]hstruct worker *worker}(hhhjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM0 hjKubj)}(hhh]h)}(hworker to be destroyedh]hworker to be destroyed}(hjlhjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhM0 hjgubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhhjfhM0 hjHubji)}(hW``struct list_head *list`` transfer worker away from its pool->idle_list and into list h](jo)}(h``struct list_head *list``h]j)}(hjh]hstruct list_head *list}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM1 hjubj)}(hhh]h)}(h;transfer worker away from its pool->idle_list and into listh]h;transfer worker away from its pool->idle_list and into list}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM1 hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM1 hjHubeh}(h]h ]h"]h$]h&]uh1jchj,ubh)}(h**Description**h]j)}(hjŕh]h Description}(hhhjǕhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÕubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM3 hj,ubh)}(haTag **worker** for destruction and adjust **pool** stats accordingly. The worker should be idle.h](hTag }(hTag hjەhhhNhNubj)}(h **worker**h]hworker}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjەubh for destruction and adjust }(h for destruction and adjust hjەhhhNhNubj)}(h**pool**h]hpool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjەubh/ stats accordingly. The worker should be idle.}(h/ stats accordingly. The worker should be idle.hjەhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM3 hj,ubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6 hj,ubh)}(hraw_spin_lock_irq(pool->lock).h]hraw_spin_lock_irq(pool->lock).}(hj+hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM8 hj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] idle_worker_timeout (C function)c.idle_worker_timeouthNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h/void idle_worker_timeout (struct timer_list *t)h]jm)}(h.void idle_worker_timeout(struct timer_list *t)h](j0)}(hvoidh]hvoid}(hhhjXhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjThhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMQ ubj)}(h h]h }(hhhjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjThhhjfhMQ ubj)}(hidle_worker_timeouth]j)}(hidle_worker_timeouth]hidle_worker_timeout}(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ](jjeh"]h$]h&]jjuh1jhjThhhjfhMQ ubj)}(h(struct timer_list *t)h]j)}(hstruct timer_list *th](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h timer_listh]h timer_list}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj{sbc.idle_worker_timeoutasbuh1hhjubj)}(h h]h }(hhhjӖhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hth]ht}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjThhhjfhMQ ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjPhhhjfhMQ ubah}(h]jKah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMY hjMhhubj)}(hhh]h)}(h.check if some idle workers can now be deleted.h]h.check if some idle workers can now be deleted.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMP hjhhubah}(h]h ]h"]h$]h&]uh1jhjMhhhjfhMQ ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj1jj1juh1jahhhj?hNhNubj)}(hX**Parameters** ``struct timer_list *t`` The pool's idle_timer that just expired **Description** The timer is armed in worker_enter_idle(). Note that it isn't disarmed in worker_leave_idle(), as a worker flicking between idle and active while its pool is at the too_many_workers() tipping point would cause too much timer housekeeping overhead. Since IDLE_WORKER_TIMEOUT is long enough, we just let it expire and re-evaluate things from there.h](h)}(h**Parameters**h]j)}(hj;h]h Parameters}(hhhj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMT hj5ubjd)}(hhh]ji)}(hA``struct timer_list *t`` The pool's idle_timer that just expired h](jo)}(h``struct timer_list *t``h]j)}(hjZh]hstruct timer_list *t}(hhhj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMQ hjTubj)}(hhh]h)}(h'The pool's idle_timer that just expiredh]h)The pool’s idle_timer that just expired}(hjuhjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMQ hjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhhjohMQ hjQubah}(h]h ]h"]h$]h&]uh1jchj5ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMS hj5ubh)}(hXZThe timer is armed in worker_enter_idle(). Note that it isn't disarmed in worker_leave_idle(), as a worker flicking between idle and active while its pool is at the too_many_workers() tipping point would cause too much timer housekeeping overhead. Since IDLE_WORKER_TIMEOUT is long enough, we just let it expire and re-evaluate things from there.h]hX\The timer is armed in worker_enter_idle(). Note that it isn’t disarmed in worker_leave_idle(), as a worker flicking between idle and active while its pool is at the too_many_workers() tipping point would cause too much timer housekeeping overhead. Since IDLE_WORKER_TIMEOUT is long enough, we just let it expire and re-evaluate things from there.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMS hj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]idle_cull_fn (C function)c.idle_cull_fnhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h,void idle_cull_fn (struct work_struct *work)h]jm)}(h+void idle_cull_fn(struct work_struct *work)h](j0)}(hvoidh]hvoid}(hhhjڗhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj֗hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMw ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֗hhhjhMw ubj)}(h idle_cull_fnh]j)}(h idle_cull_fnh]h idle_cull_fn}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhj֗hhhjhMw ubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj7modnameN classnameNjj)}j]j)}jjsbc.idle_cull_fnasbuh1hhjubj)}(h h]h }(hhhjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkh]hwork}(hhhjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhj֗hhhjhMw ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjҗhhhjhMw ubah}(h]j͗ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjϗhhubj)}(hhh]h)}(h.cull workers that have been idle for too long.h]h.cull workers that have been idle for too long.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMv hjhhubah}(h]h ]h"]h$]h&]uh1jhjϗhhhjhMw ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct work_struct *work`` the pool's work for handling these idle workers **Description** This goes through a pool's idle workers and gets rid of those that have been idle for at least IDLE_WORKER_TIMEOUT seconds. We don't want to disturb isolated CPUs because of a pcpu kworker being culled, so this also resets worker affinity. This requires a sleepable context, hence the split between timer callback and work item.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMz hjubjd)}(hhh]ji)}(hM``struct work_struct *work`` the pool's work for handling these idle workers h](jo)}(h``struct work_struct *work``h]j)}(hjܘh]hstruct work_struct *work}(hhhjޘhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjژubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMw hj֘ubj)}(hhh]h)}(h/the pool's work for handling these idle workersh]h1the pool’s work for handling these idle workers}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMw hjubah}(h]h ]h"]h$]h&]uh1jhj֘ubeh}(h]h ]h"]h$]h&]uh1jhhjhMw hjӘubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMy hjubh)}(h{This goes through a pool's idle workers and gets rid of those that have been idle for at least IDLE_WORKER_TIMEOUT seconds.h]h}This goes through a pool’s idle workers and gets rid of those that have been idle for at least IDLE_WORKER_TIMEOUT seconds.}(hj/hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMy hjubh)}(hWe don't want to disturb isolated CPUs because of a pcpu kworker being culled, so this also resets worker affinity. This requires a sleepable context, hence the split between timer callback and work item.h]hWe don’t want to disturb isolated CPUs because of a pcpu kworker being culled, so this also resets worker affinity. This requires a sleepable context, hence the split between timer callback and work item.}(hj>hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM| hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] maybe_create_worker (C function)c.maybe_create_workerhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h3void maybe_create_worker (struct worker_pool *pool)h]jm)}(h2void maybe_create_worker(struct worker_pool *pool)h](j0)}(hvoidh]hvoid}(hhhjkhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjghhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhjyhM ubj)}(hmaybe_create_workerh]j)}(hmaybe_create_workerh]hmaybe_create_worker}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjghhhjyhM ubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjƙhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÙubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjșmodnameN classnameNjj)}j]j)}jjsbc.maybe_create_workerasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpoolh]hpool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjghhhjyhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjchhhjyhM ubah}(h]j^ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj`hhubj)}(hhh]h)}(h create a new worker if necessaryh]h create a new worker if necessary}(hj.hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj)hhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjyhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjDjjDjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct worker_pool *pool`` pool to create a new worker for **Description** Create a new worker for **pool** if necessary. **pool** is guaranteed to have at least one idle worker on return from this function. If creating a new worker takes longer than MAYDAY_INTERVAL, mayday is sent to all rescuers with works scheduled on **pool** to resolve possible allocation deadlock. On return, need_to_create_worker() is guaranteed to be ``false`` and may_start_working() ``true``. LOCKING: raw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times. Does GFP_KERNEL allocations. Called only from manager.h](h)}(h**Parameters**h]j)}(hjNh]h Parameters}(hhhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjHubjd)}(hhh]ji)}(h=``struct worker_pool *pool`` pool to create a new worker for h](jo)}(h``struct worker_pool *pool``h]j)}(hjmh]hstruct worker_pool *pool}(hhhjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjgubj)}(hhh]h)}(hpool to create a new worker forh]hpool to create a new worker for}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjdubah}(h]h ]h"]h$]h&]uh1jchjHubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjHubh)}(hX+Create a new worker for **pool** if necessary. **pool** is guaranteed to have at least one idle worker on return from this function. If creating a new worker takes longer than MAYDAY_INTERVAL, mayday is sent to all rescuers with works scheduled on **pool** to resolve possible allocation deadlock.h](hCreate a new worker for }(hCreate a new worker for hjhhhNhNubj)}(h**pool**h]hpool}(hhhjǚhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if necessary. }(h if necessary. hjhhhNhNubj)}(h**pool**h]hpool}(hhhjښhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is guaranteed to have at least one idle worker on return from this function. If creating a new worker takes longer than MAYDAY_INTERVAL, mayday is sent to all rescuers with works scheduled on }(h is guaranteed to have at least one idle worker on return from this function. If creating a new worker takes longer than MAYDAY_INTERVAL, mayday is sent to all rescuers with works scheduled on hjhhhNhNubj)}(h**pool**h]hpool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) to resolve possible allocation deadlock.}(h) to resolve possible allocation deadlock.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjHubh)}(hbOn return, need_to_create_worker() is guaranteed to be ``false`` and may_start_working() ``true``.h](h7On return, need_to_create_worker() is guaranteed to be }(h7On return, need_to_create_worker() is guaranteed to be hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and may_start_working() }(h and may_start_working() hjhhhNhNubj)}(h``true``h]htrue}(hhhj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjHubh)}(hLOCKING: raw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times. Does GFP_KERNEL allocations. Called only from manager.h]hLOCKING: raw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times. Does GFP_KERNEL allocations. Called only from manager.}(hj>hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]manage_workers (C function)c.manage_workershNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h+bool manage_workers (struct worker *worker)h]jm)}(h*bool manage_workers(struct worker *worker)h](j0)}(hj h]hbool}(hhhjkhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjghhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhjxhM ubj)}(hmanage_workersh]j)}(hmanage_workersh]hmanage_workers}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjghhhjxhM ubj)}(h(struct worker *worker)h]j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkerh]hworker}(hhhjśhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj›ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjǛmodnameN classnameNjj)}j]j)}jjsbc.manage_workersasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkerh]hworker}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjghhhjxhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjchhhjxhM ubah}(h]j^ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj`hhubj)}(hhh]h)}(hmanage worker poolh]hmanage worker pool}(hj-hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj(hhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjxhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjCjjCjuh1jahhhj?hNhNubj)}(hX-**Parameters** ``struct worker *worker`` self **Description** Assume the manager role and manage the worker pool **worker** belongs to. At any given time, there can be only zero or one manager per pool. The exclusion is handled automatically by this function. The caller can safely start processing works on false return. On true return, it's guaranteed that need_to_create_worker() is false and may_start_working() is true. **Context** raw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times. Does GFP_KERNEL allocations. **Return** ``false`` if the pool doesn't need management and the caller can safely start processing works, ``true`` if management function was performed and the conditions that the caller verified before calling the function may no longer be true.h](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hhhjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubjd)}(hhh]ji)}(h``struct worker *worker`` self h](jo)}(h``struct worker *worker``h]j)}(hjlh]hstruct worker *worker}(hhhjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjfubj)}(hhh]h)}(hselfh]hself}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjcubah}(h]h ]h"]h$]h&]uh1jchjGubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubh)}(hAssume the manager role and manage the worker pool **worker** belongs to. At any given time, there can be only zero or one manager per pool. The exclusion is handled automatically by this function.h](h3Assume the manager role and manage the worker pool }(h3Assume the manager role and manage the worker pool hjhhhNhNubj)}(h **worker**h]hworker}(hhhjƜhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh belongs to. At any given time, there can be only zero or one manager per pool. The exclusion is handled automatically by this function.}(h belongs to. At any given time, there can be only zero or one manager per pool. The exclusion is handled automatically by this function.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubh)}(hThe caller can safely start processing works on false return. On true return, it's guaranteed that need_to_create_worker() is false and may_start_working() is true.h]hThe caller can safely start processing works on false return. On true return, it’s guaranteed that need_to_create_worker() is false and may_start_working() is true.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubh)}(horaw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times. Does GFP_KERNEL allocations.h]horaw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times. Does GFP_KERNEL allocations.}(hj hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubh)}(h``false`` if the pool doesn't need management and the caller can safely start processing works, ``true`` if management function was performed and the conditions that the caller verified before calling the function may no longer be true.h](j)}(h ``false``h]hfalse}(hhhj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubhY if the pool doesn’t need management and the caller can safely start processing works, }(hW if the pool doesn't need management and the caller can safely start processing works, hj.hhhNhNubj)}(h``true``h]htrue}(hhhjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh if management function was performed and the conditions that the caller verified before calling the function may no longer be true.}(h if management function was performed and the conditions that the caller verified before calling the function may no longer be true.hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]process_one_work (C function)c.process_one_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hGvoid process_one_work (struct worker *worker, struct work_struct *work)h]jm)}(hFvoid process_one_work(struct worker *worker, struct work_struct *work)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj{hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM. ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhjhM. ubj)}(hprocess_one_workh]j)}(hprocess_one_workh]hprocess_one_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhj{hhhjhM. ubj)}(h1(struct worker *worker, struct work_struct *work)h](j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjɝhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkerh]hworker}(hhhjڝhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjםubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjܝmodnameN classnameNjj)}j]j)}jjsbc.process_one_workasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkerh]hworker}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj*ubj)}(h h]h }(hhhj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjNmodnameN classnameNjj)}j]jc.process_one_workasbuh1hhj*ubj)}(h h]h }(hhhjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hjdh]h*}(hhhjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hworkh]hwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhj{hhhjhM. ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjwhhhjhM. ubah}(h]jrah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM: hjthhubj)}(hhh]h)}(hprocess single workh]hprocess single work}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM- hjhhubah}(h]h ]h"]h$]h&]uh1jhjthhhjhM. ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjȞjjȞjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct worker *worker`` self ``struct work_struct *work`` work to process **Description** Process **work**. This function contains all the logics necessary to process a single work including synchronization against and interaction with other workers on the same cpu, queueing and flushing. As long as context requirement is met, any worker can call this function to process a work. **Context** raw_spin_lock_irq(pool->lock) which is released and regrabbed.h](h)}(h**Parameters**h]j)}(hjҞh]h Parameters}(hhhjԞhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjОubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM1 hj̞ubjd)}(hhh](ji)}(h``struct worker *worker`` self h](jo)}(h``struct worker *worker``h]j)}(hjh]hstruct worker *worker}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM. hjubj)}(hhh]h)}(hselfh]hself}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM. hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM. hjubji)}(h-``struct work_struct *work`` work to process h](jo)}(h``struct work_struct *work``h]j)}(hj*h]hstruct work_struct *work}(hhhj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/ hj$ubj)}(hhh]h)}(hwork to processh]hwork to process}(hjEhjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hM/ hj@ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhhj?hM/ hjubeh}(h]h ]h"]h$]h&]uh1jchj̞ubh)}(h**Description**h]j)}(hjeh]h Description}(hhhjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM1 hj̞ubh)}(hX%Process **work**. This function contains all the logics necessary to process a single work including synchronization against and interaction with other workers on the same cpu, queueing and flushing. As long as context requirement is met, any worker can call this function to process a work.h](hProcess }(hProcess hj{hhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubhX. This function contains all the logics necessary to process a single work including synchronization against and interaction with other workers on the same cpu, queueing and flushing. As long as context requirement is met, any worker can call this function to process a work.}(hX. This function contains all the logics necessary to process a single work including synchronization against and interaction with other workers on the same cpu, queueing and flushing. As long as context requirement is met, any worker can call this function to process a work.hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM1 hj̞ubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM7 hj̞ubh)}(h>raw_spin_lock_irq(pool->lock) which is released and regrabbed.h]h>raw_spin_lock_irq(pool->lock) which is released and regrabbed.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM9 hj̞ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]$process_scheduled_works (C function)c.process_scheduled_workshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4void process_scheduled_works (struct worker *worker)h]jm)}(h3void process_scheduled_works(struct worker *worker)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubj)}(hprocess_scheduled_worksh]j)}(hprocess_scheduled_worksh]hprocess_scheduled_works}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM ubj)}(h(struct worker *worker)h]j)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkerh]hworker}(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjBmodnameN classnameNjj)}j]j)}jjsbc.process_scheduled_worksasbuh1hhjubj)}(h h]h }(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkerh]hworker}(hhhj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjݟhhhjhM ubah}(h]j؟ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjڟhhubj)}(hhh]h)}(hprocess scheduled worksh]hprocess scheduled works}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjڟhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hXS**Parameters** ``struct worker *worker`` self **Description** Process all scheduled works. Please note that the scheduled list may change while processing a work, so this function repeatedly fetches a work from the top and executes it. **Context** raw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times.h](h)}(h**Parameters**h]j)}(hjȠh]h Parameters}(hhhjʠhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƠubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj ubjd)}(hhh]ji)}(h``struct worker *worker`` self h](jo)}(h``struct worker *worker``h]j)}(hjh]hstruct worker *worker}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(hselfh]hself}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjޠubah}(h]h ]h"]h$]h&]uh1jchj ubh)}(h**Description**h]j)}(hj"h]h Description}(hhhj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj ubh)}(hProcess all scheduled works. Please note that the scheduled list may change while processing a work, so this function repeatedly fetches a work from the top and executes it.h]hProcess all scheduled works. Please note that the scheduled list may change while processing a work, so this function repeatedly fetches a work from the top and executes it.}(hj:hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj ubh)}(h **Context**h]j)}(hjIh]hContext}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj ubh)}(hQraw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times.h]hQraw_spin_lock_irq(pool->lock) which may be released and regrabbed multiple times.}(hjahj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]worker_thread (C function)c.worker_threadhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h"int worker_thread (void *__worker)h]jm)}(h!int worker_thread(void *__worker)h](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubj)}(h worker_threadh]j)}(h worker_threadh]h worker_thread}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM ubj)}(h(void *__worker)h]j)}(hvoid *__workerh](j0)}(hvoidh]hvoid}(hhhjˡhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjǡubj)}(h h]h }(hhhj١hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǡubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǡubj)}(h__workerh]h__worker}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǡubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjáubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubj)}(hhh]h)}(hthe worker thread functionh]hthe worker thread function}(hj!hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj7jj7juh1jahhhj?hNhNubj)}(hX**Parameters** ``void *__worker`` self **Description** The worker thread function. All workers belong to a worker_pool - either a per-cpu one or dynamic unbound one. These workers process all work items regardless of their specific target workqueue. The only exception is work items which belong to workqueues with a rescuer which will be explained in rescuer_thread(). **Return** 0h](h)}(h**Parameters**h]j)}(hjAh]h Parameters}(hhhjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj;ubjd)}(hhh]ji)}(h``void *__worker`` self h](jo)}(h``void *__worker``h]j)}(hj`h]hvoid *__worker}(hhhjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjZubj)}(hhh]h)}(hselfh]hself}(hj{hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuhM hjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhhjuhM hjWubah}(h]h ]h"]h$]h&]uh1jchj;ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj;ubh)}(hX=The worker thread function. All workers belong to a worker_pool - either a per-cpu one or dynamic unbound one. These workers process all work items regardless of their specific target workqueue. The only exception is work items which belong to workqueues with a rescuer which will be explained in rescuer_thread().h]hX=The worker thread function. All workers belong to a worker_pool - either a per-cpu one or dynamic unbound one. These workers process all work items regardless of their specific target workqueue. The only exception is work items which belong to workqueues with a rescuer which will be explained in rescuer_thread().}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj;ubh)}(h **Return**h]j)}(hj¢h]hReturn}(hhhjĢhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj;ubh)}(hjDth]h0}(hjDthjآhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]rescuer_thread (C function)c.rescuer_threadhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h$int rescuer_thread (void *__rescuer)h]jm)}(h#int rescuer_thread(void *__rescuer)h](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMV ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMV ubj)}(hrescuer_threadh]j)}(hrescuer_threadh]hrescuer_thread}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMV ubj)}(h(void *__rescuer)h]j)}(hvoid *__rescuerh](j0)}(hvoidh]hvoid}(hhhjChhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj?ubj)}(h h]h }(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hjdh]h*}(hhhj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(h __rescuerh]h __rescuer}(hhhjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj;ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMV ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMV ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMi hjhhubj)}(hhh]h)}(hthe rescuer thread functionh]hthe rescuer thread function}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMU hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMV ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``void *__rescuer`` self **Description** Workqueue rescuer thread function. There's one rescuer for each workqueue which has WQ_MEM_RECLAIM set. Regular work processing on a pool may block trying to create a new worker which uses GFP_KERNEL allocation which has slight chance of developing into deadlock if some works currently on the same queue need to be processed to satisfy the GFP_KERNEL allocation. This is the problem rescuer solves. When such condition is possible, the pool summons rescuers of all workqueues which have works queued on the pool and let them process those works so that forward progress can be guaranteed. This should happen rarely. **Return** 0h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMY hjubjd)}(hhh]ji)}(h``void *__rescuer`` self h](jo)}(h``void *__rescuer``h]j)}(hjأh]hvoid *__rescuer}(hhhjڣhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj֣ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMV hjңubj)}(hhh]h)}(hselfh]hself}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMV hjubah}(h]h ]h"]h$]h&]uh1jhjңubeh}(h]h ]h"]h$]h&]uh1jhhjhMV hjϣubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMX hjubh)}(hhWorkqueue rescuer thread function. There's one rescuer for each workqueue which has WQ_MEM_RECLAIM set.h]hjWorkqueue rescuer thread function. There’s one rescuer for each workqueue which has WQ_MEM_RECLAIM set.}(hj+hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMX hjubh)}(hX(Regular work processing on a pool may block trying to create a new worker which uses GFP_KERNEL allocation which has slight chance of developing into deadlock if some works currently on the same queue need to be processed to satisfy the GFP_KERNEL allocation. This is the problem rescuer solves.h]hX(Regular work processing on a pool may block trying to create a new worker which uses GFP_KERNEL allocation which has slight chance of developing into deadlock if some works currently on the same queue need to be processed to satisfy the GFP_KERNEL allocation. This is the problem rescuer solves.}(hj:hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM[ hjubh)}(hWhen such condition is possible, the pool summons rescuers of all workqueues which have works queued on the pool and let them process those works so that forward progress can be guaranteed.h]hWhen such condition is possible, the pool summons rescuers of all workqueues which have works queued on the pool and let them process those works so that forward progress can be guaranteed.}(hjIhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMa hjubh)}(hThis should happen rarely.h]hThis should happen rarely.}(hjXhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMe hjubh)}(h **Return**h]j)}(hjgh]hReturn}(hhhjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMg hjubh)}(hjDth]h0}(hjDthj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMg hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]#check_flush_dependency (C function)c.check_flush_dependencyhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(havoid check_flush_dependency (struct workqueue_struct *target_wq, struct work_struct *target_work)h]jm)}(h`void check_flush_dependency(struct workqueue_struct *target_wq, struct work_struct *target_work)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMcubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMcubj)}(hcheck_flush_dependencyh]j)}(hcheck_flush_dependencyh]hcheck_flush_dependency}(hhhj̤hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȤubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMcubj)}(hE(struct workqueue_struct *target_wq, struct work_struct *target_work)h](j)}(h"struct workqueue_struct *target_wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjΤsbc.check_flush_dependencyasbuh1hhjubj)}(h h]h }(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h target_wqh]h target_wq}(hhhjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct work_struct *target_workh](js)}(hjvh]hstruct}(hhhjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjVubj)}(h h]h }(hhhjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjzmodnameN classnameNjj)}j]j"c.check_flush_dependencyasbuh1hhjVubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(h target_workh]h target_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMcubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMcubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMlhjhhubj)}(hhh]h)}(h!check for flush dependency sanityh]h!check for flush dependency sanity}(hjޥhjܥhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbhj٥hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMcubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *target_wq`` workqueue being flushed ``struct work_struct *target_work`` work item being flushed (NULL for workqueue flushes) **Description** ``current`` is trying to flush the whole **target_wq** or **target_work** on it. If **target_wq** doesn't have ``WQ_MEM_RECLAIM``, verify that ``current`` is not reclaiming memory or running on a workqueue which doesn't have ``WQ_MEM_RECLAIM`` as that can break forward-progress guarantee leading to a deadlock.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMfhjubjd)}(hhh](ji)}(h?``struct workqueue_struct *target_wq`` workqueue being flushed h](jo)}(h&``struct workqueue_struct *target_wq``h]j)}(hjh]h"struct workqueue_struct *target_wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMchjubj)}(hhh]h)}(hworkqueue being flushedh]hworkqueue being flushed}(hj8hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMchj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj2hMchjubji)}(hY``struct work_struct *target_work`` work item being flushed (NULL for workqueue flushes) h](jo)}(h#``struct work_struct *target_work``h]j)}(hjVh]hstruct work_struct *target_work}(hhhjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdhjPubj)}(hhh]h)}(h4work item being flushed (NULL for workqueue flushes)h]h4work item being flushed (NULL for workqueue flushes)}(hjqhjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhMdhjlubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhhjkhMdhjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMfhjubh)}(hX7``current`` is trying to flush the whole **target_wq** or **target_work** on it. If **target_wq** doesn't have ``WQ_MEM_RECLAIM``, verify that ``current`` is not reclaiming memory or running on a workqueue which doesn't have ``WQ_MEM_RECLAIM`` as that can break forward-progress guarantee leading to a deadlock.h](j)}(h ``current``h]hcurrent}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is trying to flush the whole }(h is trying to flush the whole hjhhhNhNubj)}(h **target_wq**h]h target_wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or }(h or hjhhhNhNubj)}(h**target_work**h]h target_work}(hhhjѦhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on it. If }(h on it. If hjhhhNhNubj)}(h **target_wq**h]h target_wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh doesn’t have }(h doesn't have hjhhhNhNubj)}(h``WQ_MEM_RECLAIM``h]hWQ_MEM_RECLAIM}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, verify that }(h, verify that hjhhhNhNubj)}(h ``current``h]hcurrent}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhI is not reclaiming memory or running on a workqueue which doesn’t have }(hG is not reclaiming memory or running on a workqueue which doesn't have hjhhhNhNubj)}(h``WQ_MEM_RECLAIM``h]hWQ_MEM_RECLAIM}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhD as that can break forward-progress guarantee leading to a deadlock.}(hD as that can break forward-progress guarantee leading to a deadlock.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMfhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]insert_wq_barrier (C function)c.insert_wq_barrierhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hvoid insert_wq_barrier (struct pool_workqueue *pwq, struct wq_barrier *barr, struct work_struct *target, struct worker *worker)h]jm)}(h~void insert_wq_barrier(struct pool_workqueue *pwq, struct wq_barrier *barr, struct work_struct *target, struct worker *worker)h](j0)}(hvoidh]hvoid}(hhhjWhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjShhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjShhhjehMubj)}(hinsert_wq_barrierh]j)}(hinsert_wq_barrierh]hinsert_wq_barrier}(hhhjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1jhjShhhjehMubj)}(hh(struct pool_workqueue *pwq, struct wq_barrier *barr, struct work_struct *target, struct worker *worker)h](j)}(hstruct pool_workqueue *pwqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpool_workqueueh]hpool_workqueue}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjzsbc.insert_wq_barrierasbuh1hhjubj)}(h h]h }(hhhjҧhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpwqh]hpwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct wq_barrier *barrh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h wq_barrierh]h wq_barrier}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj&modnameN classnameNjj)}j]jΧc.insert_wq_barrierasbuh1hhjubj)}(h h]h }(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbarrh]hbarr}(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct work_struct *targeth](js)}(hjvh]hstruct}(hhhjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjrubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jΧc.insert_wq_barrierasbuh1hhjrubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(htargeth]htarget}(hhhjͨhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct worker *workerh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkerh]hworker}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jΧc.insert_wq_barrierasbuh1hhjubj)}(h h]h }(hhhj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkerh]hworker}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjShhhjehMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjOhhhjehMubah}(h]jJah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjLhhubj)}(hhh]h)}(hinsert a barrier workh]hinsert a barrier work}(hjjhjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjehhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjehMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct pool_workqueue *pwq`` pwq to insert barrier into ``struct wq_barrier *barr`` wq_barrier to insert ``struct work_struct *target`` target work to attach **barr** to ``struct worker *worker`` worker currently executing **target**, NULL if **target** is not executing **Description** **barr** is linked to **target** such that **barr** is completed only after **target** finishes execution. Please note that the ordering guarantee is observed only with respect to **target** and on the local cpu. Currently, a queued barrier can't be canceled. This is because try_to_grab_pending() can't determine whether the work to be grabbed is at the head of the queue and thus can't clear LINKED flag of the previous work while there must be a valid next work after a work with LINKED flag set. Note that when **worker** is non-NULL, **target** may be modified underneath us, so we can't reliably determine pwq from **target**. **Context** raw_spin_lock_irq(pool->lock).h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh](ji)}(h:``struct pool_workqueue *pwq`` pwq to insert barrier into h](jo)}(h``struct pool_workqueue *pwq``h]j)}(hjh]hstruct pool_workqueue *pwq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hpwq to insert barrier intoh]hpwq to insert barrier into}(hjĩhj©hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(h1``struct wq_barrier *barr`` wq_barrier to insert h](jo)}(h``struct wq_barrier *barr``h]j)}(hjh]hstruct wq_barrier *barr}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjܩubj)}(hhh]h)}(hwq_barrier to inserth]hwq_barrier to insert}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjܩubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(hA``struct work_struct *target`` target work to attach **barr** to h](jo)}(h``struct work_struct *target``h]j)}(hjh]hstruct work_struct *target}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h!target work to attach **barr** toh](htarget work to attach }(htarget work to attach hj4hhhNhNubj)}(h**barr**h]hbarr}(hhhj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh to}(h tohj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj0hMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj0hMhjubji)}(he``struct worker *worker`` worker currently executing **target**, NULL if **target** is not executing h](jo)}(h``struct worker *worker``h]j)}(hjhh]hstruct worker *worker}(hhhjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjbubj)}(hhh]h)}(hJworker currently executing **target**, NULL if **target** is not executingh](hworker currently executing }(hworker currently executing hjhhhNhNubj)}(h **target**h]htarget}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh , NULL if }(h , NULL if hjhhhNhNubj)}(h **target**h]htarget}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is not executing}(h is not executinghjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj}hMhj~ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhhj}hMhjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjʪh]h Description}(hhhj̪hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȪubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h**barr** is linked to **target** such that **barr** is completed only after **target** finishes execution. Please note that the ordering guarantee is observed only with respect to **target** and on the local cpu.h](j)}(h**barr**h]hbarr}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is linked to }(h is linked to hjhhhNhNubj)}(h **target**h]htarget}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh such that }(h such that hjhhhNhNubj)}(h**barr**h]hbarr}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is completed only after }(h is completed only after hjhhhNhNubj)}(h **target**h]htarget}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh_ finishes execution. Please note that the ordering guarantee is observed only with respect to }(h_ finishes execution. Please note that the ordering guarantee is observed only with respect to hjhhhNhNubj)}(h **target**h]htarget}(hhhj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and on the local cpu.}(h and on the local cpu.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hXCurrently, a queued barrier can't be canceled. This is because try_to_grab_pending() can't determine whether the work to be grabbed is at the head of the queue and thus can't clear LINKED flag of the previous work while there must be a valid next work after a work with LINKED flag set.h]hX%Currently, a queued barrier can’t be canceled. This is because try_to_grab_pending() can’t determine whether the work to be grabbed is at the head of the queue and thus can’t clear LINKED flag of the previous work while there must be a valid next work after a work with LINKED flag set.}(hjLhjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hNote that when **worker** is non-NULL, **target** may be modified underneath us, so we can't reliably determine pwq from **target**.h](hNote that when }(hNote that when hjYhhhNhNubj)}(h **worker**h]hworker}(hhhjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh is non-NULL, }(h is non-NULL, hjYhhhNhNubj)}(h **target**h]htarget}(hhhjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubhJ may be modified underneath us, so we can’t reliably determine pwq from }(hH may be modified underneath us, so we can't reliably determine pwq from hjYhhhNhNubj)}(h **target**h]htarget}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh.}(hjhjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hraw_spin_lock_irq(pool->lock).h]hraw_spin_lock_irq(pool->lock).}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]&flush_workqueue_prep_pwqs (C function)c.flush_workqueue_prep_pwqshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h]bool flush_workqueue_prep_pwqs (struct workqueue_struct *wq, int flush_color, int work_color)h]jm)}(h\bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq, int flush_color, int work_color)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hflush_workqueue_prep_pwqsh]j)}(hflush_workqueue_prep_pwqsh]hflush_workqueue_prep_pwqs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h>(struct workqueue_struct *wq, int flush_color, int work_color)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj ubj)}(h h]h }(hhhj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjDmodnameN classnameNjj)}j]j)}jj sbc.flush_workqueue_prep_pwqsasbuh1hhj ubj)}(h h]h }(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjdh]h*}(hhhjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hwqh]hwq}(hhhj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hint flush_colorh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h flush_colorh]h flush_color}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hint work_colorh](j0)}(hinth]hint}(hhhjˬhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjǬubj)}(h h]h }(hhhj٬hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǬubj)}(h work_colorh]h work_color}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǬubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]j۫ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjݫhhubj)}(hhh]h)}(h#prepare pwqs for workqueue flushingh]h#prepare pwqs for workqueue flushing}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjݫhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*jj*juh1jahhhj?hNhNubj)}(hXe**Parameters** ``struct workqueue_struct *wq`` workqueue being flushed ``int flush_color`` new flush color, < 0 for no-op ``int work_color`` new work color, < 0 for no-op **Description** Prepare pwqs for workqueue flushing. If **flush_color** is non-negative, flush_color on all pwqs should be -1. If no pwq has in-flight commands at the specified color, all pwq->flush_color's stay at -1 and ``false`` is returned. If any pwq has in flight commands, its pwq->flush_color is set to **flush_color**, **wq->nr_pwqs_to_flush** is updated accordingly, pwq wakeup logic is armed and ``true`` is returned. The caller should have initialized **wq->first_flusher** prior to calling this function with non-negative **flush_color**. If **flush_color** is negative, no flush color update is done and ``false`` is returned. If **work_color** is non-negative, all pwqs should have the same work_color which is previous to **work_color** and all will be advanced to **work_color**. **Context** mutex_lock(wq->mutex). **Return** ``true`` if **flush_color** >= 0 and there's something to flush. ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hj4h]h Parameters}(hhhj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubjd)}(hhh](ji)}(h8``struct workqueue_struct *wq`` workqueue being flushed h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjSh]hstruct workqueue_struct *wq}(hhhjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjMubj)}(hhh]h)}(hworkqueue being flushedh]hworkqueue being flushed}(hjnhjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhMhjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhhjhhMhjJubji)}(h3``int flush_color`` new flush color, < 0 for no-op h](jo)}(h``int flush_color``h]j)}(hjh]hint flush_color}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hnew flush color, < 0 for no-oph]hnew flush color, < 0 for no-op}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjJubji)}(h1``int work_color`` new work color, < 0 for no-op h](jo)}(h``int work_color``h]j)}(hjŭh]hint work_color}(hhhjǭhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjíubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hnew work color, < 0 for no-oph]hnew work color, < 0 for no-op}(hjhjޭhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjڭhMhjۭubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjڭhMhjJubeh}(h]h ]h"]h$]h&]uh1jchj.ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(h$Prepare pwqs for workqueue flushing.h]h$Prepare pwqs for workqueue flushing.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(hXyIf **flush_color** is non-negative, flush_color on all pwqs should be -1. If no pwq has in-flight commands at the specified color, all pwq->flush_color's stay at -1 and ``false`` is returned. If any pwq has in flight commands, its pwq->flush_color is set to **flush_color**, **wq->nr_pwqs_to_flush** is updated accordingly, pwq wakeup logic is armed and ``true`` is returned.h](hIf }(hIf hj%hhhNhNubj)}(h**flush_color**h]h flush_color}(hhhj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh is non-negative, flush_color on all pwqs should be -1. If no pwq has in-flight commands at the specified color, all pwq->flush_color’s stay at -1 and }(h is non-negative, flush_color on all pwqs should be -1. If no pwq has in-flight commands at the specified color, all pwq->flush_color's stay at -1 and hj%hhhNhNubj)}(h ``false``h]hfalse}(hhhjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubhQ is returned. If any pwq has in flight commands, its pwq->flush_color is set to }(hQ is returned. If any pwq has in flight commands, its pwq->flush_color is set to hj%hhhNhNubj)}(h**flush_color**h]h flush_color}(hhhjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh, }(h, hj%hhhNhNubj)}(h**wq->nr_pwqs_to_flush**h]hwq->nr_pwqs_to_flush}(hhhjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh7 is updated accordingly, pwq wakeup logic is armed and }(h7 is updated accordingly, pwq wakeup logic is armed and hj%hhhNhNubj)}(h``true``h]htrue}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh is returned.}(h is returned.hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(hThe caller should have initialized **wq->first_flusher** prior to calling this function with non-negative **flush_color**. If **flush_color** is negative, no flush color update is done and ``false`` is returned.h](h#The caller should have initialized }(h#The caller should have initialized hjhhhNhNubj)}(h**wq->first_flusher**h]hwq->first_flusher}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 prior to calling this function with non-negative }(h2 prior to calling this function with non-negative hjhhhNhNubj)}(h**flush_color**h]h flush_color}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. If }(h. If hjhhhNhNubj)}(h**flush_color**h]h flush_color}(hhhjîhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh0 is negative, no flush color update is done and }(h0 is negative, no flush color update is done and hjhhhNhNubj)}(h ``false``h]hfalse}(hhhj֮hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is returned.}(h is returned.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(hIf **work_color** is non-negative, all pwqs should have the same work_color which is previous to **work_color** and all will be advanced to **work_color**.h](hIf }(hIf hjhhhNhNubj)}(h**work_color**h]h work_color}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhP is non-negative, all pwqs should have the same work_color which is previous to }(hP is non-negative, all pwqs should have the same work_color which is previous to hjhhhNhNubj)}(h**work_color**h]h work_color}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and all will be advanced to }(h and all will be advanced to hjhhhNhNubj)}(h**work_color**h]h work_color}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(h **Context**h]j)}(hj:h]hContext}(hhhj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(hmutex_lock(wq->mutex).h]hmutex_lock(wq->mutex).}(hjRhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(h **Return**h]j)}(hjah]hReturn}(hhhjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubh)}(hV``true`` if **flush_color** >= 0 and there's something to flush. ``false`` otherwise.h](j)}(h``true``h]htrue}(hhhj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh if }(h if hjwhhhNhNubj)}(h**flush_color**h]h flush_color}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh) >= 0 and there’s something to flush. }(h' >= 0 and there's something to flush. hjwhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubh otherwise.}(h otherwise.hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]__flush_workqueue (C function)c.__flush_workqueuehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4void __flush_workqueue (struct workqueue_struct *wq)h]jm)}(h3void __flush_workqueue(struct workqueue_struct *wq)h](j0)}(hvoidh]hvoid}(hhhjۯhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjׯhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM@ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjׯhhhjhM@ubj)}(h__flush_workqueueh]j)}(h__flush_workqueueh]h__flush_workqueue}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjׯhhhjhM@ubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj8modnameN classnameNjj)}j]j)}jjsbc.__flush_workqueueasbuh1hhjubj)}(h h]h }(hhhjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjׯhhhjhM@ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjӯhhhjhM@ubah}(h]jίah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMEhjЯhhubj)}(hhh]h)}(h5ensure that any scheduled work has run to completion.h]h5ensure that any scheduled work has run to completion.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM?hjhhubah}(h]h ]h"]h$]h&]uh1jhjЯhhhjhM@ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct workqueue_struct *wq`` workqueue to flush **Description** This function sleeps until all work items which were queued on entry have finished execution, but it is not livelocked by new incoming ones.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMChjubjd)}(hhh]ji)}(h3``struct workqueue_struct *wq`` workqueue to flush h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjݰh]hstruct workqueue_struct *wq}(hhhj߰hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj۰ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM@hjװubj)}(hhh]h)}(hworkqueue to flushh]hworkqueue to flush}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM@hjubah}(h]h ]h"]h$]h&]uh1jhjװubeh}(h]h ]h"]h$]h&]uh1jhhjhM@hj԰ubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMBhjubh)}(hThis function sleeps until all work items which were queued on entry have finished execution, but it is not livelocked by new incoming ones.h]hThis function sleeps until all work items which were queued on entry have finished execution, but it is not livelocked by new incoming ones.}(hj0hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMBhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]drain_workqueue (C function)c.drain_workqueuehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h2void drain_workqueue (struct workqueue_struct *wq)h]jm)}(h1void drain_workqueue(struct workqueue_struct *wq)h](j0)}(hvoidh]hvoid}(hhhj]hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjYhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhhjkhMubj)}(hdrain_workqueueh]j)}(hdrain_workqueueh]hdrain_workqueue}(hhhj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ](jjeh"]h$]h&]jjuh1jhjYhhhjkhMubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.drain_workqueueasbuh1hhjubj)}(h h]h }(hhhjرhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjYhhhjkhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjUhhhjkhMubah}(h]jPah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjRhhubj)}(hhh]h)}(hdrain a workqueueh]hdrain a workqueue}(hj hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjRhhhjkhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj6jj6juh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` workqueue to drain **Description** Wait until the workqueue becomes empty. While draining is in progress, only chain queueing is allowed. IOW, only currently pending or running work items on **wq** can queue further work items on it. **wq** is flushed repeatedly until it becomes empty. The number of flushing is determined by the depth of chaining and should be relatively short. Whine if it takes too long.h](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hhhjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:ubjd)}(hhh]ji)}(h3``struct workqueue_struct *wq`` workqueue to drain h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj_h]hstruct workqueue_struct *wq}(hhhjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjYubj)}(hhh]h)}(hworkqueue to drainh]hworkqueue to drain}(hjzhjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthMhjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhhjthMhjVubah}(h]h ]h"]h$]h&]uh1jchj:ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:ubh)}(hXzWait until the workqueue becomes empty. While draining is in progress, only chain queueing is allowed. IOW, only currently pending or running work items on **wq** can queue further work items on it. **wq** is flushed repeatedly until it becomes empty. The number of flushing is determined by the depth of chaining and should be relatively short. Whine if it takes too long.h](hWait until the workqueue becomes empty. While draining is in progress, only chain queueing is allowed. IOW, only currently pending or running work items on }(hWait until the workqueue becomes empty. While draining is in progress, only chain queueing is allowed. IOW, only currently pending or running work items on hjhhhNhNubj)}(h**wq**h]hwq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh& can queue further work items on it. }(h& can queue further work items on it. hjhhhNhNubj)}(h**wq**h]hwq}(hhhj̲hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is flushed repeatedly until it becomes empty. The number of flushing is determined by the depth of chaining and should be relatively short. Whine if it takes too long.}(h is flushed repeatedly until it becomes empty. The number of flushing is determined by the depth of chaining and should be relatively short. Whine if it takes too long.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]flush_work (C function) c.flush_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h*bool flush_work (struct work_struct *work)h]jm)}(h)bool flush_work(struct work_struct *work)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM|ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM|ubj)}(h flush_workh]j)}(h flush_workh]h flush_work}(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM|ubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj>ubj)}(h h]h }(hhhjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjbmodnameN classnameNjj)}j]j)}jj(sb c.flush_workasbuh1hhj>ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hworkh]hwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM|ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM|ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h>wait for a work to finish executing the last queueing instanceh]h>wait for a work to finish executing the last queueing instance}(hjȳhjƳhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM{hjóhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM|ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj޳jj޳juh1jahhhj?hNhNubj)}(hXN**Parameters** ``struct work_struct *work`` the work to flush **Description** Wait until **work** has finished execution. **work** is guaranteed to be idle on return if it hasn't been requeued since flush started. **Return** ``true`` if flush_work() waited for the work to finish execution, ``false`` if it was already idle.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h/``struct work_struct *work`` the work to flush h](jo)}(h``struct work_struct *work``h]j)}(hjh]hstruct work_struct *work}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM|hjubj)}(hhh]h)}(hthe work to flushh]hthe work to flush}(hj"hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM|hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM|hjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjBh]h Description}(hhhjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM~hjubh)}(hWait until **work** has finished execution. **work** is guaranteed to be idle on return if it hasn't been requeued since flush started.h](h Wait until }(h Wait until hjXhhhNhNubj)}(h**work**h]hwork}(hhhjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh has finished execution. }(h has finished execution. hjXhhhNhNubj)}(h**work**h]hwork}(hhhjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubhU is guaranteed to be idle on return if it hasn’t been requeued since flush started.}(hS is guaranteed to be idle on return if it hasn't been requeued since flush started.hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM~hjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hc``true`` if flush_work() waited for the work to finish execution, ``false`` if it was already idle.h](j)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh: if flush_work() waited for the work to finish execution, }(h: if flush_work() waited for the work to finish execution, hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if it was already idle.}(h if it was already idle.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]flush_delayed_work (C function)c.flush_delayed_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4bool flush_delayed_work (struct delayed_work *dwork)h]jm)}(h3bool flush_delayed_work(struct delayed_work *dwork)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hflush_delayed_workh]j)}(hflush_delayed_workh]hflush_delayed_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h(struct delayed_work *dwork)h]j)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj/ubj)}(h h]h }(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjSmodnameN classnameNjj)}j]j)}jjsbc.flush_delayed_workasbuh1hhj/ubj)}(h h]h }(hhhjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hdworkh]hdwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj+ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h6wait for a dwork to finish executing the last queueingh]h6wait for a dwork to finish executing the last queueing}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjϵjjϵjuh1jahhhj?hNhNubj)}(hX|**Parameters** ``struct delayed_work *dwork`` the delayed work to flush **Description** Delayed timer is cancelled and the pending work is queued for immediate execution. Like flush_work(), this function only considers the last queueing instance of **dwork**. **Return** ``true`` if flush_work() waited for the work to finish execution, ``false`` if it was already idle.h](h)}(h**Parameters**h]j)}(hjٵh]h Parameters}(hhhj۵hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj׵ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjӵubjd)}(hhh]ji)}(h9``struct delayed_work *dwork`` the delayed work to flush h](jo)}(h``struct delayed_work *dwork``h]j)}(hjh]hstruct delayed_work *dwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hthe delayed work to flushh]hthe delayed work to flush}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj hMhjubah}(h]h ]h"]h$]h&]uh1jchjӵubh)}(h**Description**h]j)}(hj3h]h Description}(hhhj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjӵubh)}(hDelayed timer is cancelled and the pending work is queued for immediate execution. Like flush_work(), this function only considers the last queueing instance of **dwork**.h](hDelayed timer is cancelled and the pending work is queued for immediate execution. Like flush_work(), this function only considers the last queueing instance of }(hDelayed timer is cancelled and the pending work is queued for immediate execution. Like flush_work(), this function only considers the last queueing instance of hjIhhhNhNubj)}(h **dwork**h]hdwork}(hhhjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh.}(hjhjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjӵubh)}(h **Return**h]j)}(hjmh]hReturn}(hhhjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjӵubh)}(hc``true`` if flush_work() waited for the work to finish execution, ``false`` if it was already idle.h](j)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh: if flush_work() waited for the work to finish execution, }(h: if flush_work() waited for the work to finish execution, hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if it was already idle.}(h if it was already idle.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjӵubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]flush_rcu_work (C function)c.flush_rcu_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h,bool flush_rcu_work (struct rcu_work *rwork)h]jm)}(h+bool flush_rcu_work(struct rcu_work *rwork)h](j0)}(hj h]hbool}(hhhjԶhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjжhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjжhhhjhMubj)}(hflush_rcu_workh]j)}(hflush_rcu_workh]hflush_rcu_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjжhhhjhMubj)}(h(struct rcu_work *rwork)h]j)}(hstruct rcu_work *rworkh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hrcu_workh]hrcu_work}(hhhj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj0modnameN classnameNjj)}j]j)}jjsbc.flush_rcu_workasbuh1hhj ubj)}(h h]h }(hhhjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjdh]h*}(hhhj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hrworkh]hrwork}(hhhjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjжhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj̶hhhjhMubah}(h]jǶah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjɶhhubj)}(hhh]h)}(h6wait for a rwork to finish executing the last queueingh]h6wait for a rwork to finish executing the last queueing}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjɶhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct rcu_work *rwork`` the rcu work to flush **Return** ``true`` if flush_rcu_work() waited for the work to finish execution, ``false`` if it was already idle.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h1``struct rcu_work *rwork`` the rcu work to flush h](jo)}(h``struct rcu_work *rwork``h]j)}(hjշh]hstruct rcu_work *rwork}(hhhj׷hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӷubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjϷubj)}(hhh]h)}(hthe rcu work to flushh]hthe rcu work to flush}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjϷubeh}(h]h ]h"]h$]h&]uh1jhhjhMhj̷ubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hg``true`` if flush_rcu_work() waited for the work to finish execution, ``false`` if it was already idle.h](j)}(h``true``h]htrue}(hhhj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubh> if flush_rcu_work() waited for the work to finish execution, }(h> if flush_rcu_work() waited for the work to finish execution, hj&hhhNhNubj)}(h ``false``h]hfalse}(hhhj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubh if it was already idle.}(h if it was already idle.hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]cancel_work_sync (C function)c.cancel_work_synchNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h0bool cancel_work_sync (struct work_struct *work)h]jm)}(h/bool cancel_work_sync(struct work_struct *work)h](j0)}(hj h]hbool}(hhhjwhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjshhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjshhhjhMubj)}(hcancel_work_synch]j)}(hcancel_work_synch]hcancel_work_sync}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjshhhjhMubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjѸhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjθubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjӸmodnameN classnameNjj)}j]j)}jjsbc.cancel_work_syncasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkh]hwork}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjshhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjohhhjhMubah}(h]jjah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjlhhubj)}(hhh]h)}(h'cancel a work and wait for it to finishh]h'cancel a work and wait for it to finish}(hj9hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj4hhubah}(h]h ]h"]h$]h&]uh1jhjlhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct work_struct *work`` the work to cancel **Description** Cancel **work** and wait for its execution to finish. This function can be used even if the work re-queues itself or migrates to another workqueue. On return from this function, **work** is guaranteed to be not pending or executing on any CPU as long as there aren't racing enqueues. cancel_work_sync(:c:type:`delayed_work->work `) must not be used for delayed_work's. Use cancel_delayed_work_sync() instead. Must be called from a sleepable context if **work** was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if **work** was last queued on a BH workqueue. Returns ``true`` if **work** was pending, ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hhhj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubjd)}(hhh]ji)}(h0``struct work_struct *work`` the work to cancel h](jo)}(h``struct work_struct *work``h]j)}(hjxh]hstruct work_struct *work}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjrubj)}(hhh]h)}(hthe work to cancelh]hthe work to cancel}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjoubah}(h]h ]h"]h$]h&]uh1jchjSubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubh)}(hXCancel **work** and wait for its execution to finish. This function can be used even if the work re-queues itself or migrates to another workqueue. On return from this function, **work** is guaranteed to be not pending or executing on any CPU as long as there aren't racing enqueues.h](hCancel }(hCancel hjɹhhhNhNubj)}(h**work**h]hwork}(hhhjҹhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɹubh and wait for its execution to finish. This function can be used even if the work re-queues itself or migrates to another workqueue. On return from this function, }(h and wait for its execution to finish. This function can be used even if the work re-queues itself or migrates to another workqueue. On return from this function, hjɹhhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɹubhc is guaranteed to be not pending or executing on any CPU as long as there aren’t racing enqueues.}(ha is guaranteed to be not pending or executing on any CPU as long as there aren't racing enqueues.hjɹhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubh)}(hcancel_work_sync(:c:type:`delayed_work->work `) must not be used for delayed_work's. Use cancel_delayed_work_sync() instead.h](hcancel_work_sync(}(hcancel_work_sync(hjhhhNhNubh)}(h+:c:type:`delayed_work->work `h]j)}(hj h]hdelayed_work->work}(hhhj hhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdoccore-api/workqueue refdomainjreftypetype refexplicitrefwarn c:parent_keyj)}j]sb reftarget delayed_workuh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubhP) must not be used for delayed_work’s. Use cancel_delayed_work_sync() instead.}(hN) must not be used for delayed_work's. Use cancel_delayed_work_sync() instead.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj.hMhjSubh)}(hMust be called from a sleepable context if **work** was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if **work** was last queued on a BH workqueue.h](h+Must be called from a sleepable context if }(h+Must be called from a sleepable context if hj:hhhNhNubj)}(h**work**h]hwork}(hhhjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubhl was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if }(hl was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if hj:hhhNhNubj)}(h**work**h]hwork}(hhhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh# was last queued on a BH workqueue.}(h# was last queued on a BH workqueue.hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjSubh)}(h>Returns ``true`` if **work** was pending, ``false`` otherwise.h](hReturns }(hReturns hjphhhNhNubj)}(h``true``h]htrue}(hhhjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubh if }(h if hjphhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubh was pending, }(h was pending, hjphhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubh otherwise.}(h otherwise.hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] cancel_delayed_work (C function)c.cancel_delayed_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h5bool cancel_delayed_work (struct delayed_work *dwork)h]jm)}(h4bool cancel_delayed_work(struct delayed_work *dwork)h](j0)}(hj h]hbool}(hhhjٺhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjպhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjպhhhjhMubj)}(hcancel_delayed_workh]j)}(hcancel_delayed_workh]hcancel_delayed_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjպhhhjhMubj)}(h(struct delayed_work *dwork)h]j)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubaXh}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj5modnameN classnameNjj)}j]j)}jjsbc.cancel_delayed_workasbuh1hhjubj)}(h h]h }(hhhjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdworkh]hdwork}(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubah}(h]h ]h"]h$]h&]jjuh1jhjպhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjѺhhhjhMubah}(h]j̺ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM$hjκhhubj)}(hhh]h)}(hcancel a delayed workh]hcancel a delayed work}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjκhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct delayed_work *dwork`` delayed_work to cancel **Description** Kill off a pending delayed_work. This function is safe to call from any context including IRQ handler. **Return** ``true`` if **dwork** was pending and canceled; ``false`` if it wasn't pending. **Note** The work callback function may still be running on return, unless it returns ``true`` and the work doesn't re-arm itself. Explicitly flush or use cancel_delayed_work_sync() to wait on it.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h6``struct delayed_work *dwork`` delayed_work to cancel h](jo)}(h``struct delayed_work *dwork``h]j)}(hjڻh]hstruct delayed_work *dwork}(hhhjܻhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjػubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjԻubj)}(hhh]h)}(hdelayed_work to cancelh]hdelayed_work to cancel}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjԻubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjѻubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h Kill off a pending delayed_work.h]h Kill off a pending delayed_work.}(hj-hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hEThis function is safe to call from any context including IRQ handler.h]hEThis function is safe to call from any context including IRQ handler.}(hj<hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h **Return**h]j)}(hjKh]hReturn}(hhhjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hO``true`` if **dwork** was pending and canceled; ``false`` if it wasn't pending.h](j)}(h``true``h]htrue}(hhhjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh if }(h if hjahhhNhNubj)}(h **dwork**h]hdwork}(hhhjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh was pending and canceled; }(h was pending and canceled; hjahhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh if it wasn’t pending.}(h if it wasn't pending.hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h**Note**h]j)}(hjh]hNote}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hThe work callback function may still be running on return, unless it returns ``true`` and the work doesn't re-arm itself. Explicitly flush or use cancel_delayed_work_sync() to wait on it.h](hMThe work callback function may still be running on return, unless it returns }(hMThe work callback function may still be running on return, unless it returns hjhhhNhNubj)}(h``true``h]htrue}(hhhjƼhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhi and the work doesn’t re-arm itself. Explicitly flush or use cancel_delayed_work_sync() to wait on it.}(hg and the work doesn't re-arm itself. Explicitly flush or use cancel_delayed_work_sync() to wait on it.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]%cancel_delayed_work_sync (C function)c.cancel_delayed_work_synchNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h:bool cancel_delayed_work_sync (struct delayed_work *dwork)h]jm)}(h9bool cancel_delayed_work_sync(struct delayed_work *dwork)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM,ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hM,ubj)}(hcancel_delayed_work_synch]j)}(hcancel_delayed_work_synch]hcancel_delayed_work_sync}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj hM,ubj)}(h(struct delayed_work *dwork)h]j)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj8ubj)}(h h]h }(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj\modnameN classnameNjj)}j]j)}jj"sbc.cancel_delayed_work_syncasbuh1hhj8ubj)}(h h]h }(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hdworkh]hdwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj4ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hM,ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhj hM,ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM3hjhhubj)}(hhh]h)}(h/cancel a delayed work and wait for it to finishh]h/cancel a delayed work and wait for it to finish}(hj½hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM+hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hM,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjؽjjؽjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct delayed_work *dwork`` the delayed work cancel **Description** This is cancel_work_sync() for delayed works. **Return** ``true`` if **dwork** was pending, ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/hjܽubjd)}(hhh]ji)}(h7``struct delayed_work *dwork`` the delayed work cancel h](jo)}(h``struct delayed_work *dwork``h]j)}(hjh]hstruct delayed_work *dwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM,hjubj)}(hhh]h)}(hthe delayed work cancelh]hthe delayed work cancel}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM,hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM,hjubah}(h]h ]h"]h$]h&]uh1jchjܽubh)}(h**Description**h]j)}(hj<h]h Description}(hhhj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM.hjܽubh)}(h-This is cancel_work_sync() for delayed works.h]h-This is cancel_work_sync() for delayed works.}(hjThjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM.hjܽubh)}(h **Return**h]j)}(hjch]hReturn}(hhhjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM0hjܽubh)}(h7``true`` if **dwork** was pending, ``false`` otherwise.h](j)}(h``true``h]htrue}(hhhj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubh if }(h if hjyhhhNhNubj)}(h **dwork**h]hdwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubh was pending, }(h was pending, hjyhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubh otherwise.}(h otherwise.hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM2hjܽubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]disable_work (C function)c.disable_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h,bool disable_work (struct work_struct *work)h]jm)}(h+bool disable_work(struct work_struct *work)h](j0)}(hj h]hbool}(hhhjݾhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjپhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM;ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjپhhhjhM;ubj)}(h disable_workh]j)}(h disable_workh]h disable_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjپhhhjhM;ubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h work_structh]h work_struct}(hhhj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj9modnameN classnameNjj)}j]j)}jjsbc.disable_workasbuh1hhjubj)}(h h]h }(hhhjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkh]hwork}(hhhjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjپhhhjhM;ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjվhhhjhM;ubah}(h]jоah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMEhjҾhhubj)}(hhh]h)}(hDisable and cancel a work itemh]hDisable and cancel a work item}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM:hjhhubah}(h]h ]h"]h$]h&]uh1jhjҾhhhjhM;ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct work_struct *work`` work item to disable **Description** Disable **work** by incrementing its disable count and cancel it if currently pending. As long as the disable count is non-zero, any attempt to queue **work** will fail and return ``false``. The maximum supported disable depth is 2 to the power of ``WORK_OFFQ_DISABLE_BITS``, currently 65536. Can be called from any context. Returns ``true`` if **work** was pending, ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM>hjubjd)}(hhh]ji)}(h2``struct work_struct *work`` work item to disable h](jo)}(h``struct work_struct *work``h]j)}(hj޿h]hstruct work_struct *work}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܿubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM;hjؿubj)}(hhh]h)}(hwork item to disableh]hwork item to disable}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM;hjubah}(h]h ]h"]h$]h&]uh1jhjؿubeh}(h]h ]h"]h$]h&]uh1jhhjhM;hjտubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM=hjubh)}(hX$Disable **work** by incrementing its disable count and cancel it if currently pending. As long as the disable count is non-zero, any attempt to queue **work** will fail and return ``false``. The maximum supported disable depth is 2 to the power of ``WORK_OFFQ_DISABLE_BITS``, currently 65536.h](hDisable }(hDisable hj/hhhNhNubj)}(h**work**h]hwork}(hhhj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh by incrementing its disable count and cancel it if currently pending. As long as the disable count is non-zero, any attempt to queue }(h by incrementing its disable count and cancel it if currently pending. As long as the disable count is non-zero, any attempt to queue hj/hhhNhNubj)}(h**work**h]hwork}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh will fail and return }(h will fail and return hj/hhhNhNubj)}(h ``false``h]hfalse}(hhhj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh;. The maximum supported disable depth is 2 to the power of }(h;. The maximum supported disable depth is 2 to the power of hj/hhhNhNubj)}(h``WORK_OFFQ_DISABLE_BITS``h]hWORK_OFFQ_DISABLE_BITS}(hhhjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh, currently 65536.}(h, currently 65536.hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM=hjubh)}(h^Can be called from any context. Returns ``true`` if **work** was pending, ``false`` otherwise.h](h(Can be called from any context. Returns }(h(Can be called from any context. Returns hjhhhNhNubj)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(h if hjhhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh was pending, }(h was pending, hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise.}(h otherwise.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMBhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]disable_work_sync (C function)c.disable_work_synchNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h1bool disable_work_sync (struct work_struct *work)h]jm)}(h0bool disable_work_sync(struct work_struct *work)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMMubj)}(hdisable_work_synch]j)}(hdisable_work_synch]hdisable_work_sync}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMMubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj,ubj)}(h h]h }(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjPmodnameN classnameNjj)}j]j)}jjsbc.disable_work_syncasbuh1hhj,ubj)}(h h]h }(hhhjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hjdh]h*}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hworkh]hwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj(ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMXhjhhubj)}(hhh]h)}(h%Disable, cancel and drain a work itemh]h%Disable, cancel and drain a work item}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMLhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct work_struct *work`` work item to disable **Description** Similar to disable_work() but also wait for **work** to finish if currently executing. Must be called from a sleepable context if **work** was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if **work** was last queued on a BH workqueue. Returns ``true`` if **work** was pending, ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMPhjubjd)}(hhh]ji)}(h2``struct work_struct *work`` work item to disable h](jo)}(h``struct work_struct *work``h]j)}(hjh]hstruct work_struct *work}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMMhjubj)}(hhh]h)}(hwork item to disableh]hwork item to disable}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj hMMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj0h]h Description}(hhhj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOhjubh)}(hVSimilar to disable_work() but also wait for **work** to finish if currently executing.h](h,Similar to disable_work() but also wait for }(h,Similar to disable_work() but also wait for hjFhhhNhNubj)}(h**work**h]hwork}(hhhjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubh" to finish if currently executing.}(h" to finish if currently executing.hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOhjubh)}(hMust be called from a sleepable context if **work** was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if **work** was last queued on a BH workqueue.h](h+Must be called from a sleepable context if }(h+Must be called from a sleepable context if hjihhhNhNubj)}(h**work**h]hwork}(hhhjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubhl was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if }(hl was last queued on a non-BH workqueue. Can also be called from non-hardirq atomic contexts including BH if hjihhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubh# was last queued on a BH workqueue.}(h# was last queued on a BH workqueue.hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRhjubh)}(h>Returns ``true`` if **work** was pending, ``false`` otherwise.h](hReturns }(hReturns hjhhhNhNubj)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(h if hjhhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh was pending, }(h was pending, hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise.}(h otherwise.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMVhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]enable_work (C function) c.enable_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h+bool enable_work (struct work_struct *work)h]jm)}(h*bool enable_work(struct work_struct *work)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM`ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM`ubj)}(h enable_workh]j)}(h enable_workh]h enable_work}(hhhj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM`ubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj@ubj)}(h h]h }(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjdmodnameN classnameNjj)}j]j)}jj*sb c.enable_workasbuh1hhj@ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hworkh]hwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj<ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM`ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM`ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhhjhhubj)}(hhh]h)}(hEnable a work itemh]hEnable a work item}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM_hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM`ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX8**Parameters** ``struct work_struct *work`` work item to enable **Description** Undo disable_work[_sync]() by decrementing **work**'s disable count. **work** can only be queued if its disable count is 0. Can be called from any context. Returns ``true`` if the disable count reached 0. Otherwise, ``false``.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMchjubjd)}(hhh]ji)}(h1``struct work_struct *work`` work item to enable h](jo)}(h``struct work_struct *work``h]j)}(hj h]hstruct work_struct *work}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM`hjubj)}(hhh]h)}(hwork item to enableh]hwork item to enable}(hj$hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM`hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM`hjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjDh]h Description}(hhhjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbhjubh)}(h{Undo disable_work[_sync]() by decrementing **work**'s disable count. **work** can only be queued if its disable count is 0.h](h+Undo disable_work[_sync]() by decrementing }(h+Undo disable_work[_sync]() by decrementing hjZhhhNhNubj)}(h**work**h]hwork}(hhhjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubh’s disable count. }(h's disable count. hjZhhhNhNubj)}(h**work**h]hwork}(hhhjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubh. can only be queued if its disable count is 0.}(h. can only be queued if its disable count is 0.hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbhjubh)}(hfCan be called from any context. Returns ``true`` if the disable count reached 0. Otherwise, ``false``.h](h(Can be called from any context. Returns }(h(Can be called from any context. Returns hjhhhNhNubj)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, if the disable count reached 0. Otherwise, }(h, if the disable count reached 0. Otherwise, hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!disable_delayed_work (C function)c.disable_delayed_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h6bool disable_delayed_work (struct delayed_work *dwork)h]jm)}(h5bool disable_delayed_work(struct delayed_work *dwork)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM{ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM{ubj)}(hdisable_delayed_workh]j)}(hdisable_delayed_workh]hdisable_delayed_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM{ubj)}(h(struct delayed_work *dwork)h]j)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjAmodnameN classnameNjj)}j]j)}jjsbc.disable_delayed_workasbuh1hhjubj)}(h h]h }(hhhj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdworkh]hdwork}(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM{ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM{ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h&Disable and cancel a delayed work itemh]h&Disable and cancel a delayed work item}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMzhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM{ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct delayed_work *dwork`` delayed work item to disable **Description** disable_work() for delayed work items.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM~hjubjd)}(hhh]ji)}(h<``struct delayed_work *dwork`` delayed work item to disable h](jo)}(h``struct delayed_work *dwork``h]j)}(hjh]hstruct delayed_work *dwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM{hjubj)}(hhh]h)}(hdelayed work item to disableh]hdelayed work item to disable}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM{hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM{hjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj!h]h Description}(hhhj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM}hjubh)}(h&disable_work() for delayed work items.h]h&disable_work() for delayed work items.}(hj9hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM}hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]&disable_delayed_work_sync (C function)c.disable_delayed_work_synchNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h;bool disable_delayed_work_sync (struct delayed_work *dwork)h]jm)}(h:bool disable_delayed_work_sync(struct delayed_work *dwork)h](j0)}(hj h]hbool}(hhhjfhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjbhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbhhhjshMubj)}(hdisable_delayed_work_synch]j)}(hdisable_delayed_work_synch]hdisable_delayed_work_sync}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjbhhhjshMubj)}(h(struct delayed_work *dwork)h]j)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.disable_delayed_work_syncasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdworkh]hdwork}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjbhhhjshMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj^hhhjshMubah}(h]jYah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj[hhubj)}(hhh]h)}(h-Disable, cancel and drain a delayed work itemh]h-Disable, cancel and drain a delayed work item}(hj(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj#hhubah}(h]h ]h"]h$]h&]uh1jhj[hhhjshMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj>jj>juh1jahhhj?hNhNubj)}(h**Parameters** ``struct delayed_work *dwork`` delayed work item to disable **Description** disable_work_sync() for delayed work items.h](h)}(h**Parameters**h]j)}(hjHh]h Parameters}(hhhjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubjd)}(hhh]ji)}(h<``struct delayed_work *dwork`` delayed work item to disable h](jo)}(h``struct delayed_work *dwork``h]j)}(hjgh]hstruct delayed_work *dwork}(hhhjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjaubj)}(hhh]h)}(hdelayed work item to disableh]hdelayed work item to disable}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhhj|hMhj^ubah}(h]h ]h"]h$]h&]uh1jchjBubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubh)}(h+disable_work_sync() for delayed work items.h]h+disable_work_sync() for delayed work items.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] enable_delayed_work (C function)c.enable_delayed_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h5bool enable_delayed_work (struct delayed_work *dwork)h]jm)}(h4bool enable_delayed_work(struct delayed_work *dwork)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(henable_delayed_workh]j)}(henable_delayed_workh]henable_delayed_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h(struct delayed_work *dwork)h]j)}(hstruct delayed_work *dworkh](js)}(hjvh]hstruct}(hhhj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h delayed_workh]h delayed_work}(hhhjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCmodnameN classnameNjj)}j]j)}jj sbc.enable_delayed_workasbuh1hhjubj)}(h h]h }(hhhjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdworkh]hdwork}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(hEnable a delayed work itemh]hEnable a delayed work item}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct delayed_work *dwork`` delayed work item to enable **Description** enable_work() for delayed work items.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h;``struct delayed_work *dwork`` delayed work item to enable h](jo)}(h``struct delayed_work *dwork``h]j)}(hjh]hstruct delayed_work *dwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hdelayed work item to enableh]hdelayed work item to enable}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj#h]h Description}(hhhj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h%enable_work() for delayed work items.h]h%enable_work() for delayed work items.}(hj;hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!schedule_on_each_cpu (C function)c.schedule_on_each_cpuhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h+int schedule_on_each_cpu (work_func_t func)h]jm)}(h*int schedule_on_each_cpu(work_func_t func)h](j0)}(hinth]hint}(hhhjhhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjdhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdhhhjvhMubj)}(hschedule_on_each_cpuh]j)}(hschedule_on_each_cpuh]hschedule_on_each_cpu}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjdhhhjvhMubj)}(h(work_func_t func)h]j)}(hwork_func_t funch](h)}(hhh]j)}(h work_func_th]h work_func_t}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.schedule_on_each_cpuasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfunch]hfunc}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjdhhhjvhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj`hhhjvhMubah}(h]j[ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj]hhubj)}(hhh]h)}(h3execute a function synchronously on each online CPUh]h3execute a function synchronously on each online CPU}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj]hhhjvhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX#**Parameters** ``work_func_t func`` the function to call **Description** schedule_on_each_cpu() executes **func** on each online CPU using the system workqueue and blocks until all CPUs have completed. schedule_on_each_cpu() is very slow. **Return** 0 on success, -errno on failure.h](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hhhj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h*``work_func_t func`` the function to call h](jo)}(h``work_func_t func``h]j)}(hjBh]hwork_func_t func}(hhhjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj<ubj)}(hhh]h)}(hthe function to callh]hthe function to call}(hj]hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhMhjXubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhhjWhMhj9ubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj}h]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hschedule_on_each_cpu() executes **func** on each online CPU using the system workqueue and blocks until all CPUs have completed. schedule_on_each_cpu() is very slow.h](h schedule_on_each_cpu() executes }(h schedule_on_each_cpu() executes hjhhhNhNubj)}(h**func**h]hfunc}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh} on each online CPU using the system workqueue and blocks until all CPUs have completed. schedule_on_each_cpu() is very slow.}(h} on each online CPU using the system workqueue and blocks until all CPUs have completed. schedule_on_each_cpu() is very slow.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h 0 on success, -errno on failure.h]h 0 on success, -errno on failure.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]'execute_in_process_context (C function)c.execute_in_process_contexthNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hHint execute_in_process_context (work_func_t fn, struct execute_work *ew)h]jm)}(hGint execute_in_process_context(work_func_t fn, struct execute_work *ew)h](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubj)}(hexecute_in_process_contexth]j)}(hexecute_in_process_contexth]hexecute_in_process_context}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj hMubj)}(h)(work_func_t fn, struct execute_work *ew)h](j)}(hwork_func_t fnh](h)}(hhh]j)}(h work_func_th]h work_func_t}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj?modnameN classnameNjj)}j]j)}jj sbc.execute_in_process_contextasbuh1hhj6ubj)}(h h]h }(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hfnh]hfn}(hhhjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubj)}(hstruct execute_work *ewh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h execute_workh]h execute_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jYc.execute_in_process_contextasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hewh]hew}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhj hMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h.reliably execute the routine with user contexth]h.reliably execute the routine with user context}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``work_func_t fn`` the function to execute ``struct execute_work *ew`` guaranteed storage for the execute work structure (must be available when the work executes) **Description** Executes the function immediately if process context is available, otherwise schedules the function for delayed execution. **Return** 0 - function was executed 1 - function was scheduled for executionh](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hhhj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj"ubjd)}(hhh](ji)}(h+``work_func_t fn`` the function to execute h](jo)}(h``work_func_t fn``h]j)}(hjGh]hwork_func_t fn}(hhhjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjAubj)}(hhh]h)}(hthe function to executeh]hthe function to execute}(hjbhj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj]ubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhhj\hMhj>ubji)}(hy``struct execute_work *ew`` guaranteed storage for the execute work structure (must be available when the work executes) h](jo)}(h``struct execute_work *ew``h]j)}(hjh]hstruct execute_work *ew}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjzubj)}(hhh]h)}(h\guaranteed storage for the execute work structure (must be available when the work executes)h]h\guaranteed storage for the execute work structure (must be available when the work executes)}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhhjhMhj>ubeh}(h]h ]h"]h$]h&]uh1jchj"ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj"ubh)}(hzExecutes the function immediately if process context is available, otherwise schedules the function for delayed execution.h]hzExecutes the function immediately if process context is available, otherwise schedules the function for delayed execution.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj"ubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj"ubjd)}(hhh]ji)}(hB0 - function was executed 1 - function was scheduled for executionh](jo)}(h0 - function was executedh]h0 - function was executed}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h(1 - function was scheduled for executionh]h(1 - function was scheduled for execution}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!free_workqueue_attrs (C function)c.free_workqueue_attrshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h9void free_workqueue_attrs (struct workqueue_attrs *attrs)h]jm)}(h8void free_workqueue_attrs(struct workqueue_attrs *attrs)h](j0)}(hvoidh]hvoid}(hhhjShhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjOhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjahMubj)}(hfree_workqueue_attrsh]j)}(hfree_workqueue_attrsh]hfree_workqueue_attrs}(hhhjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1jhjOhhhjahMubj)}(h(struct workqueue_attrs *attrs)h]j)}(hstruct workqueue_attrs *attrsh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_attrsh]hworkqueue_attrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjvsbc.free_workqueue_attrsasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hattrsh]hattrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjOhhhjahMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjKhhhjahMubah}(h]jFah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjHhhubj)}(hhh]h)}(hfree a workqueue_attrsh]hfree a workqueue_attrs}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjHhhhjahMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj,jj,juh1jahhhj?hNhNubj)}(h{**Parameters** ``struct workqueue_attrs *attrs`` workqueue_attrs to free **Description** Undo alloc_workqueue_attrs().h](h)}(h**Parameters**h]j)}(hj6h]h Parameters}(hhhj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj0ubjd)}(hhh]ji)}(h:``struct workqueue_attrs *attrs`` workqueue_attrs to free h](jo)}(h!``struct workqueue_attrs *attrs``h]j)}(hjUh]hstruct workqueue_attrs *attrs}(hhhjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjOubj)}(hhh]h)}(hworkqueue_attrs to freeh]hworkqueue_attrs to free}(hjphjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjjhMhjkubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhhjjhMhjLubah}(h]h ]h"]h$]h&]uh1jchj0ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj0ubh)}(hUndo alloc_workqueue_attrs().h]hUndo alloc_workqueue_attrs().}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]"alloc_workqueue_attrs (C function)c.alloc_workqueue_attrshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h5struct workqueue_attrs * alloc_workqueue_attrs (void)h]jm)}(h3struct workqueue_attrs *alloc_workqueue_attrs(void)h](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(hworkqueue_attrsh]hworkqueue_attrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jalloc_workqueue_attrssbc.alloc_workqueue_attrsasbuh1hhjhhhjhMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hjdh]h*}(hhhj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(halloc_workqueue_attrsh]j)}(hjh]halloc_workqueue_attrs}(hhhj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjOhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjKubah}(h]h ]h"]h$]h&]noemphjjuh1j hjGubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(hallocate a workqueue_attrsh]hallocate a workqueue_attrs}(hj|hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjwhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``void`` no arguments **Description** Allocate a new workqueue_attrs, initialize with default settings and return it. **Return** The allocated new workqueue_attr on success. ``NULL`` on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hOAllocate a new workqueue_attrs, initialize with default settings and return it.h]hOAllocate a new workqueue_attrs, initialize with default settings and return it.}(hjhj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hAThe allocated new workqueue_attr on success. ``NULL`` on failure.h](h-The allocated new workqueue_attr on success. }(h-The allocated new workqueue_attr on success. hj3hhhNhNubj)}(h``NULL``h]hNULL}(hhhj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh on failure.}(h on failure.hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]init_worker_pool (C function)c.init_worker_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h/int init_worker_pool (struct worker_pool *pool)h]jm)}(h.int init_worker_pool(struct worker_pool *pool)h](j0)}(hinth]hint}(hhhjvhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjrhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMrubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrhhhjhMrubj)}(hinit_worker_poolh]j)}(hinit_worker_poolh]hinit_worker_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjrhhhjhMrubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.init_worker_poolasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpoolh]hpool}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjrhhhjhMrubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjnhhhjhMrubah}(h]jiah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMzhjkhhubj)}(hhh]h)}(h'initialize a newly zalloc'd worker_poolh]h)initialize a newly zalloc’d worker_pool}(hj9hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMqhj4hhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjhMrubeh}(h]h ](jfunctioneh"]h$]h&]jjjjOjjOjuh1jahhhj?hNhNubj)}(hX]**Parameters** ``struct worker_pool *pool`` worker_pool to initialize **Description** Initialize a newly zalloc'd **pool**. It also allocates **pool->attrs**. **Return** 0 on success, -errno on failure. Even on failure, all fields inside **pool** proper are initialized and put_unbound_pool() can be called on **pool** safely to release it.h](h)}(h**Parameters**h]j)}(hjYh]h Parameters}(hhhj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMuhjSubjd)}(hhh]ji)}(h7``struct worker_pool *pool`` worker_pool to initialize h](jo)}(h``struct worker_pool *pool``h]j)}(hjxh]hstruct worker_pool *pool}(hhhjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMrhjrubj)}(hhh]h)}(hworker_pool to initializeh]hworker_pool to initialize}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMrhjubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhhjhMrhjoubah}(h]h ]h"]h$]h&]uh1jchjSubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMthjSubh)}(hIInitialize a newly zalloc'd **pool**. It also allocates **pool->attrs**.h](hInitialize a newly zalloc’d }(hInitialize a newly zalloc'd hjhhhNhNubj)}(h**pool**h]hpool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. It also allocates }(h. It also allocates hjhhhNhNubj)}(h**pool->attrs**h]h pool->attrs}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMthjSubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMvhjSubh)}(h0 on success, -errno on failure. Even on failure, all fields inside **pool** proper are initialized and put_unbound_pool() can be called on **pool** safely to release it.h](hE0 on success, -errno on failure. Even on failure, all fields inside }(hE0 on success, -errno on failure. Even on failure, all fields inside hjhhhNhNubj)}(h**pool**h]hpool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh@ proper are initialized and put_unbound_pool() can be called on }(h@ proper are initialized and put_unbound_pool() can be called on hjhhhNhNubj)}(h**pool**h]hpool}(hhhj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh safely to release it.}(h safely to release it.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMvhjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]put_unbound_pool (C function)c.put_unbound_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h0void put_unbound_pool (struct worker_pool *pool)h]jm)}(h/void put_unbound_pool(struct worker_pool *pool)h](j0)}(hvoidh]hvoid}(hhhjlhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjzhMubj)}(hput_unbound_poolh]j)}(hput_unbound_poolh]hput_unbound_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhhjzhMubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.put_unbound_poolasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpoolh]hpool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhhjzhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjdhhhjzhMubah}(h]j_ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjahhubj)}(hhh]h)}(hput a worker_poolh]hput a worker_pool}(hj/hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj*hhubah}(h]h ]h"]h$]h&]uh1jhjahhhjzhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjEjjEjuh1jahhhj?hNhNubj)}(hXz**Parameters** ``struct worker_pool *pool`` worker_pool to put **Description** Put **pool**. If its refcnt reaches zero, it gets destroyed in RCU safe manner. get_unbound_pool() calls this function on its failure path and this function should be able to release pools which went through, successfully or not, init_worker_pool(). Should be called with wq_pool_mutex held.h](h)}(h**Parameters**h]j)}(hjOh]h Parameters}(hhhjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjIubjd)}(hhh]ji)}(h0``struct worker_pool *pool`` worker_pool to put h](jo)}(h``struct worker_pool *pool``h]j)}(hjnh]hstruct worker_pool *pool}(hhhjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhubj)}(hhh]h)}(hworker_pool to puth]hworker_pool to put}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjeubah}(h]h ]h"]h$]h&]uh1jchjIubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjIubh)}(hPut **pool**. If its refcnt reaches zero, it gets destroyed in RCU safe manner. get_unbound_pool() calls this function on its failure path and this function should be able to release pools which went through, successfully or not, init_worker_pool().h](hPut }(hPut hjhhhNhNubj)}(h**pool**h]hpool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. If its refcnt reaches zero, it gets destroyed in RCU safe manner. get_unbound_pool() calls this function on its failure path and this function should be able to release pools which went through, successfully or not, init_worker_pool().}(h. If its refcnt reaches zero, it gets destroyed in RCU safe manner. get_unbound_pool() calls this function on its failure path and this function should be able to release pools which went through, successfully or not, init_worker_pool().hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjIubh)}(h)Should be called with wq_pool_mutex held.h]h)Should be called with wq_pool_mutex held.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]get_unbound_pool (C function)c.get_unbound_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hKstruct worker_pool * get_unbound_pool (const struct workqueue_attrs *attrs)h]jm)}(hIstruct worker_pool *get_unbound_pool(const struct workqueue_attrs *attrs)h](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMbubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j)}jget_unbound_poolsbc.get_unbound_poolasbuh1hhj hhhjhMbubj)}(h h]h }(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMbubj)}(hjdh]h*}(hhhj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMbubj)}(hget_unbound_poolh]j)}(hjNh]hget_unbound_pool}(hhhjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubah}(h]h ](jjeh"]h$]h&]jjuh1jhj hhhjhMbubj)}(h%(const struct workqueue_attrs *attrs)h]j)}(h#const struct workqueue_attrs *attrsh](js)}(hjh]hconst}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjs)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_attrsh]hworkqueue_attrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jLc.get_unbound_poolasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hattrsh]hattrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMbubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj hhhjhMbubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMnhjhhubj)}(hhh]h)}(h/get a worker_pool with the specified attributesh]h/get a worker_pool with the specified attributes}(hj*hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMahj%hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMbubeh}(h]h ](jfunctioneh"]h$]h&]jjjj@jj@juh1jahhhj?hNhNubj)}(hX**Parameters** ``const struct workqueue_attrs *attrs`` the attributes of the worker_pool to get **Description** Obtain a worker_pool which has the same attributes as **attrs**, bump the reference count and return it. If there already is a matching worker_pool, it will be used; otherwise, this function attempts to create a new one. Should be called with wq_pool_mutex held. **Return** On success, a worker_pool with the same attributes as **attrs**. On failure, ``NULL``.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hhhjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehjDubjd)}(hhh]ji)}(hQ``const struct workqueue_attrs *attrs`` the attributes of the worker_pool to get h](jo)}(h'``const struct workqueue_attrs *attrs``h]j)}(hjih]h#const struct workqueue_attrs *attrs}(hhhjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMbhjcubj)}(hhh]h)}(h(the attributes of the worker_pool to geth]h(the attributes of the worker_pool to get}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMbhjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhhj~hMbhj`ubah}(h]h ]h"]h$]h&]uh1jchjDubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdhjDubh)}(hObtain a worker_pool which has the same attributes as **attrs**, bump the reference count and return it. If there already is a matching worker_pool, it will be used; otherwise, this function attempts to create a new one.h](h6Obtain a worker_pool which has the same attributes as }(h6Obtain a worker_pool which has the same attributes as hjhhhNhNubj)}(h **attrs**h]hattrs}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, bump the reference count and return it. If there already is a matching worker_pool, it will be used; otherwise, this function attempts to create a new one.}(h, bump the reference count and return it. If there already is a matching worker_pool, it will be used; otherwise, this function attempts to create a new one.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdhjDubh)}(h)Should be called with wq_pool_mutex held.h]h)Should be called with wq_pool_mutex held.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMihjDubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMkhjDubh)}(hVOn success, a worker_pool with the same attributes as **attrs**. On failure, ``NULL``.h](h6On success, a worker_pool with the same attributes as }(h6On success, a worker_pool with the same attributes as hjhhhNhNubj)}(h **attrs**h]hattrs}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. On failure, }(h. On failure, hjhhhNhNubj)}(h``NULL``h]hNULL}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMkhjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] wq_calc_pod_cpumask (C function)c.wq_calc_pod_cpumaskhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hUvoid wq_calc_pod_cpumask (struct workqueue_attrs *attrs, int cpu, int cpu_going_down)h]jm)}(hTvoid wq_calc_pod_cpumask(struct workqueue_attrs *attrs, int cpu, int cpu_going_down)h](j0)}(hvoidh]hvoid}(hhhjYhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjUhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjghMubj)}(hwq_calc_pod_cpumaskh]j)}(hwq_calc_pod_cpumaskh]hwq_calc_pod_cpumask}(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jhjUhhhjghMubj)}(h<(struct workqueue_attrs *attrs, int cpu, int cpu_going_down)h](j)}(hstruct workqueue_attrs *attrsh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_attrsh]hworkqueue_attrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj|sbc.wq_calc_pod_cpumaskasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hattrsh]hattrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hint cpuh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpuh]hcpu}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hint cpu_going_downh](j0)}(hinth]hint}(hhhj=hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj9ubj)}(h h]h }(hhhjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hcpu_going_downh]hcpu_going_down}(hhhjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjUhhhjghMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjQhhhjghMubah}(h]jLah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM,hjNhhubj)}(hhh]h)}(h'calculate a wq_attrs' cpumask for a podh]h)calculate a wq_attrs’ cpumask for a pod}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_attrs *attrs`` the wq_attrs of the default pwq of the target workqueue ``int cpu`` the target CPU ``int cpu_going_down`` if >= 0, the CPU to consider as offline **Description** Calculate the cpumask a workqueue with **attrs** should use on **pod**. If **cpu_going_down** is >= 0, that cpu is considered offline during calculation. The result is stored in **attrs->__pod_cpumask**. If pod affinity is not enabled, **attrs->cpumask** is always used. If enabled and **pod** has online CPUs requested by **attrs**, the returned cpumask is the intersection of the possible CPUs of **pod** and **attrs->cpumask**. The caller is responsible for ensuring that the cpumask of **pod** stays stable.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM!hjubjd)}(hhh](ji)}(hZ``struct workqueue_attrs *attrs`` the wq_attrs of the default pwq of the target workqueue h](jo)}(h!``struct workqueue_attrs *attrs``h]j)}(hjh]hstruct workqueue_attrs *attrs}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h7the wq_attrs of the default pwq of the target workqueueh]h7the wq_attrs of the default pwq of the target workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(h``int cpu`` the target CPU h](jo)}(h ``int cpu``h]j)}(hjh]hint cpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hthe target CPUh]hthe target CPU}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(h?``int cpu_going_down`` if >= 0, the CPU to consider as offline h](jo)}(h``int cpu_going_down``h]j)}(hj7h]hint cpu_going_down}(hhhj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hj1ubj)}(hhh]h)}(h'if >= 0, the CPU to consider as offlineh]h'if >= 0, the CPU to consider as offline}(hjRhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhM hjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhhjLhM hjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjrh]h Description}(hhhjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM"hjubh)}(hCalculate the cpumask a workqueue with **attrs** should use on **pod**. If **cpu_going_down** is >= 0, that cpu is considered offline during calculation. The result is stored in **attrs->__pod_cpumask**.h](h'Calculate the cpumask a workqueue with }(h'Calculate the cpumask a workqueue with hjhhhNhNubj)}(h **attrs**h]hattrs}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh should use on }(h should use on hjhhhNhNubj)}(h**pod**h]hpod}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. If }(h. If hjhhhNhNubj)}(h**cpu_going_down**h]hcpu_going_down}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhU is >= 0, that cpu is considered offline during calculation. The result is stored in }(hU is >= 0, that cpu is considered offline during calculation. The result is stored in hjhhhNhNubj)}(h**attrs->__pod_cpumask**h]hattrs->__pod_cpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM"hjubh)}(hIf pod affinity is not enabled, **attrs->cpumask** is always used. If enabled and **pod** has online CPUs requested by **attrs**, the returned cpumask is the intersection of the possible CPUs of **pod** and **attrs->cpumask**.h](h If pod affinity is not enabled, }(h If pod affinity is not enabled, hjhhhNhNubj)}(h**attrs->cpumask**h]hattrs->cpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is always used. If enabled and }(h is always used. If enabled and hjhhhNhNubj)}(h**pod**h]hpod}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh has online CPUs requested by }(h has online CPUs requested by hjhhhNhNubj)}(h **attrs**h]hattrs}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhC, the returned cpumask is the intersection of the possible CPUs of }(hC, the returned cpumask is the intersection of the possible CPUs of hjhhhNhNubj)}(h**pod**h]hpod}(hhhj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(h and hjhhhNhNubj)}(h**attrs->cpumask**h]hattrs->cpumask}(hhhj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM&hjubh)}(hPThe caller is responsible for ensuring that the cpumask of **pod** stays stable.h](h;The caller is responsible for ensuring that the cpumask of }(h;The caller is responsible for ensuring that the cpumask of hjQhhhNhNubj)}(h**pod**h]hpod}(hhhjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubh stays stable.}(h stays stable.hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM*hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]"apply_workqueue_attrs (C function)c.apply_workqueue_attrshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h\int apply_workqueue_attrs (struct workqueue_struct *wq, const struct workqueue_attrs *attrs)h]jm)}(h[int apply_workqueue_attrs(struct workqueue_struct *wq, const struct workqueue_attrs *attrs)h](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(happly_workqueue_attrsh]j)}(happly_workqueue_attrsh]happly_workqueue_attrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(hB(struct workqueue_struct *wq, const struct workqueue_attrs *attrs)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.apply_workqueue_attrsasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(h#const struct workqueue_attrs *attrsh](js)}(hjh]hconst}(hhhjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj?ubj)}(h h]h }(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubjs)}(hjvh]hstruct}(hhhj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj?ubj)}(h h]h }(hhhjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubh)}(hhh]j)}(hworkqueue_attrsh]hworkqueue_attrs}(hhhj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj~modnameN classnameNjj)}j]j c.apply_workqueue_attrsasbuh1hhj?ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hattrsh]hattrs}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h1apply new workqueue_attrs to an unbound workqueueh]h1apply new workqueue_attrs to an unbound workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` the target workqueue ``const struct workqueue_attrs *attrs`` the workqueue_attrs to apply, allocated with alloc_workqueue_attrs() **Description** Apply **attrs** to an unbound workqueue **wq**. Unless disabled, this function maps a separate pwq to each CPU pod with possibles CPUs in **attrs->cpumask** so that work items are affine to the pod it was issued on. Older pwqs are released as in-flight work items finish. Note that a work item which repeatedly requeues itself back-to-back will stay on its current pwq. Performs GFP_KERNEL allocations. Assumes caller has CPU hotplug read exclusion, i.e. cpus_read_lock(). **Return** 0 on success and -errno on failure.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh](ji)}(h5``struct workqueue_struct *wq`` the target workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hj!h]hstruct workqueue_struct *wq}(hhhj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hthe target workqueueh]hthe target workqueue}(hj<hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj6hMhjubji)}(hm``const struct workqueue_attrs *attrs`` the workqueue_attrs to apply, allocated with alloc_workqueue_attrs() h](jo)}(h'``const struct workqueue_attrs *attrs``h]j)}(hjZh]h#const struct workqueue_attrs *attrs}(hhhj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjTubj)}(hhh]h)}(hDthe workqueue_attrs to apply, allocated with alloc_workqueue_attrs()h]hDthe workqueue_attrs to apply, allocated with alloc_workqueue_attrs()}(hjuhjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMhjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhhjohMhjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hXqApply **attrs** to an unbound workqueue **wq**. Unless disabled, this function maps a separate pwq to each CPU pod with possibles CPUs in **attrs->cpumask** so that work items are affine to the pod it was issued on. Older pwqs are released as in-flight work items finish. Note that a work item which repeatedly requeues itself back-to-back will stay on its current pwq.h](hApply }(hApply hjhhhNhNubj)}(h **attrs**h]hattrs}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to an unbound workqueue }(h to an unbound workqueue hjhhhNhNubj)}(h**wq**h]hwq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\. Unless disabled, this function maps a separate pwq to each CPU pod with possibles CPUs in }(h\. Unless disabled, this function maps a separate pwq to each CPU pod with possibles CPUs in hjhhhNhNubj)}(h**attrs->cpumask**h]hattrs->cpumask}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh so that work items are affine to the pod it was issued on. Older pwqs are released as in-flight work items finish. Note that a work item which repeatedly requeues itself back-to-back will stay on its current pwq.}(h so that work items are affine to the pod it was issued on. Older pwqs are released as in-flight work items finish. Note that a work item which repeatedly requeues itself back-to-back will stay on its current pwq.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h Performs GFP_KERNEL allocations.h]h Performs GFP_KERNEL allocations.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hEAssumes caller has CPU hotplug read exclusion, i.e. cpus_read_lock().h]hEAssumes caller has CPU hotplug read exclusion, i.e. cpus_read_lock().}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h#0 on success and -errno on failure.h]h#0 on success and -errno on failure.}(hj,hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]wq_update_pod (C function)c.wq_update_podhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hWvoid wq_update_pod (struct workqueue_struct *wq, int cpu, int hotplug_cpu, bool online)h]jm)}(hVvoid wq_update_pod(struct workqueue_struct *wq, int cpu, int hotplug_cpu, bool online)h](j0)}(hvoidh]hvoid}(hhhjYhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjUhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjghMubj)}(h wq_update_podh]j)}(h wq_update_podh]h wq_update_pod}(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jhjUhhhjghMubj)}(hD(struct workqueue_struct *wq, int cpu, int hotplug_cpu, bool online)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj|sbc.wq_update_podasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hint cpuh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpuh]hcpu}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hint hotplug_cpuh](j0)}(hinth]hint}(hhhj=hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj9ubj)}(h h]h }(hhhjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(h hotplug_cpuh]h hotplug_cpu}(hhhjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(h bool onlineh](j0)}(hj h]hbool}(hhhjrhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjnubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(honlineh]honline}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjUhhhjghMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjQhhhjghMubah}(h]jLah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjNhhubj)}(hhh]h)}(h/update pod affinity of a wq for CPU hot[un]plugh]h/update pod affinity of a wq for CPU hot[un]plug}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` the target workqueue ``int cpu`` the CPU to update pool association for ``int hotplug_cpu`` the CPU coming up or going down ``bool online`` whether **cpu** is coming up or going down **Description** This function is to be called from ``CPU_DOWN_PREPARE``, ``CPU_ONLINE`` and ``CPU_DOWN_FAILED``. **cpu** is being hot[un]plugged, update pod affinity of **wq** accordingly. If pod affinity can't be adjusted due to memory allocation failure, it falls back to **wq->dfl_pwq** which may not be optimal but is always correct. Note that when the last allowed CPU of a pod goes offline for a workqueue with a cpumask spanning multiple pods, the workers which were already executing the work items for the workqueue will lose their CPU affinity and may execute on any CPU. This is similar to how per-cpu workqueues behave on CPU_DOWN. If a workqueue user wants strict affinity, it's the user's responsibility to flush the work item from CPU_DOWN_PREPARE.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubjd)}(hhh](ji)}(h5``struct workqueue_struct *wq`` the target workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjh]hstruct workqueue_struct *wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hthe target workqueueh]hthe target workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(h3``int cpu`` the CPU to update pool association for h](jo)}(h ``int cpu``h]j)}(hj2h]hint cpu}(hhhj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj,ubj)}(hhh]h)}(h&the CPU to update pool association forh]h&the CPU to update pool association for}(hjMhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhMhjHubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhhjGhMhjubji)}(h4``int hotplug_cpu`` the CPU coming up or going down h](jo)}(h``int hotplug_cpu``h]j)}(hjkh]hint hotplug_cpu}(hhhjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjeubj)}(hhh]h)}(hthe CPU coming up or going downh]hthe CPU coming up or going down}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(h;``bool online`` whether **cpu** is coming up or going down h](jo)}(h``bool online``h]j)}(hjh]h bool online}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(h*whether **cpu** is coming up or going downh](hwhether }(hwhether hjhhhNhNubj)}(h**cpu**h]hcpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is coming up or going down}(h is coming up or going downhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubh)}(hThis function is to be called from ``CPU_DOWN_PREPARE``, ``CPU_ONLINE`` and ``CPU_DOWN_FAILED``. **cpu** is being hot[un]plugged, update pod affinity of **wq** accordingly.h](h#This function is to be called from }(h#This function is to be called from hj hhhNhNubj)}(h``CPU_DOWN_PREPARE``h]hCPU_DOWN_PREPARE}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, }(h, hj hhhNhNubj)}(h``CPU_ONLINE``h]h CPU_ONLINE}(hhhj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh and }(h and hj hhhNhNubj)}(h``CPU_DOWN_FAILED``h]hCPU_DOWN_FAILED}(hhhj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh. }(h. hj hhhNhNubj)}(h**cpu**h]hcpu}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh1 is being hot[un]plugged, update pod affinity of }(h1 is being hot[un]plugged, update pod affinity of hj hhhNhNubj)}(h**wq**h]hwq}(hhhj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh accordingly.}(h accordingly.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubh)}(hIf pod affinity can't be adjusted due to memory allocation failure, it falls back to **wq->dfl_pwq** which may not be optimal but is always correct.h](hWIf pod affinity can’t be adjusted due to memory allocation failure, it falls back to }(hUIf pod affinity can't be adjusted due to memory allocation failure, it falls back to hjxhhhNhNubj)}(h**wq->dfl_pwq**h]h wq->dfl_pwq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh0 which may not be optimal but is always correct.}(h0 which may not be optimal but is always correct.hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hXNote that when the last allowed CPU of a pod goes offline for a workqueue with a cpumask spanning multiple pods, the workers which were already executing the work items for the workqueue will lose their CPU affinity and may execute on any CPU. This is similar to how per-cpu workqueues behave on CPU_DOWN. If a workqueue user wants strict affinity, it's the user's responsibility to flush the work item from CPU_DOWN_PREPARE.h]hXNote that when the last allowed CPU of a pod goes offline for a workqueue with a cpumask spanning multiple pods, the workers which were already executing the work items for the workqueue will lose their CPU affinity and may execute on any CPU. This is similar to how per-cpu workqueues behave on CPU_DOWN. If a workqueue user wants strict affinity, it’s the user’s responsibility to flush the work item from CPU_DOWN_PREPARE.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!wq_adjust_max_active (C function)c.wq_adjust_max_activehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h7void wq_adjust_max_active (struct workqueue_struct *wq)h]jm)}(h6void wq_adjust_max_active(struct workqueue_struct *wq)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hwq_adjust_max_activeh]j)}(hwq_adjust_max_activeh]hwq_adjust_max_active}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNjj)}j]j)}jjsbc.wq_adjust_max_activeasbuh1hhjubj)}(h h]h }(hhhjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h/update a wq's max_active to the current settingh]h1update a wq’s max_active to the current setting}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` target workqueue **Description** If **wq** isn't freezing, set **wq->max_active** to the saved_max_active and activate inactive work items accordingly. If **wq** is freezing, clear **wq->max_active** to zero.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h1``struct workqueue_struct *wq`` target workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjh]hstruct workqueue_struct *wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(htarget workqueueh]htarget workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hIf **wq** isn't freezing, set **wq->max_active** to the saved_max_active and activate inactive work items accordingly. If **wq** is freezing, clear **wq->max_active** to zero.h](hIf }(hIf hjhhhNhNubj)}(h**wq**h]hwq}(hhhj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh isn’t freezing, set }(h isn't freezing, set hjhhhNhNubj)}(h**wq->max_active**h]hwq->max_active}(hhhj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhJ to the saved_max_active and activate inactive work items accordingly. If }(hJ to the saved_max_active and activate inactive work items accordingly. If hjhhhNhNubj)}(h**wq**h]hwq}(hhhjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is freezing, clear }(h is freezing, clear hjhhhNhNubj)}(h**wq->max_active**h]hwq->max_active}(hhhj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to zero.}(h to zero.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]destroy_workqueue (C function)c.destroy_workqueuehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4void destroy_workqueue (struct workqueue_struct *wq)h]jm)}(h3void destroy_workqueue(struct workqueue_struct *wq)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hdestroy_workqueueh]j)}(hdestroy_workqueueh]hdestroy_workqueue}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.destroy_workqueueasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(hsafely terminate a workqueueh]hsafely terminate a workqueue}(hj\hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjWhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjrjjrjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct workqueue_struct *wq`` target workqueue **Description** Safely destroy a workqueue. All work currently pending will be done first.h](h)}(h**Parameters**h]j)}(hj|h]h Parameters}(hhhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjvubjd)}(hhh]ji)}(h1``struct workqueue_struct *wq`` target workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjh]hstruct workqueue_struct *wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(htarget workqueueh]htarget workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjvubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjvubh)}(hJSafely destroy a workqueue. All work currently pending will be done first.h]hJSafely destroy a workqueue. All work currently pending will be done first.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]%workqueue_set_max_active (C function)c.workqueue_set_max_activehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hKvoid workqueue_set_max_active (struct workqueue_struct *wq, int max_active)h]jm)}(hJvoid workqueue_set_max_active(struct workqueue_struct *wq, int max_active)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj)hMubj)}(hworkqueue_set_max_activeh]j)}(hworkqueue_set_max_activeh]hworkqueue_set_max_active}(hhhj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj)hMubj)}(h-(struct workqueue_struct *wq, int max_active)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjTubj)}(h h]h }(hhhjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjxmodnameN classnameNjj)}j]j)}jj>sbc.workqueue_set_max_activeasbuh1hhjTubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hwqh]hwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubj)}(hint max_activeh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h max_activeh]h max_active}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj)hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhj)hMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h adjust max_active of a workqueueh]h adjust max_active of a workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj)hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj)jj)juh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` target workqueue ``int max_active`` new max_active value. **Description** Set max_active of **wq** to **max_active**. See the alloc_workqueue() function comment. **Context** Don't call from IRQ context.h](h)}(h**Parameters**h]j)}(hj3h]h Parameters}(hhhj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj-ubjd)}(hhh](ji)}(h1``struct workqueue_struct *wq`` target workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjRh]hstruct workqueue_struct *wq}(hhhjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjLubj)}(hhh]h)}(htarget workqueueh]htarget workqueue}(hjmhjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjhubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhhjghMhjIubji)}(h)``int max_active`` new max_active value. h](jo)}(h``int max_active``h]j)}(hjh]hint max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hnew max_active value.h]hnew max_active value.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjIubeh}(h]h ]h"]h$]h&]uh1jchj-ubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj-ubh)}(hWSet max_active of **wq** to **max_active**. See the alloc_workqueue() function comment.h](hSet max_active of }(hSet max_active of hjhhhNhNubj)}(h**wq**h]hwq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to }(h to hjhhhNhNubj)}(h**max_active**h]h max_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh-. See the alloc_workqueue() function comment.}(h-. See the alloc_workqueue() function comment.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj-ubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj-ubh)}(hDon't call from IRQ context.h]hDon’t call from IRQ context.}(hj,hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]%workqueue_set_min_active (C function)c.workqueue_set_min_activehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hKvoid workqueue_set_min_active (struct workqueue_struct *wq, int min_active)h]jm)}(hJvoid workqueue_set_min_active(struct workqueue_struct *wq, int min_active)h](j0)}(hvoidh]hvoid}(hhhjYhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjUhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM ubj)}(h h]h }(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUhhhjghM ubj)}(hworkqueue_set_min_activeh]j)}(hworkqueue_set_min_activeh]hworkqueue_set_min_active}(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1jhjUhhhjghM ubj)}(h-(struct workqueue_struct *wq, int min_active)h](j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj|sbc.workqueue_set_min_activeasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hint min_activeh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h min_activeh]h min_active}(hhhj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjUhhhjghM ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjQhhhjghM ubah}(h]jLah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjNhhubj)}(hhh]h)}(h)adjust min_active of an unbound workqueueh]h)adjust min_active of an unbound workqueue}(hjQhjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjLhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjgjjgjuh1jahhhj?hNhNubj)}(hX(**Parameters** ``struct workqueue_struct *wq`` target unbound workqueue ``int min_active`` new min_active value **Description** Set min_active of an unbound workqueue. Unlike other types of workqueues, an unbound workqueue is not guaranteed to be able to process max_active interdependent work items. Instead, an unbound workqueue is guaranteed to be able to process min_active number of interdependent work items which is ``WQ_DFL_MIN_ACTIVE`` by default. Use this function to adjust the min_active value between 0 and the current max_active.h](h)}(h**Parameters**h]j)}(hjqh]h Parameters}(hhhjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjkubjd)}(hhh](ji)}(h9``struct workqueue_struct *wq`` target unbound workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjh]hstruct workqueue_struct *wq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(htarget unbound workqueueh]htarget unbound workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubji)}(h(``int min_active`` new min_active value h](jo)}(h``int min_active``h]j)}(hjh]hint min_active}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjubj)}(hhh]h)}(hnew min_active valueh]hnew min_active value}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM hjubeh}(h]h ]h"]h$]h&]uh1jchjkubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjkubh)}(hXHSet min_active of an unbound workqueue. Unlike other types of workqueues, an unbound workqueue is not guaranteed to be able to process max_active interdependent work items. Instead, an unbound workqueue is guaranteed to be able to process min_active number of interdependent work items which is ``WQ_DFL_MIN_ACTIVE`` by default.h](hX'Set min_active of an unbound workqueue. Unlike other types of workqueues, an unbound workqueue is not guaranteed to be able to process max_active interdependent work items. Instead, an unbound workqueue is guaranteed to be able to process min_active number of interdependent work items which is }(hX'Set min_active of an unbound workqueue. Unlike other types of workqueues, an unbound workqueue is not guaranteed to be able to process max_active interdependent work items. Instead, an unbound workqueue is guaranteed to be able to process min_active number of interdependent work items which is hjhhhNhNubj)}(h``WQ_DFL_MIN_ACTIVE``h]hWQ_DFL_MIN_ACTIVE}(hhhj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh by default.}(h by default.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM hjkubh)}(hVUse this function to adjust the min_active value between 0 and the current max_active.h]hVUse this function to adjust the min_active value between 0 and the current max_active.}(hj?hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]current_work (C function)c.current_workhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h(struct work_struct * current_work (void)h]jm)}(h&struct work_struct *current_work(void)h](js)}(hjvh]hstruct}(hhhjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjhhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM%ubj)}(h h]h }(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjyhM%ubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}j current_worksbc.current_workasbuh1hhjhhhhjyhM%ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjyhM%ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjyhM%ubj)}(h current_workh]j)}(hjh]h current_work}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhhjyhM%ubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhhjyhM%ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjdhhhjyhM%ubah}(h]j_ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM+hjahhubj)}(hhh]h)}(h'retrieve ``current`` task's work structh](h retrieve }(h retrieve hjhhhNhNubj)}(h ``current``h]hcurrent}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh task’s work struct}(h task's work structhjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM$hjhhubah}(h]h ]h"]h$]h&]uh1jhjahhhjyhM%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj=jj=juh1jahhhj?hNhNubj)}(hX(**Parameters** ``void`` no arguments **Description** Determine if ``current`` task is a workqueue worker and what it's working on. Useful to find out the context that the ``current`` task is running in. **Return** work struct if ``current`` task is a workqueue worker, ``NULL`` otherwise.h](h)}(h**Parameters**h]j)}(hjGh]h Parameters}(hhhjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM(hjAubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjfh]hvoid}(hhhjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM+hj`ubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hM+hj|ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhhj{hM+hj]ubah}(h]h ]h"]h$]h&]uh1jchjAubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM-hjAubh)}(hDetermine if ``current`` task is a workqueue worker and what it's working on. Useful to find out the context that the ``current`` task is running in.h](h Determine if }(h Determine if hjhhhNhNubj)}(h ``current``h]hcurrent}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh` task is a workqueue worker and what it’s working on. Useful to find out the context that the }(h^ task is a workqueue worker and what it's working on. Useful to find out the context that the hjhhhNhNubj)}(h ``current``h]hcurrent}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh task is running in.}(h task is running in.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM&hjAubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM)hjAubh)}(hJwork struct if ``current`` task is a workqueue worker, ``NULL`` otherwise.h](hwork struct if }(hwork struct if hjhhhNhNubj)}(h ``current``h]hcurrent}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh task is a workqueue worker, }(h task is a workqueue worker, hjhhhNhNubj)}(h``NULL``h]hNULL}(hhhj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise.}(h otherwise.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM)hjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j])current_is_workqueue_rescuer (C function)c.current_is_workqueue_rescuerhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h(bool current_is_workqueue_rescuer (void)h]jm)}(h'bool current_is_workqueue_rescuer(void)h](j0)}(hj h]hbool}(hhhj[hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjWhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM5ubj)}(h h]h }(hhhjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWhhhjhhM5ubj)}(hcurrent_is_workqueue_rescuerh]j)}(hcurrent_is_workqueue_rescuerh]hcurrent_is_workqueue_rescuer}(hhhj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ](jjeh"]h$]h&]jjuh1jhjWhhhjhhM5ubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjWhhhjhhM5ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjShhhjhhM5ubah}(h]jNah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM;hjPhhubj)}(hhh]h)}(h!is ``current`` workqueue rescuer?h](his }(his hjhhhNhNubj)}(h ``current``h]hcurrent}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh workqueue rescuer?}(h workqueue rescuer?hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM4hjhhubah}(h]h ]h"]h$]h&]uh1jhjPhhhjhhM5ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``void`` no arguments **Description** Determine whether ``current`` is a workqueue rescuer. Can be used from work functions to determine whether it's being run off the rescuer task. **Return** ``true`` if ``current`` is a workqueue rescuer. ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM8hjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM;hjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hj2hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hM;hj-ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj,hM;hjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjRh]h Description}(hhhjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM=hjubh)}(hDetermine whether ``current`` is a workqueue rescuer. Can be used from work functions to determine whether it's being run off the rescuer task.h](hDetermine whether }(hDetermine whether hjhhhhNhNubj)}(h ``current``h]hcurrent}(hhhjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubhu is a workqueue rescuer. Can be used from work functions to determine whether it’s being run off the rescuer task.}(hs is a workqueue rescuer. Can be used from work functions to determine whether it's being run off the rescuer task.hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6hjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM9hjubh)}(hD``true`` if ``current`` is a workqueue rescuer. ``false`` otherwise.h](j)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if }(h if hjhhhNhNubj)}(h ``current``h]hcurrent}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is a workqueue rescuer. }(h is a workqueue rescuer. hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh otherwise.}(h otherwise.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM9hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] workqueue_congested (C function)c.workqueue_congestedhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h?bool workqueue_congested (int cpu, struct workqueue_struct *wq)h]jm)}(h>bool workqueue_congested(int cpu, struct workqueue_struct *wq)h](j0)}(hj h]hbool}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMDubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMDubj)}(hworkqueue_congestedh]j)}(hworkqueue_congestedh]hworkqueue_congested}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMDubj)}(h&(int cpu, struct workqueue_struct *wq)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhjChhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj?ubj)}(h h]h }(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hcpuh]hcpu}(hhhj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj;ubj)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjtubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj)sbc.workqueue_congestedasbuh1hhjtubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hwqh]hwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj;ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMDubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMDubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMUhjhhubj)}(hhh]h)}(h%test whether a workqueue is congestedh]h%test whether a workqueue is congested}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMChjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMDubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``int cpu`` CPU in question ``struct workqueue_struct *wq`` target workqueue **Description** Test whether **wq**'s cpu workqueue for **cpu** is congested. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging. If **cpu** is WORK_CPU_UNBOUND, the test is performed on the local CPU. With the exception of ordered workqueues, all workqueues have per-cpu pool_workqueues, each with its own congested state. A workqueue being congested on one CPU doesn't mean that the workqueue is contested on any other CPUs. **Return** ``true`` if congested, ``false`` otherwise.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMGhjubjd)}(hhh](ji)}(h``int cpu`` CPU in question h](jo)}(h ``int cpu``h]j)}(hj=h]hint cpu}(hhhj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMDhj7ubj)}(hhh]h)}(hCPU in questionh]hCPU in question}(hjXhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMDhjSubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhhjRhMDhj4ubji)}(h1``struct workqueue_struct *wq`` target workqueue h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjvh]hstruct workqueue_struct *wq}(hhhjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMEhjpubj)}(hhh]h)}(htarget workqueueh]htarget workqueue}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMEhjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhhjhMEhj4ubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMGhjubh)}(hTest whether **wq**'s cpu workqueue for **cpu** is congested. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging.h](h Test whether }(h Test whether hjhhhNhNubj)}(h**wq**h]hwq}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’s cpu workqueue for }(h's cpu workqueue for hjhhhNhNubj)}(h**cpu**h]hcpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is congested. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging.}(h is congested. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMGhjubh)}(hGIf **cpu** is WORK_CPU_UNBOUND, the test is performed on the local CPU.h](hIf }(hIf hjhhhNhNubj)}(h**cpu**h]hcpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh= is WORK_CPU_UNBOUND, the test is performed on the local CPU.}(h= is WORK_CPU_UNBOUND, the test is performed on the local CPU.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMKhjubh)}(hWith the exception of ordered workqueues, all workqueues have per-cpu pool_workqueues, each with its own congested state. A workqueue being congested on one CPU doesn't mean that the workqueue is contested on any other CPUs.h]hWith the exception of ordered workqueues, all workqueues have per-cpu pool_workqueues, each with its own congested state. A workqueue being congested on one CPU doesn’t mean that the workqueue is contested on any other CPUs.}(hj"hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMMhjubh)}(h **Return**h]j)}(hj1h]hReturn}(hhhj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMRhjubh)}(h+``true`` if congested, ``false`` otherwise.h](j)}(h``true``h]htrue}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh if congested, }(h if congested, hjGhhhNhNubj)}(h ``false``h]hfalse}(hhhj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh otherwise.}(h otherwise.hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMThjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]work_busy (C function) c.work_busyhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h1unsigned int work_busy (struct work_struct *work)h]jm)}(h0unsigned int work_busy(struct work_struct *work)h](j0)}(hunsignedh]hunsigned}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMlubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMlubj0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhjhMlubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMlubj)}(h work_busyh]j)}(h work_busyh]h work_busy}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMlubj)}(h(struct work_struct *work)h]j)}(hstruct work_struct *workh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h work_structh]h work_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsb c.work_busyasbuh1hhjubj)}(h h]h }(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hworkh]hwork}(hhhjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMlubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMlubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMuhjhhubj)}(hhh]h)}(h3test whether a work is currently pending or runningh]h3test whether a work is currently pending or running}(hjwhjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMkhjrhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMlubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hXF**Parameters** ``struct work_struct *work`` the work to be tested **Description** Test whether **work** is currently pending or running. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging. **Return** OR'd bitmask of WORK_BUSY_* bits.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMohjubjd)}(hhh]ji)}(h3``struct work_struct *work`` the work to be tested h](jo)}(h``struct work_struct *work``h]j)}(hjh]hstruct work_struct *work}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMlhjubj)}(hhh]h)}(hthe work to be testedh]hthe work to be tested}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMlhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMlhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMnhjubh)}(hTest whether **work** is currently pending or running. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging.h](h Test whether }(h Test whether hjhhhNhNubj)}(h**work**h]hwork}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is currently pending or running. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging.}(h is currently pending or running. There is no synchronization around this function and the test result is unreliable and only useful as advisory hints or for debugging.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMnhjubh)}(h **Return**h]j)}(hj,h]hReturn}(hhhj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMrhjubh)}(h!OR'd bitmask of WORK_BUSY_* bits.h]h#OR’d bitmask of WORK_BUSY_* bits.}(hjDhjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMthjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]set_worker_desc (C function)c.set_worker_deschNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h+void set_worker_desc (const char *fmt, ...)h]jm)}(h*void set_worker_desc(const char *fmt, ...)h](j0)}(hvoidh]hvoid}(hhhjqhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjmhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmhhhjhMubj)}(hset_worker_desch]j)}(hset_worker_desch]hset_worker_desc}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjmhhhjhMubj)}(h(const char *fmt, ...)h](j)}(hconst char *fmth](js)}(hjh]hconst}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj0)}(hcharh]hchar}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfmth]hfmt}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(h...h]j)}(hjh]h...}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjmhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjihhhjhMubah}(h]jdah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjfhhubj)}(hhh]h)}(h)set description for the current work itemh]h)set description for the current work item}(hj7hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj2hhubah}(h]h ]h"]h$]h&]uh1jhjfhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjuh1jahhhj?hNhNubj)}(hX**Parameters** ``const char *fmt`` printf-style format string ``...`` arguments for the format string **Description** This function can be called by a running work function to describe what the work item is about. If the worker task gets dumped, this information will be printed out together to help debugging. The description can be at most WORKER_DESC_LEN including the trailing '\0'.h](h)}(h**Parameters**h]j)}(hjWh]h Parameters}(hhhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQubjd)}(hhh](ji)}(h/``const char *fmt`` printf-style format string h](jo)}(h``const char *fmt``h]j)}(hjvh]hconst char *fmt}(hhhjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjpubj)}(hhh]h)}(hprintf-style format stringh]hprintf-style format string}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjmubji)}(h(``...`` arguments for the format string h](jo)}(h``...``h]j)}(hjh]h...}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(harguments for the format stringh]harguments for the format string}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjmubeh}(h]h ]h"]h$]h&]uh1jchjQubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQubh)}(hXThis function can be called by a running work function to describe what the work item is about. If the worker task gets dumped, this information will be printed out together to help debugging. The description can be at most WORKER_DESC_LEN including the trailing '\0'.h]hXThis function can be called by a running work function to describe what the work item is about. If the worker task gets dumped, this information will be printed out together to help debugging. The description can be at most WORKER_DESC_LEN including the trailing ‘0’.}(hXThis function can be called by a running work function to describe what the work item is about. If the worker task gets dumped, this information will be printed out together to help debugging. The description can be at most WORKER_DESC_LEN including the trailing '\0'.hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]print_worker_info (C function)c.print_worker_infohNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hFvoid print_worker_info (const char *log_lvl, struct task_struct *task)h]jm)}(hEvoid print_worker_info(const char *log_lvl, struct task_struct *task)h](j0)}(hvoidh]hvoid}(hhhj0hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj,hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj>hMubj)}(hprint_worker_infoh]j)}(hprint_worker_infoh]hprint_worker_info}(hhhjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]jjuh1jhj,hhhj>hMubj)}(h/(const char *log_lvl, struct task_struct *task)h](j)}(hconst char *log_lvlh](js)}(hjh]hconst}(hhhjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjiubj)}(h h]h }(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj0)}(hcharh]hchar}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjiubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(hlog_lvlh]hlog_lvl}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjeubj)}(hstruct task_struct *taskh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h task_structh]h task_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjSsbc.print_worker_infoasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(htaskh]htask}(hhhj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjeubeh}(h]h ]h"]h$]h&]jjuh1jhj,hhhj>hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj(hhhj>hMubah}(h]j#ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj%hhubj)}(hhh]h)}(h,print out worker information and descriptionh]h,print out worker information and description}(hjPhjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjKhhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj>hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfjjfjuh1jahhhj?hNhNubj)}(hX**Parameters** ``const char *log_lvl`` the log level to use when printing ``struct task_struct *task`` target task **Description** If **task** is a worker and currently executing a work item, print out the name of the workqueue being serviced and worker description set with set_worker_desc() by the currently executing work item. This function can be safely called on any task as long as the task_struct itself is accessible. While safe, this function isn't synchronized and may print out mixups or garbages of limited length.h](h)}(h**Parameters**h]j)}(hjph]h Parameters}(hhhjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjjubjd)}(hhh](ji)}(h;``const char *log_lvl`` the log level to use when printing h](jo)}(h``const char *log_lvl``h]j)}(hjh]hconst char *log_lvl}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h"the log level to use when printingh]h"the log level to use when printing}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(h)``struct task_struct *task`` target task h](jo)}(h``struct task_struct *task``h]j)}(hjh]hstruct task_struct *task}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h target taskh]h target task}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubeh}(h]h ]h"]h$]h&]uh1jchjjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjjubh)}(hIf **task** is a worker and currently executing a work item, print out the name of the workqueue being serviced and worker description set with set_worker_desc() by the currently executing work item.h](hIf }(hIf hjhhhNhNubj)}(h**task**h]htask}(hhhj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is a worker and currently executing a work item, print out the name of the workqueue being serviced and worker description set with set_worker_desc() by the currently executing work item.}(h is a worker and currently executing a work item, print out the name of the workqueue being serviced and worker description set with set_worker_desc() by the currently executing work item.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjjubh)}(hThis function can be safely called on any task as long as the task_struct itself is accessible. While safe, this function isn't synchronized and may print out mixups or garbages of limited length.h]hThis function can be safely called on any task as long as the task_struct itself is accessible. While safe, this function isn’t synchronized and may print out mixups or garbages of limited length.}(hj>hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]show_one_workqueue (C function)c.show_one_workqueuehNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h5void show_one_workqueue (struct workqueue_struct *wq)h]jm)}(h4void show_one_workqueue(struct workqueue_struct *wq)h](j0)}(hvoidh]hvoid}(hhhjkhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjghhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMfubj)}(h h]h }(hhhjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhjyhMfubj)}(hshow_one_workqueueh]j)}(hshow_one_workqueueh]hshow_one_workqueue}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjghhhjyhMfubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.show_one_workqueueasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwqh]hwq}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjghhhjyhMfubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjchhhjyhMfubah}(h]j^ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhhj`hhubj)}(hhh]h)}(h!dump state of specified workqueueh]h!dump state of specified workqueue}(hj.hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehj)hhubah}(h]h ]h"]h$]h&]uh1jhj`hhhjyhMfubeh}(h]h ](jfunctioneh"]h$]h&]jjjjDjjDjuh1jahhhj?hNhNubj)}(hW**Parameters** ``struct workqueue_struct *wq`` workqueue whose state will be printedh](h)}(h**Parameters**h]j)}(hjNh]h Parameters}(hhhjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMihjHubjd)}(hhh]ji)}(hE``struct workqueue_struct *wq`` workqueue whose state will be printedh](jo)}(h``struct workqueue_struct *wq``h]j)}(hjmh]hstruct workqueue_struct *wq}(hhhjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMkhjgubj)}(hhh]h)}(h%workqueue whose state will be printedh]h%workqueue whose state will be printed}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMfhjubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhhjhMkhjdubah}(h]h ]h"]h$]h&]uh1jchjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!show_one_worker_pool (C function)c.show_one_worker_poolhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h4void show_one_worker_pool (struct worker_pool *pool)h]jm)}(h3void show_one_worker_pool(struct worker_pool *pool)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hshow_one_worker_poolh]j)}(hshow_one_worker_poolh]hshow_one_worker_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjj)}j]j)}jjsbc.show_one_worker_poolasbuh1hhjubj)}(h h]h }(hhhjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpoolh]hpool}(hhhj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h#dump state of specified worker poolh]h#dump state of specified worker pool}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hV**Parameters** ``struct worker_pool *pool`` worker pool whose state will be printedh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(hD``struct worker_pool *pool`` worker pool whose state will be printedh](jo)}(h``struct worker_pool *pool``h]j)}(hjh]hstruct worker_pool *pool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h'worker pool whose state will be printedh]h'worker pool whose state will be printed}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j] show_all_workqueues (C function)c.show_all_workqueueshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hvoid show_all_workqueues (void)h]jm)}(hvoid show_all_workqueues(void)h](j0)}(hvoidh]hvoid}(hhhj#hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj1hMubj)}(hshow_all_workqueuesh]j)}(hshow_all_workqueuesh]hshow_all_workqueues}(hhhjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj1hMubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhj`hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj\ubah}(h]h ]h"]h$]h&]noemphjjuh1j hjXubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj1hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhj1hMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(hdump workqueue stateh]hdump workqueue state}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj1hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``void`` no arguments **Description** Called from a sysrq handler and prints out all busy workqueues and pools.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hICalled from a sysrq handler and prints out all busy workqueues and pools.h]hICalled from a sysrq handler and prints out all busy workqueues and pools.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]&show_freezable_workqueues (C function)c.show_freezable_workqueueshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h%void show_freezable_workqueues (void)h]jm)}(h$void show_freezable_workqueues(void)h](j0)}(hvoidh]hvoid}(hhhjLhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjHhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHhhhjZhMubj)}(hshow_freezable_workqueuesh]j)}(hshow_freezable_workqueuesh]hshow_freezable_workqueues}(hhhjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ](jjeh"]h$]h&]jjuh1jhjHhhhjZhMubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjHhhhjZhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjDhhhjZhMubah}(h]j?ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjAhhubj)}(hhh]h)}(hdump freezable workqueue stateh]hdump freezable workqueue state}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjZhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``void`` no arguments **Description** Called from try_to_freeze_tasks() and prints out all freezable workqueues still busy.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj hMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj0h]h Description}(hhhj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hUCalled from try_to_freeze_tasks() and prints out all freezable workqueues still busy.h]hUCalled from try_to_freeze_tasks() and prints out all freezable workqueues still busy.}(hjHhjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]rebind_workers (C function)c.rebind_workershNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h.void rebind_workers (struct worker_pool *pool)h]jm)}(h-void rebind_workers(struct worker_pool *pool)h](j0)}(hvoidh]hvoid}(hhhjuhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjqhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMZubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhMZubj)}(hrebind_workersh]j)}(hrebind_workersh]hrebind_workers}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjqhhhjhMZubj)}(h(struct worker_pool *pool)h]j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.rebind_workersasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpoolh]hpool}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjqhhhjhMZubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjmhhhjhMZubah}(h]jhah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM^hjjhhubj)}(hhh]h)}(h2rebind all workers of a pool to the associated CPUh]h2rebind all workers of a pool to the associated CPU}(hj8hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMYhj3hhubah}(h]h ]h"]h$]h&]uh1jhjjhhhjhMZubeh}(h]h ](jfunctioneh"]h$]h&]jjjjNjjNjuh1jahhhj?hNhNubj)}(h**Parameters** ``struct worker_pool *pool`` pool of interest **Description** **pool->cpu** is coming online. Rebind all workers to the CPU.h](h)}(h**Parameters**h]j)}(hjXh]h Parameters}(hhhjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM]hjRubjd)}(hhh]ji)}(h.``struct worker_pool *pool`` pool of interest h](jo)}(h``struct worker_pool *pool``h]j)}(hjwh]hstruct worker_pool *pool}(hhhjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMZhjqubj)}(hhh]h)}(hpool of interesth]hpool of interest}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMZhjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhhjhMZhjnubah}(h]h ]h"]h$]h&]uh1jchjRubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM\hjRubh)}(h?**pool->cpu** is coming online. Rebind all workers to the CPU.h](j)}(h **pool->cpu**h]h pool->cpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 is coming online. Rebind all workers to the CPU.}(h2 is coming online. Rebind all workers to the CPU.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM\hjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j],restore_unbound_workers_cpumask (C function)!c.restore_unbound_workers_cpumaskhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hHvoid restore_unbound_workers_cpumask (struct worker_pool *pool, int cpu)h]jm)}(hGvoid restore_unbound_workers_cpumask(struct worker_pool *pool, int cpu)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hrestore_unbound_workers_cpumaskh]j)}(hrestore_unbound_workers_cpumaskh]hrestore_unbound_workers_cpumask}(hhhj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubj)}(h#(struct worker_pool *pool, int cpu)h](j)}(hstruct worker_pool *poolh](js)}(hjvh]hstruct}(hhhjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj?ubj)}(h h]h }(hhhjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubh)}(hhh]j)}(h worker_poolh]h worker_pool}(hhhjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjcmodnameN classnameNjj)}j]j)}jj)sb!c.restore_unbound_workers_cpumaskasbuh1hhj?ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hpoolh]hpool}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj;ubj)}(hint cpuh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpuh]hcpu}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj;ubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h"restore cpumask of unbound workersh]h"restore cpumask of unbound workers}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``struct worker_pool *pool`` unbound pool of interest ``int cpu`` the CPU which is coming up **Description** An unbound pool may end up with a cpumask which doesn't have any online CPUs. When a worker of such pool get scheduled, the scheduler resets its cpus_allowed. If **cpu** is in **pool**'s cpumask which didn't have any online CPU before, cpus_allowed of all its workers should be restored.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh](ji)}(h6``struct worker_pool *pool`` unbound pool of interest h](jo)}(h``struct worker_pool *pool``h]j)}(hj=h]hstruct worker_pool *pool}(hhhj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj7ubj)}(hhh]h)}(hunbound pool of interesth]hunbound pool of interest}(hjXhjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjRhMhjSubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhhjRhMhj4ubji)}(h'``int cpu`` the CPU which is coming up h](jo)}(h ``int cpu``h]j)}(hjvh]hint cpu}(hhhjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjpubj)}(hhh]h)}(hthe CPU which is coming uph]hthe CPU which is coming up}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhhjhMhj4ubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hX!An unbound pool may end up with a cpumask which doesn't have any online CPUs. When a worker of such pool get scheduled, the scheduler resets its cpus_allowed. If **cpu** is in **pool**'s cpumask which didn't have any online CPU before, cpus_allowed of all its workers should be restored.h](hAn unbound pool may end up with a cpumask which doesn’t have any online CPUs. When a worker of such pool get scheduled, the scheduler resets its cpus_allowed. If }(hAn unbound pool may end up with a cpumask which doesn't have any online CPUs. When a worker of such pool get scheduled, the scheduler resets its cpus_allowed. If hjhhhNhNubj)}(h**cpu**h]hcpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is in }(h is in hjhhhNhNubj)}(h**pool**h]hpool}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhk’s cpumask which didn’t have any online CPU before, cpus_allowed of all its workers should be restored.}(hg's cpumask which didn't have any online CPU before, cpus_allowed of all its workers should be restored.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]work_on_cpu_key (C function)c.work_on_cpu_keyhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hYlong work_on_cpu_key (int cpu, long (*fn)(void *), void *arg, struct lock_class_key *key)h]jm)}(hWlong work_on_cpu_key(int cpu, long (*fn)(void*), void *arg, struct lock_class_key *key)h](j0)}(hlongh]hlong}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj+hMubj)}(hwork_on_cpu_keyh]j)}(hwork_on_cpu_keyh]hwork_on_cpu_key}(hhhj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj+hMubj)}(hC(int cpu, long (*fn)(void*), void *arg, struct lock_class_key *key)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhjZhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjVubj)}(h h]h }(hhhjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hcpuh]hcpu}(hhhjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRubj)}(hlong (*fn)(void*)h](j0)}(hlongh]hlong}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h(h]h(}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfnh]hfn}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjoah]h)}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h(}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjoah]h)}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRubj)}(h void *argh](j0)}(hvoidh]hvoid}(hhhj!hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hargh]harg}(hhhjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRubj)}(hstruct lock_class_key *keyh](js)}(hjvh]hstruct}(hhhjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj_ubj)}(h h]h }(hhhjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubh)}(hhh]j)}(hlock_class_keyh]hlock_class_key}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jj@sbc.work_on_cpu_keyasbuh1hhj_ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hkeyh]hkey}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhj+hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhj+hMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h4run a function in thread context on a particular cpuh]h4run a function in thread context on a particular cpu}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj+hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``int cpu`` the cpu to run on ``long (*fn)(void *)`` the function to run ``void *arg`` the function arg ``struct lock_class_key *key`` The lock class key for lock debugging purposes **Description** It is up to the caller to ensure that the cpu doesn't go offline. The caller must not hold any locks which would prevent **fn** from completing. **Return** The value **fn** returns.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh](ji)}(h``int cpu`` the cpu to run on h](jo)}(h ``int cpu``h]j)}(hj(h]hint cpu}(hhhj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj"ubj)}(hhh]h)}(hthe cpu to run onh]hthe cpu to run on}(hjChjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhhj=hMhjubji)}(h+``long (*fn)(void *)`` the function to run h](jo)}(h``long (*fn)(void *)``h]j)}(hjah]hlong (*fn)(void *)}(hhhjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj[ubj)}(hhh]h)}(hthe function to runh]hthe function to run}(hj|hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhMhjwubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhhjvhMhjubji)}(h``void *arg`` the function arg h](jo)}(h ``void *arg``h]j)}(hjh]h void *arg}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(hthe function argh]hthe function arg}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubji)}(hN``struct lock_class_key *key`` The lock class key for lock debugging purposes h](jo)}(h``struct lock_class_key *key``h]j)}(hjh]hstruct lock_class_key *key}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h.The lock class key for lock debugging purposesh]h.The lock class key for lock debugging purposes}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hIt is up to the caller to ensure that the cpu doesn't go offline. The caller must not hold any locks which would prevent **fn** from completing.h](h{It is up to the caller to ensure that the cpu doesn’t go offline. The caller must not hold any locks which would prevent }(hyIt is up to the caller to ensure that the cpu doesn't go offline. The caller must not hold any locks which would prevent hj$hhhNhNubj)}(h**fn**h]hfn}(hhhj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubh from completing.}(h from completing.hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h **Return**h]j)}(hjIh]hReturn}(hhhjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hThe value **fn** returns.h](h The value }(h The value hj_hhhNhNubj)}(h**fn**h]hfn}(hhhjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh returns.}(h returns.hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]!work_on_cpu_safe_key (C function)c.work_on_cpu_safe_keyhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h^long work_on_cpu_safe_key (int cpu, long (*fn)(void *), void *arg, struct lock_class_key *key)h]jm)}(h\long work_on_cpu_safe_key(int cpu, long (*fn)(void*), void *arg, struct lock_class_key *key)h](j0)}(hlongh]hlong}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM,ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM,ubj)}(hwork_on_cpu_safe_keyh]j)}(hwork_on_cpu_safe_keyh]hwork_on_cpu_safe_key}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM,ubj)}(hC(int cpu, long (*fn)(void*), void *arg, struct lock_class_key *key)h](j)}(hint cpuh](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpuh]hcpu}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hlong (*fn)(void*)h](j0)}(hlongh]hlong}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h(}(hhhj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hfnh]hfn}(hhhjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjoah]h)}(hhhjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h(}(hhhjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj0)}(hvoidh]hvoid}(hhhjrhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjoah]h)}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(h void *argh](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hargh]harg}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj)}(hstruct lock_class_key *keyh](js)}(hjvh]hstruct}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hlock_class_keyh]hlock_class_key}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.work_on_cpu_safe_keyasbuh1hhjubj)}(h h]h }(hhhj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjdh]h*}(hhhj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hkeyh]hkey}(hhhj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM,ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM,ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6hjhhubj)}(hhh]h)}(h4run a function in thread context on a particular cpuh]h4run a function in thread context on a particular cpu}(hjmhjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM+hjhhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``int cpu`` the cpu to run on ``long (*fn)(void *)`` the function to run ``void *arg`` the function argument ``struct lock_class_key *key`` The lock class key for lock debugging purposes **Description** Disables CPU hotplug and calls work_on_cpu(). The caller must not hold any locks which would prevent **fn** from completing. **Return** The value **fn** returns.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/hjubjd)}(hhh](ji)}(h``int cpu`` the cpu to run on h](jo)}(h ``int cpu``h]j)}(hjh]hint cpu}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM,hjubj)}(hhh]h)}(hthe cpu to run onh]hthe cpu to run on}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM,hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM,hjubji)}(h+``long (*fn)(void *)`` the function to run h](jo)}(h``long (*fn)(void *)``h]j)}(hjh]hlong (*fn)(void *)}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM-hjubj)}(hhh]h)}(hthe function to runh]hthe function to run}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM-hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhM-hjubji)}(h$``void *arg`` the function argument h](jo)}(h ``void *arg``h]j)}(hjh]h void *arg}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM.hjubj)}(hhh]h)}(hthe function argumenth]hthe function argument}(hj9hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hM.hj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj3hM.hjubji)}(hN``struct lock_class_key *key`` The lock class key for lock debugging purposes h](jo)}(h``struct lock_class_key *key``h]j)}(hjWh]hstruct lock_class_key *key}(hhhjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/hjQubj)}(hhh]h)}(h.The lock class key for lock debugging purposesh]h.The lock class key for lock debugging purposes}(hjrhjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhM/hjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhhjlhM/hjubeh}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM1hjubh)}(h|Disables CPU hotplug and calls work_on_cpu(). The caller must not hold any locks which would prevent **fn** from completing.h](heDisables CPU hotplug and calls work_on_cpu(). The caller must not hold any locks which would prevent }(heDisables CPU hotplug and calls work_on_cpu(). The caller must not hold any locks which would prevent hjhhhNhNubj)}(h**fn**h]hfn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh from completing.}(h from completing.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM1hjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM4hjubh)}(hThe value **fn** returns.h](h The value }(h The value hjhhhNhNubj)}(h**fn**h]hfn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh returns.}(h returns.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM4hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]$freeze_workqueues_begin (C function)c.freeze_workqueues_beginhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h#void freeze_workqueues_begin (void)h]jm)}(h"void freeze_workqueues_begin(void)h](j0)}(hvoidh]hvoid}(hhhj&hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj"hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMHubj)}(h h]h }(hhhj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj4hMHubj)}(hfreeze_workqueues_beginh]j)}(hfreeze_workqueues_beginh]hfreeze_workqueues_begin}(hhhjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ](jjeh"]h$]h&]jjuh1jhj"hhhj4hMHubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjchhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj_ubah}(h]h ]h"]h$]h&]noemphjjuh1j hj[ubah}(h]h ]h"]h$]h&]jjuh1jhj"hhhj4hMHubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhj4hMHubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMPhjhhubj)}(hhh]h)}(hbegin freezing workqueuesh]hbegin freezing workqueues}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMGhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hMHubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX'**Parameters** ``void`` no arguments **Description** Start freezing workqueues. After this function returns, all freezable workqueues will queue new works to their inactive_works list instead of pool->worklist. **Context** Grabs and releases wq_pool_mutex, wq->mutex and pool->lock's.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMKhjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMNhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMNhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMNhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj h]h Description}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMPhjubh)}(hStart freezing workqueues. After this function returns, all freezable workqueues will queue new works to their inactive_works list instead of pool->worklist.h]hStart freezing workqueues. After this function returns, all freezable workqueues will queue new works to their inactive_works list instead of pool->worklist.}(hj"hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMIhjubh)}(h **Context**h]j)}(hj1h]hContext}(hhhj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMMhjubh)}(h=Grabs and releases wq_pool_mutex, wq->mutex and pool->lock's.h]h?Grabs and releases wq_pool_mutex, wq->mutex and pool->lock’s.}(hjIhjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMOhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]#freeze_workqueues_busy (C function)c.freeze_workqueues_busyhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h"bool freeze_workqueues_busy (void)h]jm)}(h!bool freeze_workqueues_busy(void)h](j0)}(hj h]hbool}(hhhjvhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjrhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMdubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrhhhjhMdubj)}(hfreeze_workqueues_busyh]j)}(hfreeze_workqueues_busyh]hfreeze_workqueues_busy}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjrhhhjhMdubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjubah}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjrhhhjhMdubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjnhhhjhMdubah}(h]jiah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMohjkhhubj)}(hhh]h)}(h$are freezable workqueues still busy?h]h$are freezable workqueues still busy?}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMchjhhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjhMdubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hXP**Parameters** ``void`` no arguments **Description** Check whether freezing is complete. This function must be called between freeze_workqueues_begin() and thaw_workqueues(). **Context** Grabs and releases wq_pool_mutex. **Return** ``true`` if some freezable workqueues are still busy. ``false`` if freezing is complete.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMghjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMjhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hj9hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMjhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhj3hMjhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjYh]h Description}(hhhj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMlhjubh)}(hzCheck whether freezing is complete. This function must be called between freeze_workqueues_begin() and thaw_workqueues().h]hzCheck whether freezing is complete. This function must be called between freeze_workqueues_begin() and thaw_workqueues().}(hjqhjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMehjubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhhjubh)}(h!Grabs and releases wq_pool_mutex.h]h!Grabs and releases wq_pool_mutex.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMjhjubh)}(h **Return**h]j)}(hjh]hReturn}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMlhjubh)}(hY``true`` if some freezable workqueues are still busy. ``false`` if freezing is complete.h](j)}(h``true``h]htrue}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh/ if some freezable workqueues are still busy. }(h/ if some freezable workqueues are still busy. hjhhhNhNubj)}(h ``false``h]hfalse}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if freezing is complete.}(h if freezing is complete.hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMmhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]thaw_workqueues (C function)c.thaw_workqueueshNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hvoid thaw_workqueues (void)h]jm)}(hvoid thaw_workqueues(void)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMubj)}(hthaw_workqueuesh]j)}(hthaw_workqueuesh]hthaw_workqueues}(hhhj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj hhhjhMubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjKhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjGubah}(h]h ]h"]h$]h&]noemphjjuh1j hjCubah}(h]h ]h"]h$]h&]jjuh1jhj hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(hthaw workqueuesh]hthaw workqueues}(hjxhjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjshhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX **Parameters** ``void`` no arguments **Description** Thaw workqueues. Normal queueing is restored and all collected frozen works are transferred to their respective pool worklists. **Context** Grabs and releases wq_pool_mutex, wq->mutex and pool->lock's.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hThaw workqueues. Normal queueing is restored and all collected frozen works are transferred to their respective pool worklists.h]hThaw workqueues. Normal queueing is restored and all collected frozen works are transferred to their respective pool worklists.}(hj hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h **Context**h]j)}(hjh]hContext}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(h=Grabs and releases wq_pool_mutex, wq->mutex and pool->lock's.h]h?Grabs and releases wq_pool_mutex, wq->mutex and pool->lock’s.}(hj1hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j].workqueue_unbound_exclude_cpumask (C function)#c.workqueue_unbound_exclude_cpumaskhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hEint workqueue_unbound_exclude_cpumask (cpumask_var_t exclude_cpumask)h]jm)}(hDint workqueue_unbound_exclude_cpumask(cpumask_var_t exclude_cpumask)h](j0)}(hinth]hint}(hhhj^hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjZhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjlhMubj)}(h!workqueue_unbound_exclude_cpumaskh]j)}(h!workqueue_unbound_exclude_cpumaskh]h!workqueue_unbound_exclude_cpumask}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjZhhhjlhMubj)}(h(cpumask_var_t exclude_cpumask)h]j)}(hcpumask_var_t exclude_cpumaskh](h)}(hhh]j)}(h cpumask_var_th]h cpumask_var_t}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsb#c.workqueue_unbound_exclude_cpumaskasbuh1hhjubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hexclude_cpumaskh]hexclude_cpumask}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjZhhhjlhMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjVhhhjlhMubah}(h]jQah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjShhubj)}(hhh]h)}(h'Exclude given CPUs from unbound cpumaskh]h'Exclude given CPUs from unbound cpumask}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjShhhjlhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX7**Parameters** ``cpumask_var_t exclude_cpumask`` the cpumask to be excluded from wq_unbound_cpumask **Description** This function can be called from cpuset code to provide a set of isolated CPUs that should be excluded from wq_unbound_cpumask. The caller must hold either cpus_read_lock or cpus_write_lock.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(hU``cpumask_var_t exclude_cpumask`` the cpumask to be excluded from wq_unbound_cpumask h](jo)}(h!``cpumask_var_t exclude_cpumask``h]j)}(hj8h]hcpumask_var_t exclude_cpumask}(hhhj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj2ubj)}(hhh]h)}(h2the cpumask to be excluded from wq_unbound_cpumaskh]h2the cpumask to be excluded from wq_unbound_cpumask}(hjShjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhMhjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhhjMhMhj/ubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjsh]h Description}(hhhjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hThis function can be called from cpuset code to provide a set of isolated CPUs that should be excluded from wq_unbound_cpumask. The caller must hold either cpus_read_lock or cpus_write_lock.h]hThis function can be called from cpuset code to provide a set of isolated CPUs that should be excluded from wq_unbound_cpumask. The caller must hold either cpus_read_lock or cpus_write_lock.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]*workqueue_set_unbound_cpumask (C function)c.workqueue_set_unbound_cpumaskhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h9int workqueue_set_unbound_cpumask (cpumask_var_t cpumask)h]jm)}(h8int workqueue_set_unbound_cpumask(cpumask_var_t cpumask)h](j0)}(hinth]hint}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/ubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM/ubj)}(hworkqueue_set_unbound_cpumaskh]j)}(hworkqueue_set_unbound_cpumaskh]hworkqueue_set_unbound_cpumask}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM/ubj)}(h(cpumask_var_t cpumask)h]j)}(hcpumask_var_t cpumaskh](h)}(hhh]j)}(h cpumask_var_th]h cpumask_var_t}(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.workqueue_set_unbound_cpumaskasbuh1hhjubj)}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpumaskh]hcpumask}(hhhj& hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1jhjhhhjhM/ubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhjhM/ubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM9hjhhubj)}(hhh]h)}(h!Set the low-level unbound cpumaskh]h!Set the low-level unbound cpumask}(hjS hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM.hjN hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjji jji juh1jahhhj?hNhNubj)}(hX**Parameters** ``cpumask_var_t cpumask`` the cpumask to set The low-level workqueues cpumask is a global cpumask that limits the affinity of all unbound workqueues. This function check the **cpumask** and apply it to all unbound workqueues and updates all pwqs of them. **Return** 0 - Success -EINVAL - Invalid **cpumask** -ENOMEM - Failed to allocate memory for attrs or pwqs.h](h)}(h**Parameters**h]j)}(hjs h]h Parameters}(hhhju hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM2hjm ubjd)}(hhh]ji)}(hX``cpumask_var_t cpumask`` the cpumask to set The low-level workqueues cpumask is a global cpumask that limits the affinity of all unbound workqueues. This function check the **cpumask** and apply it to all unbound workqueues and updates all pwqs of them. h](jo)}(h``cpumask_var_t cpumask``h]j)}(hj h]hcpumask_var_t cpumask}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM3hj ubj)}(hhh](h)}(hthe cpumask to seth]hthe cpumask to set}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM/hj ubh)}(hThe low-level workqueues cpumask is a global cpumask that limits the affinity of all unbound workqueues. This function check the **cpumask** and apply it to all unbound workqueues and updates all pwqs of them.h](hThe low-level workqueues cpumask is a global cpumask that limits the affinity of all unbound workqueues. This function check the }(hThe low-level workqueues cpumask is a global cpumask that limits the affinity of all unbound workqueues. This function check the hj hhhNhNubj)}(h **cpumask**h]hcpumask}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhE and apply it to all unbound workqueues and updates all pwqs of them.}(hE and apply it to all unbound workqueues and updates all pwqs of them.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM1hj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj hM3hj ubah}(h]h ]h"]h$]h&]uh1jchjm ubh)}(h **Return**h]j)}(hj h]hReturn}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM5hjm ubjd)}(hhh]ji)}(hf0 - Success -EINVAL - Invalid **cpumask** -ENOMEM - Failed to allocate memory for attrs or pwqs.h](jo)}(h0 - Successh]h0 - Success}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chM6hj ubj)}(hhh]h)}(hT-EINVAL - Invalid **cpumask** -ENOMEM - Failed to allocate memory for attrs or pwqs.h](h-EINVAL - Invalid }(h-EINVAL - Invalid hj hhhNhNubj)}(h **cpumask**h]hcpumask}(hhhj) hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh7 -ENOMEM - Failed to allocate memory for attrs or pwqs.}(h7 -ENOMEM - Failed to allocate memory for attrs or pwqs.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hM6hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhj hM6hj ubah}(h]h ]h"]h$]h&]uh1jchjm ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]%workqueue_sysfs_register (C function)c.workqueue_sysfs_registerhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h:int workqueue_sysfs_register (struct workqueue_struct *wq)h]jm)}(h9int workqueue_sysfs_register(struct workqueue_struct *wq)h](j0)}(hinth]hint}(hhhjt hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjp hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp hhhj hMubj)}(hworkqueue_sysfs_registerh]j)}(hworkqueue_sysfs_registerh]hworkqueue_sysfs_register}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjp hhhj hMubj)}(h(struct workqueue_struct *wq)h]j)}(hstruct workqueue_struct *wqh](js)}(hjvh]hstruct}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jrhj ubj)}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hworkqueue_structh]hworkqueue_struct}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jj sbc.workqueue_sysfs_registerasbuh1hhj ubj)}(h h]h }(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjdh]h*}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hwqh]hwq}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubah}(h]h ]h"]h$]h&]jjuh1jhjp hhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjl hhhj hMubah}(h]jg ah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhji hhubj)}(hhh]h)}(h!make a workqueue visible in sysfsh]h!make a workqueue visible in sysfs}(hj7 hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj2 hhubah}(h]h ]h"]h$]h&]uh1jhji hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjM jjM juh1jahhhj?hNhNubj)}(hX**Parameters** ``struct workqueue_struct *wq`` the workqueue to register **Description** Expose **wq** in sysfs under /sys/bus/workqueue/devices. alloc_workqueue*() automatically calls this function if WQ_SYSFS is set which is the preferred method. Workqueue user should use this function directly iff it wants to apply workqueue_attrs before making the workqueue visible in sysfs; otherwise, apply_workqueue_attrs() may race against userland updating the attributes. **Return** 0 on success, -errno on failure.h](h)}(h**Parameters**h]j)}(hjW h]h Parameters}(hhhjY hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQ ubjd)}(hhh]ji)}(h:``struct workqueue_struct *wq`` the workqueue to register h](jo)}(h``struct workqueue_struct *wq``h]j)}(hjv h]hstruct workqueue_struct *wq}(hhhjx hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjp ubj)}(hhh]h)}(hthe workqueue to registerh]hthe workqueue to register}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjp ubeh}(h]h ]h"]h$]h&]uh1jhhj hMhjm ubah}(h]h ]h"]h$]h&]uh1jchjQ ubh)}(h**Description**h]j)}(hj h]h Description}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQ ubh)}(hExpose **wq** in sysfs under /sys/bus/workqueue/devices. alloc_workqueue*() automatically calls this function if WQ_SYSFS is set which is the preferred method.h](hExpose }(hExpose hj hhhNhNubj)}(h**wq**h]hwq}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh in sysfs under /sys/bus/workqueue/devices. alloc_workqueue*() automatically calls this function if WQ_SYSFS is set which is the preferred method.}(h in sysfs under /sys/bus/workqueue/devices. alloc_workqueue*() automatically calls this function if WQ_SYSFS is set which is the preferred method.hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQ ubh)}(hWorkqueue user should use this function directly iff it wants to apply workqueue_attrs before making the workqueue visible in sysfs; otherwise, apply_workqueue_attrs() may race against userland updating the attributes.h]hWorkqueue user should use this function directly iff it wants to apply workqueue_attrs before making the workqueue visible in sysfs; otherwise, apply_workqueue_attrs() may race against userland updating the attributes.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.cdWhMhjQ ubh)}(h **Return**h]j)}(hj h]hReturn}(hhhj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQ ubh)}(h 0 on success, -errno on failure.h]h 0 on success, -errno on failure.}(hj hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjQ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]'workqueue_sysfs_unregister (C function)c.workqueue_sysfs_unregisterhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h=void workqueue_sysfs_unregister (struct workqueue_struct *wq)h]jm)}(hhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhj;hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjuh1jahhhj?hNhNubj)}(hX**Parameters** ``void`` no arguments **Description** This is the first step of three-staged workqueue subsystem initialization and invoked as soon as the bare basics - memory allocation, cpumasks and idr are up. It sets up all the data structures and system workqueues and allows early boot code to create workqueues and queue/cancel work items. Actual work item execution starts only after kthreads can be created and scheduled right before early initcalls.h](h)}(h**Parameters**h]j)}(hj`h]h Parameters}(hhhjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjZubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjyubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjvubah}(h]h ]h"]h$]h&]uh1jchjZubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjZubh)}(hXThis is the first step of three-staged workqueue subsystem initialization and invoked as soon as the bare basics - memory allocation, cpumasks and idr are up. It sets up all the data structures and system workqueues and allows early boot code to create workqueues and queue/cancel work items. Actual work item execution starts only after kthreads can be created and scheduled right before early initcalls.h]hXThis is the first step of three-staged workqueue subsystem initialization and invoked as soon as the bare basics - memory allocation, cpumasks and idr are up. It sets up all the data structures and system workqueues and allows early boot code to create workqueues and queue/cancel work items. Actual work item execution starts only after kthreads can be created and scheduled right before early initcalls.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]workqueue_init (C function)c.workqueue_inithNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(hvoid workqueue_init (void)h]jm)}(hvoid workqueue_init(void)h](j0)}(hvoidh]hvoid}(hhhjhhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjhhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubj)}(hworkqueue_inith]j)}(hworkqueue_inith]hworkqueue_init}(hhhj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj hMubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhj<hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj8ubah}(h]h ]h"]h$]h&]noemphjjuh1j hj4ubah}(h]h ]h"]h$]h&]jjuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhjhhhj hMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h&bring workqueue subsystem fully onlineh]h&bring workqueue subsystem fully online}(hjihjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjdhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(hX**Parameters** ``void`` no arguments **Description** This is the second step of three-staged workqueue subsystem initialization and invoked as soon as kthreads can be created and scheduled. Workqueues have been created and work items queued on them, but there are no kworkers executing the work items yet. Populate the worker pools with the initial workers and enable future kworker creations.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hjh]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hXTThis is the second step of three-staged workqueue subsystem initialization and invoked as soon as kthreads can be created and scheduled. Workqueues have been created and work items queued on them, but there are no kworkers executing the work items yet. Populate the worker pools with the initial workers and enable future kworker creations.h]hXTThis is the second step of three-staged workqueue subsystem initialization and invoked as soon as kthreads can be created and scheduled. Workqueues have been created and work items queued on them, but there are no kworkers executing the work items yet. Populate the worker pools with the initial workers and enable future kworker creations.}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubjQ)}(hhh]h}(h]h ]h"]h$]h&]entries](j]$workqueue_init_topology (C function)c.workqueue_init_topologyhNtauh1jPhj?hhhNhNubjb)}(hhh](jg)}(h#void workqueue_init_topology (void)h]jm)}(h"void workqueue_init_topology(void)h](j0)}(hvoidh]hvoid}(hhhj(hhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hj$hhhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMubj)}(h h]h }(hhhj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$hhhj6hMubj)}(hworkqueue_init_topologyh]j)}(hworkqueue_init_topologyh]hworkqueue_init_topology}(hhhjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1jhj$hhhj6hMubj)}(h(void)h]j)}(hvoidh]j0)}(hvoidh]hvoid}(hhhjehhhNhNubah}(h]h ]j<ah"]h$]h&]uh1j/hjaubah}(h]h ]h"]h$]h&]noemphjjuh1j hj]ubah}(h]h ]h"]h$]h&]jjuh1jhj$hhhj6hMubeh}(h]h ]h"]h$]h&]jjjuh1jljjhj hhhj6hMubah}(h]jah ](jjeh"]h$]h&]juh1jfhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubj)}(hhh]h)}(h*initialize CPU pods for unbound workqueuesh]h*initialize CPU pods for unbound workqueues}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj6hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjuh1jahhhj?hNhNubj)}(h**Parameters** ``void`` no arguments **Description** This is the third step of three-staged workqueue subsystem initialization and invoked after SMP and topology information are fully initialized. It initializes the unbound CPU pods accordingly.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubjd)}(hhh]ji)}(h``void`` no arguments h](jo)}(h``void``h]j)}(hjh]hvoid}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jnhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubj)}(hhh]h)}(h no argumentsh]h no arguments}(hjhjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhjhMhjubah}(h]h ]h"]h$]h&]uh1jchjubh)}(h**Description**h]j)}(hj h]h Description}(hhhjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubh)}(hThis is the third step of three-staged workqueue subsystem initialization and invoked after SMP and topology information are fully initialized. It initializes the unbound CPU pods accordingly.h]hThis is the third step of three-staged workqueue subsystem initialization and invoked after SMP and topology information are fully initialized. It initializes the unbound CPU pods accordingly.}(hj$hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhV/var/lib/git/docbuild/linux/Documentation/core-api/workqueue:778: ./kernel/workqueue.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj?hhhNhNubeh}(h]&kernel-inline-documentations-referenceah ]h"]&kernel inline documentations referenceah$]h&]uh1hhhhhhhhMubeh}(h] workqueueah ]h"] workqueueah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksj footnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjjerror_encodingUTF-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confapep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacefile_insertion_enabled raw_enabledKline_length_limitM'syntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_link embed_imagesenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jEjBjjjjjgjqjnjWjTjjjOjLjHjEj0 j- j j j*j'jj}jljijJjGj"jjnjkjjjjj<j9j=j:u nametypes}(jENjNjjNjqNjWNjNjONjHNj0 Nj Nj*NjNjlNjJNj"NjnNjNjNj<Nj=Nuh}(jBhjjjgjjnjmjTjtjjIjLjjEjZj- jKj j3 j'j j}j\ jijjGjojjMjkj-jjqjjj9jj:j?j_jhjjjjj}jjjj j j#j#jm&jr&j!)j&)j+j+j,j,j/j/j2j2j4j4jl5jq5j6j6j8j8j9j9jm;jr;j=j=j?j?jAjAjCjCj-Ej2EjHjHjKjKjOjOj)Qj.QjRjRj-Tj2TjUjUjWjWjZjZj\j\j^j^j,`j1`jajajMdjRdjufjzfjhjhjNjjSjjljlj[nj`njpjpj:uj?ujuxjzxj[|j`|jOjTjjjjj#j(j"j'jjj2j7jjjғjדjKjPj͗jҗj^jcj^jcjrjwj؟jݟjjjjjjjJjOj۫jjίjӯjPjUjjjjjǶj̶jjjoj̺jѺjjjоjվjjjjjjjYj^jjj[j`jjjFjKjjjijnj_jdjj jLjQjjjLjQjjjjjjjLjQj_jdjNjSjjjjjdjij#j(j^jcjjjjj?jDjhjmjjjjjjjjjijnjjjQjVjjjg jl j3 j8 j j jjjj u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.