* [PATCH v2 0/4] mm: restore per-memcg reclaim for NONSLAB shrinkers under nokmem
@ 2026-09-07 11:01 Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 1/4] mm: memcontrol: drop kmemcg_id and use the memcg ID for list_lru indexing Qinyun Tan
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Qinyun Tan @ 2026-09-07 11:01 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Michal Koutný, David Hildenbrand, Zi Yan,
Baolin Wang, Usama Arif, Dave Chinner, Qi Zheng, Yosry Ahmed,
Nhat Pham, Chengming Zhou, Xunlei Pang, cgroups, linux-mm,
linux-kernel, Qinyun Tan
With cgroup.memory=nokmem, the THP deferred split shrinker and the
zswap shrinker are degraded in two ways.
First, both shrinkers are missing the SHRINKER_NONSLAB flag, so
shrinker_memcg_alloc() demotes them to non-memcg-aware shrinkers:
limit-induced reclaim of a cgroup neither splits its partially
unmapped THPs nor writes back its zswapped pages. v1 of this series
[1] restored the flag to fix that.
However, as Sashiko's review of v1 pointed out [2], the flag alone
is not enough. __list_lru_init() also collapses every list_lru into
per-node lists under nokmem, so even with the flag restored, the
objects of all cgroups share one list per node: the per-memcg
shrinker bit is only set for whichever memcg happens to repopulate
the empty list, so pressure in other cgroups may not even trigger
the scan, and when it does, the scan walks everyone's objects.
Before commit fafaeceb89a5 ("mm: switch deferred split shrinker to
list_lru"), THP had fully per-memcg deferred split queues embedded
in struct mem_cgroup, working independently of kmem accounting.
nokmem only opts out of kernel slab accounting; THPs and zswapped
pages are user memory and remain charged to their cgroups, so
per-memcg reclaim is still what these shrinkers want.
This series keeps list_lrus backed by SHRINKER_NONSLAB shrinkers
memcg aware under nokmem:
Patch 1 drops the kmemcg_id copy, which is only assigned when kmem
accounting is enabled, and derives the list_lru xarray index from
the memcg ID directly, so the index works independently of kmem
accounting. It also drops the nokmem early return from
memcg_offline_kmem() so these lrus are reparented on offline.
Patch 2 keeps a list_lru memcg aware under nokmem when its backing
shrinker is registered SHRINKER_NONSLAB.
Patches 3 and 4 restore/add SHRINKER_NONSLAB on the THP deferred
split shrinker and the zswap shrinker, unchanged from v1.
The savings of nokmem are preserved: slab-backed lrus (e.g. the
superblock dentry/inode lrus) still fall back to per-node lists, and
the per-memcg lists are only allocated when a memcg actually holds
such objects.
[1] https://lore.kernel.org/lkml/20260904033503.4067283-1-qinyuntan@linux.alibaba.com/
[2] https://sashiko.dev/#/patchset/20260904033503.4067283-1-qinyuntan@linux.alibaba.com
Changes in v2:
- Keep the list_lrus behind the two shrinkers per-memcg under
nokmem, so the shrinker bits are set for the right memcgs and
scans stay scoped to the target cgroup's objects (patches 1-2,
new; addresses Sashiko's review of v1).
- Patches 3-4 unchanged from v1; collected the review tags.
Qinyun Tan (4):
mm: memcontrol: drop kmemcg_id and use the memcg ID for list_lru
indexing
mm: list_lru: keep per-memcg lists with nokmem for NONSLAB-backed lrus
mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker
mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB
include/linux/memcontrol.h | 8 +++++---
mm/huge_memory.c | 3 ++-
mm/list_lru.c | 14 ++++++++------
mm/memcontrol.c | 6 ------
mm/zswap.c | 4 ++--
5 files changed, 17 insertions(+), 18 deletions(-)
--
2.43.7
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/4] mm: memcontrol: drop kmemcg_id and use the memcg ID for list_lru indexing
2026-09-07 11:01 [PATCH v2 0/4] mm: restore per-memcg reclaim for NONSLAB shrinkers under nokmem Qinyun Tan
@ 2026-09-07 11:01 ` Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 2/4] mm: list_lru: keep per-memcg lists with nokmem for NONSLAB-backed lrus Qinyun Tan
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Qinyun Tan @ 2026-09-07 11:01 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Michal Koutný, David Hildenbrand, Zi Yan,
Baolin Wang, Usama Arif, Dave Chinner, Qi Zheng, Yosry Ahmed,
Nhat Pham, Chengming Zhou, Xunlei Pang, cgroups, linux-mm,
linux-kernel, Qinyun Tan
kmemcg_id is a copy of the memcg ID assigned in memcg_online_kmem(),
and is only used as the list_lru xarray index. With
cgroup.memory=nokmem the assignment never happens, so every memcg
resolves to the per-node lists. The next patch needs the index to
work under nokmem as well, so drop the copy and use the memcg ID.
The ID works just as well as the copy did: root and NULL still
return -1 and use the per-node lists, and the ID is only released
after the list_lru reparenting, so a stale or recycled ID can never
reach a live list_lru entry.
The early return of memcg_offline_kmem() under nokmem is dropped as
well, so the reparenting also covers lrus that stay memcg aware
without kmem accounting.
Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com>
---
include/linux/memcontrol.h | 8 +++++---
mm/list_lru.c | 10 +++++-----
mm/memcontrol.c | 6 ------
3 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index fdf4812e1d818..edeb287978934 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -254,7 +254,6 @@ struct mem_cgroup {
#if BITS_PER_LONG < 64
seqlock_t socket_pressure_seqlock;
#endif
- int kmemcg_id;
#ifdef CONFIG_CGROUP_WRITEBACK
struct list_head cgwb_list;
@@ -1775,12 +1774,15 @@ static inline void memcg_kmem_uncharge_page(struct page *page, int order)
}
/*
- * A helper for accessing memcg's kmem_id, used for getting
+ * A helper for accessing the memcg ID, used for getting
* corresponding LRU lists.
*/
static inline int memcg_kmem_id(struct mem_cgroup *memcg)
{
- return memcg ? memcg->kmemcg_id : -1;
+ if (!memcg || mem_cgroup_is_root(memcg))
+ return -1;
+
+ return memcg->id.id;
}
struct mem_cgroup *mem_cgroup_from_virt(void *p);
diff --git a/mm/list_lru.c b/mm/list_lru.c
index a4522ca93ebcb..6fd4e9af84396 100644
--- a/mm/list_lru.c
+++ b/mm/list_lru.c
@@ -502,7 +502,7 @@ static void memcg_reparent_list_lru_one(struct list_lru *lru, int nid,
struct list_lru_one *src,
struct mem_cgroup *dst_memcg)
{
- int dst_idx = dst_memcg->kmemcg_id;
+ int dst_idx = memcg_kmem_id(dst_memcg);
struct list_lru_one *dst;
spin_lock_irq(&src->lock);
@@ -536,7 +536,7 @@ void memcg_reparent_list_lrus(struct mem_cgroup *memcg, struct mem_cgroup *paren
* allocating a new mlru since CSS_DYING is already set for this
* memcg a rcu grace period ago.
*/
- mlru = xa_load(&lru->xa, memcg->kmemcg_id);
+ mlru = xa_load(&lru->xa, memcg_kmem_id(memcg));
if (!mlru)
continue;
@@ -551,7 +551,7 @@ void memcg_reparent_list_lrus(struct mem_cgroup *memcg, struct mem_cgroup *paren
for_each_node(i)
memcg_reparent_list_lru_one(lru, i, &mlru->node[i], parent);
- xa_erase_irq(&lru->xa, memcg->kmemcg_id);
+ xa_erase_irq(&lru->xa, memcg_kmem_id(memcg));
/*
* Here all list_lrus corresponding to the cgroup are guaranteed
@@ -566,7 +566,7 @@ void memcg_reparent_list_lrus(struct mem_cgroup *memcg, struct mem_cgroup *paren
static inline bool memcg_list_lru_allocated(struct mem_cgroup *memcg,
struct list_lru *lru)
{
- int idx = memcg->kmemcg_id;
+ int idx = memcg_kmem_id(memcg);
return idx < 0 || xa_load(&lru->xa, idx);
}
@@ -602,7 +602,7 @@ static int __memcg_list_lru_alloc(struct mem_cgroup *memcg,
if (!mlru)
return -ENOMEM;
}
- xas_set(&xas, pos->kmemcg_id);
+ xas_set(&xas, memcg_kmem_id(pos));
do {
xas_lock_irqsave(&xas, flags);
if (!xas_load(&xas) && !css_is_dying(&pos->css)) {
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 7ce50bccf1264..619d4c1f2e8f2 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3780,17 +3780,12 @@ static void memcg_online_kmem(struct mem_cgroup *memcg)
return;
static_branch_enable(&memcg_kmem_online_key);
-
- memcg->kmemcg_id = memcg->id.id;
}
static void memcg_offline_kmem(struct mem_cgroup *memcg)
{
struct mem_cgroup *parent;
- if (mem_cgroup_kmem_disabled())
- return;
-
if (unlikely(mem_cgroup_is_root(memcg)))
return;
@@ -4225,7 +4220,6 @@ static struct mem_cgroup *mem_cgroup_alloc(struct mem_cgroup *parent)
seqlock_init(&memcg->socket_pressure_seqlock);
#endif
memcg1_memcg_init(memcg);
- memcg->kmemcg_id = -1;
#ifdef CONFIG_CGROUP_WRITEBACK
INIT_LIST_HEAD(&memcg->cgwb_list);
for (i = 0; i < MEMCG_CGWB_FRN_CNT; i++)
--
2.43.7
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/4] mm: list_lru: keep per-memcg lists with nokmem for NONSLAB-backed lrus
2026-09-07 11:01 [PATCH v2 0/4] mm: restore per-memcg reclaim for NONSLAB shrinkers under nokmem Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 1/4] mm: memcontrol: drop kmemcg_id and use the memcg ID for list_lru indexing Qinyun Tan
@ 2026-09-07 11:01 ` Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 3/4] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 4/4] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan
3 siblings, 0 replies; 6+ messages in thread
From: Qinyun Tan @ 2026-09-07 11:01 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Michal Koutný, David Hildenbrand, Zi Yan,
Baolin Wang, Usama Arif, Dave Chinner, Qi Zheng, Yosry Ahmed,
Nhat Pham, Chengming Zhou, Xunlei Pang, cgroups, linux-mm,
linux-kernel, Qinyun Tan
With cgroup.memory=nokmem, __list_lru_init() collapses every list_lru
into per-node lists. That is fine for slab objects, which are not
charged per memcg without kmem accounting. But a lru backed by a
SHRINKER_NONSLAB shrinker, e.g. the THP deferred split queue or the
zswap entries, holds user memory, which is charged regardless of
nokmem. Collapsing such an lru loses the per-memcg view of its
objects. Reclaim can no longer target just the cgroup under pressure.
Keep such lrus memcg aware under nokmem when their backing shrinker is
registered SHRINKER_NONSLAB.
This leaves the savings of nokmem intact: slab-backed lrus (e.g. the
superblock dentry/inode lrus) still fall back to the per-node lists,
and the per-memcg lists are allocated only when a memcg actually holds
such objects.
Fixes: fafaeceb89a5 ("mm: switch deferred split shrinker to list_lru")
Signed-off-by: Qinyun Tan <qinyuntan@linux.alibaba.com>
---
mm/list_lru.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/mm/list_lru.c b/mm/list_lru.c
index 6fd4e9af84396..e84eff313a683 100644
--- a/mm/list_lru.c
+++ b/mm/list_lru.c
@@ -671,7 +671,9 @@ int __list_lru_init(struct list_lru *lru, bool memcg_aware, struct shrinker *shr
else
lru->shrinker_id = -1;
- if (mem_cgroup_disabled() || mem_cgroup_kmem_disabled())
+ if (mem_cgroup_disabled() ||
+ (mem_cgroup_kmem_disabled() &&
+ (!shrinker || !(shrinker->flags & SHRINKER_NONSLAB))))
memcg_aware = false;
#endif
--
2.43.7
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 3/4] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker
2026-09-07 11:01 [PATCH v2 0/4] mm: restore per-memcg reclaim for NONSLAB shrinkers under nokmem Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 1/4] mm: memcontrol: drop kmemcg_id and use the memcg ID for list_lru indexing Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 2/4] mm: list_lru: keep per-memcg lists with nokmem for NONSLAB-backed lrus Qinyun Tan
@ 2026-09-07 11:01 ` Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 4/4] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan
3 siblings, 0 replies; 6+ messages in thread
From: Qinyun Tan @ 2026-09-07 11:01 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Michal Koutný, David Hildenbrand, Zi Yan,
Baolin Wang, Usama Arif, Dave Chinner, Qi Zheng, Yosry Ahmed,
Nhat Pham, Chengming Zhou, Xunlei Pang, cgroups, 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>
Acked-by: Zi Yan <ziy@nvidia.com>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Acked-by: Usama Arif <usama.arif@linux.dev>
Reviewed-by: Baolin Wang <baolin.wang@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 c5d11147b69ae..87c9fc48b7cfd 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1064,7 +1064,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] 6+ messages in thread
* [PATCH v2 4/4] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB
2026-09-07 11:01 [PATCH v2 0/4] mm: restore per-memcg reclaim for NONSLAB shrinkers under nokmem Qinyun Tan
` (2 preceding siblings ...)
2026-09-07 11:01 ` [PATCH v2 3/4] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan
@ 2026-09-07 11:01 ` Qinyun Tan
2026-09-07 11:33 ` Yosry Ahmed
3 siblings, 1 reply; 6+ messages in thread
From: Qinyun Tan @ 2026-09-07 11:01 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Michal Koutný, David Hildenbrand, Zi Yan,
Baolin Wang, Usama Arif, Dave Chinner, Qi Zheng, Yosry Ahmed,
Nhat Pham, Chengming Zhou, Xunlei Pang, cgroups, 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>
Acked-by: Usama Arif <usama.arif@linux.dev>
---
mm/zswap.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mm/zswap.c b/mm/zswap.c
index f3ae3c81e48ea..032136942c172 100644
--- a/mm/zswap.c
+++ b/mm/zswap.c
@@ -1252,8 +1252,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] 6+ messages in thread
* Re: [PATCH v2 4/4] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB
2026-09-07 11:01 ` [PATCH v2 4/4] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan
@ 2026-09-07 11:33 ` Yosry Ahmed
0 siblings, 0 replies; 6+ messages in thread
From: Yosry Ahmed @ 2026-09-07 11:33 UTC (permalink / raw)
To: Qinyun Tan
Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin,
Shakeel Butt, Muchun Song, Michal Koutný, David Hildenbrand,
Zi Yan, Baolin Wang, Usama Arif, Dave Chinner, Qi Zheng,
Nhat Pham, Chengming Zhou, Xunlei Pang, cgroups, linux-mm,
linux-kernel
On Mon, Sep 7, 2026 at 4:01 AM Qinyun Tan <qinyuntan@linux.alibaba.com> 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>
> Acked-by: Usama Arif <usama.arif@linux.dev>
Acked-by: Yosry Ahmed <yosry@kernel.org>
> ---
> mm/zswap.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/mm/zswap.c b/mm/zswap.c
> index f3ae3c81e48ea..032136942c172 100644
> --- a/mm/zswap.c
> +++ b/mm/zswap.c
> @@ -1252,8 +1252,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 [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-09-07 11:33 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-07 11:01 [PATCH v2 0/4] mm: restore per-memcg reclaim for NONSLAB shrinkers under nokmem Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 1/4] mm: memcontrol: drop kmemcg_id and use the memcg ID for list_lru indexing Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 2/4] mm: list_lru: keep per-memcg lists with nokmem for NONSLAB-backed lrus Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 3/4] mm: thp: restore SHRINKER_NONSLAB on the deferred split shrinker Qinyun Tan
2026-09-07 11:01 ` [PATCH v2 4/4] mm: zswap: mark the zswap shrinker SHRINKER_NONSLAB Qinyun Tan
2026-09-07 11:33 ` Yosry Ahmed
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox