From: Tvrtko Ursulin <tursulin@ursulin.net>
To: Natalie Vock <natalie.vock@gmx.de>,
Maarten Lankhorst <dev@lankhorst.se>,
Maxime Ripard <mripard@kernel.org>, Tejun Heo <tj@kernel.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Michal Koutný <mkoutny@suse.com>,
Christian Koenig <christian.koenig@amd.com>,
Huang Rui <ray.huang@amd.com>,
Matthew Auld <matthew.auld@intel.com>,
Matthew Brost <matthew.brost@intel.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>
Cc: cgroups@vger.kernel.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v6 6/6] drm/ttm: Use common ancestor of evictor and evictee as limit pool
Date: Fri, 13 Mar 2026 14:11:30 +0000 [thread overview]
Message-ID: <cf522bc4-09ef-4e19-afc4-2c8a9d8a1abc@ursulin.net> (raw)
In-Reply-To: <20260313-dmemcg-aggressive-protect-v6-6-7c71cc1492db@gmx.de>
On 13/03/2026 11:40, Natalie Vock wrote:
> When checking whether to skip certain buffers because they're protected
> by dmem.low, we're checking the effective protection of the evictee's
> cgroup, but depending on how the evictor's cgroup relates to the
> evictee's, the semantics of effective protection values change.
>
> When testing against cgroups from different subtrees, page_counter's
> recursive protection propagates memory protection afforded to a parent
> down to the child cgroups, even if the children were not explicitly
> protected. This prevents cgroups whose parents were afforded no
> protection from stealing memory from cgroups whose parents were afforded
> more protection, without users having to explicitly propagate this
> protection.
>
> However, if we always calculate protection from the root cgroup, this
> breaks prioritization of sibling cgroups: If one cgroup was explicitly
> protected and its siblings were not, the protected cgroup should get
> higher priority, i.e. the protected cgroup should be able to steal from
> unprotected siblings. This only works if we restrict the protection
> calculation to the subtree shared by evictor and evictee.
>
> Signed-off-by: Natalie Vock <natalie.vock@gmx.de>
> ---
> drivers/gpu/drm/ttm/ttm_bo.c | 43 ++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 40 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 7300b91b77dd3..df4f4633a3a53 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -628,11 +628,48 @@ static s64 ttm_bo_evict_cb(struct ttm_lru_walk *walk, struct ttm_buffer_object *
> {
> struct ttm_bo_evict_walk *evict_walk =
> container_of(walk, typeof(*evict_walk), walk);
> + struct dmem_cgroup_pool_state *limit_pool, *ancestor = NULL;
> + bool evict_valuable;
> s64 lret;
>
> - if (!dmem_cgroup_state_evict_valuable(evict_walk->alloc_state->limit_pool,
> - bo->resource->css, evict_walk->try_low,
> - &evict_walk->hit_low))
> + /*
> + * If may_try_low is not set, then we're trying to evict unprotected
> + * buffers in favor of a protected allocation for charge_pool. Explicitly skip
> + * buffers belonging to the same cgroup here - that cgroup is definitely protected,
> + * even though dmem_cgroup_state_evict_valuable would allow the eviction because a
> + * cgroup is always allowed to evict from itself even if it is protected.
> + */
> + if (!evict_walk->alloc_state->may_try_low &&
> + bo->resource->css == evict_walk->alloc_state->charge_pool)
> + return 0;
Hm.. should this hunk go into the previous patch?
> +
> + limit_pool = evict_walk->alloc_state->limit_pool;
> + /*
> + * If there is no explicit limit pool, find the root of the shared subtree between
> + * evictor and evictee. This is important so that recursive protection rules can
> + * apply properly: Recursive protection distributes cgroup protection afforded
> + * to a parent cgroup but not used explicitly by a child cgroup between all child
> + * cgroups (see docs of effective_protection in mm/page_counter.c). However, when
> + * direct siblings compete for memory, siblings that were explicitly protected
> + * should get prioritized over siblings that weren't. This only happens correctly
> + * when the root of the shared subtree is passed to
> + * dmem_cgroup_state_evict_valuable. Otherwise, the effective-protection
> + * calculation cannot distinguish direct siblings from unrelated subtrees and the
> + * calculated protection ends up wrong.
> + */
> + if (!limit_pool) {
> + ancestor = dmem_cgroup_get_common_ancestor(bo->resource->css,
> + evict_walk->alloc_state->charge_pool);
> + limit_pool = ancestor;
> + }
> +
> + evict_valuable = dmem_cgroup_state_evict_valuable(limit_pool, bo->resource->css,
> + evict_walk->try_low,
> + &evict_walk->hit_low);
> + if (ancestor)
> + dmem_cgroup_pool_state_put(ancestor);
> +
> + if (!evict_valuable)
This part is probably better reviewed by someone more familiar with the
dmem controller. One question I have though is whether this patch is
independent from the rest of the series or it really makes sense for it
to be last?
Regards,
Tvrtko
> return 0;
>
> if (bo->pin_count || !bo->bdev->funcs->eviction_valuable(bo, evict_walk->place))
>
next prev parent reply other threads:[~2026-03-13 14:11 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-13 11:39 [PATCH v6 0/6] cgroup/dmem,drm/ttm: Improve protection in contended cases Natalie Vock
2026-03-13 11:40 ` [PATCH v6 1/6] cgroup/dmem: Add queries for protection values Natalie Vock
2026-03-13 21:10 ` Claude review: " Claude Code Review Bot
2026-03-13 11:40 ` [PATCH v6 2/6] cgroup,cgroup/dmem: Add (dmem_)cgroup_common_ancestor helper Natalie Vock
2026-03-13 14:16 ` Michal Koutný
2026-03-13 21:10 ` Claude review: " Claude Code Review Bot
2026-03-13 11:40 ` [PATCH v6 3/6] drm/ttm: Extract code for attempting allocation in a place Natalie Vock
2026-03-13 21:10 ` Claude review: " Claude Code Review Bot
2026-03-13 11:40 ` [PATCH v6 4/6] drm/ttm: Split cgroup charge and resource allocation Natalie Vock
2026-03-13 12:53 ` Tvrtko Ursulin
2026-03-13 21:10 ` Claude review: " Claude Code Review Bot
2026-03-13 11:40 ` [PATCH v6 5/6] drm/ttm: Be more aggressive when allocating below protection limit Natalie Vock
2026-03-13 13:29 ` Tvrtko Ursulin
2026-03-13 21:10 ` Claude review: " Claude Code Review Bot
2026-03-13 11:40 ` [PATCH v6 6/6] drm/ttm: Use common ancestor of evictor and evictee as limit pool Natalie Vock
2026-03-13 14:11 ` Tvrtko Ursulin [this message]
2026-03-13 14:16 ` Michal Koutný
2026-03-13 21:10 ` Claude review: " Claude Code Review Bot
2026-03-13 21:10 ` Claude review: cgroup/dmem,drm/ttm: Improve protection in contended cases Claude Code Review Bot
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=cf522bc4-09ef-4e19-afc4-2c8a9d8a1abc@ursulin.net \
--to=tursulin@ursulin.net \
--cc=airlied@gmail.com \
--cc=cgroups@vger.kernel.org \
--cc=christian.koenig@amd.com \
--cc=dev@lankhorst.se \
--cc=dri-devel@lists.freedesktop.org \
--cc=hannes@cmpxchg.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matthew.auld@intel.com \
--cc=matthew.brost@intel.com \
--cc=mkoutny@suse.com \
--cc=mripard@kernel.org \
--cc=natalie.vock@gmx.de \
--cc=ray.huang@amd.com \
--cc=simona@ffwll.ch \
--cc=tj@kernel.org \
--cc=tzimmermann@suse.de \
/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