From nobody Tue Jun 16 06:29:59 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 13A8B19E992 for ; Wed, 22 Apr 2026 07:38:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776843538; cv=none; b=mwF2abdxmu6PSs30Sih4wTGtRPLAohcBdOrO5eSd3b5s2mSsGUdL5Qfp08rZzRzQPb9M6hunjzTuHnujIZEGQA4RB97dmnCaVI7PeU9R031/z7EGTp+locDWsCj3cp9ob8FMoPbH2Hi/7njSI/QsVUpZhUonUcGclmRI+E/n0uE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776843538; c=relaxed/simple; bh=7C8zpaXbDw1uhCScZubHyxlpt42mHkFHj+T9SzWKNkc=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=WQQfyICj8J3Wor+BZagof8+usGlOdNiHtMZxg24Kavc2dLEQoDD0arCaIwnq907NvJrXsSgI3jo4iKGGgzPDKFuimriBmpr38tOTi7SjQULqXohyaxiQ0bwcXAlCoDJdhRuIeEOm5TLykXoKeDLXgs2T4zODXFgQZeJsTCFb2F4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 4b633b083e1e11f1aa26b74ffac11d73-20260422 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NAME, HR_CC_NO_NAME, HR_CTE_8B HR_CTT_MISS, HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME HR_SJ_DIGIT_LEN, HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM HR_SJ_PHRASE, HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT HR_TO_NO_NAME, IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_TRUSTED SA_EXISTED, SN_TRUSTED, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS DMARC_NOPASS, CIE_BAD, CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS GTI_C_CI, GTI_FG_IT, GTI_RG_INFO, GTI_C_BU, AMN_GOOD ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:4322ef36-3fe2-486f-be4a-425753147a7f,IP:10, URL:0,TC:0,Content:-25,EDM:0,RT:0,SF:-5,FILE:0,BULK:0,RULE:Release_Ham,ACT ION:release,TS:-20 X-CID-INFO: VERSION:1.3.12,REQID:4322ef36-3fe2-486f-be4a-425753147a7f,IP:10,UR L:0,TC:0,Content:-25,EDM:0,RT:0,SF:-5,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:-20 X-CID-META: VersionHash:e7bac3a,CLOUDID:534dc0081b7714e64e5e6bf10eef6cb0,BulkI D:260422153847CJN5I53G,BulkQuantity:0,Recheck:0,SF:17|19|38|66|78|102|127| 850|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:99|1,File:nil,RT:nil,Bulk: nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,B RE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR,TF_CID_SPAM_FAS,TF_CID_SPAM_FSD,TF_CID_SPAM_ULS X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 4b633b083e1e11f1aa26b74ffac11d73-20260422 X-User: lihongfu@kylinos.cn Received: from localhost.localdomain [(183.242.174.23)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1500469479; Wed, 22 Apr 2026 15:38:45 +0800 From: Hongfu Li To: harry@kernel.org, willy@infradead.org, vbabka@kernel.org, roman.gushchin@linux.dev, akpm@linux-foundation.org, surenb@google.com, pasha.tatashin@soleen.com, hao.li@linux.dev Cc: linux-kernel@vger.kernel.org, Hongfu Li Subject: [PATCH v3] tools/cgroup/slabinfo: Fix use of slab.memcg_data Date: Wed, 22 Apr 2026 15:39:00 +0800 Message-Id: <20260422073900.107311-1-lihongfu@kylinos.cn> X-Mailer: git-send-email 2.25.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" After the introduce slabobj_ext to support slab object extensions, the memcg_slabinfo tool broke. An attempt to run it produces a trace like this: Traceback (most recent call last): File "/usr/local/bin/drgn", line 8, in sys.exit(_main()) ^^^^^^^ File "/usr/local/lib64/python3.11/site-packages/drgn/cli.py", line 688, i= n _main runpy.run_path( File "", line 291, in run_path File "", line 98, in _run_module_code File "", line 88, in _run_code File "/root/memcg_slabinfo.py", line 225, in main() File "/root/memcg_slabinfo.py", line 195, in main objcg_vec_raw =3D slab.memcg_data.value_() AttributeError: 'struct slab' has no member 'memcg_data' Fixes: 21c690a349ba ("mm: introduce slabobj_ext to support slab object exte= nsions") Fixes: 5ba6bc27b1f9 ("slab: decouple pointer to barn from kmem_cache_node") Signed-off-by: Hongfu Li Acked-by: Harry Yoo (Oracle) --- v3: - Add a compatibility accessor for per-node cache state (per_node[nid].node= vs node[nid]) - Link to v2: https://lore.kernel.org/all/20260421055829.3930289-1-lihongfu= @kylinos.cn/ v2: - Skip slabs after masking when the base is zero (OBJEXTS_ALLOC_FAIL). - Walk slab->obj_exts using base + stride * i (same indexing as slab_obj_ex= t()). - Link to v1: https://lore.kernel.org/all/20260417020729.952897-1-lihongfu@= kylinos.cn/ --- tools/cgroup/memcg_slabinfo.py | 45 ++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/tools/cgroup/memcg_slabinfo.py b/tools/cgroup/memcg_slabinfo.py index 6bf4bde77903..f49512831d6a 100644 --- a/tools/cgroup/memcg_slabinfo.py +++ b/tools/cgroup/memcg_slabinfo.py @@ -33,6 +33,21 @@ def err(s): sys.exit(1) =20 =20 +def objexts_flags_mask(): + try: + return int(prog.constant('__NR_OBJEXTS_FLAGS')) - 1 + except: + return 0x7 + + +def slab_obj_ext_stride(slab): + # Match slab_obj_ext() for both layouts: contiguous ext[] or ext-in-ob= ject + try: + return slab.stride.value_() + except AttributeError: + return prog.type('struct slabobj_ext').size + + def find_memcg_ids(css=3Dprog['root_mem_cgroup'].css, prefix=3D''): if not list_empty(css.children.address_of_()): for css in list_for_each_entry('struct cgroup_subsys_state', @@ -68,6 +83,13 @@ def oo_objects(s): return s.oo.x & OO_MASK =20 =20 +def kmem_cache_get_node(s, nid): + try: + return s.per_node[nid].node + except AttributeError: + return s.node[nid] + + def count_partial(n, fn): nr_objs =3D 0 for slab in list_for_each_entry('struct slab', n.partial.address_of_(), @@ -86,7 +108,9 @@ def slub_get_slabinfo(s, cfg): nr_free =3D 0 =20 for node in range(cfg['nr_nodes']): - n =3D s.node[node] + n =3D kmem_cache_get_node(s, node) + if not n.value_(): + continue nr_slabs +=3D n.nr_slabs.counter.value_() nr_objs +=3D n.total_objects.counter.value_() nr_free +=3D count_partial(n, count_free) @@ -192,23 +216,30 @@ def main(): # look over all slab folios and look for objects belonging # to the given memory cgroup for slab in for_each_slab(prog): - objcg_vec_raw =3D slab.memcg_data.value_() - if objcg_vec_raw =3D=3D 0: + objext_vec_raw =3D slab.obj_exts.value_() + if objext_vec_raw =3D=3D 0: continue cache =3D slab.slab_cache if not cache: continue addr =3D cache.value_() caches[addr] =3D cache - # clear the lowest bit to get the true obj_cgroups - objcg_vec =3D Object(prog, 'struct obj_cgroup **', - value=3Dobjcg_vec_raw & ~1) =20 if addr not in stats: stats[addr] =3D 0 =20 + # clear OBJEXTS_FLAGS_MASK bits to get the true slabobj_ext ba= se. + # If OBJEXTS_ALLOC_FAIL, masked base is 0 - not tied to any cg= roup. + mask =3D objexts_flags_mask() + objext_base =3D objext_vec_raw & ~mask + if objext_base =3D=3D 0: + continue + + stride =3D slab_obj_ext_stride(slab) for i in range(oo_objects(cache)): - if objcg_vec[i].value_() in obj_cgroups: + objext =3D Object(prog, 'struct slabobj_ext *', + value=3Dobjext_base + stride * i) + if objext.objcg.value_() in obj_cgroups: stats[addr] +=3D 1 =20 for addr in caches: --=20 2.25.1