From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 905404508FD; Wed, 10 Jun 2026 15:41:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781106069; cv=none; b=ee14cImPiUtfYFjlmxgrKK2/yiDmtccGHi2vpFzXetrHTNgnXVRxfLKq1XPlfRZiDhsPbdcASyjy3nmJC9fB+qEZamOgOjIH4/MiRLI5f8z1UPPv+mJhWizK3REX1/r0dc/hIN6jn1JriTFMozMlRuBa0VQ0IGFl4UNngVpRiAU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781106069; c=relaxed/simple; bh=RIBnEHMLwgnNXapDnCk3NcLcht4EfUsQhn+mW19p3wo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y/9PtwedpI0003726lwaFMJVzz/aFe7MXMW7utumHdTM0GPTImowqjJLbj/wTiQF/rJRZ4K7Lr1NEGQU47O63vRpEV3mxeHk5Hd0mWnHDpn4kKkzvX47ATtHQ0hImn2sSmIA/RzebC4h90Isaw1ZM2JjoZIO5t9zaz2hBIMsmg0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mnIo4SnC; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mnIo4SnC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E454D1F00893; Wed, 10 Jun 2026 15:40:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1781106064; bh=yRohSSU7buAwP8rkGvuFsooGceecpgqW9FG/cY7L87c=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=mnIo4SnCqJZi4Zezto2wNu4R9ghQQlbBBS1ONRe0lv42vFME08dn0cs4xiR3ZtQC+ W/WEGkU0/zRVgGy4KlAwKUXewIIBBY/mfIoVx3rI54ZWxEXAxO2JMjk/RzZD+DKFRC V7+1TDExqnms4jOu2eO9pNHmcLaR7QJ9qWHYXGmblyNs5lYHYJfko8GpU1cc79LCZw FgrLywy46zNqot1QYCaUMSsxguO24wNGd2K5ig1lLBP3pCAfIjaPYuPvn/DbJI1gn7 J5s3wVmYglUFGS7abi/4zSN+AfWq9+MtKAcDTH4+M2oo2XV63fnhGioWrfaFUE6U+O gJUEmgf82O+Eg== From: "Vlastimil Babka (SUSE)" Date: Wed, 10 Jun 2026 17:40:08 +0200 Subject: [PATCH v2 06/16] mm/slab: add alloc_flags to slab_alloc_context Precedence: bulk X-Mailing-List: cgroups@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260610-slab_alloc_flags-v2-6-7190909db118@kernel.org> References: <20260610-slab_alloc_flags-v2-0-7190909db118@kernel.org> In-Reply-To: <20260610-slab_alloc_flags-v2-0-7190909db118@kernel.org> To: Harry Yoo Cc: Hao Li , Christoph Lameter , David Rientjes , Roman Gushchin , Suren Baghdasaryan , Alexei Starovoitov , Andrew Morton , Johannes Weiner , Michal Hocko , Shakeel Butt , Alexander Potapenko , Marco Elver , Dmitry Vyukov , kasan-dev@googlegroups.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, "Vlastimil Babka (SUSE)" X-Mailer: b4 0.15.2 Add alloc_flags as a new field to the slab_alloc_context helper struct, so we can pass it to more functions in the slab implementation without adding another function parameter. Start checking them via alloc_flags_allow_spinning() in alloc_single_from_new_slab() (where we can drop the allow_spin parameter) and ___slab_alloc(). This further reduces false-positive spinning-not-allowed from allocations that are not kmalloc_nolock() but lack __GFP_RECLAIM flags. _kmalloc_nolock_noprof() initializes ac.alloc_flags using its flags that are SLAB_ALLOC_TRYLOCK. slab_alloc_node() and __kmem_cache_alloc_bulk() are not reachable from kmalloc_nolock() and all their callers expect spinning to be allowed, so they can use SLAB_ALLOC_DEFAULT. This is temporary as the scope of slab_alloc_context will further move to the callers, making the alloc_flags usage more obvious. Signed-off-by: Vlastimil Babka (SUSE) --- mm/slub.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mm/slub.c b/mm/slub.c index e79fbca11bc0..ef745b37d063 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -217,6 +217,7 @@ static DEFINE_STATIC_KEY_FALSE(strict_numa); struct slab_alloc_context { unsigned long caller_addr; unsigned long orig_size; + unsigned int alloc_flags; }; /* Structure holding parameters for get_from_partial() call chain */ @@ -3693,9 +3694,9 @@ static inline void init_slab_obj_iter(struct kmem_cache *s, struct slab *slab, * and put the slab to the partial (or full) list. */ static void *alloc_single_from_new_slab(struct kmem_cache *s, struct slab *slab, - struct slab_alloc_context *ac, - bool allow_spin) + struct slab_alloc_context *ac) { + bool allow_spin = alloc_flags_allow_spinning(ac->alloc_flags); struct kmem_cache_node *n; struct slab_obj_iter iter; bool needs_add_partial; @@ -4452,7 +4453,7 @@ static unsigned int alloc_from_new_slab(struct kmem_cache *s, struct slab *slab, static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, struct slab_alloc_context *ac) { - bool allow_spin = gfpflags_allow_spinning(gfpflags); + bool allow_spin = alloc_flags_allow_spinning(ac->alloc_flags); void *object; struct slab *slab; struct partial_context pc; @@ -4503,7 +4504,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, stat(s, ALLOC_SLAB); if (IS_ENABLED(CONFIG_SLUB_TINY) || kmem_cache_debug(s)) { - object = alloc_single_from_new_slab(s, slab, ac, allow_spin); + object = alloc_single_from_new_slab(s, slab, ac); if (likely(object)) goto success; @@ -4919,6 +4920,7 @@ unsigned int alloc_from_pcs_bulk(struct kmem_cache *s, gfp_t gfp, size_t size, static __fastpath_inline void *slab_alloc_node(struct kmem_cache *s, struct list_lru *lru, gfp_t gfpflags, int node, unsigned long addr, size_t orig_size) { + const unsigned int alloc_flags = SLAB_ALLOC_DEFAULT; void *object; s = slab_pre_alloc_hook(s, gfpflags); @@ -4929,12 +4931,13 @@ static __fastpath_inline void *slab_alloc_node(struct kmem_cache *s, struct list if (unlikely(object)) goto out; - object = alloc_from_pcs(s, gfpflags, SLAB_ALLOC_DEFAULT, node); + object = alloc_from_pcs(s, gfpflags, alloc_flags, node); if (unlikely(!object)) { struct slab_alloc_context ac = { .caller_addr = addr, .orig_size = orig_size, + .alloc_flags = alloc_flags, }; object = __slab_alloc_node(s, gfpflags, node, &ac); } @@ -5406,6 +5409,7 @@ void *_kmalloc_nolock_noprof(DECL_TOKEN_PARAMS(size, token), gfp_t gfp_flags, in struct slab_alloc_context ac = { .caller_addr = _RET_IP_, .orig_size = orig_size, + .alloc_flags = alloc_flags, }; /* @@ -7256,6 +7260,7 @@ static bool __kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, struct slab_alloc_context ac = { .caller_addr = _RET_IP_, .orig_size = s->object_size, + .alloc_flags = SLAB_ALLOC_DEFAULT, }; for (i = 0; i < size; i++) { -- 2.54.0