linux/drivers
Shrikanth Hegde 27d47ebce4 virt/steal_governor: Implement steal_governor policy loop
Schedule work at regular intervals to implement the steal_governor
policy loop, which monitors steal time and takes action on the state of
preferred CPUs. The interval is determined by the interval_ms parameter.
schedule_delayed_work() is used since interval_ms is on the order of
milliseconds and the work does not need to happen instantly.

Periodic policy loop essentially does:

- Gets the total/delta steal values and cpus to use steal_ratio.
- Calculate the steal_ratio as below.

       steal_ratio = (delta_steal * 100*100)/(delta_ns * num_cpus())

  It is calculated this way to consider the fractional values of steal
  time. I.e 10 means 0.1% steal time. A few tricks such as
  divide by 10,000 are used to avoid possible overflow.
- If steal ratio is higher than high threshold, call the method to reduce
  the preferred CPUs.
- If steal ratio is lower or equal to low threshold, call the method to
  increase the preferred CPUs.
- If the steal ratio falls in between, no action is taken.
- Ensures design constraints always met.
  1. At least one core/CPU must be there in preferred mask.
  2. preferred CPUs is subset of active CPUs.
  If not met, then restore preferred CPUs to active and stop
  requeue of the work. Driver is effectively non-functional after that.

Note that design checks are always performed. This helps avoid placing
driver-specific design constraints inside the core CPU hotplug mechanism.
User may offline specific set of CPUs that could leave the preferred
mask as empty. With the design check performed always, driver gracefully
shuts down upon detecting that edge case.

In order to help the above loop, a few helper functions have been added.
1. get_system_steal_time()
- steal governor takes global view of steal time instead of individual
  vCPU. Collect the steal values across the vCPUs of interest.
- Sum up steal time values across possible CPUs. This helps to keep it
  a monotonically increasing number and avoids spikes due to CPU
  hotplug.

2. decrease_preferred_cpus()
- Called when there is high steal time. It needs to decide which CPUs to
  mark as non-preferred.
- Get first housekeeping CPU and its core mask. Mark it as
  protected core. This helps to keep at least one core as preferred.
  (kernel ensures at least one housekeeping CPU stays active.)
- Find the last CPU outside of this protected core mask. i.e target CPU
- Based on that target CPU, get its sibling and mark them as
  non-preferred.

3. increase_preferred_cpus()
- Called when there is low steal time. It needs to decide which CPUs to
  mark as preferred and set that state.
- Get the first active non-preferred CPUs. This likely is the last
  set of CPUs being marked as non-preferred.
- get the siblings of that CPU and mark them as preferred.

4. get_system_cpus()
- informs how many CPUs needs to be considered for steal_ratio
  calculations.
- Since only active CPUs effectively contribute to steal time delta,
  returns number of active CPUs. This also helps to avoid dilution of
  thresholds in sparsely populated systems.

Notes:
1. Using core instead of individual CPUs performs better as SMT is
   quite common and some hypervisor such as powerVM does core scheduling.

