[PATCH 00/20] kthread: Introduce preferred affinity v4

Frederic Weisbecker posted 20 patches 2 months ago
arch/arm/common/bL_switcher.c                 |  10 +-
arch/x86/kernel/cpu/resctrl/pseudo_lock.c     |  28 +--
arch/x86/kvm/i8254.c                          |   2 +-
crypto/crypto_engine.c                        |   2 +-
drivers/cpufreq/cppc_cpufreq.c                |   2 +-
drivers/firmware/stratix10-svc.c              |   9 +-
drivers/gpu/drm/drm_vblank_work.c             |   2 +-
.../drm/i915/gem/selftests/i915_gem_context.c |   2 +-
drivers/gpu/drm/i915/gt/selftest_execlists.c  |   2 +-
drivers/gpu/drm/i915/gt/selftest_hangcheck.c  |   2 +-
drivers/gpu/drm/i915/gt/selftest_slpc.c       |   2 +-
drivers/gpu/drm/i915/selftests/i915_request.c |   8 +-
drivers/gpu/drm/msm/disp/msm_disp_snapshot.c  |   2 +-
drivers/gpu/drm/msm/msm_atomic.c              |   2 +-
drivers/gpu/drm/msm/msm_gpu.c                 |   2 +-
drivers/gpu/drm/msm/msm_kms.c                 |   2 +-
.../platform/chips-media/wave5/wave5-vpu.c    |   2 +-
drivers/net/dsa/mv88e6xxx/chip.c              |   2 +-
drivers/net/ethernet/intel/ice/ice_dpll.c     |   2 +-
drivers/net/ethernet/intel/ice/ice_gnss.c     |   2 +-
drivers/net/ethernet/intel/ice/ice_ptp.c      |   2 +-
drivers/platform/chrome/cros_ec_spi.c         |   2 +-
drivers/ptp/ptp_clock.c                       |   2 +-
drivers/scsi/bnx2fc/bnx2fc_fcoe.c             |   7 +-
drivers/scsi/bnx2i/bnx2i_init.c               |   7 +-
drivers/scsi/qedi/qedi_main.c                 |   6 +-
drivers/soc/fsl/qbman/qman_test_stash.c       |   6 +-
drivers/spi/spi.c                             |   2 +-
drivers/usb/typec/tcpm/tcpm.c                 |   2 +-
drivers/vdpa/vdpa_sim/vdpa_sim.c              |   2 +-
drivers/watchdog/watchdog_dev.c               |   2 +-
fs/erofs/zdata.c                              |   2 +-
include/linux/cpuhotplug.h                    |   1 +
include/linux/kthread.h                       |  56 ++++-
kernel/kallsyms_selftest.c                    |   4 +-
kernel/kthread.c                              | 201 ++++++++++++++++--
kernel/rcu/tree.c                             |  94 ++------
kernel/rcu/tree_plugin.h                      |  11 +-
kernel/sched/core.c                           |  17 +-
kernel/sched/ext.c                            |   2 +-
kernel/workqueue.c                            |   2 +-
lib/test_objpool.c                            |  19 +-
mm/compaction.c                               |  43 +---
mm/vmscan.c                                   |   8 +-
net/core/pktgen.c                             |   7 +-
net/dsa/tag_ksz.c                             |   2 +-
net/dsa/tag_ocelot_8021q.c                    |   2 +-
net/dsa/tag_sja1105.c                         |   2 +-
48 files changed, 339 insertions(+), 261 deletions(-)
[PATCH 00/20] kthread: Introduce preferred affinity v4
Posted by Frederic Weisbecker 2 months ago
Affining kthreads follow either of 4 existing different patterns:

1) Per-CPU kthreads must stay affine to a single CPU and never execute
   relevant code on any other CPU. This is currently handled by smpboot
   code which takes care of CPU-hotplug operations.

2) Kthreads that _have_ to be affine to a specific set of CPUs and can't
   run anywhere else. The affinity is set through kthread_bind_mask()
   and the subsystem takes care by itself to handle CPU-hotplug operations.

3) Kthreads that _prefer_ to be affine to a specific NUMA node.

4) Similar to the previous point but kthreads have a _preferred_ affinity
   different than a node. It is set manually like any other task and
   CPU-hotplug is supposed to be handled by the relevant subsystem so
   that the task is properly reaffined whenever a given CPU from the
   preferred affinity comes up or down. Also care must be taken so that
   the preferred affinity doesn't cross housekeeping cpumask boundaries.

Currently the preferred affinity patterns (3 and 4) have at least 4
identified users, with more or less success when it comes to handle
CPU-hotplug operations and CPU isolation.

This is a infrastructure proposal to handle this (after cleanups from 01
to 10).

Changes since v3:

_ Handle CPU down from scheduler fallback (new patch 11/20), suggested
  by Michal Hocko
