* [PATCH 2/8] mm: percpu: charge obj_exts allocation with __GFP_ACCOUNT
From: Alexandre Ghiti @ 2026-05-11 20:20 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups, Alexandre Ghiti
In-Reply-To: <20260511202136.330358-1-alex@ghiti.fr>
This is a preparatory patch for upcoming per-memcg-per-node kmem
accounting.
pcpu allocations are always fully charged at once using
pcpu_obj_full_size(), which returns the size of the pcpu "metadata" +
pcpu "payload". But metadata and payload may not be allocated on the
same numa node, so charge the metadata independently from the payload.
Do this by explicitly passing __GFP_ACCOUNT to the obj_exts allocation
and remove its accounting in pcpu_memcg_pre_alloc_hook().
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
mm/percpu-internal.h | 16 +++-------------
mm/percpu.c | 15 ++++++++-------
2 files changed, 11 insertions(+), 20 deletions(-)
diff --git a/mm/percpu-internal.h b/mm/percpu-internal.h
index 4b3d6ec43703..f01db026d213 100644
--- a/mm/percpu-internal.h
+++ b/mm/percpu-internal.h
@@ -144,22 +144,12 @@ static inline int pcpu_chunk_map_bits(struct pcpu_chunk *chunk)
}
/**
- * pcpu_obj_full_size - helper to calculate size of each accounted object
+ * pcpu_obj_total_size - helper to calculate size of each accounted object
* @size: size of area to allocate in bytes
- *
- * For each accounted object there is an extra space which is used to store
- * obj_cgroup membership if kmemcg is not disabled. Charge it too.
*/
-static inline size_t pcpu_obj_full_size(size_t size)
+static inline size_t pcpu_obj_total_size(size_t size)
{
- size_t extra_size = 0;
-
-#ifdef CONFIG_MEMCG
- if (!mem_cgroup_kmem_disabled())
- extra_size += size / PCPU_MIN_ALLOC_SIZE * sizeof(struct obj_cgroup *);
-#endif
-
- return size * num_possible_cpus() + extra_size;
+ return size * num_possible_cpus();
}
#ifdef CONFIG_PERCPU_STATS
diff --git a/mm/percpu.c b/mm/percpu.c
index b0676b8054ed..13de6e099d96 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1460,7 +1460,8 @@ static struct pcpu_chunk *pcpu_alloc_chunk(gfp_t gfp)
if (need_pcpuobj_ext()) {
chunk->obj_exts =
pcpu_mem_zalloc(pcpu_chunk_map_bits(chunk) *
- sizeof(struct pcpuobj_ext), gfp);
+ sizeof(struct pcpuobj_ext),
+ gfp | __GFP_ACCOUNT);
if (!chunk->obj_exts)
goto objcg_fail;
}
@@ -1625,7 +1626,7 @@ static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
if (!objcg || obj_cgroup_is_root(objcg))
return true;
- if (obj_cgroup_charge(objcg, gfp, pcpu_obj_full_size(size)))
+ if (obj_cgroup_charge(objcg, gfp, pcpu_obj_total_size(size)))
return false;
*objcgp = objcg;
@@ -1645,10 +1646,10 @@ static void pcpu_memcg_post_alloc_hook(struct obj_cgroup *objcg,
rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
- pcpu_obj_full_size(size));
+ pcpu_obj_total_size(size));
rcu_read_unlock();
} else {
- obj_cgroup_uncharge(objcg, pcpu_obj_full_size(size));
+ obj_cgroup_uncharge(objcg, pcpu_obj_total_size(size));
}
}
@@ -1664,11 +1665,11 @@ static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
return;
chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup = NULL;
- obj_cgroup_uncharge(objcg, pcpu_obj_full_size(size));
+ obj_cgroup_uncharge(objcg, pcpu_obj_total_size(size));
rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
- -pcpu_obj_full_size(size));
+ -pcpu_obj_total_size(size));
rcu_read_unlock();
obj_cgroup_put(objcg);
@@ -1897,7 +1898,7 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
trace_percpu_alloc_percpu(_RET_IP_, reserved, is_atomic, size, align,
chunk->base_addr, off, ptr,
- pcpu_obj_full_size(size), gfp);
+ pcpu_obj_total_size(size), gfp);
pcpu_memcg_post_alloc_hook(objcg, chunk, off, size);
--
2.54.0
^ permalink raw reply related
* [PATCH 3/8] mm: percpu: Split memcg charging and kmem accounting
From: Alexandre Ghiti @ 2026-05-11 20:20 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups, Alexandre Ghiti
In-Reply-To: <20260511202136.330358-1-alex@ghiti.fr>
This is preparatory patch for upcoming per-memcg-per-node kmem
accounting.
Percpu allocations charge memory before knowing which NUMA nodes the
pages will land on. So we need to decouple the memcg charging from the
kmem accounting:
1. In the pre-alloc hook, obj_cgroup_precharge() reserves pages for
memcg limit enforcement without updating kmem stats.
2. In the post-alloc hook, obj_cgroup_account_kmem() accounts kmem
and places the sub-page remainder into the obj stock after the
allocation succeeds.
Because of that decoupling, we must not rely on the stock in the
precharge function and always charge the necessary pages that will
be accounted after the allocations happened. That means we may
temporarily overcharge the memcg but the obj_stock draining will get
things back to normal.
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
include/linux/memcontrol.h | 4 +++
mm/memcontrol.c | 50 ++++++++++++++++++++++++++++++++++++++
mm/percpu.c | 15 +++++++++---
3 files changed, 66 insertions(+), 3 deletions(-)
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index dc3fa687759b..568ab08f42af 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -1707,6 +1707,10 @@ static inline struct obj_cgroup *get_obj_cgroup_from_current(void)
int obj_cgroup_charge(struct obj_cgroup *objcg, gfp_t gfp, size_t size);
void obj_cgroup_uncharge(struct obj_cgroup *objcg, size_t size);
+int obj_cgroup_precharge(struct obj_cgroup *objcg, gfp_t gfp,
+ unsigned int nr_pages);
+void obj_cgroup_unprecharge(struct obj_cgroup *objcg, unsigned int nr_pages);
+void obj_cgroup_account_kmem(struct obj_cgroup *objcg, unsigned int nr_pages);
extern struct static_key_false memcg_bpf_enabled_key;
static inline bool memcg_bpf_enabled(void)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index d81a76654b2c..aaaa6a8b9f15 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3405,6 +3405,56 @@ void obj_cgroup_uncharge(struct obj_cgroup *objcg, size_t size)
refill_obj_stock(objcg, size, true);
}
+/*
+ * obj_cgroup_account_kmem - account KMEM for nr_pages
+ *
+ * Called after obj_cgroup_precharge() when the allocation succeeds.
+ * Accounts KMEM for nr_pages on the objcg's node.
+ */
+void obj_cgroup_account_kmem(struct obj_cgroup *objcg, unsigned int nr_pages)
+{
+ struct mem_cgroup *memcg;
+
+ rcu_read_lock();
+ memcg = obj_cgroup_memcg(objcg);
+ account_kmem_nmi_safe(memcg, nr_pages);
+ memcg1_account_kmem(memcg, nr_pages);
+ rcu_read_unlock();
+}
+
+/*
+ * obj_cgroup_precharge - reserve pages without KMEM accounting
+ *
+ * Reserves page counter credits for limit enforcement. Does not update
+ * KMEM stats or the per-CPU obj stock, because precharge decouples
+ * the page counter charge from KMEM accounting (which happens later
+ * per-node via obj_cgroup_account_kmem).
+ *
+ * On failure, use obj_cgroup_unprecharge() to release the reservation.
+ */
+int obj_cgroup_precharge(struct obj_cgroup *objcg, gfp_t gfp,
+ unsigned int nr_pages)
+{
+ struct mem_cgroup *memcg;
+ int ret;
+
+ memcg = get_mem_cgroup_from_objcg(objcg);
+ ret = try_charge_memcg(memcg, gfp, nr_pages);
+ css_put(&memcg->css);
+
+ return ret;
+}
+
+void obj_cgroup_unprecharge(struct obj_cgroup *objcg, unsigned int nr_pages)
+{
+ struct mem_cgroup *memcg;
+
+ memcg = get_mem_cgroup_from_objcg(objcg);
+ if (!mem_cgroup_is_root(memcg))
+ refill_stock(memcg, nr_pages);
+ css_put(&memcg->css);
+}
+
static inline size_t obj_full_size(struct kmem_cache *s)
{
/*
diff --git a/mm/percpu.c b/mm/percpu.c
index 13de6e099d96..7c67dc2e4878 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1626,7 +1626,8 @@ static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
if (!objcg || obj_cgroup_is_root(objcg))
return true;
- if (obj_cgroup_charge(objcg, gfp, pcpu_obj_total_size(size)))
+ if (obj_cgroup_precharge(objcg, gfp,
+ PAGE_ALIGN(pcpu_obj_total_size(size)) >> PAGE_SHIFT))
return false;
*objcgp = objcg;
@@ -1641,15 +1642,23 @@ static void pcpu_memcg_post_alloc_hook(struct obj_cgroup *objcg,
return;
if (likely(chunk && chunk->obj_exts)) {
+ size_t total = pcpu_obj_total_size(size);
+ size_t remainder = PAGE_ALIGN(total) - total;
+
obj_cgroup_get(objcg);
chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup = objcg;
rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
- pcpu_obj_total_size(size));
+ total);
rcu_read_unlock();
+
+ obj_cgroup_account_kmem(objcg, PAGE_ALIGN(total) >> PAGE_SHIFT);
+ if (remainder)
+ obj_cgroup_uncharge(objcg, remainder);
} else {
- obj_cgroup_uncharge(objcg, pcpu_obj_total_size(size));
+ obj_cgroup_unprecharge(objcg,
+ PAGE_ALIGN(pcpu_obj_total_size(size)) >> PAGE_SHIFT);
}
}
--
2.54.0
^ permalink raw reply related
* Re: [PATCH 1/3] cgroup/cpuset: Fix deadline bandwidth leak in cpuset_can_attach()
From: Aaron Tomlin @ 2026-05-11 20:25 UTC (permalink / raw)
To: Waiman Long
Cc: tsbogend, paul, jmorris, serge, mingo, peterz, juri.lelli,
vincent.guittot, stephen.smalley.work, casey, tj, hannes, mkoutny,
chenridong, dietmar.eggemann, rostedt, bsegall, mgorman, vschneid,
kprateek.nayak, omosnace, kees, neelx, sean, chjohnst, steve,
mproche, nick.lange, cgroups, linux-mips, linux-fsdevel,
linux-security-module, selinux, linux-kernel
In-Reply-To: <354af9fc-1c70-4ee4-a0ff-8821bebec7b8@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 796 bytes --]
On Mon, May 11, 2026 at 01:54:37PM -0400, Waiman Long wrote:
> > Hi Waiman,
> >
> > Thank you for the follow up.
> >
> > Acknowledged. I will drop this patch in the next iteration due to [1].
> >
> > Please note, the sashiko AI Review bot reported: cpuset_can_attach()
> > incorrectly assumes all migrating tasks originate from the same source
> > cpuset. At first glance, this feedback is valid. I plan to submit a patch,
> > if no solution was already proposed.
> >
> > [1]: https://lore.kernel.org/lkml/20260509102031.97608-2-zhangguopeng@kylinos.cn/
>
> Yes, it does look like the AI feedback is valid. I will take a further look
> into this.
>
> Thanks,
> Longman
No worries, I have it. I'll submit a patch for review shortly.
Kind regards,
--
Aaron Tomlin
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* [PATCH 4/8] mm: memcontrol: track MEMCG_KMEM per NUMA node
From: Alexandre Ghiti @ 2026-05-11 20:20 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups, Alexandre Ghiti
In-Reply-To: <20260511202136.330358-1-alex@ghiti.fr>
This patch gets rid of MEMCG_KMEM and wires all the "generic" functions
by introducing per-node obj_cgroup objects.
Note that it does not convert the kmem users to proper per-memcg-per-node
accounting now, this is done in upcoming patches.
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
include/linux/memcontrol.h | 23 ++++++++++----
include/linux/mmzone.h | 1 +
mm/memcontrol.c | 64 ++++++++++++++++++++++++--------------
mm/vmstat.c | 1 +
4 files changed, 59 insertions(+), 30 deletions(-)
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 568ab08f42af..17cf823160e4 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -35,7 +35,6 @@ enum memcg_stat_item {
MEMCG_SWAP = NR_VM_NODE_STAT_ITEMS,
MEMCG_SOCK,
MEMCG_PERCPU_B,
- MEMCG_KMEM,
MEMCG_ZSWAP_B,
MEMCG_ZSWAPPED,
MEMCG_ZSWAP_INCOMP,
@@ -126,9 +125,10 @@ struct mem_cgroup_per_node {
struct list_head objcg_list;
#ifdef CONFIG_MEMCG_NMI_SAFETY_REQUIRES_ATOMIC
- /* slab stats for nmi context */
+ /* slab and kmem stats for nmi context */
atomic_t slab_reclaimable;
atomic_t slab_unreclaimable;
+ atomic_t kmem;
#endif
};
@@ -190,6 +190,7 @@ struct obj_cgroup {
struct rcu_head rcu;
};
bool is_root;
+ int nid;
};
/*
@@ -254,10 +255,6 @@ struct mem_cgroup {
atomic_long_t memory_events[MEMCG_NR_MEMORY_EVENTS];
atomic_long_t memory_events_local[MEMCG_NR_MEMORY_EVENTS];
-#ifdef CONFIG_MEMCG_NMI_SAFETY_REQUIRES_ATOMIC
- /* MEMCG_KMEM for nmi context */
- atomic_t kmem_stat;
-#endif
/*
* Hint of reclaim pressure for socket memroy management. Note
* that this indicator should NOT be used in legacy cgroup mode
@@ -776,6 +773,20 @@ static inline void obj_cgroup_put(struct obj_cgroup *objcg)
percpu_ref_put(&objcg->refcnt);
}
+static inline struct obj_cgroup *obj_cgroup_get_nid(struct obj_cgroup *objcg,
+ int nid)
+{
+ struct obj_cgroup *nid_objcg;
+ struct mem_cgroup *memcg;
+
+ rcu_read_lock();
+ memcg = obj_cgroup_memcg(objcg);
+ nid_objcg = rcu_dereference(memcg->nodeinfo[nid]->objcg);
+ rcu_read_unlock();
+
+ return nid_objcg;
+}
+
static inline bool mem_cgroup_tryget(struct mem_cgroup *memcg)
{
return !memcg || css_tryget(&memcg->css);
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 9adb2ad21da5..97eb168fd7f3 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -326,6 +326,7 @@ enum node_stat_item {
#ifdef CONFIG_HUGETLB_PAGE
NR_HUGETLB,
#endif
+ NR_KMEM,
NR_BALLOON_PAGES,
NR_KERNEL_FILE_PAGES,
NR_GPU_ACTIVE, /* Pages assigned to GPU objects */
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index aaaa6a8b9f15..979a847e542a 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -136,6 +136,7 @@ bool mem_cgroup_kmem_disabled(void)
}
static void memcg_uncharge(struct mem_cgroup *memcg, unsigned int nr_pages);
+static void mod_memcg_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, int val);
static void obj_cgroup_release(struct percpu_ref *ref)
{
@@ -170,9 +171,11 @@ static void obj_cgroup_release(struct percpu_ref *ref)
if (nr_pages) {
struct mem_cgroup *memcg;
+ struct lruvec *lruvec;
memcg = get_mem_cgroup_from_objcg(objcg);
- mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages);
+ lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(objcg->nid));
+ mod_lruvec_state(lruvec, NR_KMEM, -nr_pages);
memcg1_account_kmem(memcg, -nr_pages);
if (!mem_cgroup_is_root(memcg))
memcg_uncharge(memcg, nr_pages);
@@ -423,13 +426,13 @@ static const unsigned int memcg_node_stat_items[] = {
#ifdef CONFIG_HUGETLB_PAGE
NR_HUGETLB,
#endif
+ NR_KMEM,
};
static const unsigned int memcg_stat_items[] = {
MEMCG_SWAP,
MEMCG_SOCK,
MEMCG_PERCPU_B,
- MEMCG_KMEM,
MEMCG_ZSWAP_B,
MEMCG_ZSWAPPED,
MEMCG_ZSWAP_INCOMP,
@@ -1537,7 +1540,7 @@ struct memory_stat {
static const struct memory_stat memory_stats[] = {
{ "anon", NR_ANON_MAPPED },
{ "file", NR_FILE_PAGES },
- { "kernel", MEMCG_KMEM },
+ { "kernel", NR_KMEM },
{ "kernel_stack", NR_KERNEL_STACK_KB },
{ "pagetables", NR_PAGETABLE },
{ "sec_pagetables", NR_SECONDARY_PAGETABLE },
@@ -3004,20 +3007,26 @@ struct obj_cgroup *get_obj_cgroup_from_folio(struct folio *folio)
}
#ifdef CONFIG_MEMCG_NMI_SAFETY_REQUIRES_ATOMIC
-static inline void account_kmem_nmi_safe(struct mem_cgroup *memcg, int val)
+static inline void account_kmem_nmi_safe(struct mem_cgroup *memcg, int nid, int val)
{
if (likely(!in_nmi())) {
- mod_memcg_state(memcg, MEMCG_KMEM, val);
+ struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid));
+
+ mod_lruvec_state(lruvec, NR_KMEM, val);
} else {
+ struct mem_cgroup_per_node *pn = memcg->nodeinfo[nid];
+
/* preemption is disabled in_nmi(). */
css_rstat_updated(&memcg->css, smp_processor_id());
- atomic_add(val, &memcg->kmem_stat);
+ atomic_add(val, &pn->kmem);
}
}
#else
-static inline void account_kmem_nmi_safe(struct mem_cgroup *memcg, int val)
+static inline void account_kmem_nmi_safe(struct mem_cgroup *memcg, int nid, int val)
{
- mod_memcg_state(memcg, MEMCG_KMEM, val);
+ struct lruvec *lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(nid));
+
+ mod_lruvec_state(lruvec, NR_KMEM, val);
}
#endif
@@ -3033,7 +3042,7 @@ static void obj_cgroup_uncharge_pages(struct obj_cgroup *objcg,
memcg = get_mem_cgroup_from_objcg(objcg);
- account_kmem_nmi_safe(memcg, -nr_pages);
+ account_kmem_nmi_safe(memcg, objcg->nid, -nr_pages);
memcg1_account_kmem(memcg, -nr_pages);
if (!mem_cgroup_is_root(memcg))
refill_stock(memcg, nr_pages);
@@ -3061,7 +3070,7 @@ static int obj_cgroup_charge_pages(struct obj_cgroup *objcg, gfp_t gfp,
if (ret)
goto out;
- account_kmem_nmi_safe(memcg, nr_pages);
+ account_kmem_nmi_safe(memcg, objcg->nid, nr_pages);
memcg1_account_kmem(memcg, nr_pages);
out:
css_put(&memcg->css);
@@ -3238,10 +3247,11 @@ static void drain_obj_stock(struct obj_stock_pcp *stock)
if (nr_pages) {
struct mem_cgroup *memcg;
+ struct lruvec *lruvec;
memcg = get_mem_cgroup_from_objcg(old);
-
- mod_memcg_state(memcg, MEMCG_KMEM, -nr_pages);
+ lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(old->nid));
+ mod_lruvec_state(lruvec, NR_KMEM, -nr_pages);
memcg1_account_kmem(memcg, -nr_pages);
if (!mem_cgroup_is_root(memcg))
memcg_uncharge(memcg, nr_pages);
@@ -3250,7 +3260,7 @@ static void drain_obj_stock(struct obj_stock_pcp *stock)
}
/*
- * The leftover is flushed to the centralized per-memcg value.
+ * The leftover is flushed to the per-node per-memcg value.
* On the next attempt to refill obj stock it will be moved
* to a per-cpu stock (probably, on an other CPU), see
* refill_obj_stock().
@@ -3417,7 +3427,7 @@ void obj_cgroup_account_kmem(struct obj_cgroup *objcg, unsigned int nr_pages)
rcu_read_lock();
memcg = obj_cgroup_memcg(objcg);
- account_kmem_nmi_safe(memcg, nr_pages);
+ account_kmem_nmi_safe(memcg, objcg->nid, nr_pages);
memcg1_account_kmem(memcg, nr_pages);
rcu_read_unlock();
}
@@ -4165,6 +4175,7 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css)
if (unlikely(mem_cgroup_is_root(memcg)))
objcg->is_root = true;
+ objcg->nid = nid;
objcg->memcg = memcg;
rcu_assign_pointer(memcg->nodeinfo[nid]->objcg, objcg);
obj_cgroup_get(objcg);
@@ -4369,15 +4380,6 @@ static void flush_nmi_stats(struct mem_cgroup *memcg, struct mem_cgroup *parent,
{
int nid;
- if (atomic_read(&memcg->kmem_stat)) {
- int kmem = atomic_xchg(&memcg->kmem_stat, 0);
- int index = memcg_stats_index(MEMCG_KMEM);
-
- memcg->vmstats->state[index] += kmem;
- if (parent)
- parent->vmstats->state_pending[index] += kmem;
- }
-
for_each_node_state(nid, N_MEMORY) {
struct mem_cgroup_per_node *pn = memcg->nodeinfo[nid];
struct lruvec_stats *lstats = pn->lruvec_stats;
@@ -4408,6 +4410,18 @@ static void flush_nmi_stats(struct mem_cgroup *memcg, struct mem_cgroup *parent,
if (parent)
parent->vmstats->state_pending[index] += slab;
}
+ if (atomic_read(&pn->kmem)) {
+ int kmem = atomic_xchg(&pn->kmem, 0);
+ int index = memcg_stats_index(NR_KMEM);
+
+ mod_node_page_state(NODE_DATA(nid), NR_KMEM, kmem);
+ lstats->state[index] += kmem;
+ memcg->vmstats->state[index] += kmem;
+ if (plstats)
+ plstats->state_pending[index] += kmem;
+ if (parent)
+ parent->vmstats->state_pending[index] += kmem;
+ }
}
}
#else
@@ -5173,7 +5187,9 @@ static void uncharge_batch(const struct uncharge_gather *ug)
if (ug->nr_memory) {
memcg_uncharge(memcg, ug->nr_memory);
if (ug->nr_kmem) {
- mod_memcg_state(memcg, MEMCG_KMEM, -ug->nr_kmem);
+ struct lruvec *lruvec =
+ mem_cgroup_lruvec(memcg, NODE_DATA(ug->objcg->nid));
+ mod_lruvec_state(lruvec, NR_KMEM, -ug->nr_kmem);
memcg1_account_kmem(memcg, -ug->nr_kmem);
}
memcg1_oom_recover(memcg);
diff --git a/mm/vmstat.c b/mm/vmstat.c
index f534972f517d..d55437d1852e 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -1293,6 +1293,7 @@ const char * const vmstat_text[] = {
#ifdef CONFIG_HUGETLB_PAGE
[I(NR_HUGETLB)] = "nr_hugetlb",
#endif
+ [I(NR_KMEM)] = "nr_kmem",
[I(NR_BALLOON_PAGES)] = "nr_balloon_pages",
[I(NR_KERNEL_FILE_PAGES)] = "nr_kernel_file_pages",
[I(NR_GPU_ACTIVE)] = "nr_gpu_active",
--
2.54.0
^ permalink raw reply related
* [PATCH 6/8] mm: slab: per-node kmem accounting for slab
From: Alexandre Ghiti @ 2026-05-11 20:20 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups, Alexandre Ghiti
In-Reply-To: <20260511202136.330358-1-alex@ghiti.fr>
Update slab hook to use per-node obj_cgroup for correct NUMA
attribution of NR_KMEM.
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
mm/memcontrol.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 66d2beb1c974..cefb335c990e 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3521,14 +3521,18 @@ bool __memcg_slab_post_alloc_hook(struct kmem_cache *s, struct list_lru *lru,
unsigned long obj_exts;
struct slabobj_ext *obj_ext;
struct obj_stock_pcp *stock;
+ struct obj_cgroup *nid_objcg;
+ int nid;
slab = virt_to_slab(p[i]);
+ nid = slab_pgdat(slab)->node_id;
if (!slab_obj_exts(slab) &&
alloc_slab_obj_exts(slab, s, flags, false)) {
continue;
}
+ nid_objcg = obj_cgroup_get_nid(objcg, nid);
/*
* if we fail and size is 1, memcg_alloc_abort_single() will
* just free the object, which is ok as we have not assigned
@@ -3541,17 +3545,17 @@ bool __memcg_slab_post_alloc_hook(struct kmem_cache *s, struct list_lru *lru,
* between iterations, with a more complicated undo
*/
stock = trylock_stock();
- if (!stock || !__consume_obj_stock(objcg, stock, obj_size)) {
+ if (!stock || !__consume_obj_stock(nid_objcg, stock, obj_size)) {
size_t remainder;
unlock_stock(stock);
- if (__obj_cgroup_charge(objcg, flags, obj_size, &remainder))
+ if (__obj_cgroup_charge(nid_objcg, flags, obj_size, &remainder))
return false;
stock = trylock_stock();
if (remainder)
- __refill_obj_stock(objcg, stock, remainder, false);
+ __refill_obj_stock(nid_objcg, stock, remainder, false);
}
- __account_obj_stock(objcg, stock, obj_size,
+ __account_obj_stock(nid_objcg, stock, obj_size,
slab_pgdat(slab), cache_vmstat_idx(s));
unlock_stock(stock);
@@ -3559,8 +3563,8 @@ bool __memcg_slab_post_alloc_hook(struct kmem_cache *s, struct list_lru *lru,
get_slab_obj_exts(obj_exts);
off = obj_to_index(s, slab, p[i]);
obj_ext = slab_obj_ext(slab, obj_exts, off);
- obj_cgroup_get(objcg);
- obj_ext->objcg = objcg;
+ obj_cgroup_get(nid_objcg);
+ obj_ext->objcg = nid_objcg;
put_slab_obj_exts(obj_exts);
}
--
2.54.0
^ permalink raw reply related
* Re: [PATCH v2 2/3] security: Expand task_setscheduler LSM hook to include CPU affinity mask
From: Paul Moore @ 2026-05-11 20:28 UTC (permalink / raw)
To: Aaron Tomlin
Cc: tsbogend, jmorris, serge, mingo, peterz, juri.lelli,
vincent.guittot, stephen.smalley.work, casey, longman, tj, hannes,
mkoutny, chenridong, dietmar.eggemann, rostedt, bsegall, mgorman,
vschneid, kprateek.nayak, omosnace, kees, neelx, sean, chjohnst,
steve, mproche, nick.lange, cgroups, linux-mips, linux-fsdevel,
linux-security-module, selinux, linux-kernel
In-Reply-To: <20260509213803.968464-4-atomlin@atomlin.com>
On Sat, May 9, 2026 at 5:38 PM Aaron Tomlin <atomlin@atomlin.com> wrote:
>
> At present, the task_setscheduler LSM hook provides security modules
> with the opportunity to mediate changes to a task's scheduling policy.
> However, when invoked via sched_setaffinity(), the hook lacks
> visibility into the actual CPU affinity mask being requested.
> Consequently, BPF-based security modules are entirely blind to the
> target CPUs and cannot make granular access control decisions based on
> spatial isolation.
>
> In modern multi-tenant and real-time environments, CPU isolation is a
> critical boundary. The inability to audit or restrict specific CPU
> pinning requests limits the effectiveness of eBPF-driven security
> policies, particularly when attempting to shield isolated or
> cryptographic cores from unprivileged or compromised tasks.
>
> This patch expands the security_task_setscheduler() hook signature to
> include a pointer to the requested cpumask. Because this is a shared
> hook used for multiple scheduling attribute changes, call sites that do
> not modify CPU affinity are updated to safely pass NULL.
> To protect against unverified dereferences, the parameter is annotated
> with __nullable in the LSM hook definition, ensuring the BPF verifier
> mandates explicit NULL checks for attached eBPF programs.
>
> This change updates all in-tree security modules (SELinux and Smack) to
> accommodate the new parameter mechanically, whilst providing BPF LSMs
> with the necessary context to enforce strict affinity policies.
>
> Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
> ---
> arch/mips/kernel/mips-mt-fpaff.c | 30 +++++++++++++++++-------------
> fs/proc/base.c | 2 +-
> include/linux/lsm_hook_defs.h | 3 ++-
> include/linux/security.h | 11 +++++++----
> kernel/cgroup/cpuset.c | 4 ++--
> kernel/sched/syscalls.c | 4 ++--
> security/commoncap.c | 7 +++++--
> security/security.c | 11 ++++++-----
> security/selinux/hooks.c | 3 ++-
> security/smack/smack_lsm.c | 11 +++++++++--
> 10 files changed, 53 insertions(+), 33 deletions(-)
I haven't looked too closely at this patch yet, but based on a quick
glance, can you help me understand why it is included with the other
two patches in one patchset? The other two patches look like stable
level kernel bug fixes, while this patch introduces functionality to
an existing LSM hook; one of these is not like the others :)
Unless there is something critical that I'm missing here, I would
suggest splitting this patch out from the other two bugfixes for
separate handling. If there is a patch dependency issue you can
always mention that in the cover letter.
--
paul-moore.com
^ permalink raw reply
* Re: [PATCH v3 2/2] cgroup/cpuset: reserve DL bandwidth only for root-domain moves
From: Tejun Heo @ 2026-05-11 20:29 UTC (permalink / raw)
To: Guopeng Zhang
Cc: Waiman Long, Michal Koutný, Ingo Molnar, Peter Zijlstra,
Juri Lelli, Chen Ridong, Johannes Weiner, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Valentin Schneider, K Prateek Nayak, Gabriele Monaco, Will Deacon,
linux-kernel, cgroups
In-Reply-To: <20260509102031.97608-3-zhangguopeng@kylinos.cn>
Hello,
Applied to cgroup/for-7.1-fixes with Cc: stable@vger.kernel.org # v6.10+.
Thanks.
--
tejun
^ permalink raw reply
* [PATCH 7/8] mm: percpu: per-node kmem accounting using local credit
From: Alexandre Ghiti @ 2026-05-11 20:20 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups, Alexandre Ghiti
In-Reply-To: <20260511202136.330358-1-alex@ghiti.fr>
Now that the memcg charging is decoupled from the kmem accounting, we
can't use obj_stock to handle the percpu accounting because our
precharged pages may get drained. That's a problem because we suppose
we have enough charged pages in pcpu_memcg_post_alloc_hook() and we cannot
charge more pages here because it may fail and would defeat the purpose of
the precharge.
So instead of using obj_stock, use a local per-node credit that fills
the same purpose whose surplus eventually gets refilled into the
stock.
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
mm/percpu.c | 88 +++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 76 insertions(+), 12 deletions(-)
diff --git a/mm/percpu.c b/mm/percpu.c
index 7c67dc2e4878..64b327fe3c26 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1614,6 +1614,16 @@ static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr)
}
#ifdef CONFIG_MEMCG
+static unsigned int pcpu_memcg_nr_precharge_pages(size_t size)
+{
+ size_t total = pcpu_obj_total_size(size);
+
+ if (total < PAGE_SIZE)
+ return num_possible_nodes();
+
+ return PAGE_ALIGN(total) >> PAGE_SHIFT;
+}
+
static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
struct obj_cgroup **objcgp)
{
@@ -1626,8 +1636,7 @@ static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
if (!objcg || obj_cgroup_is_root(objcg))
return true;
- if (obj_cgroup_precharge(objcg, gfp,
- PAGE_ALIGN(pcpu_obj_total_size(size)) >> PAGE_SHIFT))
+ if (obj_cgroup_precharge(objcg, gfp, pcpu_memcg_nr_precharge_pages(size)))
return false;
*objcgp = objcg;
@@ -1642,29 +1651,68 @@ static void pcpu_memcg_post_alloc_hook(struct obj_cgroup *objcg,
return;
if (likely(chunk && chunk->obj_exts)) {
- size_t total = pcpu_obj_total_size(size);
- size_t remainder = PAGE_ALIGN(total) - total;
+ unsigned int nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
+ unsigned int precharge_pages = pcpu_memcg_nr_precharge_pages(size);
+ unsigned int pages_used = 0;
+ unsigned int node_credit[MAX_NUMNODES] = { 0 };
+ unsigned int cpu;
+ int nid;
obj_cgroup_get(objcg);
chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup = objcg;
rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
- total);
+ pcpu_obj_total_size(size));
rcu_read_unlock();
- obj_cgroup_account_kmem(objcg, PAGE_ALIGN(total) >> PAGE_SHIFT);
- if (remainder)
- obj_cgroup_uncharge(objcg, remainder);
+ for_each_possible_cpu(cpu) {
+ unsigned int i;
+
+ for (i = 0; i < nr_pages; i++) {
+ void *addr = (void *)pcpu_chunk_addr(chunk, cpu,
+ PFN_DOWN(off) + i);
+ size_t page_sz = i < nr_pages - 1 ?
+ PAGE_SIZE : size - (nr_pages - 1) * PAGE_SIZE;
+
+ nid = page_to_nid(pcpu_addr_to_page(addr));
+
+ if (node_credit[nid] < page_sz) {
+ struct obj_cgroup *nid_objcg;
+
+ nid_objcg = obj_cgroup_get_nid(objcg, nid);
+ obj_cgroup_account_kmem(nid_objcg, 1);
+ node_credit[nid] += PAGE_SIZE;
+ pages_used++;
+ }
+
+ node_credit[nid] -= page_sz;
+ }
+ }
+
+ /* Return unused precharged pages */
+ if (pages_used < precharge_pages)
+ obj_cgroup_unprecharge(objcg, precharge_pages - pages_used);
+
+ /* Put leftover per-node credit into stock */
+ for_each_online_node(nid) {
+ if (node_credit[nid] > 0) {
+ struct obj_cgroup *nid_objcg;
+
+ nid_objcg = obj_cgroup_get_nid(objcg, nid);
+ obj_cgroup_uncharge(nid_objcg, node_credit[nid]);
+ }
+ }
} else {
- obj_cgroup_unprecharge(objcg,
- PAGE_ALIGN(pcpu_obj_total_size(size)) >> PAGE_SHIFT);
+ obj_cgroup_unprecharge(objcg, pcpu_memcg_nr_precharge_pages(size));
}
}
static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
{
+ unsigned int nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
struct obj_cgroup *objcg;
+ unsigned int cpu;
if (unlikely(!chunk->obj_exts))
return;
@@ -1674,13 +1722,29 @@ static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
return;
chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup = NULL;
- obj_cgroup_uncharge(objcg, pcpu_obj_total_size(size));
-
rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
-pcpu_obj_total_size(size));
rcu_read_unlock();
+ for_each_possible_cpu(cpu) {
+ unsigned int i;
+
+ for (i = 0; i < nr_pages; i++) {
+ void *addr = (void *)pcpu_chunk_addr(chunk, cpu,
+ PFN_DOWN(off) + i);
+ struct obj_cgroup *nid_objcg;
+ int nid;
+ size_t unc;
+
+ nid = page_to_nid(pcpu_addr_to_page(addr));
+ nid_objcg = obj_cgroup_get_nid(objcg, nid);
+ unc = i < nr_pages - 1 ?
+ PAGE_SIZE : size - (nr_pages - 1) * PAGE_SIZE;
+ obj_cgroup_uncharge(nid_objcg, unc);
+ }
+ }
+
obj_cgroup_put(objcg);
}
--
2.54.0
^ permalink raw reply related
* [PATCH 8/8] mm: zswap: per-node kmem accounting for zswap/zsmalloc
From: Alexandre Ghiti @ 2026-05-11 20:20 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups, Alexandre Ghiti
In-Reply-To: <20260511202136.330358-1-alex@ghiti.fr>
Update zswap and zsmalloc to use per-node obj_cgroup for kmem
accounting, attributing compressed page charges to the correct
NUMA node.
But actually, this is incomplete because it does not correctly account
for entries that straddle pages, those pages being possibly on 2 different
nodes.
This will be correctly handled by Joshua in a different series [1].
Link: https://lore.kernel.org/linux-mm/20260311195153.4013476-1-joshua.hahnjy@gmail.com/ [1]
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
include/linux/zsmalloc.h | 2 ++
mm/zsmalloc.c | 11 +++++++++++
mm/zswap.c | 9 +++++++--
3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/include/linux/zsmalloc.h b/include/linux/zsmalloc.h
index 478410c880b1..30427f3fe232 100644
--- a/include/linux/zsmalloc.h
+++ b/include/linux/zsmalloc.h
@@ -50,6 +50,8 @@ void zs_obj_read_sg_end(struct zs_pool *pool, unsigned long handle);
void zs_obj_write(struct zs_pool *pool, unsigned long handle,
void *handle_mem, size_t mem_len);
+int zs_handle_to_nid(struct zs_pool *pool, unsigned long handle);
+
extern const struct movable_operations zsmalloc_mops;
#endif
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index 63128ddb7959..7b45c67e51f1 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -1381,6 +1381,17 @@ static void obj_free(int class_size, unsigned long obj)
mod_zspage_inuse(zspage, -1);
}
+int zs_handle_to_nid(struct zs_pool *pool, unsigned long handle)
+{
+ unsigned long obj;
+ struct zpdesc *zpdesc;
+
+ obj = handle_to_obj(handle);
+ obj_to_zpdesc(obj, &zpdesc);
+ return page_to_nid(zpdesc_page(zpdesc));
+}
+EXPORT_SYMBOL(zs_handle_to_nid);
+
void zs_free(struct zs_pool *pool, unsigned long handle)
{
struct zspage *zspage;
diff --git a/mm/zswap.c b/mm/zswap.c
index 4b5149173b0e..e3a9a294f14b 100644
--- a/mm/zswap.c
+++ b/mm/zswap.c
@@ -1443,8 +1443,13 @@ static bool zswap_store_page(struct page *page,
*/
zswap_pool_get(pool);
if (objcg) {
- obj_cgroup_get(objcg);
- obj_cgroup_charge_zswap(objcg, entry->length);
+ struct obj_cgroup *nid_objcg;
+ int nid = zs_handle_to_nid(pool->zs_pool, entry->handle);
+
+ nid_objcg = obj_cgroup_get_nid(objcg, nid);
+ obj_cgroup_charge_zswap(nid_objcg, entry->length);
+ obj_cgroup_get(nid_objcg);
+ objcg = nid_objcg;
}
atomic_long_inc(&zswap_stored_pages);
if (entry->length == PAGE_SIZE)
--
2.54.0
^ permalink raw reply related
* [PATCH 5/8] mm: memcontrol: per-node kmem accounting for page charges
From: Alexandre Ghiti @ 2026-05-11 20:20 UTC (permalink / raw)
To: Andrew Morton
Cc: Johannes Weiner, Michal Hocko, Roman Gushchin, Shakeel Butt,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups, Alexandre Ghiti
In-Reply-To: <20260511202136.330358-1-alex@ghiti.fr>
Update __memcg_kmem_charge_page() to use per-node obj_cgroup for
correct NUMA attribution of NR_KMEM.
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
---
mm/memcontrol.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 979a847e542a..66d2beb1c974 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3105,17 +3105,19 @@ static void page_set_objcg(struct page *page, const struct obj_cgroup *objcg)
*/
int __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order)
{
- struct obj_cgroup *objcg;
+ struct obj_cgroup *objcg, *nid_objcg;
+ int nid = page_to_nid(page);
int ret = 0;
objcg = current_obj_cgroup();
if (objcg && !obj_cgroup_is_root(objcg)) {
- ret = obj_cgroup_charge_pages(objcg, gfp, 1 << order);
- if (!ret) {
- obj_cgroup_get(objcg);
- page_set_objcg(page, objcg);
- return 0;
- }
+ nid_objcg = obj_cgroup_get_nid(objcg, nid);
+ ret = obj_cgroup_charge_pages(nid_objcg, gfp, 1 << order);
+ if (ret)
+ return ret;
+ obj_cgroup_get(nid_objcg);
+ page_set_objcg(page, nid_objcg);
+ return 0;
}
return ret;
}
--
2.54.0
^ permalink raw reply related
* Re: [PATCH v3 00/12] mm, swap: swap table phase IV: unify allocation and reduce static metadata
From: Andrew Morton @ 2026-05-11 21:12 UTC (permalink / raw)
To: Kairui Song
Cc: kasong, linux-mm, David Hildenbrand, Zi Yan, Baolin Wang,
Barry Song, Hugh Dickins, Chris Li, Kemeng Shi, Nhat Pham,
Baoquan He, Johannes Weiner, Youngjun Park, Chengming Zhou,
Roman Gushchin, Shakeel Butt, Muchun Song, Qi Zheng, linux-kernel,
cgroups, Yosry Ahmed, Lorenzo Stoakes, Dev Jain, Lance Yang,
Michal Hocko, Michal Hocko, Suren Baghdasaryan, Axel Rasmussen
In-Reply-To: <CAMgjq7CJ8Are6m7X2UxUoJ=77c_oSpdG8-bzkmdRzwey2Cp1gQ@mail.gmail.com>
On Sat, 25 Apr 2026 02:11:47 +0800 Kairui Song <ryncsn@gmail.com> wrote:
> > base-commit: f1541b40cd422d7e22273be9b7e9edfc9ea4f0d7
> > change-id: 20260111-swap-table-p4-98ee92baa7c4
> >
> > Best regards,
> > --
> > Kairui Song <kasong@tencent.com>
> >
> >
>
> I checked sashiko's review, it seems sashiko itself is bugged or
> something wrong, Most patched end up with:
> Tool error: Review tool timed out (active time exceeded)
>
> The rest of the results are all false positives, maybe I can add a few
> more comments in the code or commit so it can understand the code
> better.
>
> And checking V2's review:
> https://sashiko.dev/#/patchset/20260417-swap-table-p4-v2-0-17f5d1015428%40tencent.com
>
> Which are mostly false positives and I've fixed the two real but
> trivial issues already. Things should be fine.
Sashiko review of v3:
https://sashiko.dev/#/patchset/20260421-swap-table-p4-v3-0-2f23759a76bc@tencent.com
appears to be complete, so perhaps it went back and figured it out.
It claims to have several "critical" and "high" things, so please
recheck?
From your replies in this thread, I believe that we'll be seeing a v4
series?
^ permalink raw reply
* [tj-cgroup:for-7.2] BUILD SUCCESS be2689c9ed47bde6f15a24c9845f6fc1ec52502f
From: kernel test robot @ 2026-05-11 21:39 UTC (permalink / raw)
To: Tejun Heo; +Cc: cgroups
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git for-7.2
branch HEAD: be2689c9ed47bde6f15a24c9845f6fc1ec52502f cgroup/cpuset: Skip hardwall ancestor scan in cpuset v2 in cpuset_current_node_allowed()
elapsed time: 741m
configs tested: 317
configs skipped: 6
The following configs have been built successfully.
More configs may be tested in the coming days.
tested configs:
alpha allnoconfig gcc-15.2.0
alpha allyesconfig gcc-15.2.0
alpha defconfig gcc-15.2.0
arc allmodconfig clang-16
arc allmodconfig gcc-15.2.0
arc allnoconfig gcc-15.2.0
arc allyesconfig clang-23
arc defconfig gcc-15.2.0
arc randconfig-001-20260511 gcc-10.5.0
arc randconfig-001-20260512 gcc-11.5.0
arc randconfig-002-20260511 gcc-10.5.0
arc randconfig-002-20260512 gcc-11.5.0
arm allnoconfig gcc-15.2.0
arm allyesconfig clang-16
arm allyesconfig gcc-15.2.0
arm defconfig gcc-15.2.0
arm pxa3xx_defconfig clang-23
arm randconfig-001-20260511 gcc-10.5.0
arm randconfig-001-20260512 gcc-11.5.0
arm randconfig-002-20260511 gcc-10.5.0
arm randconfig-002-20260512 gcc-11.5.0
arm randconfig-003-20260511 gcc-10.5.0
arm randconfig-003-20260512 gcc-11.5.0
arm randconfig-004-20260511 gcc-10.5.0
arm randconfig-004-20260512 gcc-11.5.0
arm64 allmodconfig clang-23
arm64 allnoconfig gcc-15.2.0
arm64 defconfig gcc-15.2.0
arm64 randconfig-001 clang-23
arm64 randconfig-001-20260511 clang-17
arm64 randconfig-001-20260511 clang-23
arm64 randconfig-001-20260512 gcc-14.3.0
arm64 randconfig-002 clang-23
arm64 randconfig-002-20260511 clang-17
arm64 randconfig-002-20260511 clang-23
arm64 randconfig-002-20260512 gcc-14.3.0
arm64 randconfig-003 clang-23
arm64 randconfig-003-20260511 clang-17
arm64 randconfig-003-20260511 clang-23
arm64 randconfig-003-20260512 gcc-14.3.0
arm64 randconfig-004 clang-23
arm64 randconfig-004-20260511 clang-17
arm64 randconfig-004-20260511 clang-23
arm64 randconfig-004-20260512 gcc-14.3.0
csky allmodconfig gcc-15.2.0
csky allnoconfig gcc-15.2.0
csky defconfig gcc-15.2.0
csky randconfig-001 clang-23
csky randconfig-001-20260511 clang-17
csky randconfig-001-20260511 clang-23
csky randconfig-001-20260512 gcc-14.3.0
csky randconfig-002 clang-23
csky randconfig-002-20260511 clang-17
csky randconfig-002-20260511 clang-23
csky randconfig-002-20260512 gcc-14.3.0
hexagon allmodconfig gcc-15.2.0
hexagon allnoconfig gcc-15.2.0
hexagon defconfig gcc-15.2.0
hexagon randconfig-001-20260511 gcc-8.5.0
hexagon randconfig-001-20260512 gcc-10.5.0
hexagon randconfig-002-20260511 gcc-8.5.0
hexagon randconfig-002-20260512 gcc-10.5.0
i386 allmodconfig clang-20
i386 allnoconfig gcc-15.2.0
i386 allyesconfig clang-20
i386 buildonly-randconfig-001-20260511 gcc-14
i386 buildonly-randconfig-001-20260512 gcc-14
i386 buildonly-randconfig-002-20260511 gcc-14
i386 buildonly-randconfig-002-20260512 gcc-14
i386 buildonly-randconfig-003-20260511 gcc-14
i386 buildonly-randconfig-003-20260512 gcc-14
i386 buildonly-randconfig-004-20260511 gcc-14
i386 buildonly-randconfig-004-20260512 gcc-14
i386 buildonly-randconfig-005-20260511 gcc-14
i386 buildonly-randconfig-005-20260512 gcc-14
i386 buildonly-randconfig-006-20260511 gcc-14
i386 buildonly-randconfig-006-20260512 gcc-14
i386 defconfig gcc-15.2.0
i386 randconfig-001-20260511 gcc-12
i386 randconfig-002-20260511 gcc-12
i386 randconfig-003-20260511 gcc-12
i386 randconfig-004-20260511 gcc-12
i386 randconfig-005-20260511 gcc-12
i386 randconfig-006-20260511 gcc-12
i386 randconfig-007-20260511 gcc-12
i386 randconfig-011 clang-20
i386 randconfig-011-20260511 clang-20
i386 randconfig-011-20260512 clang-20
i386 randconfig-012 clang-20
i386 randconfig-012-20260511 clang-20
i386 randconfig-012-20260512 clang-20
i386 randconfig-013 clang-20
i386 randconfig-013-20260511 clang-20
i386 randconfig-013-20260512 clang-20
i386 randconfig-014 clang-20
i386 randconfig-014-20260511 clang-20
i386 randconfig-014-20260512 clang-20
i386 randconfig-015 clang-20
i386 randconfig-015-20260511 clang-20
i386 randconfig-015-20260512 clang-20
i386 randconfig-016 clang-20
i386 randconfig-016-20260511 clang-20
i386 randconfig-016-20260512 clang-20
i386 randconfig-017 clang-20
i386 randconfig-017-20260511 clang-20
i386 randconfig-017-20260512 clang-20
loongarch allmodconfig clang-23
loongarch allnoconfig gcc-15.2.0
loongarch defconfig clang-19
loongarch randconfig-001-20260511 gcc-8.5.0
loongarch randconfig-001-20260512 gcc-10.5.0
loongarch randconfig-002-20260511 gcc-8.5.0
loongarch randconfig-002-20260512 gcc-10.5.0
m68k allmodconfig gcc-15.2.0
m68k allnoconfig gcc-15.2.0
m68k allyesconfig clang-16
m68k allyesconfig gcc-15.2.0
m68k defconfig clang-19
microblaze allnoconfig gcc-15.2.0
microblaze allyesconfig gcc-15.2.0
microblaze defconfig clang-19
mips allmodconfig gcc-15.2.0
mips allnoconfig gcc-15.2.0
mips allyesconfig gcc-15.2.0
mips jazz_defconfig clang-17
mips maltaup_xpa_defconfig gcc-15.2.0
nios2 allmodconfig clang-23
nios2 allnoconfig clang-23
nios2 allnoconfig gcc-11.5.0
nios2 defconfig clang-19
nios2 randconfig-001-20260511 gcc-8.5.0
nios2 randconfig-001-20260512 gcc-10.5.0
nios2 randconfig-002-20260511 gcc-8.5.0
nios2 randconfig-002-20260512 gcc-10.5.0
openrisc allmodconfig clang-23
openrisc allnoconfig clang-23
openrisc allnoconfig gcc-15.2.0
openrisc defconfig gcc-15.2.0
parisc allmodconfig gcc-15.2.0
parisc allnoconfig clang-23
parisc allnoconfig gcc-15.2.0
parisc allyesconfig clang-19
parisc defconfig gcc-15.2.0
parisc randconfig-001 clang-20
parisc randconfig-001-20260511 clang-20
parisc randconfig-001-20260512 gcc-12.5.0
parisc randconfig-002 clang-20
parisc randconfig-002-20260511 clang-20
parisc randconfig-002-20260512 gcc-12.5.0
parisc64 defconfig clang-19
powerpc allmodconfig gcc-15.2.0
powerpc allnoconfig clang-23
powerpc allnoconfig gcc-15.2.0
powerpc arches_defconfig gcc-15.2.0
powerpc randconfig-001 clang-20
powerpc randconfig-001-20260511 clang-20
powerpc randconfig-001-20260512 gcc-12.5.0
powerpc randconfig-002 clang-20
powerpc randconfig-002-20260511 clang-20
powerpc randconfig-002-20260512 gcc-12.5.0
powerpc64 randconfig-001 clang-20
powerpc64 randconfig-001-20260511 clang-20
powerpc64 randconfig-001-20260512 gcc-12.5.0
powerpc64 randconfig-002 clang-20
powerpc64 randconfig-002-20260511 clang-20
powerpc64 randconfig-002-20260512 gcc-12.5.0
riscv allmodconfig clang-23
riscv allnoconfig clang-23
riscv allnoconfig gcc-15.2.0
riscv allyesconfig clang-16
riscv defconfig gcc-15.2.0
riscv randconfig-001 gcc-12.5.0
riscv randconfig-001-20260511 gcc-12.5.0
riscv randconfig-001-20260512 gcc-15.2.0
riscv randconfig-002 gcc-12.5.0
riscv randconfig-002-20260511 gcc-12.5.0
riscv randconfig-002-20260512 gcc-15.2.0
s390 allmodconfig clang-19
s390 allnoconfig clang-23
s390 allyesconfig gcc-15.2.0
s390 defconfig gcc-15.2.0
s390 randconfig-001 gcc-12.5.0
s390 randconfig-001-20260511 gcc-12.5.0
s390 randconfig-001-20260512 gcc-15.2.0
s390 randconfig-002 gcc-12.5.0
s390 randconfig-002-20260511 gcc-12.5.0
s390 randconfig-002-20260512 gcc-15.2.0
sh allmodconfig gcc-15.2.0
sh allnoconfig clang-23
sh allnoconfig gcc-15.2.0
sh allyesconfig clang-19
sh defconfig gcc-14
sh randconfig-001 gcc-12.5.0
sh randconfig-001-20260511 gcc-12.5.0
sh randconfig-001-20260512 gcc-15.2.0
sh randconfig-002 gcc-12.5.0
sh randconfig-002-20260511 gcc-12.5.0
sh randconfig-002-20260512 gcc-15.2.0
sh se7751_defconfig gcc-15.2.0
sparc allnoconfig clang-23
sparc allnoconfig gcc-15.2.0
sparc defconfig gcc-15.2.0
sparc randconfig-001 gcc-8.5.0
sparc randconfig-001-20260511 gcc-8.5.0
sparc randconfig-001-20260512 gcc-13.4.0
sparc randconfig-002 gcc-8.5.0
sparc randconfig-002-20260511 gcc-8.5.0
sparc randconfig-002-20260512 gcc-13.4.0
sparc64 allmodconfig clang-23
sparc64 defconfig gcc-14
sparc64 randconfig-001 gcc-8.5.0
sparc64 randconfig-001-20260511 gcc-8.5.0
sparc64 randconfig-001-20260512 gcc-13.4.0
sparc64 randconfig-002 gcc-8.5.0
sparc64 randconfig-002-20260511 gcc-8.5.0
sparc64 randconfig-002-20260512 gcc-13.4.0
um allmodconfig clang-19
um allnoconfig clang-23
um allyesconfig gcc-15.2.0
um defconfig gcc-14
um i386_defconfig gcc-14
um randconfig-001 gcc-8.5.0
um randconfig-001-20260511 gcc-8.5.0
um randconfig-001-20260512 gcc-13.4.0
um randconfig-002 gcc-8.5.0
um randconfig-002-20260511 gcc-8.5.0
um randconfig-002-20260512 gcc-13.4.0
um x86_64_defconfig gcc-14
x86_64 allmodconfig clang-20
x86_64 allnoconfig clang-20
x86_64 allnoconfig clang-23
x86_64 allyesconfig clang-20
x86_64 buildonly-randconfig-001 gcc-14
x86_64 buildonly-randconfig-001-20260511 gcc-14
x86_64 buildonly-randconfig-001-20260512 gcc-14
x86_64 buildonly-randconfig-002 gcc-14
x86_64 buildonly-randconfig-002-20260511 gcc-14
x86_64 buildonly-randconfig-002-20260512 gcc-14
x86_64 buildonly-randconfig-003 gcc-14
x86_64 buildonly-randconfig-003-20260511 gcc-14
x86_64 buildonly-randconfig-003-20260512 gcc-14
x86_64 buildonly-randconfig-004 gcc-14
x86_64 buildonly-randconfig-004-20260511 gcc-14
x86_64 buildonly-randconfig-004-20260512 gcc-14
x86_64 buildonly-randconfig-005 gcc-14
x86_64 buildonly-randconfig-005-20260511 gcc-14
x86_64 buildonly-randconfig-005-20260512 gcc-14
x86_64 buildonly-randconfig-006 gcc-14
x86_64 buildonly-randconfig-006-20260511 gcc-14
x86_64 buildonly-randconfig-006-20260512 gcc-14
x86_64 defconfig gcc-14
x86_64 kexec clang-20
x86_64 randconfig-001 clang-20
x86_64 randconfig-001-20260511 clang-20
x86_64 randconfig-001-20260512 gcc-14
x86_64 randconfig-002 clang-20
x86_64 randconfig-002-20260511 clang-20
x86_64 randconfig-002-20260512 gcc-14
x86_64 randconfig-003 clang-20
x86_64 randconfig-003-20260511 clang-20
x86_64 randconfig-003-20260512 gcc-14
x86_64 randconfig-004 clang-20
x86_64 randconfig-004-20260511 clang-20
x86_64 randconfig-004-20260512 gcc-14
x86_64 randconfig-005 clang-20
x86_64 randconfig-005-20260511 clang-20
x86_64 randconfig-005-20260512 gcc-14
x86_64 randconfig-006 clang-20
x86_64 randconfig-006-20260511 clang-20
x86_64 randconfig-006-20260512 gcc-14
x86_64 randconfig-011 clang-20
x86_64 randconfig-011-20260511 clang-20
x86_64 randconfig-011-20260512 clang-20
x86_64 randconfig-012 clang-20
x86_64 randconfig-012-20260511 clang-20
x86_64 randconfig-012-20260512 clang-20
x86_64 randconfig-013 clang-20
x86_64 randconfig-013-20260511 clang-20
x86_64 randconfig-013-20260512 clang-20
x86_64 randconfig-014 clang-20
x86_64 randconfig-014-20260511 clang-20
x86_64 randconfig-014-20260512 clang-20
x86_64 randconfig-015 clang-20
x86_64 randconfig-015-20260511 clang-20
x86_64 randconfig-015-20260512 clang-20
x86_64 randconfig-016 clang-20
x86_64 randconfig-016-20260511 clang-20
x86_64 randconfig-016-20260512 clang-20
x86_64 randconfig-071-20260511 clang-20
x86_64 randconfig-071-20260512 clang-20
x86_64 randconfig-072-20260511 clang-20
x86_64 randconfig-072-20260512 clang-20
x86_64 randconfig-073-20260511 clang-20
x86_64 randconfig-073-20260512 clang-20
x86_64 randconfig-074-20260511 clang-20
x86_64 randconfig-074-20260512 clang-20
x86_64 randconfig-075-20260511 clang-20
x86_64 randconfig-075-20260512 clang-20
x86_64 randconfig-076-20260511 clang-20
x86_64 randconfig-076-20260512 clang-20
x86_64 rhel-9.4 clang-20
x86_64 rhel-9.4-bpf gcc-14
x86_64 rhel-9.4-func clang-20
x86_64 rhel-9.4-kselftests clang-20
x86_64 rhel-9.4-kunit gcc-14
x86_64 rhel-9.4-ltp gcc-14
x86_64 rhel-9.4-rust clang-20
xtensa allnoconfig clang-23
xtensa allnoconfig gcc-15.2.0
xtensa allyesconfig clang-23
xtensa iss_defconfig gcc-15.2.0
xtensa randconfig-001 gcc-8.5.0
xtensa randconfig-001-20260511 gcc-8.5.0
xtensa randconfig-001-20260512 gcc-13.4.0
xtensa randconfig-002 gcc-8.5.0
xtensa randconfig-002-20260511 gcc-8.5.0
xtensa randconfig-002-20260512 gcc-13.4.0
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* [tj-cgroup:for-next] BUILD SUCCESS 274bbc309b54b559865d05841d1f3d07096c8a63
From: kernel test robot @ 2026-05-11 22:08 UTC (permalink / raw)
To: Tejun Heo; +Cc: cgroups
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git for-next
branch HEAD: 274bbc309b54b559865d05841d1f3d07096c8a63 Merge branch 'for-7.2' into for-next
elapsed time: 769m
configs tested: 310
configs skipped: 2
The following configs have been built successfully.
More configs may be tested in the coming days.
tested configs:
alpha allnoconfig gcc-15.2.0
alpha allyesconfig gcc-15.2.0
alpha defconfig gcc-15.2.0
arc allmodconfig clang-16
arc allnoconfig gcc-15.2.0
arc allyesconfig clang-23
arc defconfig gcc-15.2.0
arc randconfig-001-20260511 gcc-10.5.0
arc randconfig-001-20260512 gcc-11.5.0
arc randconfig-002-20260511 gcc-10.5.0
arc randconfig-002-20260512 gcc-11.5.0
arm allnoconfig gcc-15.2.0
arm allyesconfig clang-16
arm defconfig gcc-15.2.0
arm pxa3xx_defconfig clang-23
arm randconfig-001-20260511 gcc-10.5.0
arm randconfig-001-20260512 gcc-11.5.0
arm randconfig-002-20260511 gcc-10.5.0
arm randconfig-002-20260512 gcc-11.5.0
arm randconfig-003-20260511 gcc-10.5.0
arm randconfig-003-20260512 gcc-11.5.0
arm randconfig-004-20260511 gcc-10.5.0
arm randconfig-004-20260512 gcc-11.5.0
arm64 allmodconfig clang-23
arm64 allnoconfig gcc-15.2.0
arm64 defconfig gcc-15.2.0
arm64 randconfig-001 clang-23
arm64 randconfig-001-20260511 clang-17
arm64 randconfig-001-20260511 clang-23
arm64 randconfig-001-20260512 gcc-14.3.0
arm64 randconfig-002 clang-23
arm64 randconfig-002-20260511 clang-17
arm64 randconfig-002-20260511 clang-23
arm64 randconfig-002-20260512 gcc-14.3.0
arm64 randconfig-003 clang-23
arm64 randconfig-003-20260511 clang-17
arm64 randconfig-003-20260511 clang-23
arm64 randconfig-003-20260512 gcc-14.3.0
arm64 randconfig-004 clang-23
arm64 randconfig-004-20260511 clang-17
arm64 randconfig-004-20260511 clang-23
arm64 randconfig-004-20260512 gcc-14.3.0
csky allmodconfig gcc-15.2.0
csky allnoconfig gcc-15.2.0
csky defconfig gcc-15.2.0
csky randconfig-001 clang-23
csky randconfig-001-20260511 clang-17
csky randconfig-001-20260511 clang-23
csky randconfig-001-20260512 gcc-14.3.0
csky randconfig-002 clang-23
csky randconfig-002-20260511 clang-17
csky randconfig-002-20260511 clang-23
csky randconfig-002-20260512 gcc-14.3.0
hexagon allmodconfig clang-17
hexagon allmodconfig gcc-15.2.0
hexagon allnoconfig gcc-15.2.0
hexagon defconfig gcc-15.2.0
hexagon randconfig-001-20260511 gcc-8.5.0
hexagon randconfig-001-20260512 gcc-10.5.0
hexagon randconfig-002-20260511 gcc-8.5.0
hexagon randconfig-002-20260512 gcc-10.5.0
i386 allmodconfig clang-20
i386 allnoconfig gcc-15.2.0
i386 allyesconfig clang-20
i386 buildonly-randconfig-001-20260511 gcc-14
i386 buildonly-randconfig-001-20260512 gcc-14
i386 buildonly-randconfig-002-20260511 gcc-14
i386 buildonly-randconfig-002-20260512 gcc-14
i386 buildonly-randconfig-003-20260511 gcc-14
i386 buildonly-randconfig-003-20260512 gcc-14
i386 buildonly-randconfig-004-20260511 gcc-14
i386 buildonly-randconfig-004-20260512 gcc-14
i386 buildonly-randconfig-005-20260511 gcc-14
i386 buildonly-randconfig-005-20260512 gcc-14
i386 buildonly-randconfig-006-20260511 gcc-14
i386 buildonly-randconfig-006-20260512 gcc-14
i386 defconfig gcc-15.2.0
i386 randconfig-001-20260511 gcc-12
i386 randconfig-002-20260511 gcc-12
i386 randconfig-003-20260511 gcc-12
i386 randconfig-004-20260511 gcc-12
i386 randconfig-005-20260511 gcc-12
i386 randconfig-006-20260511 gcc-12
i386 randconfig-007-20260511 gcc-12
i386 randconfig-011 clang-20
i386 randconfig-011-20260511 clang-20
i386 randconfig-011-20260512 clang-20
i386 randconfig-012 clang-20
i386 randconfig-012-20260511 clang-20
i386 randconfig-012-20260512 clang-20
i386 randconfig-013 clang-20
i386 randconfig-013-20260511 clang-20
i386 randconfig-013-20260512 clang-20
i386 randconfig-014 clang-20
i386 randconfig-014-20260511 clang-20
i386 randconfig-014-20260512 clang-20
i386 randconfig-015 clang-20
i386 randconfig-015-20260511 clang-20
i386 randconfig-015-20260512 clang-20
i386 randconfig-016 clang-20
i386 randconfig-016-20260511 clang-20
i386 randconfig-016-20260512 clang-20
i386 randconfig-017 clang-20
i386 randconfig-017-20260511 clang-20
i386 randconfig-017-20260512 clang-20
loongarch allmodconfig clang-23
loongarch allnoconfig gcc-15.2.0
loongarch defconfig clang-19
loongarch randconfig-001-20260511 gcc-8.5.0
loongarch randconfig-001-20260512 gcc-10.5.0
loongarch randconfig-002-20260511 gcc-8.5.0
loongarch randconfig-002-20260512 gcc-10.5.0
m68k allmodconfig gcc-15.2.0
m68k allnoconfig gcc-15.2.0
m68k allyesconfig clang-16
m68k defconfig clang-19
microblaze allnoconfig gcc-15.2.0
microblaze allyesconfig gcc-15.2.0
microblaze defconfig clang-19
mips allmodconfig gcc-15.2.0
mips allnoconfig gcc-15.2.0
mips allyesconfig gcc-15.2.0
mips jazz_defconfig clang-17
mips maltaup_xpa_defconfig gcc-15.2.0
nios2 allmodconfig clang-23
nios2 allnoconfig clang-23
nios2 defconfig clang-19
nios2 randconfig-001-20260511 gcc-8.5.0
nios2 randconfig-001-20260512 gcc-10.5.0
nios2 randconfig-002-20260511 gcc-8.5.0
nios2 randconfig-002-20260512 gcc-10.5.0
openrisc allmodconfig clang-23
openrisc allnoconfig clang-23
openrisc defconfig gcc-15.2.0
parisc allmodconfig gcc-15.2.0
parisc allnoconfig clang-23
parisc allyesconfig clang-19
parisc allyesconfig gcc-15.2.0
parisc defconfig gcc-15.2.0
parisc randconfig-001 clang-20
parisc randconfig-001-20260511 clang-20
parisc randconfig-001-20260512 gcc-12.5.0
parisc randconfig-002 clang-20
parisc randconfig-002-20260511 clang-20
parisc randconfig-002-20260512 gcc-12.5.0
parisc64 defconfig clang-19
powerpc allmodconfig gcc-15.2.0
powerpc allnoconfig clang-23
powerpc arches_defconfig gcc-15.2.0
powerpc randconfig-001 clang-20
powerpc randconfig-001-20260511 clang-20
powerpc randconfig-001-20260512 gcc-12.5.0
powerpc randconfig-002 clang-20
powerpc randconfig-002-20260511 clang-20
powerpc randconfig-002-20260512 gcc-12.5.0
powerpc64 randconfig-001 clang-20
powerpc64 randconfig-001-20260511 clang-20
powerpc64 randconfig-001-20260512 gcc-12.5.0
powerpc64 randconfig-002 clang-20
powerpc64 randconfig-002-20260511 clang-20
powerpc64 randconfig-002-20260512 gcc-12.5.0
riscv allmodconfig clang-23
riscv allnoconfig clang-23
riscv allyesconfig clang-16
riscv defconfig gcc-15.2.0
riscv randconfig-001 gcc-12.5.0
riscv randconfig-001-20260511 gcc-12.5.0
riscv randconfig-001-20260512 gcc-15.2.0
riscv randconfig-002 gcc-12.5.0
riscv randconfig-002-20260511 gcc-12.5.0
riscv randconfig-002-20260512 gcc-15.2.0
s390 allmodconfig clang-18
s390 allmodconfig clang-19
s390 allnoconfig clang-23
s390 allyesconfig gcc-15.2.0
s390 defconfig gcc-15.2.0
s390 randconfig-001 gcc-12.5.0
s390 randconfig-001-20260511 gcc-12.5.0
s390 randconfig-001-20260512 gcc-15.2.0
s390 randconfig-002 gcc-12.5.0
s390 randconfig-002-20260511 gcc-12.5.0
s390 randconfig-002-20260512 gcc-15.2.0
sh allmodconfig gcc-15.2.0
sh allnoconfig clang-23
sh allyesconfig clang-19
sh allyesconfig gcc-15.2.0
sh defconfig gcc-14
sh randconfig-001 gcc-12.5.0
sh randconfig-001-20260511 gcc-12.5.0
sh randconfig-001-20260512 gcc-15.2.0
sh randconfig-002 gcc-12.5.0
sh randconfig-002-20260511 gcc-12.5.0
sh randconfig-002-20260512 gcc-15.2.0
sh se7751_defconfig gcc-15.2.0
sparc allnoconfig clang-23
sparc defconfig gcc-15.2.0
sparc randconfig-001 gcc-8.5.0
sparc randconfig-001-20260511 gcc-8.5.0
sparc randconfig-001-20260512 gcc-13.4.0
sparc randconfig-002 gcc-8.5.0
sparc randconfig-002-20260511 gcc-8.5.0
sparc randconfig-002-20260512 gcc-13.4.0
sparc64 allmodconfig clang-23
sparc64 defconfig gcc-14
sparc64 randconfig-001 gcc-8.5.0
sparc64 randconfig-001-20260511 gcc-8.5.0
sparc64 randconfig-001-20260512 gcc-13.4.0
sparc64 randconfig-002 gcc-8.5.0
sparc64 randconfig-002-20260511 gcc-8.5.0
sparc64 randconfig-002-20260512 gcc-13.4.0
um allmodconfig clang-19
um allnoconfig clang-23
um allyesconfig gcc-14
um allyesconfig gcc-15.2.0
um defconfig gcc-14
um i386_defconfig gcc-14
um randconfig-001 gcc-8.5.0
um randconfig-001-20260511 gcc-8.5.0
um randconfig-001-20260512 gcc-13.4.0
um randconfig-002 gcc-8.5.0
um randconfig-002-20260511 gcc-8.5.0
um randconfig-002-20260512 gcc-13.4.0
um x86_64_defconfig gcc-14
x86_64 allmodconfig clang-20
x86_64 allnoconfig clang-23
x86_64 allyesconfig clang-20
x86_64 buildonly-randconfig-001 gcc-14
x86_64 buildonly-randconfig-001-20260511 gcc-14
x86_64 buildonly-randconfig-001-20260512 gcc-14
x86_64 buildonly-randconfig-002 gcc-14
x86_64 buildonly-randconfig-002-20260511 gcc-14
x86_64 buildonly-randconfig-002-20260512 gcc-14
x86_64 buildonly-randconfig-003 gcc-14
x86_64 buildonly-randconfig-003-20260511 gcc-14
x86_64 buildonly-randconfig-003-20260512 gcc-14
x86_64 buildonly-randconfig-004 gcc-14
x86_64 buildonly-randconfig-004-20260511 gcc-14
x86_64 buildonly-randconfig-004-20260512 gcc-14
x86_64 buildonly-randconfig-005 gcc-14
x86_64 buildonly-randconfig-005-20260511 gcc-14
x86_64 buildonly-randconfig-005-20260512 gcc-14
x86_64 buildonly-randconfig-006 gcc-14
x86_64 buildonly-randconfig-006-20260511 gcc-14
x86_64 buildonly-randconfig-006-20260512 gcc-14
x86_64 defconfig gcc-14
x86_64 kexec clang-20
x86_64 randconfig-001 clang-20
x86_64 randconfig-001-20260511 clang-20
x86_64 randconfig-001-20260512 gcc-14
x86_64 randconfig-002 clang-20
x86_64 randconfig-002-20260511 clang-20
x86_64 randconfig-002-20260512 gcc-14
x86_64 randconfig-003 clang-20
x86_64 randconfig-003-20260511 clang-20
x86_64 randconfig-003-20260512 gcc-14
x86_64 randconfig-004 clang-20
x86_64 randconfig-004-20260511 clang-20
x86_64 randconfig-004-20260512 gcc-14
x86_64 randconfig-005 clang-20
x86_64 randconfig-005-20260511 clang-20
x86_64 randconfig-005-20260512 gcc-14
x86_64 randconfig-006 clang-20
x86_64 randconfig-006-20260511 clang-20
x86_64 randconfig-006-20260512 gcc-14
x86_64 randconfig-011 clang-20
x86_64 randconfig-011-20260511 clang-20
x86_64 randconfig-011-20260512 clang-20
x86_64 randconfig-012 clang-20
x86_64 randconfig-012-20260511 clang-20
x86_64 randconfig-012-20260512 clang-20
x86_64 randconfig-013 clang-20
x86_64 randconfig-013-20260511 clang-20
x86_64 randconfig-013-20260512 clang-20
x86_64 randconfig-014 clang-20
x86_64 randconfig-014-20260511 clang-20
x86_64 randconfig-014-20260512 clang-20
x86_64 randconfig-015 clang-20
x86_64 randconfig-015-20260511 clang-20
x86_64 randconfig-015-20260512 clang-20
x86_64 randconfig-016 clang-20
x86_64 randconfig-016-20260511 clang-20
x86_64 randconfig-016-20260512 clang-20
x86_64 randconfig-071-20260511 clang-20
x86_64 randconfig-071-20260512 clang-20
x86_64 randconfig-072-20260511 clang-20
x86_64 randconfig-072-20260512 clang-20
x86_64 randconfig-073-20260511 clang-20
x86_64 randconfig-073-20260512 clang-20
x86_64 randconfig-074-20260511 clang-20
x86_64 randconfig-074-20260512 clang-20
x86_64 randconfig-075-20260511 clang-20
x86_64 randconfig-075-20260512 clang-20
x86_64 randconfig-076-20260511 clang-20
x86_64 randconfig-076-20260512 clang-20
x86_64 rhel-9.4 clang-20
x86_64 rhel-9.4-bpf gcc-14
x86_64 rhel-9.4-func clang-20
x86_64 rhel-9.4-kselftests clang-20
x86_64 rhel-9.4-kunit gcc-14
x86_64 rhel-9.4-ltp gcc-14
x86_64 rhel-9.4-rust clang-20
xtensa allnoconfig clang-23
xtensa allyesconfig clang-23
xtensa iss_defconfig gcc-15.2.0
xtensa randconfig-001 gcc-8.5.0
xtensa randconfig-001-20260511 gcc-8.5.0
xtensa randconfig-001-20260512 gcc-13.4.0
xtensa randconfig-002 gcc-8.5.0
xtensa randconfig-002-20260511 gcc-8.5.0
xtensa randconfig-002-20260512 gcc-13.4.0
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* [tj-cgroup:for-7.1-fixes] BUILD SUCCESS 4a39eda5fdd867fc39f3c039714dd432cee00268
From: kernel test robot @ 2026-05-11 22:09 UTC (permalink / raw)
To: Tejun Heo; +Cc: cgroups
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git for-7.1-fixes
branch HEAD: 4a39eda5fdd867fc39f3c039714dd432cee00268 cgroup/cpuset: Reset DL migration state on can_attach() failure
elapsed time: 831m
configs tested: 339
configs skipped: 3
The following configs have been built successfully.
More configs may be tested in the coming days.
tested configs:
alpha allnoconfig gcc-15.2.0
alpha allyesconfig gcc-15.2.0
alpha defconfig gcc-15.2.0
arc allmodconfig clang-16
arc allmodconfig gcc-15.2.0
arc allnoconfig gcc-15.2.0
arc allyesconfig clang-23
arc allyesconfig gcc-15.2.0
arc defconfig gcc-15.2.0
arc randconfig-001-20260511 gcc-10.5.0
arc randconfig-001-20260512 gcc-11.5.0
arc randconfig-002-20260511 gcc-10.5.0
arc randconfig-002-20260512 gcc-11.5.0
arm allnoconfig clang-23
arm allnoconfig gcc-15.2.0
arm allyesconfig clang-16
arm allyesconfig gcc-15.2.0
arm defconfig gcc-15.2.0
arm pxa3xx_defconfig clang-23
arm randconfig-001-20260511 gcc-10.5.0
arm randconfig-001-20260512 gcc-11.5.0
arm randconfig-002-20260511 gcc-10.5.0
arm randconfig-002-20260512 gcc-11.5.0
arm randconfig-003-20260511 gcc-10.5.0
arm randconfig-003-20260512 gcc-11.5.0
arm randconfig-004-20260511 gcc-10.5.0
arm randconfig-004-20260512 gcc-11.5.0
arm64 allmodconfig clang-19
arm64 allmodconfig clang-23
arm64 allnoconfig gcc-15.2.0
arm64 defconfig gcc-15.2.0
arm64 randconfig-001 clang-23
arm64 randconfig-001-20260511 clang-17
arm64 randconfig-001-20260511 clang-23
arm64 randconfig-001-20260512 gcc-14.3.0
arm64 randconfig-002 clang-23
arm64 randconfig-002-20260511 clang-17
arm64 randconfig-002-20260511 clang-23
arm64 randconfig-002-20260512 gcc-14.3.0
arm64 randconfig-003 clang-23
arm64 randconfig-003-20260511 clang-17
arm64 randconfig-003-20260511 clang-23
arm64 randconfig-003-20260512 gcc-14.3.0
arm64 randconfig-004 clang-23
arm64 randconfig-004-20260511 clang-17
arm64 randconfig-004-20260511 clang-23
arm64 randconfig-004-20260512 gcc-14.3.0
csky allmodconfig gcc-15.2.0
csky allnoconfig gcc-15.2.0
csky defconfig gcc-15.2.0
csky randconfig-001 clang-23
csky randconfig-001-20260511 clang-17
csky randconfig-001-20260511 clang-23
csky randconfig-001-20260512 gcc-14.3.0
csky randconfig-002 clang-23
csky randconfig-002-20260511 clang-17
csky randconfig-002-20260511 clang-23
csky randconfig-002-20260512 gcc-14.3.0
hexagon allmodconfig clang-17
hexagon allmodconfig gcc-15.2.0
hexagon allnoconfig clang-23
hexagon allnoconfig gcc-15.2.0
hexagon defconfig gcc-15.2.0
hexagon randconfig-001-20260511 clang-23
hexagon randconfig-001-20260511 gcc-8.5.0
hexagon randconfig-001-20260512 gcc-10.5.0
hexagon randconfig-002-20260511 clang-16
hexagon randconfig-002-20260511 gcc-8.5.0
hexagon randconfig-002-20260512 gcc-10.5.0
i386 allmodconfig clang-20
i386 allmodconfig gcc-14
i386 allnoconfig gcc-14
i386 allnoconfig gcc-15.2.0
i386 allyesconfig clang-20
i386 allyesconfig gcc-14
i386 buildonly-randconfig-001-20260511 gcc-14
i386 buildonly-randconfig-001-20260512 gcc-14
i386 buildonly-randconfig-002-20260511 gcc-14
i386 buildonly-randconfig-002-20260512 gcc-14
i386 buildonly-randconfig-003-20260511 gcc-14
i386 buildonly-randconfig-003-20260512 gcc-14
i386 buildonly-randconfig-004-20260511 gcc-14
i386 buildonly-randconfig-004-20260512 gcc-14
i386 buildonly-randconfig-005-20260511 gcc-14
i386 buildonly-randconfig-005-20260512 gcc-14
i386 buildonly-randconfig-006-20260511 gcc-14
i386 buildonly-randconfig-006-20260512 gcc-14
i386 defconfig gcc-15.2.0
i386 randconfig-001-20260511 gcc-12
i386 randconfig-002-20260511 gcc-12
i386 randconfig-003-20260511 gcc-12
i386 randconfig-004-20260511 gcc-12
i386 randconfig-005-20260511 gcc-12
i386 randconfig-006-20260511 gcc-12
i386 randconfig-007-20260511 gcc-12
i386 randconfig-011 clang-20
i386 randconfig-011-20260511 clang-20
i386 randconfig-011-20260512 clang-20
i386 randconfig-012 clang-20
i386 randconfig-012-20260511 clang-20
i386 randconfig-012-20260512 clang-20
i386 randconfig-013 clang-20
i386 randconfig-013-20260511 clang-20
i386 randconfig-013-20260512 clang-20
i386 randconfig-014 clang-20
i386 randconfig-014-20260511 clang-20
i386 randconfig-014-20260512 clang-20
i386 randconfig-015 clang-20
i386 randconfig-015-20260511 clang-20
i386 randconfig-015-20260512 clang-20
i386 randconfig-016 clang-20
i386 randconfig-016-20260511 clang-20
i386 randconfig-016-20260512 clang-20
i386 randconfig-017 clang-20
i386 randconfig-017-20260511 clang-20
i386 randconfig-017-20260512 clang-20
loongarch allmodconfig clang-19
loongarch allmodconfig clang-23
loongarch allnoconfig clang-23
loongarch allnoconfig gcc-15.2.0
loongarch defconfig clang-19
loongarch randconfig-001-20260511 clang-23
loongarch randconfig-001-20260511 gcc-8.5.0
loongarch randconfig-001-20260512 gcc-10.5.0
loongarch randconfig-002-20260511 clang-18
loongarch randconfig-002-20260511 gcc-8.5.0
loongarch randconfig-002-20260512 gcc-10.5.0
m68k allmodconfig gcc-15.2.0
m68k allnoconfig gcc-15.2.0
m68k allyesconfig clang-16
m68k allyesconfig gcc-15.2.0
m68k defconfig clang-19
microblaze allnoconfig gcc-15.2.0
microblaze allyesconfig gcc-15.2.0
microblaze defconfig clang-19
mips allmodconfig gcc-15.2.0
mips allnoconfig gcc-15.2.0
mips allyesconfig gcc-15.2.0
mips jazz_defconfig clang-17
mips maltaup_xpa_defconfig gcc-15.2.0
nios2 allmodconfig clang-23
nios2 allmodconfig gcc-11.5.0
nios2 allnoconfig clang-23
nios2 allnoconfig gcc-11.5.0
nios2 defconfig clang-19
nios2 randconfig-001-20260511 gcc-8.5.0
nios2 randconfig-001-20260511 gcc-9.5.0
nios2 randconfig-001-20260512 gcc-10.5.0
nios2 randconfig-002-20260511 gcc-8.5.0
nios2 randconfig-002-20260512 gcc-10.5.0
openrisc allmodconfig clang-23
openrisc allmodconfig gcc-15.2.0
openrisc allnoconfig clang-23
openrisc allnoconfig gcc-15.2.0
openrisc defconfig gcc-15.2.0
parisc allmodconfig gcc-15.2.0
parisc allnoconfig clang-23
parisc allnoconfig gcc-15.2.0
parisc allyesconfig clang-19
parisc allyesconfig gcc-15.2.0
parisc defconfig gcc-15.2.0
parisc randconfig-001 clang-20
parisc randconfig-001-20260511 clang-20
parisc randconfig-001-20260512 gcc-12.5.0
parisc randconfig-002 clang-20
parisc randconfig-002-20260511 clang-20
parisc randconfig-002-20260512 gcc-12.5.0
parisc64 defconfig clang-19
powerpc allmodconfig gcc-15.2.0
powerpc allnoconfig clang-23
powerpc allnoconfig gcc-15.2.0
powerpc arches_defconfig gcc-15.2.0
powerpc ge_imp3a_defconfig gcc-15.2.0
powerpc randconfig-001 clang-20
powerpc randconfig-001-20260511 clang-20
powerpc randconfig-001-20260512 gcc-12.5.0
powerpc randconfig-002 clang-20
powerpc randconfig-002-20260511 clang-20
powerpc randconfig-002-20260512 gcc-12.5.0
powerpc64 randconfig-001 clang-20
powerpc64 randconfig-001-20260511 clang-20
powerpc64 randconfig-001-20260512 gcc-12.5.0
powerpc64 randconfig-002 clang-20
powerpc64 randconfig-002-20260511 clang-20
powerpc64 randconfig-002-20260512 gcc-12.5.0
riscv allmodconfig clang-23
riscv allnoconfig clang-23
riscv allnoconfig gcc-15.2.0
riscv allyesconfig clang-16
riscv defconfig gcc-15.2.0
riscv randconfig-001 gcc-12.5.0
riscv randconfig-001-20260511 gcc-12.5.0
riscv randconfig-001-20260512 gcc-15.2.0
riscv randconfig-002 gcc-12.5.0
riscv randconfig-002-20260511 gcc-12.5.0
riscv randconfig-002-20260512 gcc-15.2.0
s390 allmodconfig clang-18
s390 allmodconfig clang-19
s390 allnoconfig clang-23
s390 allyesconfig gcc-15.2.0
s390 defconfig gcc-15.2.0
s390 randconfig-001 gcc-12.5.0
s390 randconfig-001-20260511 gcc-12.5.0
s390 randconfig-001-20260512 gcc-15.2.0
s390 randconfig-002 gcc-12.5.0
s390 randconfig-002-20260511 gcc-12.5.0
s390 randconfig-002-20260512 gcc-15.2.0
sh allmodconfig gcc-15.2.0
sh allnoconfig clang-23
sh allnoconfig gcc-15.2.0
sh allyesconfig clang-19
sh allyesconfig gcc-15.2.0
sh defconfig gcc-14
sh randconfig-001 gcc-12.5.0
sh randconfig-001-20260511 gcc-12.5.0
sh randconfig-001-20260512 gcc-15.2.0
sh randconfig-002 gcc-12.5.0
sh randconfig-002-20260511 gcc-12.5.0
sh randconfig-002-20260512 gcc-15.2.0
sh se7751_defconfig gcc-15.2.0
sparc allnoconfig clang-23
sparc allnoconfig gcc-15.2.0
sparc defconfig gcc-15.2.0
sparc randconfig-001 gcc-8.5.0
sparc randconfig-001-20260511 gcc-8.5.0
sparc randconfig-001-20260512 gcc-13.4.0
sparc randconfig-002 gcc-8.5.0
sparc randconfig-002-20260511 gcc-8.5.0
sparc randconfig-002-20260512 gcc-13.4.0
sparc64 allmodconfig clang-23
sparc64 defconfig gcc-14
sparc64 randconfig-001 gcc-8.5.0
sparc64 randconfig-001-20260511 gcc-8.5.0
sparc64 randconfig-001-20260512 gcc-13.4.0
sparc64 randconfig-002 gcc-8.5.0
sparc64 randconfig-002-20260511 gcc-8.5.0
sparc64 randconfig-002-20260512 gcc-13.4.0
um allmodconfig clang-19
um allnoconfig clang-23
um allyesconfig gcc-14
um allyesconfig gcc-15.2.0
um defconfig gcc-14
um i386_defconfig gcc-14
um randconfig-001 gcc-8.5.0
um randconfig-001-20260511 gcc-8.5.0
um randconfig-001-20260512 gcc-13.4.0
um randconfig-002 gcc-8.5.0
um randconfig-002-20260511 gcc-8.5.0
um randconfig-002-20260512 gcc-13.4.0
um x86_64_defconfig gcc-14
x86_64 allmodconfig clang-20
x86_64 allnoconfig clang-20
x86_64 allnoconfig clang-23
x86_64 allyesconfig clang-20
x86_64 buildonly-randconfig-001 gcc-14
x86_64 buildonly-randconfig-001-20260511 gcc-14
x86_64 buildonly-randconfig-001-20260512 gcc-14
x86_64 buildonly-randconfig-002 gcc-14
x86_64 buildonly-randconfig-002-20260511 gcc-14
x86_64 buildonly-randconfig-002-20260512 gcc-14
x86_64 buildonly-randconfig-003 gcc-14
x86_64 buildonly-randconfig-003-20260511 gcc-14
x86_64 buildonly-randconfig-003-20260512 gcc-14
x86_64 buildonly-randconfig-004 gcc-14
x86_64 buildonly-randconfig-004-20260511 gcc-14
x86_64 buildonly-randconfig-004-20260512 gcc-14
x86_64 buildonly-randconfig-005 gcc-14
x86_64 buildonly-randconfig-005-20260511 gcc-14
x86_64 buildonly-randconfig-005-20260512 gcc-14
x86_64 buildonly-randconfig-006 gcc-14
x86_64 buildonly-randconfig-006-20260511 gcc-14
x86_64 buildonly-randconfig-006-20260512 gcc-14
x86_64 defconfig gcc-14
x86_64 kexec clang-20
x86_64 randconfig-001 clang-20
x86_64 randconfig-001-20260511 clang-20
x86_64 randconfig-001-20260512 gcc-14
x86_64 randconfig-002 clang-20
x86_64 randconfig-002-20260511 clang-20
x86_64 randconfig-002-20260512 gcc-14
x86_64 randconfig-003 clang-20
x86_64 randconfig-003-20260511 clang-20
x86_64 randconfig-003-20260512 gcc-14
x86_64 randconfig-004 clang-20
x86_64 randconfig-004-20260511 clang-20
x86_64 randconfig-004-20260512 gcc-14
x86_64 randconfig-005 clang-20
x86_64 randconfig-005-20260511 clang-20
x86_64 randconfig-005-20260512 gcc-14
x86_64 randconfig-006 clang-20
x86_64 randconfig-006-20260511 clang-20
x86_64 randconfig-006-20260512 gcc-14
x86_64 randconfig-011 clang-20
x86_64 randconfig-011-20260511 clang-20
x86_64 randconfig-011-20260512 clang-20
x86_64 randconfig-012 clang-20
x86_64 randconfig-012-20260511 clang-20
x86_64 randconfig-012-20260512 clang-20
x86_64 randconfig-013 clang-20
x86_64 randconfig-013-20260511 clang-20
x86_64 randconfig-013-20260512 clang-20
x86_64 randconfig-014 clang-20
x86_64 randconfig-014-20260511 clang-20
x86_64 randconfig-014-20260512 clang-20
x86_64 randconfig-015 clang-20
x86_64 randconfig-015-20260511 clang-20
x86_64 randconfig-015-20260512 clang-20
x86_64 randconfig-016 clang-20
x86_64 randconfig-016-20260511 clang-20
x86_64 randconfig-016-20260512 clang-20
x86_64 randconfig-071-20260511 clang-20
x86_64 randconfig-071-20260512 clang-20
x86_64 randconfig-072-20260511 clang-20
x86_64 randconfig-072-20260512 clang-20
x86_64 randconfig-073-20260511 clang-20
x86_64 randconfig-073-20260512 clang-20
x86_64 randconfig-074-20260511 clang-20
x86_64 randconfig-074-20260512 clang-20
x86_64 randconfig-075-20260511 clang-20
x86_64 randconfig-075-20260512 clang-20
x86_64 randconfig-076-20260511 clang-20
x86_64 randconfig-076-20260512 clang-20
x86_64 rhel-9.4 clang-20
x86_64 rhel-9.4-bpf gcc-14
x86_64 rhel-9.4-func clang-20
x86_64 rhel-9.4-kselftests clang-20
x86_64 rhel-9.4-kunit gcc-14
x86_64 rhel-9.4-ltp gcc-14
x86_64 rhel-9.4-rust clang-20
xtensa allnoconfig clang-23
xtensa allnoconfig gcc-15.2.0
xtensa allyesconfig clang-23
xtensa iss_defconfig gcc-15.2.0
xtensa randconfig-001 gcc-8.5.0
xtensa randconfig-001-20260511 gcc-8.5.0
xtensa randconfig-001-20260512 gcc-13.4.0
xtensa randconfig-002 gcc-8.5.0
xtensa randconfig-002-20260511 gcc-8.5.0
xtensa randconfig-002-20260512 gcc-13.4.0
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* [PATCH AUTOSEL 7.0-6.6] docs: cgroup-v1: Update charge-commit section
From: Sasha Levin @ 2026-05-11 22:19 UTC (permalink / raw)
To: patches, stable
Cc: T.J. Mercier, Tejun Heo, Sasha Levin, lizefan.x, hannes, corbet,
cgroups, linux-doc, linux-kernel
In-Reply-To: <20260511221931.2370053-1-sashal@kernel.org>
From: "T.J. Mercier" <tjmercier@google.com>
[ Upstream commit d8769544bde51b0ac980d10f8fe9f9fed6c95995 ]
Commit 1d8f136a421f ("memcg/hugetlb: remove memcg hugetlb
try-commit-cancel protocol") removed mem_cgroup_commit_charge() and
mem_cgroup_cancel_charge(), but the docs still refer to those functions.
There is no longer any charge cancellation.
Update the docs to match the code.
Signed-off-by: T.J. Mercier <tjmercier@google.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
LLM Generated explanations, may be completely bogus:
## Phase 1: Commit Message Forensics
Step 1.1 Record: subsystem `docs: cgroup-v1`; action verb `Update`;
intent: update `Documentation/admin-guide/cgroup-v1/memcg_test.rst` so
the charge-commit section matches current memcg code.
Step 1.2 Record: tags present: `Signed-off-by: T.J. Mercier
<tjmercier@google.com>` and `Signed-off-by: Tejun Heo <tj@kernel.org>`.
No `Fixes:`, `Reported-by:`, `Tested-by:`, `Reviewed-by:`, `Acked-by:`,
`Link:`, or `Cc: stable@vger.kernel.org` tags in the committed message.
Step 1.3 Record: the body says commit `1d8f136a421f` removed
`mem_cgroup_commit_charge()` and `mem_cgroup_cancel_charge()`, while the
cgroup-v1 memcg docs still name them and describe cancellation.
Symptom/failure mode: incorrect documentation only. Version information:
the referenced removal commit is from 2025-01-13 in the local object
database; candidate commit is from 2026-04-30. Root cause: docs were not
updated when the code was changed.
Step 1.4 Record: this is not a hidden runtime bug fix. It is an explicit
documentation correctness fix.
## Phase 2: Diff Analysis
Step 2.1 Record: one file changed: `Documentation/admin-
guide/cgroup-v1/memcg_test.rst`, `2 insertions(+), 4 deletions(-)`. No
functions modified. Scope: single-file documentation-only surgical
change.
Step 2.2 Record: before, the section was titled `charge-commit-cancel`,
listed `mem_cgroup_commit_charge()` or `mem_cgroup_cancel_charge()`, and
described `cancel()`. After, it is titled `charge-commit`, lists
`commit_charge()`, and removes the cancellation text.
Step 2.3 Record: bug category is documentation/comment correctness.
Specific mechanism: removes stale references to APIs that are absent in
current `6.19.y`/`7.0.y` code and in `origin/master`.
Step 2.4 Record: fix quality is obviously correct for trees whose memcg
code no longer has `mem_cgroup_commit_charge()` /
`mem_cgroup_cancel_charge()`. Regression risk is zero runtime risk, but
there is a branch-selection concern: `stable/linux-6.12.y` still
contains those functions, so this exact doc update would be misleading
there.
## Phase 3: Git History Investigation
Step 3.1 Record: `git blame` before the candidate shows the stale doc
lines came from `f3f5edc5e41e` in this repository’s history. `git blame
origin/master` shows the changed lines attributed to `d8769544bde51`.
Step 3.2 Record: no `Fixes:` tag. I still inspected referenced commit
`1d8f136a421f26747e58c01281cba5bffae8d289`; it removed prototypes and
implementations for `mem_cgroup_commit_charge()`,
`mem_cgroup_cancel_charge()`, and related hugetlb try/commit/cancel
helpers.
Step 3.3 Record: recent history for `Documentation/admin-
guide/cgroup-v1/memcg_test.rst` on `origin/master` has only the file
introduction/import commit and this candidate. Related path history
shows the candidate was merged via `cgroup-for-7.1-rc2-fixes`. No
prerequisite doc series found.
Step 3.4 Record: author `T.J. Mercier` has at least one other cgroup-
related commit in `origin/master`; Tejun Heo is listed in `MAINTAINERS`
as cgroup maintainer and committed the patch.
Step 3.5 Record: no code dependencies for the patch itself. It can apply
standalone to the current `stable/linux-7.0.y` checkout. Applicability
must be gated by whether the target tree’s code has removed the old
APIs.
## Phase 4: Mailing List And External Research
Step 4.1 Record: `b4 dig -c d8769544bde51...` found the original
submission at
`https://patch.msgid.link/20260430201142.240387-1-tjmercier@google.com`.
`b4 dig -a` found only v1 of a single-patch series. The mbox contains
Tejun’s reply: “Applied to cgroup/for-7.1-fixes.” No NAKs or concerns
found in the saved thread.
Step 4.2 Record: `b4 dig -w` shows recipients included cgroup
maintainers/list and docs list: `tj@kernel.org`, `hannes@cmpxchg.org`,
`mkoutny@suse.com`, `cgroups@vger.kernel.org`, `corbet@lwn.net`,
`skhan@linuxfoundation.org`, `linux-doc@vger.kernel.org`, `linux-
kernel@vger.kernel.org`.
Step 4.3 Record: no `Reported-by` or bug-report `Link:` tags. No syzbot,
bugzilla, or user-impact bug report applies.
Step 4.4 Record: b4 found a standalone single-patch series, not part of
a multi-patch dependency chain.
Step 4.5 Record: web search did not find stable-list discussion for this
exact patch. `WebFetch` to lore/patch.msgid was blocked by Anubis, but
b4 successfully fetched the mbox.
## Phase 5: Code Semantic Analysis
Step 5.1 Record: no functions modified by the diff.
Step 5.2 Record: no callers affected by the diff. For documentation
accuracy, I verified current `stable/linux-7.0.y` code has
`commit_charge()` callers in `charge_memcg()`,
`mem_cgroup_replace_folio()`, and `mem_cgroup_migrate()`.
Step 5.3 Record: no changed callees. The relevant current code has
`commit_charge()` assigning `folio->memcg_data`, and callers also invoke
`memcg1_commit_charge()` where appropriate.
Step 5.4 Record: runtime reachability is not relevant because no
executable code changes.
Step 5.5 Record: similar stale docs pattern exists in stable branches;
however code state differs by branch. `6.19.y`/`7.0.y` have stale docs
and no old API. `6.12.y` still has `mem_cgroup_commit_charge()` and
`mem_cgroup_cancel_charge()` in code.
## Phase 6: Cross-Referencing And Stable Tree Analysis
Step 6.1 Record: buggy stale documentation exists in
`stable/linux-7.0.y`, `stable/linux-6.19.y`, `stable/linux-6.18.y`,
`stable/linux-6.6.y`, `stable/linux-6.1.y`, `stable/linux-5.15.y`, and
`stable/linux-5.10.y` by exact doc grep. I verified the old APIs are
absent in several of those trees, but `stable/linux-6.12.y` still
contains `mem_cgroup_commit_charge()` and `mem_cgroup_cancel_charge()`,
so this exact upstream text is not universally correct for all
maintained stable lines.
Step 6.2 Record: `git apply --check` of the candidate diff succeeds on
the current `stable/linux-7.0.y` checkout. Expected backport difficulty:
clean for trees with matching doc context; branch-specific review needed
for `6.12.y`.
Step 6.3 Record: no related stable fix for this exact doc update found
by local stable branch ancestry checks or web search.
## Phase 7: Subsystem And Maintainer Context
Step 7.1 Record: subsystem is cgroup-v1 memcg documentation.
Criticality: peripheral/runtime-none; important only for documentation
correctness.
Step 7.2 Record: cgroup and memcg areas are active; recent
`origin/master` history includes multiple cgroup/mm fixes. The candidate
was applied by the cgroup maintainer.
## Phase 8: Impact And Risk Assessment
Step 8.1 Record: affected population is documentation readers and
developers/admins consulting old cgroup-v1 memcg internals. No kernel
runtime users are affected.
Step 8.2 Record: trigger condition is reading or relying on the stale
documentation. Unprivileged users cannot trigger a kernel failure
because there is no runtime behavior.
Step 8.3 Record: failure mode is incorrect documentation. Severity: LOW.
It can mislead developers/admins, but it does not fix crash, corruption,
leak, deadlock, or security behavior.
Step 8.4 Record: benefit is low but real for documentation correctness,
especially because the stable rules exception allows
documentation/comment fixes and runtime risk is zero. Risk is very low
for branches whose code matches the new text; risk is documentation-
regression risk if applied to a branch like `6.12.y` where cancellation
APIs still exist.
## Phase 9: Final Synthesis
Step 9.1 Record: evidence for backporting: tiny docs-only patch;
corrects verified stale references in current `7.0.y` and `6.19.y`;
applied by cgroup maintainer; no runtime regression risk; documentation
fixes are allowed. Evidence against: no runtime bug or user-visible
stability issue; not correct for every stable branch, specifically
verified `6.12.y` still has the old commit/cancel APIs. Unresolved: I
did not exhaustively validate every maintained stable branch’s memcg API
state.
Step 9.2 Stable rules checklist:
1. Obviously correct and tested? Yes for matching-code branches;
verified by code grep, `git diff --check`, and `git apply --check` on
`7.0.y`.
2. Fixes a real bug that affects users? It fixes incorrect
documentation, not runtime behavior.
3. Important issue? No runtime severity; LOW documentation correctness
issue.
4. Small and contained? Yes, 6-line docs-only diff in one file.
5. No new features or APIs? Yes.
6. Can apply to stable trees? Yes to at least current `7.0.y`; should
not be applied blindly to `6.12.y`.
Step 9.3 Record: exception category is documentation fix.
Step 9.4 Decision: backport is acceptable for stable trees whose memcg
implementation no longer has charge cancellation APIs. It should be
excluded from trees like `6.12.y` where the old APIs still exist. With
that branch-selection caveat, this qualifies under the documentation-fix
exception.
Verification:
- [Phase 1] Parsed candidate commit
`d8769544bde51b0ac980d10f8fe9f9fed6c95995`: only two Signed-off-by
tags, no bug/report/stable tags.
- [Phase 2] `git show --stat --patch`: confirmed one docs file, `2
insertions(+), 4 deletions(-)`.
- [Phase 3] `git show 1d8f136a421f...`: confirmed referenced commit
removed `mem_cgroup_commit_charge()` and `mem_cgroup_cancel_charge()`
from mainline code.
- [Phase 3] `git log origin/master --grep`: found candidate and merge
via `cgroup-for-7.1-rc2-fixes`.
- [Phase 4] `b4 dig`: found lore thread and exact patch-id match.
- [Phase 4] `b4 dig -a`: only v1 single-patch series.
- [Phase 4] `b4 dig -w`: relevant cgroup and docs maintainers/lists were
included.
- [Phase 4] Saved mbox: confirmed Tejun replied “Applied to
cgroup/for-7.1-fixes”; no NAKs or stable nomination found.
- [Phase 5] `rg`/`git grep`: confirmed current code uses
`commit_charge()` and no longer has old API names in `7.0.y`.
- [Phase 6] `git apply --check`: candidate applies cleanly to current
`7.0.y`.
- [Phase 6] Branch checks: `6.12.y` still has
`mem_cgroup_commit_charge()` and `mem_cgroup_cancel_charge()`, so this
patch must not be applied there unchanged.
- [Phase 8] Runtime impact verified as none because only
`Documentation/admin-guide/cgroup-v1/memcg_test.rst` changes.
**YES**
Documentation/admin-guide/cgroup-v1/memcg_test.rst | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/Documentation/admin-guide/cgroup-v1/memcg_test.rst b/Documentation/admin-guide/cgroup-v1/memcg_test.rst
index 9f8e27355cba5..7c7cd457cf695 100644
--- a/Documentation/admin-guide/cgroup-v1/memcg_test.rst
+++ b/Documentation/admin-guide/cgroup-v1/memcg_test.rst
@@ -47,21 +47,19 @@ Please note that implementation details can be changed.
Called when swp_entry's refcnt goes down to 0. A charge against swap
disappears.
-3. charge-commit-cancel
+3. charge-commit
=======================
Memcg pages are charged in two steps:
- mem_cgroup_try_charge()
- - mem_cgroup_commit_charge() or mem_cgroup_cancel_charge()
+ - commit_charge()
At try_charge(), there are no flags to say "this page is charged".
at this point, usage += PAGE_SIZE.
At commit(), the page is associated with the memcg.
- At cancel(), simply usage -= PAGE_SIZE.
-
Under below explanation, we assume CONFIG_SWAP=y.
4. Anonymous
--
2.53.0
^ permalink raw reply related
* Re: [PATCH v6 01/22] mm/swap: decouple swap cache from physical swap infrastructure
From: Yosry Ahmed @ 2026-05-11 22:46 UTC (permalink / raw)
To: Nhat Pham
Cc: kasong, Liam.Howlett, akpm, apopple, axelrasmussen, baohua,
baolin.wang, bhe, byungchul, cgroups, chengming.zhou, chrisl,
corbet, david, dev.jain, gourry, hannes, hughd, jannh,
joshua.hahnjy, lance.yang, lenb, linux-doc, linux-kernel,
linux-mm, linux-pm, lorenzo.stoakes, matthew.brost, mhocko,
muchun.song, npache, pavel, peterx, peterz, pfalcato, rafael,
rakie.kim, roman.gushchin, rppt, ryan.roberts, shakeel.butt,
shikemeng, surenb, tglx, vbabka, weixugc, ying.huang, yosry.ahmed,
yuanchu, zhengqi.arch, ziy, kernel-team, riel, haowenchao22
In-Reply-To: <20260505153854.1612033-2-nphamcs@gmail.com>
On Tue, May 05, 2026 at 08:38:30AM -0700, Nhat Pham wrote:
> When we virtualize the swap space, we will manage swap cache at the
> virtual swap layer. To prepare for this, decouple swap cache from
> physical swap infrastructure.
>
> We will also remove all the swap cache related helpers of swap table. We
> will keep the rest of the swap table infrastructure, which will be
> repurposed to serve as the rmap (physical -> virtual swap mapping)
> later.
I didn't look through the entire series, but let me ask the same
high-level question I asked before. Instead of moving things out of the
swap table, why not reuse the swap table as the representation of the
virtual swap space? Seems like most/all metadata is already moved there
in a nice concise format.
>
> Note that with this patch, we will move to a single global lock to
> synchronize swap cache accesses. This is temporarily, as the swap cache
> will be re-partitioned in to (virtual) swap clusters once we move the
> swap cache to the soon-to-be-introduced virtual swap layer.
>
> Signed-off-by: Nhat Pham <nphamcs@gmail.com>
^ permalink raw reply
* Re: [PATCH 1/8] mm: memcontrol: propagate NMI slab stats to memcg vmstats
From: Shakeel Butt @ 2026-05-11 22:49 UTC (permalink / raw)
To: Alexandre Ghiti
Cc: Andrew Morton, Johannes Weiner, Michal Hocko, Roman Gushchin,
Muchun Song, Dennis Zhou, Tejun Heo, Christoph Lameter,
Vlastimil Babka, Yosry Ahmed, Nhat Pham, Sergey Senozhatsky,
Chengming Zhou, Suren Baghdasaryan, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Minchan Kim, Mike Rapoport, Axel Rasmussen,
Barry Song, Kairui Song, Wei Xu, Yuanchu Xie, Liam R . Howlett,
Joshua Hahn, linux-mm, linux-kernel, cgroups
In-Reply-To: <20260511202136.330358-2-alex@ghiti.fr>
On Mon, May 11, 2026 at 10:20:36PM +0200, Alexandre Ghiti wrote:
> flush_nmi_stats() drains per-node NMI slab atomics into the per-node
> lruvec_stats, but does not propagate them to the memcg-level vmstats.
>
> This is inconsistent with account_slab_nmi_safe() which updates both,
I think the above sentence needs clarification. Something like "For non nmi
case, account_slab_nmi_safe() calls mod_memcg_lruvec_state() which updates both
per-node lruvec_stats and memcg-level vmstats, so flush_nmi_stats() needs to
flush to per-node lruvec_stats as well as memcg-level vmstats but at the moment
the memcg-level vmstats flushing is missing. Fix that".
> so fix this by propagating the NMI slab stats to the memcg-level vmstats.
>
> Fixes: 940b01fc8dc1 ("memcg: nmi safe memcg stats for specific archs")
> Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
> ---
> mm/memcontrol.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index c3d98ab41f1f..d81a76654b2c 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -4341,16 +4341,22 @@ static void flush_nmi_stats(struct mem_cgroup *memcg, struct mem_cgroup *parent,
> int index = memcg_stats_index(NR_SLAB_RECLAIMABLE_B);
>
> lstats->state[index] += slab;
> + memcg->vmstats->state[index] += slab;
> if (plstats)
> plstats->state_pending[index] += slab;
> + if (parent)
> + parent->vmstats->state_pending[index] += slab;
Nit: please keep all three code lines additions together.
> }
> if (atomic_read(&pn->slab_unreclaimable)) {
> int slab = atomic_xchg(&pn->slab_unreclaimable, 0);
> int index = memcg_stats_index(NR_SLAB_UNRECLAIMABLE_B);
>
> lstats->state[index] += slab;
> + memcg->vmstats->state[index] += slab;
> if (plstats)
> plstats->state_pending[index] += slab;
> + if (parent)
> + parent->vmstats->state_pending[index] += slab;
Same here.
> }
> }
> }
With the commit message fixed and nits addressed, you can add:
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
and thanks for catching this issue.
^ permalink raw reply
* Re: [PATCH] cgroup: Keep favordynmods enabled once per-threadgroup rwsem is active
From: Chen Ridong @ 2026-05-12 0:46 UTC (permalink / raw)
To: Guopeng Zhang, Tejun Heo, Johannes Weiner, Michal Koutný
Cc: Yi Tao, cgroups, linux-kernel
In-Reply-To: <08ab3e19-38f7-4892-b752-c3a601ed15ba@huaweicloud.com>
On 2026/5/11 20:08, Chen Ridong wrote:
>
>
> On 2026/5/11 17:53, Guopeng Zhang wrote:
>>
>>
>> 在 2026/5/11 17:05, Chen Ridong 写道:
>>>
>>>
>>> On 2026/5/11 16:16, Guopeng Zhang wrote:
>>>> cgroup_enable_per_threadgroup_rwsem is a one-way switch. Once it is
>>>> enabled, cgroup.procs writes use the per-threadgroup rwsem and
>>>> cgroup_threadgroup_change_begin()/end() use the same global state to
>>>> decide whether to take and release the per-threadgroup rwsem.
>>>>
>>>> The disable path warned that the per-threadgroup rwsem mechanism could not
>>>> be disabled but still called rcu_sync_exit() and cleared
>>>> CGRP_ROOT_FAVOR_DYNMODS. That partially disabled favordynmods while the
>>>> global per-threadgroup rwsem mode remained enabled: cgroup.procs writes
>>>> would continue to use the per-threadgroup rwsem, while
>>>> cgroup_threadgroup_change_begin()/end() could observe the exited rcu_sync
>>>> state. The root would also no longer report favordynmods.
>>>>
>>>> Make the transition match the documented one-way semantics. Call
>>>> rcu_sync_enter() only for the first favordynmods enable, and make later
>>>> disable attempts a no-op after warning once the per-threadgroup rwsem mode
>>>> has been enabled.
>>>>
>>>> Fixes: 0568f89d4fb8 ("cgroup: replace global percpu_rwsem with per threadgroup resem when writing to cgroup.procs")
>>>> Signed-off-by: Guopeng Zhang <zhangguopeng@kylinos.cn>
>>>> ---
>>>> Manual AB test:
>>>>
>>>> Before this patch:
>>>> enable favordynmods:
>>>> cgroup2 opts: rw,relatime,favordynmods
>>>> disable attempt:
>>>> cgroup2 opts: rw,relatime
>>>> dmesg:
>>>> cgroup: cgroup favordynmods: per threadgroup rwsem mechanism can't be disabled
>>>>
>>>> After this patch:
>>>> enable favordynmods:
>>>> cgroup2 opts: rw,relatime,favordynmods
>>>> disable attempt:
>>>> cgroup2 opts: rw,relatime,favordynmods
>>>> dmesg:
>>>> cgroup: cgroup favordynmods: per threadgroup rwsem mechanism can't be disabled
>>>>
>>>> kernel/cgroup/cgroup.c | 11 +++++------
>>>> 1 file changed, 5 insertions(+), 6 deletions(-)
>>>>
>>>> diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
>>>> index 6152add0c5eb..fd10fb5b3598 100644
>>>> --- a/kernel/cgroup/cgroup.c
>>>> +++ b/kernel/cgroup/cgroup.c
>>>> @@ -1297,14 +1297,13 @@ void cgroup_favor_dynmods(struct cgroup_root *root, bool favor)
>>>> */
>>>> percpu_down_write(&cgroup_threadgroup_rwsem);
>>>> if (favor && !favoring) {
>>>> - cgroup_enable_per_threadgroup_rwsem = true;
>>>> - rcu_sync_enter(&cgroup_threadgroup_rwsem.rss);
>>>> + if (!cgroup_enable_per_threadgroup_rwsem) {
>>>
>>> Is this branch redundant? I think if (favor && !favoring) alone should suffice —
>>> or can the outer condition be true twice (i.e., can this block be entered
>>> multiple times)?
>>> Hi Ridong,
>>
>> Thanks for taking a look.
>>
>> I don't think the inner check is redundant. `favoring` is per-root, while
>> `cgroup_enable_per_threadgroup_rwsem` is global.
>>
>> For example, root A may have already enabled favordynmods:
>>
>
> This functionality is only available for cgroup v2, right?
>
Sorry for the mistake. I incorrectly recalled that it was only available for v2.
Please ignore that.
--
Best regards,
Ridong
^ permalink raw reply
* [PATCH] cpuset: Fix multi-source deadline task accounting and bandwidth bypass
From: Aaron Tomlin @ 2026-05-12 1:03 UTC (permalink / raw)
To: longman, tj, hannes, mkoutny; +Cc: chenridong, neelx, cgroups, linux-kernel
During a batch migration where threads in a taskset originate from
multiple source cpusets (e.g., via cgroup.procs), cpuset_can_attach()
and cpuset_attach() currently evaluate the source cpuset exactly once
by caching the first task's oldcs.
This creates two distinct critical flaws for SCHED_DEADLINE tasks:
1. oldcs->nr_deadline_tasks is decremented solely on the first
source cpuset. If tasks originated from other cpusets, their
counts are permanently leaked, and the first cpuset permanently
underflows.
2. cpumask_intersects() is evaluated strictly against the first
task's source cpuset. This allows tasks originating from
entirely isolated root domains to silently bypass the
dl_bw_alloc() admission control.
This patch refactors the deadline accounting to evaluate task_cs(task)
on a per-task basis during the cgroup_taskset_for_each() loops. To
achieve accurate accounting before the core cgroup migration actually
executes, the permanent nr_deadline_tasks increments/decrements are
shifted into cpuset_can_attach(). If the migration aborts, the counts
are gracefully reverted via an internal rollback loop or the
cpuset_cancel_attach() callback.
Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
---
kernel/cgroup/cpuset.c | 53 +++++++++++++++++++++++++++++++-----------
1 file changed, 39 insertions(+), 14 deletions(-)
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index e3a081a07c6d..36f1d28f8ade 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -3034,32 +3034,36 @@ static int cpuset_can_attach(struct cgroup_taskset *tset)
if (setsched_check) {
ret = security_task_setscheduler(task);
if (ret)
- goto out_unlock;
+ goto out_unlock_reset;
}
if (dl_task(task)) {
+ struct cpuset *old_cs = task_cs(task);
+
cs->nr_migrate_dl_tasks++;
- cs->sum_migrate_dl_bw += task->dl.dl_bw;
+ old_cs->nr_deadline_tasks--;
+ cs->nr_deadline_tasks++;
+
+ if (!cpumask_intersects(old_cs->effective_cpus,
+ cs->effective_cpus))
+ cs->sum_migrate_dl_bw += task->dl.dl_bw;
}
}
if (!cs->nr_migrate_dl_tasks)
goto out_success;
- if (!cpumask_intersects(oldcs->effective_cpus, cs->effective_cpus)) {
+ if (cs->sum_migrate_dl_bw) {
int cpu = cpumask_any_and(cpu_active_mask, cs->effective_cpus);
if (unlikely(cpu >= nr_cpu_ids)) {
- reset_migrate_dl_data(cs);
ret = -EINVAL;
- goto out_unlock;
+ goto out_unlock_reset;
}
ret = dl_bw_alloc(cpu, cs->sum_migrate_dl_bw);
- if (ret) {
- reset_migrate_dl_data(cs);
- goto out_unlock;
- }
+ if (ret)
+ goto out_unlock_reset;
cs->dl_bw_cpu = cpu;
}
@@ -3070,6 +3074,22 @@ static int cpuset_can_attach(struct cgroup_taskset *tset)
* changes which zero cpus/mems_allowed.
*/
cs->attach_in_progress++;
+ goto out_unlock;
+
+out_unlock_reset:
+ if (cs->nr_migrate_dl_tasks) {
+ struct task_struct *t;
+
+ cgroup_taskset_for_each(t, css, tset) {
+ if (t == task)
+ break;
+ if (dl_task(t)) {
+ task_cs(t)->nr_deadline_tasks++;
+ cs->nr_deadline_tasks--;
+ }
+ }
+ reset_migrate_dl_data(cs);
+ }
out_unlock:
mutex_unlock(&cpuset_mutex);
return ret;
@@ -3079,6 +3099,7 @@ static void cpuset_cancel_attach(struct cgroup_taskset *tset)
{
struct cgroup_subsys_state *css;
struct cpuset *cs;
+ struct task_struct *task;
cgroup_taskset_first(tset, &css);
cs = css_cs(css);
@@ -3089,8 +3110,15 @@ static void cpuset_cancel_attach(struct cgroup_taskset *tset)
if (cs->dl_bw_cpu >= 0)
dl_bw_free(cs->dl_bw_cpu, cs->sum_migrate_dl_bw);
- if (cs->nr_migrate_dl_tasks)
+ if (cs->nr_migrate_dl_tasks) {
+ cgroup_taskset_for_each(task, css, tset) {
+ if (dl_task(task)) {
+ task_cs(task)->nr_deadline_tasks++;
+ cs->nr_deadline_tasks--;
+ }
+ }
reset_migrate_dl_data(cs);
+ }
mutex_unlock(&cpuset_mutex);
}
@@ -3195,11 +3223,8 @@ static void cpuset_attach(struct cgroup_taskset *tset)
schedule_flush_migrate_mm();
cs->old_mems_allowed = cpuset_attach_nodemask_to;
- if (cs->nr_migrate_dl_tasks) {
- cs->nr_deadline_tasks += cs->nr_migrate_dl_tasks;
- oldcs->nr_deadline_tasks -= cs->nr_migrate_dl_tasks;
+ if (cs->nr_migrate_dl_tasks)
reset_migrate_dl_data(cs);
- }
dec_attach_in_progress_locked(cs);
--
2.51.0
^ permalink raw reply related
* Re: [PATCH] selftests/cgroup: check malloc return value in alloc_anon functions
From: Hongfu Li @ 2026-05-12 3:06 UTC (permalink / raw)
To: vishal.moola
Cc: cgroups, hannes, lihongfu, linux-kernel, linux-kselftest,
linux-mm, mhocko, mkoutny, muchun.song, roman.gushchin,
shakeel.butt, shuah, tj
In-Reply-To: <agHEjG7_fHMAnQrw@fedora>
Hi Vishal,
> > diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testing/selftests/cgroup/test_memcontrol.c
> > index b43da9bc20c4..8ef9c99a82eb 100644
> > --- a/tools/testing/selftests/cgroup/test_memcontrol.c
> > +++ b/tools/testing/selftests/cgroup/test_memcontrol.c
> > @@ -61,6 +61,11 @@ int alloc_anon(const char *cgroup, void *arg)
> > char *buf, *ptr;
> >
> > buf = malloc(size);
> > + if (buf == NULL) {
> > + fprintf(stderr, "malloc() failed\n");
> > + return -1;
> > + }
> > +
> > for (ptr = buf; ptr < buf + size; ptr += PAGE_SIZE)
> > *ptr = 0;
>
> Every malloc() call in this file has this same pattern. Maybe we'd be
> better off making it a helper function?
>
> Either way:
> Reviewed-by: Vishal Moola <vishal.moola@gmail.com>
Thanks for your review and valuable suggestion.
I agree with you, will refactor all malloc() checks into a common helper
function, and send out a v2 patch soon.
Best regards,
Hongfu Li
^ permalink raw reply
* [PATCH 0/3] cgroup/rdma: add rdma.peak and rdma.events[.local]
From: Tao Cui @ 2026-05-12 3:17 UTC (permalink / raw)
To: tj, hannes, mkoutny, cgroups; +Cc: Tao Cui
Hi,
This series adds three new cgroup interface files to the RDMA controller
to improve observability of resource usage and limit enforcement:
- rdma.peak: per-device high watermark of resource usage
- rdma.events: hierarchical max event counters
- rdma.events.local: per-cgroup local max and failcnt counters
Why these interfaces?
Currently rdma.current only shows the instantaneous resource usage per
device. Administrators who need to set appropriate rdma.max limits have
no way to observe usage spikes or detect when limits are being hit.
rdma.peak addresses the observability gap: it tracks the historical high
watermark so administrators can determine a sensible rdma.max based on
actual peak demand rather than guesswork. This is directly analogous to
memory.peak.
rdma.events and rdma.events.local address the notification gap: they
provide per-device counters that track how often resource limits block
allocations, and can be monitored via poll/epoll for real-time alerting
when a cgroup hits its rdma.max. This follows the pids.events /
pids.events.local design, where events are attributed to the cgroup
whose limit was exceeded rather than the cgroup where the allocation was
attempted.
Patch overview:
Patch 1: rdma.peak
Adds peak tracking in the charge path and the rdma.peak interface
file. rpools are kept alive while peak is non-zero so the values
persist as historical records.
Patch 2: rdma.events
Adds hierarchical max event counters that propagate upward from the
cgroup whose limit was hit. Introduces rdmacg_event_locked() and
the rdma.events interface file with poll notification support.
Patch 3: rdma.events.local
Extends the event infrastructure with per-cgroup local counters:
local max counts how often this cgroup's limit blocked an allocation,
failcnt counts how often allocations from this subtree were rejected.
Adds the rdma.events.local interface file.
These patches have been tested locally.
Tao Cui (3):
cgroup/rdma: add rdma.peak for per-device peak usage tracking
cgroup/rdma: add rdma.events to track resource limit exhaustion
cgroup/rdma: add rdma.events.local for per-cgroup allocation failure
attribution
include/linux/cgroup_rdma.h | 4 +
kernel/cgroup/rdma.c | 165 +++++++++++++++++++++++++++++++++++-
2 files changed, 165 insertions(+), 4 deletions(-)
--
2.43.0
^ permalink raw reply
* [PATCH 1/3] cgroup/rdma: add rdma.peak for per-device peak usage tracking
From: Tao Cui @ 2026-05-12 3:17 UTC (permalink / raw)
To: tj, hannes, mkoutny, cgroups; +Cc: Tao Cui
In-Reply-To: <20260512031719.273507-1-cuitao@kylinos.cn>
rdma.peak tracks the high watermark of resource usage per device,
giving a better baseline on which to set rdma.max. Polling
rdma.current isn't feasible since it would miss short-lived spikes.
This interface is analogous to memory.peak.
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
kernel/cgroup/rdma.c | 44 ++++++++++++++++++++++++++++++++++++++++----
1 file changed, 40 insertions(+), 4 deletions(-)
diff --git a/kernel/cgroup/rdma.c b/kernel/cgroup/rdma.c
index 3df7c38ce481..ed1f3f7996bd 100644
--- a/kernel/cgroup/rdma.c
+++ b/kernel/cgroup/rdma.c
@@ -44,6 +44,7 @@ static LIST_HEAD(rdmacg_devices);
enum rdmacg_file_type {
RDMACG_RESOURCE_TYPE_MAX,
RDMACG_RESOURCE_TYPE_STAT,
+ RDMACG_RESOURCE_TYPE_PEAK,
};
/*
@@ -60,6 +61,7 @@ static char const *rdmacg_resource_names[] = {
struct rdmacg_resource {
int max;
int usage;
+ int peak;
};
/*
@@ -204,9 +206,20 @@ uncharge_cg_locked(struct rdma_cgroup *cg,
rpool->usage_sum--;
if (rpool->usage_sum == 0 &&
rpool->num_max_cnt == RDMACG_RESOURCE_MAX) {
+ int i;
+
+ /*
+ * Keep the rpool alive if any peak value is non-zero,
+ * so that rdma.peak persists as a historical high-
+ * watermark even after all resources are freed.
+ */
+ for (i = 0; i < RDMACG_RESOURCE_MAX; i++) {
+ if (rpool->resources[i].peak)
+ return;
+ }
/*
- * No user of the rpool and all entries are set to max, so
- * safe to delete this rpool.
+ * No user of the rpool and all entries are
+ * set to max, so safe to delete this rpool.
*/
free_cg_rpool_locked(rpool);
}
@@ -306,6 +319,8 @@ int rdmacg_try_charge(struct rdma_cgroup **rdmacg,
goto err;
} else {
rpool->resources[index].usage = new;
+ if (new > rpool->resources[index].peak)
+ rpool->resources[index].peak = new;
rpool->usage_sum++;
}
}
@@ -472,9 +487,15 @@ static ssize_t rdmacg_resource_set_max(struct kernfs_open_file *of,
if (rpool->usage_sum == 0 &&
rpool->num_max_cnt == RDMACG_RESOURCE_MAX) {
+ int i;
+
+ for (i = 0; i < RDMACG_RESOURCE_MAX; i++) {
+ if (rpool->resources[i].peak)
+ goto dev_err;
+ }
/*
- * No user of the rpool and all entries are set to max, so
- * safe to delete this rpool.
+ * No user of the rpool and all entries are
+ * set to max, so safe to delete this rpool.
*/
free_cg_rpool_locked(rpool);
}
@@ -506,6 +527,8 @@ static void print_rpool_values(struct seq_file *sf,
value = rpool->resources[i].max;
else
value = S32_MAX;
+ } else if (sf_type == RDMACG_RESOURCE_TYPE_PEAK) {
+ value = rpool ? rpool->resources[i].peak : 0;
} else {
if (rpool)
value = rpool->resources[i].usage;
@@ -556,6 +579,12 @@ static struct cftype rdmacg_files[] = {
.private = RDMACG_RESOURCE_TYPE_STAT,
.flags = CFTYPE_NOT_ON_ROOT,
},
+ {
+ .name = "peak",
+ .seq_show = rdmacg_resource_read,
+ .private = RDMACG_RESOURCE_TYPE_PEAK,
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
{ } /* terminate */
};
@@ -575,6 +604,13 @@ rdmacg_css_alloc(struct cgroup_subsys_state *parent)
static void rdmacg_css_free(struct cgroup_subsys_state *css)
{
struct rdma_cgroup *cg = css_rdmacg(css);
+ struct rdmacg_resource_pool *rpool, *tmp;
+
+ /* Clean up rpools kept alive by non-zero peak values */
+ mutex_lock(&rdmacg_mutex);
+ list_for_each_entry_safe(rpool, tmp, &cg->rpools, cg_node)
+ free_cg_rpool_locked(rpool);
+ mutex_unlock(&rdmacg_mutex);
kfree(cg);
}
--
2.43.0
^ permalink raw reply related
* [PATCH 2/3] cgroup/rdma: add rdma.events to track resource limit exhaustion
From: Tao Cui @ 2026-05-12 3:17 UTC (permalink / raw)
To: tj, hannes, mkoutny, cgroups; +Cc: Tao Cui
In-Reply-To: <20260512031719.273507-1-cuitao@kylinos.cn>
Add per-device hierarchical event counters to track when RDMA resource
limits are exceeded. The rdma.events file reports max event counts
propagated upward from the cgroup whose limit was hit to all ancestors.
This mirrors the design of pids.events, where events are attributed to
the cgroup that imposed the limit, not necessarily the cgroup where the
allocation was attempted. Userspace can monitor this file via
poll/epoll for real-time notification of resource exhaustion.
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
include/linux/cgroup_rdma.h | 3 ++
kernel/cgroup/rdma.c | 66 +++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+)
diff --git a/include/linux/cgroup_rdma.h b/include/linux/cgroup_rdma.h
index 80edae03c313..ac691fe7d3f5 100644
--- a/include/linux/cgroup_rdma.h
+++ b/include/linux/cgroup_rdma.h
@@ -24,6 +24,9 @@ struct rdma_cgroup {
* that belongs to this cgroup.
*/
struct list_head rpools;
+
+ /* Handle for rdma.events */
+ struct cgroup_file events_file;
};
struct rdmacg_device {
diff --git a/kernel/cgroup/rdma.c b/kernel/cgroup/rdma.c
index ed1f3f7996bd..66b853cf4ac8 100644
--- a/kernel/cgroup/rdma.c
+++ b/kernel/cgroup/rdma.c
@@ -8,6 +8,7 @@
* Copyright (C) 2016 Parav Pandit <pandit.parav@gmail.com>
*/
+#include <linux/atomic.h>
#include <linux/bitops.h>
#include <linux/limits.h>
#include <linux/slab.h>
@@ -81,6 +82,9 @@ struct rdmacg_resource_pool {
u64 usage_sum;
/* total number counts which are set to max */
int num_max_cnt;
+
+ /* per-resource hierarchical max event counters */
+ atomic64_t events_max[RDMACG_RESOURCE_MAX];
};
static struct rdma_cgroup *css_rdmacg(struct cgroup_subsys_state *css)
@@ -225,6 +229,33 @@ uncharge_cg_locked(struct rdma_cgroup *cg,
}
}
+/**
+ * rdmacg_event_locked - fire hierarchical max event when resource limit is hit
+ * @over_cg: cgroup whose limit was exceeded
+ * @device: rdma device
+ * @index: resource type index
+ *
+ * Must be called under rdmacg_mutex. Propagates max event counts upward
+ * from @over_cg to all ancestors and notifies userspace.
+ */
+static void rdmacg_event_locked(struct rdma_cgroup *over_cg,
+ struct rdmacg_device *device,
+ enum rdmacg_resource_type index)
+{
+ struct rdmacg_resource_pool *rpool;
+ struct rdma_cgroup *p;
+
+ lockdep_assert_held(&rdmacg_mutex);
+
+ for (p = over_cg; parent_rdmacg(p); p = parent_rdmacg(p)) {
+ rpool = get_cg_rpool_locked(p, device);
+ if (!IS_ERR(rpool)) {
+ atomic64_inc(&rpool->events_max[index]);
+ cgroup_file_notify(&p->events_file);
+ }
+ }
+}
+
/**
* rdmacg_uncharge_hierarchy - hierarchically uncharge rdma resource count
* @cg: pointer to cg to uncharge and all parents in hierarchy
@@ -331,6 +362,8 @@ int rdmacg_try_charge(struct rdma_cgroup **rdmacg,
return 0;
err:
+ if (ret == -EAGAIN)
+ rdmacg_event_locked(p, device, index);
mutex_unlock(&rdmacg_mutex);
rdmacg_uncharge_hierarchy(cg, device, p, index);
return ret;
@@ -565,6 +598,33 @@ static int rdmacg_resource_read(struct seq_file *sf, void *v)
return 0;
}
+static int rdmacg_events_show(struct seq_file *sf, void *v)
+{
+ struct rdma_cgroup *cg = css_rdmacg(seq_css(sf));
+ struct rdmacg_resource_pool *rpool;
+ struct rdmacg_device *device;
+ int i;
+
+ mutex_lock(&rdmacg_mutex);
+
+ list_for_each_entry(device, &rdmacg_devices, dev_node) {
+ rpool = find_cg_rpool_locked(cg, device);
+ if (!rpool)
+ continue;
+
+ seq_printf(sf, "%s ", device->name);
+ for (i = 0; i < RDMACG_RESOURCE_MAX; i++) {
+ seq_printf(sf, "%s.max %lld ",
+ rdmacg_resource_names[i],
+ (s64)atomic64_read(&rpool->events_max[i]));
+ }
+ seq_putc(sf, '\n');
+ }
+
+ mutex_unlock(&rdmacg_mutex);
+ return 0;
+}
+
static struct cftype rdmacg_files[] = {
{
.name = "max",
@@ -585,6 +645,12 @@ static struct cftype rdmacg_files[] = {
.private = RDMACG_RESOURCE_TYPE_PEAK,
.flags = CFTYPE_NOT_ON_ROOT,
},
+ {
+ .name = "events",
+ .seq_show = rdmacg_events_show,
+ .file_offset = offsetof(struct rdma_cgroup, events_file),
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
{ } /* terminate */
};
--
2.43.0
^ permalink raw reply related
* [PATCH 3/3] cgroup/rdma: add rdma.events.local for per-cgroup allocation failure attribution
From: Tao Cui @ 2026-05-12 3:17 UTC (permalink / raw)
To: tj, hannes, mkoutny, cgroups; +Cc: Tao Cui
In-Reply-To: <20260512031719.273507-1-cuitao@kylinos.cn>
Add per-cgroup local event counters to track RDMA resource limit
exhaustion from the perspective of individual cgroups. The
rdma.events.local file reports two per-resource counters:
- max: number of times this cgroup's limit was the one that blocked
an allocation in the subtree
- failcnt: number of allocation attempts originating from this
cgroup (or its descendants) that failed due to an ancestor's limit
This mirrors the design of pids.events.local, where events are
attributed to the cgroup that imposed the limit, not necessarily the
cgroup where the allocation was attempted.
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
include/linux/cgroup_rdma.h | 3 +-
kernel/cgroup/rdma.c | 67 +++++++++++++++++++++++++++++++++----
2 files changed, 63 insertions(+), 7 deletions(-)
diff --git a/include/linux/cgroup_rdma.h b/include/linux/cgroup_rdma.h
index ac691fe7d3f5..404e746552ca 100644
--- a/include/linux/cgroup_rdma.h
+++ b/include/linux/cgroup_rdma.h
@@ -25,8 +25,9 @@ struct rdma_cgroup {
*/
struct list_head rpools;
- /* Handle for rdma.events */
+ /* Handles for rdma.events[.local] */
struct cgroup_file events_file;
+ struct cgroup_file events_local_file;
};
struct rdmacg_device {
diff --git a/kernel/cgroup/rdma.c b/kernel/cgroup/rdma.c
index 66b853cf4ac8..2c1e1a5d7b6d 100644
--- a/kernel/cgroup/rdma.c
+++ b/kernel/cgroup/rdma.c
@@ -83,8 +83,10 @@ struct rdmacg_resource_pool {
/* total number counts which are set to max */
int num_max_cnt;
- /* per-resource hierarchical max event counters */
+ /* per-resource event counters */
atomic64_t events_max[RDMACG_RESOURCE_MAX];
+ atomic64_t events_local_max[RDMACG_RESOURCE_MAX];
+ atomic64_t events_failcnt[RDMACG_RESOURCE_MAX];
};
static struct rdma_cgroup *css_rdmacg(struct cgroup_subsys_state *css)
@@ -230,15 +232,18 @@ uncharge_cg_locked(struct rdma_cgroup *cg,
}
/**
- * rdmacg_event_locked - fire hierarchical max event when resource limit is hit
+ * rdmacg_event_locked - fire event when resource allocation exceeds limit
+ * @cg: requesting cgroup
* @over_cg: cgroup whose limit was exceeded
* @device: rdma device
* @index: resource type index
*
- * Must be called under rdmacg_mutex. Propagates max event counts upward
- * from @over_cg to all ancestors and notifies userspace.
+ * Must be called under rdmacg_mutex. Updates event counters in the
+ * resource pools of @cg and @over_cg, propagates hierarchical max
+ * events upward, and notifies userspace via cgroup_file_notify().
*/
-static void rdmacg_event_locked(struct rdma_cgroup *over_cg,
+static void rdmacg_event_locked(struct rdma_cgroup *cg,
+ struct rdma_cgroup *over_cg,
struct rdmacg_device *device,
enum rdmacg_resource_type index)
{
@@ -247,6 +252,21 @@ static void rdmacg_event_locked(struct rdma_cgroup *over_cg,
lockdep_assert_held(&rdmacg_mutex);
+ /* Increment failcnt in requesting cgroup */
+ rpool = find_cg_rpool_locked(cg, device);
+ if (rpool) {
+ atomic64_inc(&rpool->events_failcnt[index]);
+ cgroup_file_notify(&cg->events_local_file);
+ }
+
+ /* Increment local max in the over-limit cgroup */
+ rpool = find_cg_rpool_locked(over_cg, device);
+ if (rpool) {
+ atomic64_inc(&rpool->events_local_max[index]);
+ cgroup_file_notify(&over_cg->events_local_file);
+ }
+
+ /* Propagate hierarchical max events upward, creating rpools as needed */
for (p = over_cg; parent_rdmacg(p); p = parent_rdmacg(p)) {
rpool = get_cg_rpool_locked(p, device);
if (!IS_ERR(rpool)) {
@@ -363,7 +383,7 @@ int rdmacg_try_charge(struct rdma_cgroup **rdmacg,
err:
if (ret == -EAGAIN)
- rdmacg_event_locked(p, device, index);
+ rdmacg_event_locked(cg, p, device, index);
mutex_unlock(&rdmacg_mutex);
rdmacg_uncharge_hierarchy(cg, device, p, index);
return ret;
@@ -625,6 +645,35 @@ static int rdmacg_events_show(struct seq_file *sf, void *v)
return 0;
}
+static int rdmacg_events_local_show(struct seq_file *sf, void *v)
+{
+ struct rdma_cgroup *cg = css_rdmacg(seq_css(sf));
+ struct rdmacg_resource_pool *rpool;
+ struct rdmacg_device *device;
+ int i;
+
+ mutex_lock(&rdmacg_mutex);
+
+ list_for_each_entry(device, &rdmacg_devices, dev_node) {
+ rpool = find_cg_rpool_locked(cg, device);
+ if (!rpool)
+ continue;
+
+ seq_printf(sf, "%s ", device->name);
+ for (i = 0; i < RDMACG_RESOURCE_MAX; i++) {
+ seq_printf(sf, "%s.max %lld %s.failcnt %lld ",
+ rdmacg_resource_names[i],
+ (s64)atomic64_read(&rpool->events_local_max[i]),
+ rdmacg_resource_names[i],
+ (s64)atomic64_read(&rpool->events_failcnt[i]));
+ }
+ seq_putc(sf, '\n');
+ }
+
+ mutex_unlock(&rdmacg_mutex);
+ return 0;
+}
+
static struct cftype rdmacg_files[] = {
{
.name = "max",
@@ -651,6 +700,12 @@ static struct cftype rdmacg_files[] = {
.file_offset = offsetof(struct rdma_cgroup, events_file),
.flags = CFTYPE_NOT_ON_ROOT,
},
+ {
+ .name = "events.local",
+ .seq_show = rdmacg_events_local_show,
+ .file_offset = offsetof(struct rdma_cgroup, events_local_file),
+ .flags = CFTYPE_NOT_ON_ROOT,
+ },
{ } /* terminate */
};
--
2.43.0
^ permalink raw reply related
* Re: [PATCH v3 00/12] mm, swap: swap table phase IV: unify allocation and reduce static metadata
From: Kairui Song @ 2026-05-12 5:10 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-mm, David Hildenbrand, Zi Yan, Baolin Wang, Barry Song,
Hugh Dickins, Chris Li, Kemeng Shi, Nhat Pham, Baoquan He,
Johannes Weiner, Youngjun Park, Chengming Zhou, Roman Gushchin,
Shakeel Butt, Muchun Song, Qi Zheng, linux-kernel, cgroups,
Yosry Ahmed, Lorenzo Stoakes, Dev Jain, Lance Yang, Michal Hocko,
Michal Hocko, Suren Baghdasaryan, Axel Rasmussen
In-Reply-To: <20260511141249.eac1426fee41c9fe463e7e23@linux-foundation.org>
On Tue, May 12, 2026 at 5:12 AM Andrew Morton <akpm@linux-foundation.org> wrote:
>
> On Sat, 25 Apr 2026 02:11:47 +0800 Kairui Song <ryncsn@gmail.com> wrote:
> > I checked sashiko's review, it seems sashiko itself is bugged or
> > something wrong, Most patched end up with:
> > Tool error: Review tool timed out (active time exceeded)
> >
> > The rest of the results are all false positives, maybe I can add a few
> > more comments in the code or commit so it can understand the code
> > better.
> >
> > And checking V2's review:
> > https://sashiko.dev/#/patchset/20260417-swap-table-p4-v2-0-17f5d1015428%40tencent.com
> >
> > Which are mostly false positives and I've fixed the two real but
> > trivial issues already. Things should be fine.
>
> Sashiko review of v3:
>
> https://sashiko.dev/#/patchset/20260421-swap-table-p4-v3-0-2f23759a76bc@tencent.com
>
> appears to be complete, so perhaps it went back and figured it out.
>
> It claims to have several "critical" and "high" things, so please
> recheck?
Right, thanks for the head up! Just checked again, still, all reports
are false positives.
Some part may worth adding a WARN_ON or some comment (one was also
suggested by Chris), so both humans and AI will be less confused.
For example sashiko is very concerned about round_down of swp_entry_t,
or alignment of folio's swap entry, which is already a common pattern
now and completely fine. We did plan to use a wrapper for that later
to make it less confusing, not really a problem.
Maybe better also add a bit more info to the commit message.
> From your replies in this thread, I believe that we'll be seeing a v4
> series?
Sure, I'll send a v4, most changes are for cleanup and minor improvements.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox