* [PATCH 0/2] mm: restore SHRINKER_NONSLAB on THP and zswap shrinkers
@ 2026-09-04 3:35 Qinyun Tan
2026-09-04 3:35 ` [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan
2026-09-04 3:35 ` [PATCH 2/2] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan
0 siblings, 2 replies; 8+ messages in thread
From: Qinyun Tan @ 2026-09-04 3:35 UTC (permalink / raw)
To: Andrew Morton
Cc: Michal Koutný, David Hildenbrand, Lorenzo Stoakes, Zi Yan,
Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain,
Barry Song, Lance Yang, Usama Arif, Johannes Weiner, Yosry Ahmed,
Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang,
linux-mm, linux-kernel, Qinyun Tan
While reviewing the patch "mm/list_lru: don't copy stale shrinker id
from non-memcg-aware shrinkers" (now in mm-unstable), Michal noticed
that the two non-slab memcg-aware shrinkers, the THP deferred split
shrinker and the zswap shrinker, are registered without
SHRINKER_NONSLAB [1].
Without that flag, booting with cgroup.memory=nokmem silently demotes
both shrinkers to non-memcg-aware ones: memcg (limit-induced) reclaim
neither splits partially unmapped THPs nor writes back zswapped pages
of the cgroup under pressure.
Patch 1 restores the flag on the deferred split shrinker; it was lost
when commit fafaeceb89a5 ("mm: switch deferred split shrinker to
list_lru") re-registered the shrinker.
Patch 2 adds the flag to the zswap shrinker, which has never carried
it since its introduction in commit b5ba474f3f51 ("zswap: shrink zswap
pool based on memory pressure").
The series is based on mm-new, on top of the list_lru patch above,
but the changes are independent of it.
[1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/
Qinyun Tan (2):
mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker
mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB
mm/huge_memory.c | 3 ++-
mm/zswap.c | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
--
2.43.7
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker 2026-09-04 3:35 [PATCH 0/2] mm: restore SHRINKER_NONSLAB on THP and zswap shrinkers Qinyun Tan @ 2026-09-04 3:35 ` Qinyun Tan 2026-09-04 15:17 ` Zi Yan ` (3 more replies) 2026-09-04 3:35 ` [PATCH 2/2] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan 1 sibling, 4 replies; 8+ messages in thread From: Qinyun Tan @ 2026-09-04 3:35 UTC (permalink / raw) To: Andrew Morton Cc: Michal Koutný, David Hildenbrand, Lorenzo Stoakes, Zi Yan, Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif, Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang, linux-mm, linux-kernel, Qinyun Tan On a system booted with cgroup.memory=nokmem, the deferred split shrinker is quietly demoted to a non-memcg-aware one. As a result, partially unmapped THPs are only split under global reclaim; memcg (limit-induced) reclaim never splits them, so a cgroup under memory pressure keeps its underused THPs intact. This is a regression from commit fafaeceb89a5 ("mm: switch deferred split shrinker to list_lru"), which re-registered the shrinker without SHRINKER_NONSLAB. The shrinker had carried this flag since commit 0a432dcbeb32 ("mm: shrinker: make shrinker not depend on memcg kmem") precisely so it would keep working with kmem accounting disabled. Without the flag, shrinker_memcg_alloc() fails with -ENOSYS under nokmem and the shrinker loses its memcg awareness. This was noticed by Michal during review of the patch "mm/list_lru: don't copy stale shrinker id from non-memcg-aware shrinkers" [1]. Restore the flag. [1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/ Fixes: fafaeceb89a5 ("mm: switch deferred split shrinker to list_lru") Suggested-by: Michal Koutný <mkoutny@suse.com> Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com> --- mm/huge_memory.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 644d6905b49cc..16f9aa5b2d077 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1022,7 +1022,8 @@ int folio_memcg_alloc_deferred(struct folio *folio) static int __init thp_shrinker_init(void) { deferred_split_shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE | - SHRINKER_MEMCG_AWARE, + SHRINKER_MEMCG_AWARE | + SHRINKER_NONSLAB, "thp-deferred_split"); if (!deferred_split_shrinker) return -ENOMEM; -- 2.43.7 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker 2026-09-04 3:35 ` [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan @ 2026-09-04 15:17 ` Zi Yan 2026-09-07 7:10 ` Baolin Wang ` (2 subsequent siblings) 3 siblings, 0 replies; 8+ messages in thread From: Zi Yan @ 2026-09-04 15:17 UTC (permalink / raw) To: Qinyun Tan, Andrew Morton Cc: Michal Koutný, David Hildenbrand, Lorenzo Stoakes, Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif, Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang, linux-mm, linux-kernel On Thu Sep 3, 2026 at 11:35 PM EDT, Qinyun Tan wrote: > On a system booted with cgroup.memory=nokmem, the deferred split > shrinker is quietly demoted to a non-memcg-aware one. As a result, > partially unmapped THPs are only split under global reclaim; memcg > (limit-induced) reclaim never splits them, so a cgroup under memory > pressure keeps its underused THPs intact. > > This is a regression from commit fafaeceb89a5 ("mm: switch deferred > split shrinker to list_lru"), which re-registered the shrinker without > SHRINKER_NONSLAB. The shrinker had carried this flag since commit > 0a432dcbeb32 ("mm: shrinker: make shrinker not depend on memcg kmem") > precisely so it would keep working with kmem accounting disabled. > Without the flag, shrinker_memcg_alloc() fails with -ENOSYS under > nokmem and the shrinker loses its memcg awareness. > > This was noticed by Michal during review of the patch "mm/list_lru: > don't copy stale shrinker id from non-memcg-aware shrinkers" [1]. > > Restore the flag. > > [1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/ > > Fixes: fafaeceb89a5 ("mm: switch deferred split shrinker to list_lru") > Suggested-by: Michal Koutný <mkoutny@suse.com> > Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com> > --- > mm/huge_memory.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > Makes sense. Acked-by: Zi Yan <ziy@nvidia.com> -- Best Regards, Yan, Zi ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker 2026-09-04 3:35 ` [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan 2026-09-04 15:17 ` Zi Yan @ 2026-09-07 7:10 ` Baolin Wang 2026-09-07 10:42 ` David Hildenbrand (Arm) 2026-09-07 10:52 ` Usama Arif 3 siblings, 0 replies; 8+ messages in thread From: Baolin Wang @ 2026-09-07 7:10 UTC (permalink / raw) To: Qinyun Tan, Andrew Morton Cc: Michal Koutný, David Hildenbrand, Lorenzo Stoakes, Zi Yan, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif, Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang, linux-mm, linux-kernel On 9/4/26 11:35 AM, Qinyun Tan wrote: > On a system booted with cgroup.memory=nokmem, the deferred split > shrinker is quietly demoted to a non-memcg-aware one. As a result, > partially unmapped THPs are only split under global reclaim; memcg > (limit-induced) reclaim never splits them, so a cgroup under memory > pressure keeps its underused THPs intact. > > This is a regression from commit fafaeceb89a5 ("mm: switch deferred > split shrinker to list_lru"), which re-registered the shrinker without > SHRINKER_NONSLAB. The shrinker had carried this flag since commit > 0a432dcbeb32 ("mm: shrinker: make shrinker not depend on memcg kmem") > precisely so it would keep working with kmem accounting disabled. > Without the flag, shrinker_memcg_alloc() fails with -ENOSYS under > nokmem and the shrinker loses its memcg awareness. > > This was noticed by Michal during review of the patch "mm/list_lru: > don't copy stale shrinker id from non-memcg-aware shrinkers" [1]. > > Restore the flag. > > [1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/ > > Fixes: fafaeceb89a5 ("mm: switch deferred split shrinker to list_lru") > Suggested-by: Michal Koutný <mkoutny@suse.com> > Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com> > --- LGTM. Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker 2026-09-04 3:35 ` [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan 2026-09-04 15:17 ` Zi Yan 2026-09-07 7:10 ` Baolin Wang @ 2026-09-07 10:42 ` David Hildenbrand (Arm) 2026-09-07 10:52 ` Usama Arif 3 siblings, 0 replies; 8+ messages in thread From: David Hildenbrand (Arm) @ 2026-09-07 10:42 UTC (permalink / raw) To: Qinyun Tan, Andrew Morton Cc: Michal Koutný, Lorenzo Stoakes, Zi Yan, Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif, Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang, linux-mm, linux-kernel On 9/4/26 05:35, Qinyun Tan wrote: > On a system booted with cgroup.memory=nokmem, the deferred split > shrinker is quietly demoted to a non-memcg-aware one. As a result, > partially unmapped THPs are only split under global reclaim; memcg > (limit-induced) reclaim never splits them, so a cgroup under memory > pressure keeps its underused THPs intact. > > This is a regression from commit fafaeceb89a5 ("mm: switch deferred > split shrinker to list_lru"), which re-registered the shrinker without > SHRINKER_NONSLAB. The shrinker had carried this flag since commit > 0a432dcbeb32 ("mm: shrinker: make shrinker not depend on memcg kmem") > precisely so it would keep working with kmem accounting disabled. > Without the flag, shrinker_memcg_alloc() fails with -ENOSYS under > nokmem and the shrinker loses its memcg awareness. > > This was noticed by Michal during review of the patch "mm/list_lru: > don't copy stale shrinker id from non-memcg-aware shrinkers" [1]. > > Restore the flag. > > [1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/ > > Fixes: fafaeceb89a5 ("mm: switch deferred split shrinker to list_lru") > Suggested-by: Michal Koutný <mkoutny@suse.com> > Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com> > --- Acked-by: David Hildenbrand (Arm) <david@kernel.org> -- Cheers, David ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker 2026-09-04 3:35 ` [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan ` (2 preceding siblings ...) 2026-09-07 10:42 ` David Hildenbrand (Arm) @ 2026-09-07 10:52 ` Usama Arif 3 siblings, 0 replies; 8+ messages in thread From: Usama Arif @ 2026-09-07 10:52 UTC (permalink / raw) To: Qinyun Tan, Andrew Morton Cc: Michal Koutný, David Hildenbrand, Lorenzo Stoakes, Zi Yan, Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang, linux-mm, linux-kernel On 04/09/2026 04:35, Qinyun Tan wrote: > On a system booted with cgroup.memory=nokmem, the deferred split > shrinker is quietly demoted to a non-memcg-aware one. As a result, > partially unmapped THPs are only split under global reclaim; memcg > (limit-induced) reclaim never splits them, so a cgroup under memory > pressure keeps its underused THPs intact. > > This is a regression from commit fafaeceb89a5 ("mm: switch deferred > split shrinker to list_lru"), which re-registered the shrinker without > SHRINKER_NONSLAB. The shrinker had carried this flag since commit > 0a432dcbeb32 ("mm: shrinker: make shrinker not depend on memcg kmem") > precisely so it would keep working with kmem accounting disabled. > Without the flag, shrinker_memcg_alloc() fails with -ENOSYS under > nokmem and the shrinker loses its memcg awareness. > > This was noticed by Michal during review of the patch "mm/list_lru: > don't copy stale shrinker id from non-memcg-aware shrinkers" [1]. > > Restore the flag. > > [1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/ > > Fixes: fafaeceb89a5 ("mm: switch deferred split shrinker to list_lru") > Suggested-by: Michal Koutný <mkoutny@suse.com> > Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com> > --- > mm/huge_memory.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 644d6905b49cc..16f9aa5b2d077 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -1022,7 +1022,8 @@ int folio_memcg_alloc_deferred(struct folio *folio) > static int __init thp_shrinker_init(void) > { > deferred_split_shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE | > - SHRINKER_MEMCG_AWARE, > + SHRINKER_MEMCG_AWARE | > + SHRINKER_NONSLAB, > "thp-deferred_split"); > if (!deferred_split_shrinker) > return -ENOMEM; Acked-by: Usama Arif <usama.arif@linux.dev> ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/2] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB 2026-09-04 3:35 [PATCH 0/2] mm: restore SHRINKER_NONSLAB on THP and zswap shrinkers Qinyun Tan 2026-09-04 3:35 ` [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan @ 2026-09-04 3:35 ` Qinyun Tan 2026-09-07 10:52 ` Usama Arif 1 sibling, 1 reply; 8+ messages in thread From: Qinyun Tan @ 2026-09-04 3:35 UTC (permalink / raw) To: Andrew Morton Cc: Michal Koutný, David Hildenbrand, Lorenzo Stoakes, Zi Yan, Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif, Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang, linux-mm, linux-kernel, Qinyun Tan With kmem accounting disabled (cgroup.memory=nokmem), memcg reclaim never invokes the zswap shrinker: a cgroup under memory pressure does not write back its own zswapped pages to make room; they are only written back by global reclaim or once the global pool limit kicks in. The zswap shrinker is registered memcg-aware but without SHRINKER_NONSLAB, so under nokmem it is treated as a slab shrinker: before commit 03375203e1da ("mm: do not allocate shrinker info with cgroup.memory=nokmem") it was skipped by the !memcg_kmem_online() check in shrink_slab_memcg(); since that commit it is demoted to non-memcg-aware at registration. But the zswap shrinker is not a slab shrinker: it tracks zswap entries and resolves the owning memcg from the folio's objcg, independent of kmem accounting. This was noticed by Michal during review of the patch "mm/list_lru: don't copy stale shrinker id from non-memcg-aware shrinkers" [1]. Mark it SHRINKER_NONSLAB so it keeps its memcg awareness and runs under memcg reclaim with nokmem. [1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/ Fixes: b5ba474f3f51 ("zswap: shrink zswap pool based on memory pressure") Suggested-by: Michal Koutný <mkoutny@suse.com> Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com> --- mm/zswap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm/zswap.c b/mm/zswap.c index 761cd699e0a3e..8bcc2997d7719 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -1263,8 +1263,8 @@ static struct shrinker *zswap_alloc_shrinker(void) { struct shrinker *shrinker; - shrinker = - shrinker_alloc(SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE, "mm-zswap"); + shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE | + SHRINKER_NONSLAB, "mm-zswap"); if (!shrinker) return NULL; -- 2.43.7 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB 2026-09-04 3:35 ` [PATCH 2/2] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan @ 2026-09-07 10:52 ` Usama Arif 0 siblings, 0 replies; 8+ messages in thread From: Usama Arif @ 2026-09-07 10:52 UTC (permalink / raw) To: Qinyun Tan, Andrew Morton Cc: Michal Koutný, David Hildenbrand, Lorenzo Stoakes, Zi Yan, Baolin Wang, Liam R . Howlett, Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou, Kairui Song, Shakeel Butt, Xunlei Pang, linux-mm, linux-kernel On 04/09/2026 04:35, Qinyun Tan wrote: > With kmem accounting disabled (cgroup.memory=nokmem), memcg reclaim > never invokes the zswap shrinker: a cgroup under memory pressure does > not write back its own zswapped pages to make room; they are only > written back by global reclaim or once the global pool limit kicks in. > > The zswap shrinker is registered memcg-aware but without > SHRINKER_NONSLAB, so under nokmem it is treated as a slab shrinker: > before commit 03375203e1da ("mm: do not allocate shrinker info with > cgroup.memory=nokmem") it was skipped by the !memcg_kmem_online() > check in shrink_slab_memcg(); since that commit it is demoted to > non-memcg-aware at registration. But the zswap shrinker is not a slab > shrinker: it tracks zswap entries and resolves the owning memcg from > the folio's objcg, independent of kmem accounting. > > This was noticed by Michal during review of the patch "mm/list_lru: > don't copy stale shrinker id from non-memcg-aware shrinkers" [1]. > > Mark it SHRINKER_NONSLAB so it keeps its memcg awareness and runs > under memcg reclaim with nokmem. > > [1] https://lore.kernel.org/lkml/697713c4-0857-485b-aba7-c74f37a3c8b4@linux.alibaba.com/ > > Fixes: b5ba474f3f51 ("zswap: shrink zswap pool based on memory pressure") > Suggested-by: Michal Koutný <mkoutny@suse.com> > Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com> > --- > mm/zswap.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/mm/zswap.c b/mm/zswap.c > index 761cd699e0a3e..8bcc2997d7719 100644 > --- a/mm/zswap.c > +++ b/mm/zswap.c > @@ -1263,8 +1263,8 @@ static struct shrinker *zswap_alloc_shrinker(void) > { > struct shrinker *shrinker; > > - shrinker = > - shrinker_alloc(SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE, "mm-zswap"); > + shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE | > + SHRINKER_NONSLAB, "mm-zswap"); > if (!shrinker) > return NULL; > Acked-by: Usama Arif <usama.arif@linux.dev> ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-09-07 10:52 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-09-04 3:35 [PATCH 0/2] mm: restore SHRINKER_NONSLAB on THP and zswap shrinkers Qinyun Tan 2026-09-04 3:35 ` [PATCH 1/2] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan 2026-09-04 15:17 ` Zi Yan 2026-09-07 7:10 ` Baolin Wang 2026-09-07 10:42 ` David Hildenbrand (Arm) 2026-09-07 10:52 ` Usama Arif 2026-09-04 3:35 ` [PATCH 2/2] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan 2026-09-07 10:52 ` Usama Arif
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox