From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D7EB133890B for ; Wed, 25 Feb 2026 16:34:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772037255; cv=none; b=O/oXzpIE/difCK6fFUWN8LKssJ1jN5ZmCyy2fG40lMQLQe6VjloKcAlpmfK1fWm8I7ahGMSgXLsRnnzZmzQ0YZW5Nq1S1IPbWDvcM4nWYXueRUnzQ4NXq+XOaJax0TVWfZlG2Zr/lnv2WsofYojNGk1JZasK1z9VeJ25rYL/lkU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772037255; c=relaxed/simple; bh=TmLHkhmQPYkFl8e/TENYnXOsa1+++CyqiWEQD5M6C4M=; h=Date:Mime-Version:Message-ID:Subject:From:To:Cc:Content-Type; b=d9Nid0EbiHwACsUbuHgeFitRIGJBW6URZiLj0eZY+HnlPa+cOAR6yin1hO3H4ppia/6Jxv++hR3J3e+mKIWJXpfqUuCdFOOGKUxeVFsm6t0mRq4i+AoadqVxRTiPmOO6l1KAO1AgDQh/IjsfN2RXF3Zi1Xdb5USnXQueQvIGfis= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kv8kVwqo; arc=none smtp.client-ip=74.125.82.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="kv8kVwqo" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2bd808454d6so40376782eec.1 for ; Wed, 25 Feb 2026 08:34:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1772037252; x=1772642052; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=6B7L7o41Oxea7KFZzUcBIICs8iJlEAxQhGkCpMBeOa4=; b=kv8kVwqoj9+kdQoK+FjIhW+d2HvRqBeiUX0pV++XpLl0TlUrau7r6nXpFxnlO4o9fx p78E1uvxDF/OL+ePMitmwRaZWyzK1l3nB7sH6PZDO9NjRSmrf81Mscs1LVsgB9aYC4U0 DKv+kvAxQWXV+4hbMPs44wq73zM/lHrUbS202Uze0m/shWkpSMTrfkLDxy8vD3z9tcFu 70+xQF7fKtpmdRJfdwx1dXICC6a/mBBBI0Yz4xso+TPBSPsUOcNLyPWYerJskTqTx5cW zegzkAAzjLqtGS1w0tAxPXva78mRCr5mq45jcD+wJorg4qY8ihfIletur1fpwNoGkHNI 724A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772037252; x=1772642052; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=6B7L7o41Oxea7KFZzUcBIICs8iJlEAxQhGkCpMBeOa4=; b=N1+LI4W6W4Y5JaMa03zqt2Ou5MTBdOFSXagaXcI4qHokNkE+b6/KCPxHWMxh7EuKP6 WAqOK0KgDNnroE8NOVvxPK3k6KEzxXPR2Zb/BXZSZXHxCz2A5St7EZrn1zYJH+Hzikcb FwpDnkBAN0mv3VHKW992txfX/YrCu9F1NCuyh7ezRJjNuNv3bJ2wkamz3JfV30RaVDeb xZNANM5pt6NnfPhgqYcFgeFr3mUUDL3R/TT8Hv1yqbpzkKmTrMoC44LVn8T7dT+Ooq3V iW2IHJS+H9mKHLGzygoApJ6QOmD1QkdvqH5cq9X5XYKcFjtflm2PdyKZ544uSgYHNw3e QnYw== X-Forwarded-Encrypted: i=1; AJvYcCWNR5vfqYoaSqT92K9DvRFcarnOyKIpgxSGF6UB7a3XAOoLP0wFopW33zD8PVfFa+i7Moes3tC0lelWptE=@vger.kernel.org X-Gm-Message-State: AOJu0Yyb8up9+gBzHHQTI+nAzrcFi9+QTxPnmGH9T/ch7LjauU1Niahb 0r6Cf2bFAzg+1OWBB5NW/AdVrHMH4PkkVyp+Ib0RJKCO5HCcI4lpscuTvQAM9oxKi5xb0BQlTDW 8tl83xw== X-Received: from dycqw12-n1.prod.google.com ([2002:a05:7300:c00c:10b0:2ba:b709:6d63]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7300:7492:b0:2b7:da6d:8e8e with SMTP id 5a478bee46e88-2bdcbf46311mr522707eec.4.1772037251637; Wed, 25 Feb 2026 08:34:11 -0800 (PST) Date: Wed, 25 Feb 2026 08:34:07 -0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.53.0.414.gf7e9f6c205-goog Message-ID: <20260225163407.2218712-1-surenb@google.com> Subject: [PATCH v3 1/1] mm/slab: mark alloc tags empty for sheaves allocated with __GFP_NO_OBJ_EXT From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: vbabka@suse.cz, harry.yoo@oracle.com, 00107082@163.com, cl@gentwo.org, rientjes@google.com, roman.gushchin@linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Suren Baghdasaryan Content-Type: text/plain; charset="UTF-8" alloc_empty_sheaf() allocates sheaves from SLAB_KMALLOC caches using __GFP_NO_OBJ_EXT to avoid recursion, however it does not mark their allocation tags empty before freeing, which results in a warning when CONFIG_MEM_ALLOC_PROFILING_DEBUG is set. Fix this by marking allocation tags for such sheaves as empty. Reported-by: David Wang <00107082@163.com> Closes: https://lore.kernel.org/all/20260223155128.3849-1-00107082@163.com/ Analyzed-by: Harry Yoo Signed-off-by: Suren Baghdasaryan Reviewed-by: Harry Yoo Tested-by: Harry Yoo Tested-by: David Wang <00107082@163.com> --- include/linux/gfp_types.h | 2 ++ mm/slab.h | 4 ++-- mm/slub.c | 33 +++++++++++++++++++++++---------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/include/linux/gfp_types.h b/include/linux/gfp_types.h index 814bb2892f99..6c75df30a281 100644 --- a/include/linux/gfp_types.h +++ b/include/linux/gfp_types.h @@ -139,6 +139,8 @@ enum { * %__GFP_ACCOUNT causes the allocation to be accounted to kmemcg. * * %__GFP_NO_OBJ_EXT causes slab allocation to have no object extension. + * mark_obj_codetag_empty() should be called upon freeing for objects allocated + * with this flag to indicate that their NULL tags are expected and normal. */ #define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE) #define __GFP_WRITE ((__force gfp_t)___GFP_WRITE) diff --git a/mm/slab.h b/mm/slab.h index 71c7261bf822..f6ef862b60ef 100644 --- a/mm/slab.h +++ b/mm/slab.h @@ -290,14 +290,14 @@ static inline void *nearest_obj(struct kmem_cache *cache, /* Determine object index from a given position */ static inline unsigned int __obj_to_index(const struct kmem_cache *cache, - void *addr, void *obj) + void *addr, const void *obj) { return reciprocal_divide(kasan_reset_tag(obj) - addr, cache->reciprocal_size); } static inline unsigned int obj_to_index(const struct kmem_cache *cache, - const struct slab *slab, void *obj) + const struct slab *slab, const void *obj) { if (is_kfence_address(obj)) return 0; diff --git a/mm/slub.c b/mm/slub.c index 862642c165ed..34c32749f091 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -2041,18 +2041,18 @@ static inline void dec_slabs_node(struct kmem_cache *s, int node, #ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG -static inline void mark_objexts_empty(struct slabobj_ext *obj_exts) +static inline void mark_obj_codetag_empty(const void *obj) { - struct slab *obj_exts_slab; + struct slab *obj_slab; unsigned long slab_exts; - obj_exts_slab = virt_to_slab(obj_exts); - slab_exts = slab_obj_exts(obj_exts_slab); + obj_slab = virt_to_slab(obj); + slab_exts = slab_obj_exts(obj_slab); if (slab_exts) { get_slab_obj_exts(slab_exts); - unsigned int offs = obj_to_index(obj_exts_slab->slab_cache, - obj_exts_slab, obj_exts); - struct slabobj_ext *ext = slab_obj_ext(obj_exts_slab, + unsigned int offs = obj_to_index(obj_slab->slab_cache, + obj_slab, obj); + struct slabobj_ext *ext = slab_obj_ext(obj_slab, slab_exts, offs); if (unlikely(is_codetag_empty(&ext->ref))) { @@ -2090,7 +2090,7 @@ static inline void handle_failed_objexts_alloc(unsigned long obj_exts, #else /* CONFIG_MEM_ALLOC_PROFILING_DEBUG */ -static inline void mark_objexts_empty(struct slabobj_ext *obj_exts) {} +static inline void mark_obj_codetag_empty(const void *obj) {} static inline bool mark_failed_objexts_alloc(struct slab *slab) { return false; } static inline void handle_failed_objexts_alloc(unsigned long obj_exts, struct slabobj_ext *vec, unsigned int objects) {} @@ -2211,7 +2211,7 @@ int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s, * assign slabobj_exts in parallel. In this case the existing * objcg vector should be reused. */ - mark_objexts_empty(vec); + mark_obj_codetag_empty(vec); if (unlikely(!allow_spin)) kfree_nolock(vec); else @@ -2254,7 +2254,7 @@ static inline void free_slab_obj_exts(struct slab *slab, bool allow_spin) * NULL, therefore replace NULL with CODETAG_EMPTY to indicate that * the extension for obj_exts is expected to be NULL. */ - mark_objexts_empty(obj_exts); + mark_obj_codetag_empty(obj_exts); if (allow_spin) kfree(obj_exts); else @@ -2312,6 +2312,10 @@ static void alloc_slab_obj_exts_early(struct kmem_cache *s, struct slab *slab) #else /* CONFIG_SLAB_OBJ_EXT */ +static inline void mark_obj_codetag_empty(const void *obj) +{ +} + static inline void init_slab_obj_exts(struct slab *slab) { } @@ -2783,6 +2787,15 @@ static inline struct slab_sheaf *alloc_empty_sheaf(struct kmem_cache *s, static void free_empty_sheaf(struct kmem_cache *s, struct slab_sheaf *sheaf) { + /* + * If the sheaf was created with __GFP_NO_OBJ_EXT flag then its + * corresponding extension is NULL and alloc_tag_sub() will throw a + * warning, therefore replace NULL with CODETAG_EMPTY to indicate + * that the extension for this sheaf is expected to be NULL. + */ + if (s->flags & SLAB_KMALLOC) + mark_obj_codetag_empty(sheaf); + kfree(sheaf); stat(s, SHEAF_FREE); base-commit: 7dff99b354601dd01829e1511711846e04340a69 -- 2.53.0.414.gf7e9f6c205-goog