_ Simplify accordlingly 13/20 and 16/20
_ Add acks

Frederic Weisbecker (20):
  arm/bL_switcher: Use kthread_run_on_cpu()
  x86/resctrl: Use kthread_run_on_cpu()
  firmware: stratix10-svc: Use kthread_run_on_cpu()
  scsi: bnx2fc: Use kthread_create_on_cpu()
  scsi: bnx2i: Use kthread_create_on_cpu()
  scsi: qedi: Use kthread_create_on_cpu()
  soc/qman: test: Use kthread_run_on_cpu()
  kallsyms: Use kthread_run_on_cpu()
  lib: test_objpool: Use kthread_run_on_cpu()
  net: pktgen: Use kthread_create_on_node()
  sched: Handle CPU isolation on last resort fallback rq selection
  kthread: Make sure kthread hasn't started while binding it
  kthread: Default affine kthread to its preferred NUMA node
  mm: Create/affine kcompactd to its preferred node
  mm: Create/affine kswapd to its preferred node
  kthread: Implement preferred affinity
  rcu: Use kthread preferred affinity for RCU boost
  kthread: Unify kthread_create_on_cpu() and
    kthread_create_worker_on_cpu() automatic format
  treewide: Introduce kthread_run_worker[_on_cpu]()
  rcu: Use kthread preferred affinity for RCU exp kworkers

 arch/arm/common/bL_switcher.c                 |  10 +-
 arch/x86/kernel/cpu/resctrl/pseudo_lock.c     |  28 +--
 arch/x86/kvm/i8254.c                          |   2 +-
 crypto/crypto_engine.c                        |   2 +-
 drivers/cpufreq/cppc_cpufreq.c                |   2 +-
 drivers/firmware/stratix10-svc.c              |   9 +-
 drivers/gpu/drm/drm_vblank_work.c             |   2 +-
 .../drm/i915/gem/selftests/i915_gem_context.c |   2 +-
 drivers/gpu/drm/i915/gt/selftest_execlists.c  |   2 +-
 drivers/gpu/drm/i915/gt/selftest_hangcheck.c  |   2 +-
 drivers/gpu/drm/i915/gt/selftest_slpc.c       |   2 +-
 drivers/gpu/drm/i915/selftests/i915_request.c |   8 +-
 drivers/gpu/drm/msm/disp/msm_disp_snapshot.c  |   2 +-
 drivers/gpu/drm/msm/msm_atomic.c              |   2 +-
 drivers/gpu/drm/msm/msm_gpu.c                 |   2 +-
 drivers/gpu/drm/msm/msm_kms.c                 |   2 +-
 .../platform/chips-media/wave5/wave5-vpu.c    |   2 +-
 drivers/net/dsa/mv88e6xxx/chip.c              |   2 +-
 drivers/net/ethernet/intel/ice/ice_dpll.c     |   2 +-
 drivers/net/ethernet/intel/ice/ice_gnss.c     |   2 +-
 drivers/net/ethernet/intel/ice/ice_ptp.c      |   2 +-
 drivers/platform/chrome/cros_ec_spi.c         |   2 +-
 drivers/ptp/ptp_clock.c                       |   2 +-
 drivers/scsi/bnx2fc/bnx2fc_fcoe.c             |   7 +-
 drivers/scsi/bnx2i/bnx2i_init.c               |   7 +-
 drivers/scsi/qedi/qedi_main.c                 |   6 +-
 drivers/soc/fsl/qbman/qman_test_stash.c       |   6 +-
 drivers/spi/spi.c                             |   2 +-
 drivers/usb/typec/tcpm/tcpm.c                 |   2 +-
 drivers/vdpa/vdpa_sim/vdpa_sim.c              |   2 +-
 drivers/watchdog/watchdog_dev.c               |   2 +-
 fs/erofs/zdata.c                              |   2 +-
 include/linux/cpuhotplug.h                    |   1 +
 include/linux/kthread.h                       |  56 ++++-
 kernel/kallsyms_selftest.c                    |   4 +-
 kernel/kthread.c                              | 201 ++++++++++++++++--
 kernel/rcu/tree.c                             |  94 ++------
 kernel/rcu/tree_plugin.h                      |  11 +-
 kernel/sched/core.c                           |  17 +-
 kernel/sched/ext.c                            |   2 +-
 kernel/workqueue.c                            |   2 +-
 lib/test_objpool.c                            |  19 +-
 mm/compaction.c                               |  43 +---
 mm/vmscan.c                                   |   8 +-
 net/core/pktgen.c                             |   7 +-
 net/dsa/tag_ksz.c                             |   2 +-
 net/dsa/tag_ocelot_8021q.c                    |   2 +-
 net/dsa/tag_sja1105.c                         |   2 +-
 48 files changed, 339 insertions(+), 261 deletions(-)

-- 
2.46.0