[PATCH v6 00/23] sched: Introduce cpu_preferred_mask and steal-driven vCPU backoff
From: Shrikanth Hegde <hidden>
Date: 2026-07-01 14:17:43
Also in:
lkml
Very briefly, - Maintain set of CPUs which can be used by workload. It is denoted as cpu_preferred_mask - Periodically compute the steal time. If steal time is high/low based on the thresholds, either reduce/increase the preferred CPUs. This is handled in a new driver called steal_monitor - If a CPU is marked as non-preferred, push the task running on it if possible. - Use this CPU state in wakeup and load balance to ensure tasks run within preferred CPUs. For more details on idea, problem statement and performance numbers, please refer to cover-letter of v2[2] and OSPM talk[1]. *** Please review and provide your feedback!! *** [1]:https://youtu.be/adxUKFPlOp0 [2] v2: https://lore.kernel.org/all/20260407191950.643549-1-sshegde@linux.ibm.com/#t (local) [3] v5: https://lore.kernel.org/all/20260625124648.802832-1-sshegde@linux.ibm.com/ (local) Thank you very much for feedback so far. This has helped the code to evolve towards a clear abstraction layers and get simplified. (Hopefully). Apologies in advance if I have missed addressing any comments. If so would be purely accidental, not in any way intentional. base commit: tip/sched/core at 'commit b2463ebf2674 ("sched/debug: Remove unused schedstats")' v5->v6: - Drop 1st patch. It is already in sched/core. Thanks Peter for picking it up. - make cpu_preferred_mask as EXPORT_SYMBOL_GPL (Peter Zijlstra) - Make set_preferred_cpu a NOP when CONFIG_PREFERRED_CPU=n, and still keep assign_cpu macro for =y case. (Peter Zijlstra and Yury Norov) - Drop the optimization of caching the preferred state in select_fallback_rq. Initially had thought of splitting v5's patch into two. Then later found that having the cached value exposes a race scenario where task affinity could get reset due to cached value if mask changed after it was cached. - Drop wakeup patch (Peter Zijlstra). No performance degradation seen. If CPU is non-preferred select_fallback_rq gets called in wakeup path. Additional checks of available_idle_cpu is not necessary. Hence the drop. - Address CPU hotplug related concerns of accessing active_mask in steal monitor driver code (sashiko) - Address concerns over u64 overflow (sashiko) - Make decrease_preferred_cpus work correctly if nohz_full=<last_set_of_CPUS. Don't assume housekeeping core is always at beginning, (sashiko) - Added a optimization for common case where nohz_full=<empty> - Fixed a few documentation nits (Randy Dunlap) - Fixed "this patch" reference in changelogs (Peter Zijlstra) Let me know if there is any critical information is missing regarding new driver such as policy, documentation or missing implementation. I have ensured checkpatch --strict is happy. As mentioned in previous v5[3]'s cover-letter, I am looking for guidance on the below concern that will arise. I think there should be a MAINTAINERS file entry for new driver. I don't see a drivers/virt/* entry. Either as a new entry for driver or a few file in SCHEDULER entry. Let me know if/what I should add it. Shrikanth Hegde (23): sched/docs: Document cpu_preferred_mask and Preferred CPU concept kconfig: Provide PREFERRED_CPU option cpumask: Introduce cpu_preferred_mask sysfs: Add preferred CPU file sched/core: Try to use a preferred CPU in is_cpu_allowed sched/fair: load balance only among preferred CPUs sched/fair: Pull the load on preferred CPU sched/core: Keep tick on non-preferred CPUs until tasks are out sched/core: Push current task from non preferred CPU sched/debug: Add migration stats due to non preferred CPUs virt/steal_monitor: Add documentation virt: Introduce steal monitor driver virt/steal_monitor: Restore to active on module disable virt/steal_monitor: Define steal_monitor structure virt/steal_monitor: Add control knobs for handling steal values virt/steal_monitor: Compute work at regular intervals virt/steal_monitor: Provide default method to get systemwide steal time virt/steal_monitor: Provide default method to inc/dec preferred CPUs virt/steal_monitor: Provide default method to get num of CPUs for steal ratio virt/steal_monitor: Act on steal values at regular intervals virt/steal_monitor: Add direction control virt/steal_monitor: Add design check of preferred subset of active virt/steal_monitor: Optimise decrease_preferred_cpus when all CPUs are housekeeping .../ABI/testing/sysfs-devices-system-cpu | 11 ++ Documentation/driver-api/index.rst | 1 + Documentation/driver-api/steal-monitor.rst | 99 +++++++++++++ Documentation/scheduler/sched-arch.rst | 56 ++++++++ drivers/base/cpu.c | 8 ++ drivers/virt/Makefile | 1 + drivers/virt/steal_monitor/Makefile | 14 ++ drivers/virt/steal_monitor/defaults.c | 129 +++++++++++++++++ drivers/virt/steal_monitor/sm_core.c | 130 ++++++++++++++++++ drivers/virt/steal_monitor/sm_core.h | 33 +++++ include/linux/cpumask.h | 27 +++- include/linux/sched.h | 1 + kernel/Kconfig.preempt | 14 ++ kernel/cpu.c | 6 + kernel/sched/core.c | 127 ++++++++++++++++- kernel/sched/debug.c | 1 + kernel/sched/fair.c | 12 +- kernel/sched/sched.h | 17 +++ 18 files changed, 682 insertions(+), 5 deletions(-) create mode 100644 Documentation/driver-api/steal-monitor.rst create mode 100644 drivers/virt/steal_monitor/Makefile create mode 100644 drivers/virt/steal_monitor/defaults.c create mode 100644 drivers/virt/steal_monitor/sm_core.c create mode 100644 drivers/virt/steal_monitor/sm_core.h -- 2.47.3