From: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
To: Matthew Brost <matthew.brost@intel.com>
Cc: intel-xe@lists.freedesktop.org,
Matthew Auld <matthew.auld@intel.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Subject: Re: [PATCH v2 2/2] drm/xe: Update shrinker batch size based on average BO size
Date: Thu, 10 Sep 2026 17:50:54 +0200 [thread overview]
Message-ID: <1ae2d69aa2a04b922c2fbc177a3d92733673ef18.camel@linux.intel.com> (raw)
In-Reply-To: <9e00ce576d2801e8f7a514c76c3a333c73832383.camel@linux.intel.com>
On Thu, 2026-09-10 at 12:54 +0200, Thomas Hellström wrote:
> On Tue, 2026-08-18 at 14:32 -0700, Matthew Brost wrote:
> > On Tue, Aug 18, 2026 at 02:10:35PM +0200, Thomas Hellström wrote:
> > > On Fri, 2026-08-14 at 16:24 -0700, Matthew Brost wrote:
> > > > On Fri, Aug 14, 2026 at 04:37:37PM +0200, Thomas Hellström
> > > > wrote:
> > > > > Update our preferred vmscan batch size on each count pass to
> > > > > avoid
> > > > > invoking scan_objects for requests too small to free even a
> > > > > single
> > > > > average-sized GEM object. Our rough estimate for an effective
> > > > > batch
> > > > > is twice the average number of pages per populated ttm_tt
> > > > > across
> > > > > all
> > > > > shrinkable and purgeable objects. The factor of two provides
> > > > > headroom
> > > > > so that most scan invocations can free at least one GEM
> > > > > object
> > > > > despite
> > > > > variability in object sizes.
> > > > >
> > > > > The batch value is updated as an exponential moving average,
> > > > > (old_batch + avg) / 2, to smooth out sudden changes in the
> > > > > object population. It is floored at 128 pages, the kernel
> > > > > default
> > > > > SHRINK_BATCH, to ensure the shrinker remains responsive when
> > > > > there
> > > > > are very few objects.
> > > > >
> > > > > The populated_tts counter introduced in the previous commit
> > > > > provides
> > > > > the object count needed for the average. We inherit the same
> > > > > justification as the analogous mechanism in i915: shrinking a
> > > > > GEM
> > > > > object has non-trivial locking overhead, so firing the
> > > > > shrinker
> > > > > for
> > > > > requests smaller than a single object is wasteful.
> > > > >
> > > > > v2:
> > > > > - Fix the average object size estimate to account for the
> > > > > full
> > > > > shrinkable and purgeable population.
> > > > >
> > > > > Assisted-by: GitHub_Copilot:claude-sonnet-4.6
> > > > > Assisted-by: GitHub_Copilot:claude-sonnet-5
> > > >
> > > > This is probably the right direction given what we currently
> > > > have
> > > > in
> > > > terms of shrinker control, but the core heuristic is still a
> > > > pretty
> > > > poor
> > > > one. My understanding is that it combines batch and seek values
> > > > using
> > > > some odd math to determine whether a scan is worthwhile at a
> > > > given
> > > > priority level. We probably want to avoid shrinking at the
> > > > initial
> > > > scan
> > > > priorities, and I believe this change accomplishes that.
> > >
> > > Yes, but I think that's a side-effect not to be fully relied
> > > upon.
> > >
> > > The meaning of this value IMO is to tell the core how many
> > > objects
> > > to
> > > expect for a scan request, so that the core can hold off
> > > shrinking
> > > until that many objects is actually this shrinker's fair share of
> > > its
> > > available objects. So the side effect would be that this
> > > shrinker's
> > > fair share of shrinking may not trigger a scan request if
> > > shrinking
> > > is
> > > triggered by compacting?
> > >
> >
> > I think you mean higher order allocations, not compaction. Reclaim
> > is
> > the input to compaction - see compaction_ready, compact_gap usage
> > in
> > vmscan.c
>
> Yes, I meant shrinking triggered by higher order allocations, but
> used
> compaction as a term for shrinking any order page in order to be able
> to coalesce memory into higher order. That might not be the correct
> terminology, though.
>
> >
> > So I think a side affect could be higher order allocation never
> > enter
> > our shrinker if compaction_ready flips to true before our batch
> > size
> > /
> > seek values are asked for (total_scan math in do_shrink_slab).
>
> Yes, that's a possible side-effect.
>
> >
> > > >
> > > > That said, I think we really want two shrinkers instead: one
> > > > with
> > > > the
> > > > default settings (or perhaps even a reduced seek value) for
> > > > purgeable
> > > > BOs, and another for BOs that we legitimately need to back up.
> > > > The
> > > > purgeable one should be favored to run eariler, likewise the
> > > > TTM
> > > > pool
> > > > shrinker should be favored run before our shrinker too.
> > >
> > > I don't think we can or should use the batch size to decide which
> > > shrinker should be prioritized. IIRC one of the comments to
> > > previous
> >
> > It probably isn't the right approach, but my concern is that our
> > shrinker
> > won't run at higher orders when there are cheap reclaimable pages
> > (i.e.,
> > we have purged BOs that can immediately make higher-order pages
> > available
> > or allow compaction to do its job of forming higher-order pages). I
> > have
> > already seen shrinker backoff being too aggressive when
> > compaction_ready()
> > returns true, resulting in virtually zero THP availability because
> > shrinkers hold onto enough non-movable pages scattered throughout
> > memory
> > to prevent successful compaction (I have a local core MM patch that
> > fixes
> > this issue).
> >
> > Purgable and non-purgable pages have fundamentally different
> > shrinking
> > costs, and that distinction needs to be expressed somehow. The
> > opportunistic compaction (wrongly named) shrinker series attempts
> > to
> > capture this.
>
> But since the core attempts to be fair poking shrinkers, and that's
> not
> really what we want (we want it to shrink purgeable stuff first, and
> avoid shrinking non-purgeable stuff).
Actually with separate shrinkers we can modify the count to handle
this. I'll take a look at that.
/Thomas
next prev parent reply other threads:[~2026-09-10 15:50 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 14:37 [PATCH v2 0/2] drm/xe: Adjust the bo shrinker batch size Thomas Hellström
2026-08-14 14:37 ` [PATCH v2 1/2] drm/xe: Track number of populated ttm_tts in the shrinker Thomas Hellström
2026-08-14 14:56 ` sashiko-bot
2026-08-14 14:37 ` [PATCH v2 2/2] drm/xe: Update shrinker batch size based on average BO size Thomas Hellström
2026-08-14 14:45 ` sashiko-bot
2026-08-14 23:24 ` Matthew Brost
2026-08-14 23:35 ` Matthew Brost
2026-08-18 12:10 ` Thomas Hellström
2026-08-18 21:32 ` Matthew Brost
2026-09-10 10:54 ` Thomas Hellström
2026-09-10 15:50 ` Thomas Hellström [this message]
2026-08-14 15:17 ` ✓ CI.KUnit: success for drm/xe: Adjust the bo shrinker batch size (rev2) Patchwork
2026-08-14 16:14 ` ✗ Xe.CI.BAT: failure " Patchwork
2026-08-14 18:07 ` ✓ Xe.CI.FULL: success " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1ae2d69aa2a04b922c2fbc177a3d92733673ef18.camel@linux.intel.com \
--to=thomas.hellstrom@linux.intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matthew.auld@intel.com \
--cc=matthew.brost@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox