On Thu, Oct 31, 2024 at 10:07 AM Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > > Swap the order of the checks in tdp_mmu_iter_cond_resched() so that KVM > checks to see if a resched is needed _before_ checking to see if yielding > must be disallowed to guarantee forward progress. Iterating over TDP MMU > SPTEs is a hot path, e.g. tearing down a root can touch millions of SPTEs, > and not needing to reschedule is by far the common case. On the other > hand, disallowing yielding because forward progress has not been made is a > very rare case. > > Returning early for the common case (no resched), effectively reduces the > number of checks from 2 to 1 for the common case, and should make the code > slightly more predictable for the CPU. > > To resolve a weird conundrum where the forward progress check currently > returns false, but the need resched check subtly returns iter->yielded, > which _should_ be false (enforced by a WARN), return false unconditionally > (which might also help make the sequence more predictable). If KVM has a > bug where iter->yielded is left danging, continuing to yield is neither > right nor wrong, it was simply an artifact of how the original code was > written. > > Unconditionally returning false when yielding is unnecessary or unwanted > will also allow extracting the "should resched" logic to a separate helper > in a future patch. > > Cc: David Matlack <dmatlack@xxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Feel free to add: Reviewed-by: James Houghton <jthoughton@xxxxxxxxxx>