Re: [PATCH] sched: Skip schedule() in sched_yield() when CPU has no other work

From: Peter Zijlstra

Date: Mon Feb 02 2026 - 10:16:18 EST


On Mon, Feb 02, 2026 at 06:00:38AM -0800, Daniel Hodges wrote:
> When a task calls sched_yield() but is the only runnable task on its
> CPU with no pending wakeups, there's nothing to yield to. In this case,
> skip the schedule() overhead entirely and return immediately.
>
> The yield_task() callback is still invoked to preserve per-class
> semantics (e.g., SCHED_DEADLINE's dl_yielded flag for bandwidth
> reclamation). The early exit only occurs after yield_task() completes
> and only if nr_running == 1 and ttwu_pending is false.
>
> Testing performed in a 32-CPU VM using virtme-ng:
>
> stress-ng --yield 8, unpinned workers, 10s each, 30 runs:
> Baseline: 10.18M yields/sec
> Optimized: 11.58M yields/sec
>
> The optimization benefits lightly-loaded systems and CPU-pinned
> workloads where tasks are often alone on their CPUs. On loaded systems
> where CPUs have multiple runnable tasks, the check fails and we fall
> through to the normal schedule() path with no regression.

What is calling sched_yield() enough for this to matter? Calling
sched_yield() outside of FIFO/DL is basically UB.