On 21/10/2026 13:18, Arunpravin Paneer Selvam wrote:
From: Arunpravin Paneer Selvam <[email protected]>

Range-restricted allocations (the visible-VRAM aperture) skip
dirty_steer_window() and reach __alloc_range_bias() with no clear/dirty
eligibility guard, so a dirty allocation freely splits clear extents (and
vice versa), interleaving the two classes until no large same-class run
survives and a 4K scanout pin fails with -ENOSPC. Use a two-pass range
search instead: block_incompatible() rejects opposite-class blocks in the
strict pass and relaxes only when the strict pass returns -ENOSPC, so a
request still succeeds when only opposite-class space remains. A KUnit
regression test covers the interleaving pattern and fails without the
guard.

v2: the strict pass can split a block and then reject both children, so
     a split no longer implies a compatible block exists. Sashiko reported
     the resulting leaked splits; fix as suggested by Matthew:
  - Push the parent back on the DFS stack after each split and merge it
    back with unsplit_block() if both children are still free.
  - Make block_incompatible() judge free blocks only (split nodes keep a
    stale clear bit) and take the requested order, so mixed blocks that
    can hold a compatible block are descended instead of skipped.
  - Extend the KUnit test with a coalesced mixed block and a check that
    a rejected split is merged back.

Fixes: 1ad5e807f716 ("gpu/buddy: replace dual-tree/force_merge with decoupled dirty 
tracker")
Assisted-by: LLM
Cc: Matthew Auld <[email protected]>
Cc: Christian König <[email protected]>
Signed-off-by: Arunpravin Paneer Selvam <[email protected]>

Reviewed-by: Matthew Auld <[email protected]>

Are you just going to push this one by itself?

Reply via email to