2. This doesn't do any NUMA splicing to keep the code simpler and
   minimal overhead. Current code expects CPUs spread uniformly
   across NUMA nodes.

Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/20260928053728.797539-13-sshegde@linux.ibm.com
2026-09-28 08:44:43 +02:00
..
accel drm for 7.3-rc1 2026-08-21 08:41:00 -07:00
accessibility
acpi Revert "ACPI: scan: Defer device power initialization" 2026-08-27 16:03:20 +02:00
amba
android Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
ata pci-v7.3-changes 2026-08-23 12:44:10 -07:00
atm
auxdisplay auxdisplay for v7.3-1 2026-08-24 08:15:59 -07:00
base sysfs: Add preferred CPU file 2026-09-28 08:44:41 +02:00
bcma
block mm.git review status for linus..mm-stable 2026-08-27 09:17:06 -07:00
bluetooth Including fixes from Bluetooth, IPSec and Netfilter. 2026-08-27 13:53:43 -07:00
bus Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
cache
cdrom
cdx
char ipmi: Fix some minor issues, add async init 2026-08-28 16:32:12 -07:00
clk MFD for v7.3 2026-08-27 10:45:08 -07:00
clocksource hyperv-next for v7.3-rc1 2026-08-26 16:47:40 -07:00
comedi
connector
counter Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
cpufreq More power management updates for 7.3-rc1 2026-08-26 14:13:26 -07:00
cpuidle MFD for v7.3 2026-08-27 10:45:08 -07:00
crypto dmaengine updates for v7.3 2026-08-24 12:21:15 -07:00
cxl
dax mm.git review status for mm-hotfixes-stable..mm-stable 2026-08-20 18:17:08 -07:00
dca
devfreq
dibs net/dibs: Correct freeing of dmb_clientid_arr 2026-08-12 17:08:05 -07:00
dio
dma dmaengine updates for v7.3 2026-08-24 12:21:15 -07:00
dma-buf Linux 7.2 2026-08-20 10:58:44 +10:00
dpll Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2026-08-18 10:42:41 -07:00
edac x86/msr updates for v7.3: 2026-08-18 14:02:15 -07:00
eisa
extcon
firewire firewire updates for v7.3 2026-08-22 08:41:28 -07:00
firmware remoteproc updates for v7.3 2026-08-25 14:03:31 -07:00
fpga Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
fsi
fwctl rust: introduce abstractions for fwctl 2026-08-14 19:21:17 -03:00
gnss
gpib Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
gpio gpio updates for v7.3-rc1 2026-08-19 09:10:07 -07:00
gpu drm next/fixes for 7.3-rc1 2026-08-28 16:37:55 -07:00
greybus
hid platform-drivers-x86 for v7.3-1 2026-08-24 10:16:35 -07:00
hsi HSI changes for the 7.3 series 2026-08-21 12:01:23 -07:00
hte
hv hyperv-next for v7.3-rc1 2026-08-26 16:47:40 -07:00
hwmon Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
hwspinlock
hwtracing Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
i2c i2c-fixes for v7.3-rc1 2026-08-30 10:53:24 -07:00
i3c i3c: dw: reduce do_daa time if there's no client 2026-08-19 09:28:33 +02:00
idle
iio More thermal control updates for 7.3-rc1 2026-08-26 14:21:30 -07:00
infiniband Including fixes from Bluetooth, IPSec and Netfilter. 2026-08-27 13:53:43 -07:00
input Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
interconnect This pull request contains the following interconnect updates for 2026-08-19 09:55:37 +02:00
iommu dma-mapping updates for Linux 7.3: 2026-08-24 11:35:46 -07:00
ipack Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
irqchip pci-v7.3-changes 2026-08-23 12:44:10 -07:00
leds LEDs for v7.3 2026-08-27 11:05:51 -07:00
macintosh
mailbox mailbox: add Axiado AX3005 mailbox driver 2026-08-23 15:41:13 -05:00
mcb
md for-7.3/block-20260819 2026-08-20 13:55:16 -07:00
media USB / Thunderbolt changes for 7.3-rc1 2026-08-25 10:44:46 -07:00
memory * Raw NAND changes 2026-08-23 09:11:21 -07:00
memstick
message
mfd MFD for v7.3 2026-08-27 10:45:08 -07:00
misc Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
mmc MMC core: 2026-08-21 11:58:08 -07:00
most
mtd This pull request contains updates for UBI and UBIFS: 2026-08-28 10:59:07 -07:00
mux
net Including fixes from Bluetooth, IPSec and Netfilter. 2026-08-27 13:53:43 -07:00
nfc Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2026-08-18 10:42:41 -07:00
ntb NTB: ntb_transport: Reject oversized TX buffers 2026-08-20 13:43:24 -07:00
nubus
nvdimm vhost,vdpa,virtio: fixes, features 2026-08-20 17:07:50 -07:00
nvme dmaengine updates for v7.3 2026-08-24 12:21:15 -07:00
nvmem Char/Misc/IIO/etc driver update for 7.3-rc1 2026-08-25 09:38:50 -07:00
of Devicetree fixes for v7.3, part 1: 2026-08-27 12:53:43 -07:00
opp
parisc parisc: eisa: Fix infinite loop when parsing invalid IRQ value 2026-08-18 11:43:05 +02:00
parport
pci hyperv-next for v7.3-rc1 2026-08-26 16:47:40 -07:00
pcmcia
peci
perf RISC-V updates for v7.3 2026-08-20 14:53:54 -07:00
phy Mostly the usual clk driver updates and new SoC additions plus non-critical 2026-08-26 11:14:30 -07:00
pinctrl Pin control bulk changes for kernel v7.3 2026-08-24 08:46:03 -07:00
platform MFD for v7.3 2026-08-27 10:45:08 -07:00
pmdomain Mostly the usual clk driver updates and new SoC additions plus non-critical 2026-08-26 11:14:30 -07:00
pnp
power power sequencing updates for v7.3-rc1 2026-08-26 08:45:09 -07:00
powercap More power management updates for 7.3-rc1 2026-08-26 14:13:26 -07:00
pps
ps3
ptp ptp: netc: fix period truncation and potential divide-by-zero in PEROUT 2026-08-22 12:34:39 -07:00
pwm Driver core changes for 7.3-rc1 2026-08-19 10:42:18 -07:00
rapidio
ras
regulator regulator: Fix for v7.3 2026-08-27 12:21:56 -07:00
remoteproc
resctrl arm64 updates for 7.3 2026-08-18 11:57:17 -07:00
reset Mostly the usual clk driver updates and new SoC additions plus non-critical 2026-08-26 11:14:30 -07:00
rpmsg
rtc RTC for 7.3 2026-08-28 09:53:43 -07:00
s390 Arm: 2026-08-25 11:48:04 -07:00
sbus
scsi SCSI updates for 7.3 2026-08-29 11:55:36 -07:00
sh
siox
slimbus
soc remoteproc updates for v7.3 2026-08-25 14:03:31 -07:00
soundwire soundwire updates for 7.3 2026-08-24 12:16:16 -07:00
spi spi: Fixes for v7.3 2026-08-27 12:38:05 -07:00
spmi
ssb
staging Staging driver updates for 7.3-rc1 2026-08-25 10:16:19 -07:00
target USB / Thunderbolt changes for 7.3-rc1 2026-08-25 10:44:46 -07:00
tc
tee soc: drivers for 7.3 2026-08-18 19:40:29 -07:00
thermal MFD for v7.3 2026-08-27 10:45:08 -07:00
thunderbolt thunderbolt: Changes for v7.3 merge window 2026-08-19 10:01:59 +02:00
tty TTY / Serial driver updates for 7.3-rc1 2026-08-25 10:59:12 -07:00
ufs SCSI updates for 7.3 2026-08-29 11:55:36 -07:00
uio
usb Including fixes from Bluetooth, IPSec and Netfilter. 2026-08-27 13:53:43 -07:00
vdpa vduse: Add suspend 2026-08-19 06:38:48 -04:00
vfio mm.git review status for mm-hotfixes-stable..mm-stable 2026-08-20 18:17:08 -07:00
vhost vhost,vdpa,virtio: fixes, features 2026-08-20 17:07:50 -07:00
video Backlight for v7.3 2026-08-27 11:16:39 -07:00
virt virt/steal_governor: Implement steal_governor policy loop 2026-09-28 08:44:43 +02:00
virtio virtio_ring: fix infinite loop in virtnet_poll_cleantx when device is broken 2026-08-19 06:38:47 -04:00
w1
watchdog MFD for v7.3 2026-08-27 10:45:08 -07:00
xen sched: Convert paravirt_steal to new static key APIs 2026-09-02 10:28:24 +02:00
zorro
Kconfig
Makefile