• Tejun Heo's avatar
    workqueue: Add multiple affinity scopes and interface to select them · 63c5484e
    Tejun Heo authored
    Add three more affinity scopes - WQ_AFFN_CPU, SMT and CACHE - and make CACHE
    the default. The code changes to actually add the additional scopes are
    trivial.
    
    Also add module parameter "workqueue.default_affinity_scope" to override the
    default scope and "affinity_scope" sysfs file to configure it per workqueue.
    wq_dump.py and documentations are updated accordingly.
    
    This enables significant flexibility in configuring how unbound workqueues
    behave. If affinity scope is set to "cpu", it'll behave close to a per-cpu
    workqueue. On the other hand, "system" removes all locality boundaries.
    
    Many modern machines have multiple L3 caches often while being mostly
    uniform in terms of memory access. Thus, workqueue's previous behavior of
    spreading work items in each NUMA node had negative performance implications
    from unncessarily crossing L3 boundaries between issue and execution.
    However, picking a finer grained affinity scope also has a downside in that
    an issuer in one group can't utilize CPUs in other groups.
    
    While dependent on the specifics of workload, there's usually a noticeable
    penalty in crossing L3 boundaries, so let's default to CACHE. This issue
    will be further addressed and documented with examples in future patches.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    63c5484e
workqueue.c 185 KB