Re: [PATCH 2/2] cgroup/cpuset: use mems_allowed_seq when checking a policy nodemask
From: Gregory Price
Date: Thu Oct 15 2026 - 09:50:41 EST
On Thu, Oct 15, 2026 at 09:59:31AM +0200, Vlastimil Babka (SUSE) wrote:
> On 10/15/26 00:24, Gregory Price (Meta) wrote:
> > A cpuset update changes the task's mems_allowed and rebinds its
> > mempolicy in separate steps under mems_allowed_seq, but the check
> > reads both without it. This can cause a spurious numa placement
> > miss under some cpuset/mempolicy combinations.
> >
> > A reader that loads one mask before the update and the other after
> > it can see a spurious empty intersection and drop the nodemask.
> >
> > For example, a task with cpuset.mems={0} and MPOL_BIND={0}. If the
> > cpuset moves to mems={1,2}, the policy is rebound to {1}.
> >
> > The allocator can race and compare the old mems_allowed {0} against
> > the new policy {1} - which will result in a dropped nodemask and a
> > misplaced allocation on node 2.
>
> > Simply retry the intersection until mems_allowed_seq is stable.
> >
> > This covers the task policy, which is rebound under mems_allowed_seq.
> > VMA policies are rebound afterwards by mpol_rebind_mm(), outside
> > mems_allowed_seq, and are not covered by this change.
> >
> > Fixes: cc9a6c877661 ("cpuset: mm: reduce large amounts of memory barrier related damage v3")
> > Signed-off-by: Gregory Price (Meta) <gourry@xxxxxxxxxx>
>
> Should the comment and/or code in check_retry_cpuset() be updated as well?
>
No I don't think so. We're checking different things.
The loop here makes sure nodemask and mems_allowed are stable when
compared so we don't erroneously drop the nodemask on a race.
The cookie-check in check_retry_cpuset() determines whether the entire
allocation should restart. It runs after the nodemask would already
have been dropped, so it can't catch this race.
~Gregory