From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-187.mta1.migadu.com (out-187.mta1.migadu.com [95.215.58.187]) (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 51A2F370D7C for ; Fri, 12 Jun 2026 11:30:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.187 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781263823; cv=none; b=oay4az1gQAKcme+GgK049azv6MMSiFDLpmFGK+qZNMrGKYVuA5HaOFJlVp2sJrBslIO3RRAcHoXMLrrffD38c4uXYfRcPVMz6SxVuzQ7ZPxbfL+fjpr1B+5+jcC/dhT+hCA9c1W9wtu6VaaYG2TlOlDULgf9oZR491oAtK3WYdY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781263823; c=relaxed/simple; bh=A5EJ8jZC0OSHsS7S6F2G25aqbCTZsM25ARiRJkxN/kE=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=jpMbQ6hr19pmhySPqXWowa2pMJzWNbZpE/FRt4ccSQuRpsxbtmkS/OFpyX7nVRKbyB6dSiYJfXgzJJjEgv5AU+yxYyo3IfaID9Pdt3xMJvs23s5F1EfNoWfFGoApaRNI7pWRMMhBCOXE5RwX+/+R6oLTeWTsW+yBXbZdqcz4XmY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=mQ6XTXPT; arc=none smtp.client-ip=95.215.58.187 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="mQ6XTXPT" Date: Fri, 12 Jun 2026 19:29:43 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781263811; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=gnE76kx6sJHPObcY3xV2Cf2cd1QfYlcVg52Ay7ZMWeQ=; b=mQ6XTXPTqyo8DYGRO17jNXO1oaUsaQbgvh7wgElYYAOLo1NPZdxySPHZBJj6gST26n8jhW gKLRuBzRbgsGfenosc3DORszrEL7v8sUA02WF6feITnfb7RRTgkLEOndlUrsBSdP1IESFV snHja/j4piC9f4rYT0PTzP4dBLJQ/Mc= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Hao Li To: "Vlastimil Babka (SUSE)" Cc: Harry Yoo , 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 Subject: Re: [PATCH v2 15/16] mm/slab: remove __GFP_NO_OBJ_EXT usage from alloc_slab_obj_exts() Message-ID: References: <20260610-slab_alloc_flags-v2-0-7190909db118@kernel.org> <20260610-slab_alloc_flags-v2-15-7190909db118@kernel.org> <49f1bf1e-fcaf-48fa-a7b1-f8ee78b19762@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <49f1bf1e-fcaf-48fa-a7b1-f8ee78b19762@kernel.org> X-Migadu-Flow: FLOW_OUT On Fri, Jun 12, 2026 at 12:17:45PM +0200, Vlastimil Babka (SUSE) wrote: > On 6/12/26 08:54, Hao Li wrote: > > On Wed, Jun 10, 2026 at 05:40:17PM +0200, Vlastimil Babka (SUSE) wrote: > >> __GFP_NO_OBJ_EXT has limited scope within the slab allocator itself and > >> gfp flags are a scarce resource, unlike slab's alloc_flags. > >> > >> Introduce SLAB_ALLOC_NO_RECURSE alloc flag that has the same intent as > >> __GFP_NO_OBJ_EXT but a more generic name, meaning that a kmalloc() > >> family function should not recurse into another kmalloc*() for the > >> purposes of allocating auxiliary structures (obj_ext arrays or sheaves). > >> > >> First, replace the __GFP_NO_OBJ_EXT for allocating obj_ext arrays in > >> alloc_slab_obj_exts(). Make use of the newly added kmalloc_flags() > >> function, where we can pass alloc_flags with SLAB_ALLOC_NO_RECURSE > >> added. This will also pass through SLAB_ALLOC_TRYLOCK so we don't need > >> to special case kmalloc_nolock() anymore. > >> > >> Note that until now the kmalloc_nolock() ignored the incoming gfp flags > >> and hardcoded __GFP_ZERO | __GFP_NO_OBJ_EXT. But it's correct to pass on > >> the incoming gfp flags (only augmented with __GFP_ZERO), because if > >> alloc_flags contain SLAB_ALLOC_TRYLOCK, the incoming gfp flags have to > >> be also compatible with it. > >> > >> Signed-off-by: Vlastimil Babka (SUSE) > >> --- > >> mm/slab.h | 1 + > >> mm/slub.c | 13 +++++-------- > >> 2 files changed, 6 insertions(+), 8 deletions(-) > >> > >> diff --git a/mm/slab.h b/mm/slab.h > >> index 45bfcfb35a9c..509f330654b8 100644 > >> --- a/mm/slab.h > >> +++ b/mm/slab.h > >> @@ -21,6 +21,7 @@ > >> #define SLAB_ALLOC_DEFAULT 0x00 /* no flags */ > >> #define SLAB_ALLOC_TRYLOCK 0x01 /* a kmalloc_nolock() allocation */ > >> #define SLAB_ALLOC_NEW_SLAB 0x02 /* a flag for alloc_slab_obj_exts() */ > >> +#define SLAB_ALLOC_NO_RECURSE 0x04 /* prevent kmalloc() recursion */ > >> > >> static inline bool alloc_flags_allow_spinning(const unsigned int alloc_flags) > >> { > >> diff --git a/mm/slub.c b/mm/slub.c > >> index cbb38bd01e46..7dfbd0251aa2 100644 > >> --- a/mm/slub.c > >> +++ b/mm/slub.c > >> @@ -2167,15 +2167,12 @@ int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s, > >> > >> gfp &= ~OBJCGS_CLEAR_MASK; > >> /* Prevent recursive extension vector allocation */ > >> - gfp |= __GFP_NO_OBJ_EXT; > >> + alloc_flags |= SLAB_ALLOC_NO_RECURSE; > >> > >> sz = obj_exts_alloc_size(s, slab, gfp); > >> > > > > For the original calls to kmalloc_nolock and kmalloc_node, I notice a difference: > > > >> - if (unlikely(!allow_spin)) > >> - vec = kmalloc_nolock(sz, __GFP_ZERO | __GFP_NO_OBJ_EXT, > >> - slab_nid(slab)); > > > > kmalloc_nolock completely discarded `gfp` flags. > > > >> - else > >> - vec = kmalloc_node(sz, gfp | __GFP_ZERO, slab_nid(slab)); > > > > while kmalloc_node preserved and passed it along. > > > >> + /* This will use kmalloc_nolock() if alloc_flags say so */ > >> + vec = kmalloc_flags(sz, gfp | __GFP_ZERO, alloc_flags, slab_nid(slab)); > > > > Now both paths are merged into kmalloc_flags, the gfp flags are > > unconditionally carried through. It seems this might carry some unwanted flags. > > > > I traced the call path and found that ___slab_alloc sets the __GFP_THISNODE > > for trynode_flags. If this flag propagates all the way into > > kmalloc_flags->...->__kmalloc_nolock_noprof, it will trigger the > > VM_WARN_ON_ONCE warning. Maybe we need to strip the original gfp if > > `!allow_spin`. > > Thanks. This should do the job in a more generic way I hope? > Yeah, this is more elegant. > diff --git a/mm/slub.c b/mm/slub.c > index f9b8dc56bb57..0bf53f70c9be 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -2047,12 +2047,15 @@ static inline void dec_slabs_node(struct kmem_cache *s, int node, > #endif /* CONFIG_SLUB_DEBUG */ > > /* > - * The allocated objcg pointers array is not accounted directly. > + * The allocated objcg pointers array or sheaf is not accounted directly. > * Moreover, it should not come from DMA buffer and is not readily > - * reclaimable. So those GFP bits should be masked off. > + * reclaimable. Node restriction for the parent allocation also should > + * not apply to the slab's internal objects. > + * So those GFP bits should be masked off. > */ > #define OBJCGS_CLEAR_MASK (__GFP_DMA | __GFP_RECLAIMABLE | \ > - __GFP_ACCOUNT | __GFP_NOFAIL) > + __GFP_ACCOUNT | __GFP_NOFAIL | > + __GFP_THISNODE ) Good idea! Both code and comments make sense to me. > > #ifdef CONFIG_SLAB_OBJ_EXT > > -- Thanks, Hao