Hi,

On Sun, 18 Oct 2026 13:09:26 +0200, Christian Theune wrote:
> Quick note: while rolling back the affected machine, I noticed that we
> only saw those exact crashes on 6.12.112 but not on 6.12.110 and
> 6.12.111.

Another data point: we hit the same oops twice in 30 hours on a KVM
guest running Debian's 6.12.113 (kswapd -> ... -> workingset_update_node
-> list_lru_add+0x83, NULL+0x8), Debian bug
https://bugs.debian.org/1151281. Amazon reported it on 6.12.110.

In case it helps with the 6.12 backport Greg and Sasha asked for, we
have a reproducer and ran it on one test guest (8 vCPU, 8 GB, XFS on a
loop device, MGLRU, THP=always), pristine 6.12.113 from kernel.org
built with a reduced Debian config:

  kernel                                  result with background load
  Debian 6.12.113-1                       crashed after ~13, ~2*, ~24 min
  pristine 6.12.113                       crashed after ~14 min
  pristine 6.12.113, ad812805fea7         no crash in 90 min
    reverted
  pristine 6.12.113 + 62e72d2cf702 +      no crash in 120 min
    aca1f2d5de17 adapted (below)

  * that run started just after a kernel build had finished

Without the background load the reproducer alone did not crash (30 and
60 min runs). During the 120 min run on the backport the path was
exercised heavily (~1.09M workingset_nodereclaim, ~37k thp_split_page)
and the kernel log stayed clean (no BUG/WARNING).

The backport we tested follows Sasha's description: 62e72d2cf702 ("mm,
madvise: fix potential workingset node list_lru leaks") applies cleanly
to 6.12.113, and the relevant part of aca1f2d5de17 becomes a single line
in split_huge_page_to_list_to_order():

--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -3529,6 +3529,7 @@ int split_huge_page_to_list_to_order(struct page *page, 
struct list_head *list,
                        goto out;
                }

+               mapping_set_update(&xas, mapping);
                xas_split_alloc(&xas, folio, folio_order(folio), gfp);
                if (xas_error(&xas)) {
                        ret = xas_error(&xas);

This is test feedback, not a formal submission: we are not in a position
to carry these patches through review ourselves. If someone sends the
6.12.y backports, we are glad to run them through the same reproducer
and reply with a Tested-by.

The reproducer, roughly: on an XFS filesystem, a background loop that
untars the kernel source and runs "make -j$(nproc) vmlinux" in its own
cgroup, plus 4 workers each looping over (1) in a MemoryMax=128M scope,
rewrite a 256 MiB file in 2 MiB writes and evict it by reading a 1 GiB
file (cache dropped first), then (2) in a fresh MemoryMax=96M scope, read
the 256 MiB file back with read_ahead_kb=16384, punch an 8 KiB hole in
every 2 MiB block and read the 1 GiB file again to force memcg reclaim.
The scripts are available on request.

Thanks,
Thomas Mischler

Reply via email to