Lines Matching +full:context +full:- +full:dependent
13 There are many cases where an asynchronous process execution context
17 When such an asynchronous execution context is needed, a work item
19 independent thread serves as the asynchronous execution context. The
33 thread system-wide. A single MT wq needed to keep around the same
42 worker pool. An MT wq could provide only one execution context per CPU
45 including proneness to deadlocks around the single execution context.
60 * Use per-CPU unified worker pools shared by all wq to provide
80 A work item can be executed in either a thread or the BH (softirq) context.
85 worker-pools.
87 The cmwq design differentiates between the user-facing workqueues that
89 which manages worker-pools and processes the queued work items.
91 There are two worker-pools, one for normal work items and the other
93 worker-pools to serve work items queued on unbound workqueues - the
97 concurrent execution context, there's no need to worry about concurrency.
98 Each per-CPU BH worker pool contains only one pseudo worker which represents
99 the BH execution context. A BH workqueue can be considered a convenience
110 When a work item is queued to a workqueue, the target worker-pool is
112 and appended on the shared worklist of the worker-pool. For example,
114 be queued on the worklist of either normal or highpri worker-pool that
123 Each worker-pool bound to an actual CPU implements concurrency
124 management by hooking into the scheduler. The worker-pool is notified
130 workers on the CPU, the worker-pool doesn't start execution of a new
152 wq's that have a rescue-worker reserved for execution under memory
153 pressure. Else it is possible that the worker-pool deadlocks waiting
162 removal. ``alloc_workqueue()`` takes three arguments - ``@name``,
173 ---------
177 workqueues are always per-CPU and all BH work items are executed in the
178 queueing CPU's softirq context in the queueing order.
187 Work items queued to a per-cpu wq are bound to a specific CPU.
194 worker-pools which host workers which are not bound to any
196 context provider without concurrency management. The unbound
197 worker-pools try to start execution of work items as soon as
217 execution context regardless of memory pressure.
221 worker-pool of the target cpu. Highpri worker-pools are
224 Note that normal and highpri worker-pools don't interact with
232 worker-pool from starting execution. This is useful for bound
239 non-CPU-intensive work items can delay execution of CPU
246 --------------
251 at the same time per CPU. This is always a per-CPU attribute, even for
347 ``WQ_MEM_RECLAIM`` set has an execution context reserved for it. If
381 scope of "cache_shard", it will group CPUs into sub-LLC shards. A work item
395 worker on the same CPU. This makes unbound workqueues behave as per-cpu
408 CPUs are grouped into sub-LLC shards of at most ``wq_cache_shard_size``
436 item starts execution, workqueue makes a best-effort attempt to ensure
455 kernel, there exists a pronounced trade-off between locality and utilization
462 testing with dm-crypt clearly illustrates this trade-off.
464 The tests are run on a CPU with 12-cores/24-threads split across four L3
466 ``/dev/dm-0`` is a dm-crypt device created on NVME SSD (Samsung 990 PRO) and
471 -------------------------------------------------------------
475 $ fio --filename=/dev/dm-0 --direct=1 --rw=randrw --bs=32k --ioengine=libaio \
476 --iodepth=64 --runtime=60 --numjobs=24 --time_based --group_reporting \
477 --name=iops-test-job --verify=sha512
479 There are 24 issuers, each issuing 64 IOs concurrently. ``--verify=sha512``
486 .. list-table::
488 :header-rows: 1
490 * - Affinity
491 - Bandwidth (MiBps)
492 - CPU util (%)
494 * - system
495 - 1159.40 ±1.34
496 - 99.31 ±0.02
498 * - cache
499 - 1166.40 ±0.89
500 - 99.34 ±0.01
502 * - cache (strict)
503 - 1166.00 ±0.71
504 - 99.35 ±0.01
508 machine but the cache-affine ones outperform by 0.6% thanks to improved
513 -----------------------------------------------------
517 $ fio --filename=/dev/dm-0 --direct=1 --rw=randrw --bs=32k \
518 --ioengine=libaio --iodepth=64 --runtime=60 --numjobs=8 \
519 --time_based --group_reporting --name=iops-test-job --verify=sha512
521 The only difference from the previous scenario is ``--numjobs=8``. There are
525 .. list-table::
527 :header-rows: 1
529 * - Affinity
530 - Bandwidth (MiBps)
531 - CPU util (%)
533 * - system
534 - 1155.40 ±0.89
535 - 97.41 ±0.05
537 * - cache
538 - 1154.40 ±1.14
539 - 96.15 ±0.09
541 * - cache (strict)
542 - 1112.00 ±4.64
543 - 93.26 ±0.35
556 -----------------------------------------------------------
560 $ fio --filename=/dev/dm-0 --direct=1 --rw=randrw --bs=32k \
561 --ioengine=libaio --iodepth=64 --runtime=60 --numjobs=4 \
562 --time_based --group_reporting --name=iops-test-job --verify=sha512
564 Again, the only difference is ``--numjobs=4``. With the number of issuers
566 and the bandwidth becomes dependent on completion latencies.
568 .. list-table::
570 :header-rows: 1
572 * - Affinity
573 - Bandwidth (MiBps)
574 - CPU util (%)
576 * - system
577 - 993.60 ±1.82
578 - 75.49 ±0.06
580 * - cache
581 - 973.40 ±1.52
582 - 74.90 ±0.07
584 * - cache (strict)
585 - 828.20 ±4.49
586 - 66.84 ±0.29
593 ------------------------------
597 impact is dependent on the distances between the scopes and may be more
600 While the loss of work-conservation in certain scenarios hurts, it is a lot
611 ``WQ_CPU_INTENSIVE`` per-cpu workqueue. There is no real advanage to the
617 * The loss of work-conservation in non-strict affinity scopes is likely
620 work-conservation in most cases. As such, it is possible that future
662 pod_node [0]=-1
668 pool[01] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 0
670 pool[03] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 1
672 pool[05] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 2
674 pool[07] ref= 1 nice=-20 idle/workers= 2/ 2 cpu= 3
678 pool[11] ref= 1 nice=-20 idle/workers= 1/ 1 cpus=0000000f
679 pool[12] ref= 2 nice=-20 idle/workers= 1/ 1 cpus=00000003
680 pool[13] ref= 2 nice=-20 idle/workers= 1/ 1 cpus=0000000c
682 Workqueue CPU -> pool
708 events 18545 0 6.1 0 5 - -
709 events_highpri 8 0 0.0 0 0 - -
710 events_long 3 0 0.0 0 0 - -
711 events_unbound 38306 0 0.1 - 7 - -
712 events_freezable 0 0 0.0 0 0 - -
713 events_power_efficient 29598 0 0.2 0 0 - -
714 events_freezable_pwr_ef 10 0 0.0 0 0 - -
715 sock_diag_events 0 0 0.0 0 0 - -
718 events 18548 0 6.1 0 5 - -
719 events_highpri 8 0 0.0 0 0 - -
720 events_long 3 0 0.0 0 0 - -
721 events_unbound 38322 0 0.1 - 7 - -
722 events_freezable 0 0 0.0 0 0 - -
723 events_power_efficient 29603 0 0.2 0 0 - -
724 events_freezable_pwr_ef 10 0 0.0 0 0 - -
725 sock_diag_events 0 0 0.0 0 0 - -
772 Non-reentrance Conditions
775 Workqueue guarantees that a work item cannot be re-entrant if the following
783 executed by at most one worker system-wide at any given time.
793 .. kernel-doc:: include/linux/workqueue.h
795 .. kernel-doc:: kernel/workqueue.c