[PATCH v6 00/23] sched: Introduce cpu_preferred_mask and steal-driven vCPU backoff
From: Shrikanth Hegde
Date: Wed Jul 01 2026 - 10:18:19 EST
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@xxxxxxxxxxxxx/#t
[3] v5: https://lore.kernel.org/all/20260625124648.802832-1-sshegde@xxxxxxxxxxxxx/
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