Re: [PATCH RFC] xarray: honor XA_FLAGS_ACCOUNT in xas_split_alloc()

From: Johannes Weiner

Date: Thu Jul 30 2026 - 10:25:56 EST


Hello Zi,

On Mon, Jul 27, 2026 at 09:51:40PM -0400, Zi Yan wrote:
> XArray operations that allocate xa_nodes, such as xas_nomem() and
> xas_alloc(), add __GFP_ACCOUNT when the array has XA_FLAGS_ACCOUNT set.
> This charges the allocated memory and avoids the workingset convergence
> issue described by commit 7b785645e8f13 ("mm: fix page cache convergence
> regression").
>
> xas_split_alloc() does not have that flag. Add it when necessary.
>
> Fixes: 6b24ca4a1a8d4 ("mm: Use multi-index entries in the page cache")
> Signed-off-by: Zi Yan <ziy@xxxxxxxxxx>
> ---
> Hi Johannes,
>
> IIUC, __GFP_ACCOUNT is needed for xarray node allocation accounting when
> XA_FLAGS_ACCOUNT is set. Commit 7b785645e8f13 ("mm: fix page cache
> convergence regression") fixed a workingset regression with it.
> xas_split_alloc() does not have it, so I imagine xa_node allocated during
> folio split would cause a similar issue. I would like to get your
> opinion on this.

Yes, you're right!

As we had discussed on the THP cabal call, we should use the memcg
context of the folio, as that could be different from the callers'
depending on who's doing the splitting. I.e.

memcg = get_mem_cgroup_from_folio(x);
old_memcg = set_active_memcg(memcg);

xas_split_alloc() / xas_try_split()

set_active_memcg(old_memcg);
mem_cgroup_put(memcg);

There is __folio_split() -> xas_split_alloc(). But there is also
__folio_split() -> __folio_freeze_and_split_unmapped() ->
__split_unmapped_folio() -> xas_try_split() -> XA_FLAGS_ACCOUNT ->
__GFP_ACCOUNT. So it would make sense to me to set up the memcg
context in __folio_split() already.