On 6/17/26 04:22, Matthew Brost wrote: > When a driver specifies a beneficial order, TTM should make a reasonable > effort to allocate pages at that order. > > Use __GFP_RETRY_MAYFAIL instead of __GFP_NORETRY when allocating at the > beneficial order. This allows reclaim to try harder before falling back to > smaller orders, at the cost of longer allocation setup time. > > That tradeoff is acceptable for beneficial-order allocations: higher-order > backing pages can improve TLB hit rates and reduce the number of TLB > invalidations needed when moving memory. > > Cc: Christian Koenig <[email protected]> > Cc: Huang Rui <[email protected]> > Cc: Matthew Auld <[email protected]> > Cc: Maarten Lankhorst <[email protected]> > Cc: Maxime Ripard <[email protected]> > Cc: Thomas Zimmermann <[email protected]> > Cc: David Airlie <[email protected]> > Cc: Simona Vetter <[email protected]> > Cc: [email protected] > Cc: [email protected] > Cc: Thomas Hellström <[email protected]> > Signed-off-by: Matthew Brost <[email protected]>
Reviewed-by: Christian König <[email protected]> > --- > > Together with other Xe/core shrinker changes currently under development, > this change significantly improved performance under memory fragmentation > on PTL. In 3DMark Wild Life Extreme, performance improved by up to 120% > compared to the baseline fragmented-memory case. GravityMark also showed > approximately a 20% improvement under similar conditions. > --- > drivers/gpu/drm/ttm/ttm_pool.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c > index 9f0ab99eb289..682ae4f40424 100644 > --- a/drivers/gpu/drm/ttm/ttm_pool.c > +++ b/drivers/gpu/drm/ttm/ttm_pool.c > @@ -168,6 +168,11 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool > *pool, gfp_t gfp_flags, > if (order && beneficial_order && order != beneficial_order) > gfp_flags &= ~__GFP_RECLAIM; > > + if (beneficial_order && order == beneficial_order) { > + gfp_flags &= ~__GFP_NORETRY; > + gfp_flags |= __GFP_RETRY_MAYFAIL; > + } > + > if (!ttm_pool_uses_dma_alloc(pool)) { > p = alloc_pages_node(pool->nid, gfp_flags, order); > if (p) {
