Keeping tasks cache-warm —in work-conserving LAVD scheduler
select_cpu, when a task wakes, the scheduler does its best to find an idle core.Stay on the previous CPU, or take an idle one in the same domain?
Stay in this LLC, or wake in a less loaded one?
This talk focuses on the first. If time permits, we also go through the second — inter‑LLC domain migration.
T wakes. Its cache is on cpu A, which is busy running X. Cpu B is idle and holds nothing of T. Work conservation picks B every time.
Neither side is observable. Both are predictions — and while T waits, X keeps evicting its lines.
SIS_CACHEChen Yu · Intel
keeps A idle for T's average sleep
→ slide 9
task warmthDavid Dai · Meta
waits for a warm A if the wait is short
→ slides 7–8
+ enhanced bycompletion timeChangwoo Min · Igalia
prices that wait in time, not tasks
→ slides 12–13
look‑aheadGavin Guo · Igalia
pulls a still-warm task from behind the head
→ slides 10–11
Stay if the previous CPU is idle — or if the predicted wait, time until it stops + nr_queued × avg slice, fits a budget the task's heat stretches up to 2×. Otherwise migrate, and refill.
scx_lavd: Modulate CPU Stickness using Task Warmth — David Dai, Meta, July 2026 · scx #3714
Wake-time warmth stick. 0 = lavd base. The win plateaus at 10–20 µs; 50 µs decays it.
When a short sleeper leaves its CPU idle, the CPU stays cache-hot for the task's average sleep. Another wakee's idle search skips it and takes a cold CPU; the sleeper finds its previous CPU idle and takes it at once. A timer, not a lock — no owner is stored.
[PATCH v2 0/3] Introduce SIS_CACHE to choose previous CPU during task wakeup — Chen Yu, Intel, Nov 2023 · not merged
When a CPU drains the shared domain queue, it looks ahead a few tasks past the head and tries to find one still warm on this CPU, sequentially, in deadline-increasing order; when a warm task is found, it pulls it to the per-CPU queue and keeps every other task in the shared queue for any CPU.
scx_lavd: Add second-pass warm-task pull at domain DSQ dispatch — Gavin Guo, Igalia, Aug 2026 · not upstream
Changwoo Min's completion-time estimate (#3806) prices the wait in time, not tasks: the running task's remaining time plus each queued task's own service time, over the core's capacity. For task warmth, T now waits for its warm CPU behind short work and moves on when long work is really ahead.
today5699c7f08582
per-CPU DSQ only · a count times an average
▼ Changwoo's enhancement: priced in time, not tasks
completion time enhancement80eabdc60198
local + per-CPU DSQ · each task's own service time
Completion time prices each queued task at its own service time, reads the local DSQ, and charges a running task that has outrun its average for the overrun.
Completion time: Changwoo Min, PR #3806 (open) · stickiness change 80eabdc60198, not yet split out
Igalia is a worker-owned cooperative — remote-friendly and consensus-run. We are hiring.
igalia.com/jobs