• Linus Torvalds's avatar
    Merge tag 'wq-for-6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq · ff887eb0
    Linus Torvalds authored
    Pull workqueue updates from Tejun Heo:
     "This cycle, a lot of workqueue changes including some that are
      significant and invasive.
    
       - During v6.6 cycle, unbound workqueues were updated so that they are
         more topology aware and flexible, which among other things improved
         workqueue behavior on modern multi-L3 CPUs. In the process, commit
         636b927e ("workqueue: Make unbound workqueues to use per-cpu
         pool_workqueues") switched unbound workqueues to use per-CPU
         frontend pool_workqueues as a part of increasing front-back mapping
         flexibility.
    
         An unwelcome side effect of this change was that this made max
         concurrency enforcement per-CPU blowing up the maximum number of
         allowed concurrent executions. I incorrectly assumed that this
         wouldn't cause practical problems as most unbound workqueue users
         are self-regulate max concurrency; however, there definitely are
         which don't (e.g. on IO paths) and the drastic increase in the
         allowed max concurrency led to noticeable perf regressions in some
         use cases.
    
         This is now addressed by separating out max concurrency enforcement
         to a separate struct - wq_node_nr_active - which makes @max_active
         consistently mean system-wide max concurrency regardless of the
         number of CPUs or (finally) NUMA nodes. This is a rather invasive
         and, in places, a bit clunky; however, the clunkiness rises from
         the the inherent requirement to handle the disagreement between the
         execution locality domain and max concurrency enforcement domain on
         some modern machines.
    
         See commit 5797b1c1 ("workqueue: Implement system-wide
         nr_active enforcement for unbound workqueues") for more details.
    
       - BH workqueue support is added.
    
         They are similar to per-CPU workqueues but execute work items in
         the softirq context. This is expected to replace tasklet. However,
         currently, it's missing the ability to disable and enable work
         items which is needed to convert many tasklet users. To avoid
         crowding this merge window too much, this will be included in the
         next merge window. A separate pull request will be sent for the
         couple conversion patches that are currently pending.
    
       - Waiman plugged a long-standing hole in workqueue CPU isolation
         where ordered workqueues didn't follow wq_unbound_cpumask updates.
         Ordered workqueues now follow the same rules as other unbound
         workqueues.
    
       - More CPU isolation improvements: Juri fixed another deficit in
         workqueue isolation where unbound rescuers don't respect
         wq_unbound_cpumask. Leonardo fixed delayed_work timers firing on
         isolated CPUs.
    
       - Other misc changes"
    
    * tag 'wq-for-6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq: (54 commits)
      workqueue: Drain BH work items on hot-unplugged CPUs
      workqueue: Introduce from_work() helper for cleaner callback declarations
      workqueue: Control intensive warning threshold through cmdline
      workqueue: Make @flags handling consistent across set_work_data() and friends
      workqueue: Remove clear_work_data()
      workqueue: Factor out work_grab_pending() from __cancel_work_sync()
      workqueue: Clean up enum work_bits and related constants
      workqueue: Introduce work_cancel_flags
      workqueue: Use variable name irq_flags for saving local irq flags
      workqueue: Reorganize flush and cancel[_sync] functions
      workqueue: Rename __cancel_work_timer() to __cancel_timer_sync()
      workqueue: Use rcu_read_lock_any_held() instead of rcu_read_lock_held()
      workqueue: Cosmetic changes
      workqueue, irq_work: Build fix for !CONFIG_IRQ_WORK
      workqueue: Fix queue_work_on() with BH workqueues
      async: Use a dedicated unbound workqueue with raised min_active
      workqueue: Implement workqueue_set_min_active()
      workqueue: Fix kernel-doc comment of unplug_oldest_pwq()
      workqueue: Bind unbound workqueue rescuer to wq_unbound_cpumask
      kernel/workqueue: Let rescuers follow unbound wq cpumask changes
      ...
    ff887eb0
main.c 37.8 KB