From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C412C83F10 for ; Wed, 9 Jul 2025 13:40:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D34C76B009B; Wed, 9 Jul 2025 09:40:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D0C0C6B00A0; Wed, 9 Jul 2025 09:40:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C493E6B00D0; Wed, 9 Jul 2025 09:40:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id B61066B009B for ; Wed, 9 Jul 2025 09:40:33 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 391FA16023C for ; Wed, 9 Jul 2025 13:40:33 +0000 (UTC) X-FDA: 83644835946.14.9E2802A Received: from mailrelay-egress16.pub.mailoutpod3-cph3.one.com (mailrelay-egress16.pub.mailoutpod3-cph3.one.com [46.30.212.3]) by imf28.hostedemail.com (Postfix) with ESMTP id E6FFAC0012 for ; Wed, 9 Jul 2025 13:40:30 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=yQGPicK6; dkim=pass header.d=konsulko.se header.s=ed1 header.b=HClRKehy ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752068431; a=rsa-sha256; cv=none; b=GytHEQQbgZWKulfHX3bDZ8hFIcm1ZGbvaQ3MBAs5kOzI+bFTM/gjcfaRGgkqojjZkgJuMo M8luTfhTaUa0Hy9i23lClf5D2Lhso82hiLhBy5yl8VxX5yg5+30HcuQeN64EpYb4gYZAMz db+KZi/o2fNECwIIhXl4etUNiSHvWHY= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=yQGPicK6; dkim=pass header.d=konsulko.se header.s=ed1 header.b=HClRKehy; dmarc=none; spf=none (imf28.hostedemail.com: domain of vitaly.wool@konsulko.se has no SPF policy when checking 46.30.212.3) smtp.mailfrom=vitaly.wool@konsulko.se ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752068431; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=9wNmXzsT2Qm51iGkMW4W5Cj/ccZe0He2BomSiCEZkp4=; b=7/Lmj2f0QiCUB9rw6jcwvB32uDNbKe9c6QQrTo1PNfjsmOTGq6MVYAlxRH3LzhWgT2J2xv 9PllIjAt0nXKXe/d4GGq73eFjAkl4REt853F9cYmWAuSv/KVO+yEeD3IsIsBwmCcr9GBeI 9UjVpx1amWzA/hJondwekvi0uJ9nd64= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1752068428; x=1752673228; d=konsulko.se; s=rsa1; h=to:references:message-id:content-transfer-encoding:cc:date:in-reply-to:from: subject:mime-version:content-type:from; bh=9wNmXzsT2Qm51iGkMW4W5Cj/ccZe0He2BomSiCEZkp4=; b=yQGPicK6w3+28Yo5sIl58kfKYkdW1IWfx00KTopXUszMdQcH41UNa9nmn8KcgR+qdkHF/btI5xuz/ etbJKDvR5BwYmOxdc247JXKwUqFfGpQzg45l9wKNb1G9B+B8KcJf2np9xg/JkTFnNf82SjHu90oSxz 3cU6NMetiMOSZYNBFOmAumLiWF3jeeulgBdZsWKVdw/rygP5hwBeslZf5cW3SXqU2ffLLvELROOcQ2 J7RwO4b1egyy/WjOC1JYKrX9ZUuuPuYI1+J4tW9eMZolC12GVmODmuP6bLn7ridnsu7lvOmchjvucu 4l8Jqur4xU2hVOmfqr+O+nHDjuUcgxw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1752068428; x=1752673228; d=konsulko.se; s=ed1; h=to:references:message-id:content-transfer-encoding:cc:date:in-reply-to:from: subject:mime-version:content-type:from; bh=9wNmXzsT2Qm51iGkMW4W5Cj/ccZe0He2BomSiCEZkp4=; b=HClRKehyLxD+atMHjqjFXjYpFGiwwHdAYs1D322FiACSdZUNRNlg9hMQ0NJXj9dFNv4cfeAHDm/Eg G4FsTXMBg== X-HalOne-ID: 45a67a1f-5cca-11f0-a5c1-81a63d10fb2d Received: from smtpclient.apple (c188-150-224-8.bredband.tele2.se [188.150.224.8]) by mailrelay5.pub.mailoutpod3-cph3.one.com (Halon) with ESMTPSA id 45a67a1f-5cca-11f0-a5c1-81a63d10fb2d; Wed, 09 Jul 2025 13:40:28 +0000 (UTC) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.200.121\)) Subject: Re: [PATCH v11 2/4] mm/slub: allow to set node and align in k[v]realloc From: Vitaly Wool In-Reply-To: <76FFFF68-15F3-4A36-BF1D-A33CF36FDC9E@konsulko.se> Date: Wed, 9 Jul 2025 15:40:17 +0200 Cc: linux-mm@kvack.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, Uladzislau Rezki , Danilo Krummrich , Alice Ryhl , rust-for-linux@vger.kernel.org, Hyeonggon Yoo <42.hyeyoo@gmail.com>, Roman Gushchin , Lorenzo Stoakes , "Liam R. Howlett" Content-Transfer-Encoding: quoted-printable Message-Id: <7099B4C7-311F-466D-B12C-BDC52FE34A65@konsulko.se> References: <20250707164755.631374-1-vitaly.wool@konsulko.se> <20250707164908.631462-1-vitaly.wool@konsulko.se> <4c5852cc-2ca5-432b-8426-01c108df66cb@suse.cz> <76FFFF68-15F3-4A36-BF1D-A33CF36FDC9E@konsulko.se> To: Vlastimil Babka X-Mailer: Apple Mail (2.3826.200.121) X-Rspamd-Server: rspam11 X-Rspam-User: X-Stat-Signature: 7axk8het9wqkqi36btigxpaipf9whrni X-Rspamd-Queue-Id: E6FFAC0012 X-HE-Tag: 1752068430-786091 X-HE-Meta: U2FsdGVkX1+sTQM3H9Qbzsa8QTKjKaQXuleOkuxkfmESQ/t9ovrMzK/8d3OTRCkeGqi4fDTpspIXO1GkoFzkRYs9s5Y/bvcUkq6R9lYWpxCi5+KLmu10l+rwZSU6vjlCATUcFAXeoNKGvf0UcIqtz835PnlCpZw+wG/r6UCXNLjCs215dbFTYrP6tUZB/NxLxQ1utbmhFO6xDp+C0zu/sbuSvwLtkYUnpaY2rBLHqqnsj9retf8XXP7jqKAVorPDJE4hUobY39pAHfAbeeOoU/j0bufrPy9i8lNlmwrI0FJye55oKywsObCbPVg7JXeagxNmrairQ1ZZ0L7zRP7RYTGpcv3Oc83c7zbkaggKCMKpZEf9/GnrIJDbB6PIv6ehl5wxnH59GlM+nwc6/IMNlTEDGOzCGyQdY55xlNWGbHgwbywGyyjN26kWJHp+SZ1FiXIGrKpVU0aLqrZCMAj7jW7TNypJ+0CjfAstvyR6u0Ow/+eUiHK8i0mjFZzsCaTk4K5lO9LG5teYuY/UOTOdeamLHXDNgjPAHWVzMwMwzzZO4qOkSBunmkPQefXfUL9JIadATzBjmgQEhEzr6W2vDp1Kxin1TwfJ6NjqqyFyutP0h4Eti5l70McX+pd9s410pwXQgAqGRfXNLlGtbJ0dBTQ7jqaLy9QXyEIgDKSXMzPRoFMsnxJP+Z/ZH7s8fXp271b65xOAzry65RHWEzHi0ytv19uDas6NuJu9dKvszBOdV1hElmRR0uKsXoaAktzIgWM4sYViQXzp0zYeANZovMyVFIVCHflJM+gswRn1o0KCyul/dhOVuRr+D+/axIHk9qvnfYEvUz9YFyu2JsMGL8aMK3QmRbK42SXoUzftdvFXKdJTbyFLPyiKNOV+Vteiy6w9uBlQray4pdUbDK/Al0k5AUvcGfFp7XautU/cgFgCeSNxq34lAwGAgvG/TyLtwrUJ6FlPBhXhNksAI/Y fGIMimTb kL112qQRB072oLPGLBQ67pfjeJiP7oaZ0ETfUzQT+fP0j6V80ZJAgU2ywa9S7T/QqXYqLS7mBzqDD2Lasem5DGiU7pf1dwdvDOoGEkTW4z4bvt8ckGCoQY7J7/YFvJjttWjHxuT+x4OYcWmzHSQjCM58nBa/2wf4QQxzcgeHSCDInWbm+2hE3ctghRrDrzqdT1LsJ+quNsgReFP2xkRA5AuBZ9CfVSAC0wDkhcZkPbji23PWMIqfGWyN5slFN6gGaUWtht4IS2uyGUU1pkIRRU0KBRbwNXQMSjaH6wIL/YjXWPaw= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: > On Jul 8, 2025, at 4:03=E2=80=AFPM, Vitaly Wool = wrote: >=20 >=20 >=20 >> On Jul 8, 2025, at 2:52=E2=80=AFPM, Vlastimil Babka = wrote: >>=20 >> On 7/7/25 18:49, Vitaly Wool wrote: >>> Reimplement k[v]realloc_node() to be able to set node and >>> alignment should a user need to do so. In order to do that while >>> retaining the maximal backward compatibility, add >>> k[v]realloc_node_align() functions and redefine the rest of API >>> using these new ones. >>>=20 >>> With that change we also provide the ability for the Rust part of >>> the kernel to set node and alignment in its K[v]xxx >>> [re]allocations. >>>=20 >>> Signed-off-by: Vitaly Wool >>> --- >>> include/linux/slab.h | 40 ++++++++++++++++++--------- >>> mm/slub.c | 64 = ++++++++++++++++++++++++++++++-------------- >>> 2 files changed, 71 insertions(+), 33 deletions(-) >>>=20 >>> diff --git a/include/linux/slab.h b/include/linux/slab.h >>> index d5a8ab98035c..13abcf4ada22 100644 >>> --- a/include/linux/slab.h >>> +++ b/include/linux/slab.h >>> @@ -465,9 +465,15 @@ int kmem_cache_shrink(struct kmem_cache *s); >>> /* >>> * Common kmalloc functions provided by all allocators >>> */ >>> -void * __must_check krealloc_noprof(const void *objp, size_t = new_size, >>> - gfp_t flags) __realloc_size(2); >>> -#define krealloc(...) alloc_hooks(krealloc_noprof(__VA_ARGS__)) >>> +void * __must_check krealloc_node_align_noprof(const void *objp, = size_t new_size, >>> + unsigned long align, >>> + gfp_t flags, int nid) __realloc_size(2); >>> +#define krealloc_node_noprof(_p, _s, _f, _n) \ >>> + krealloc_node_align_noprof(_p, _s, 1, _f, _n) >>> +#define krealloc_noprof(...) krealloc_node_noprof(__VA_ARGS__, = NUMA_NO_NODE) >>> +#define krealloc_node_align(...) = alloc_hooks(krealloc_node_align_noprof(__VA_ARGS__)) >>> +#define krealloc_node(...) = alloc_hooks(krealloc_node_noprof(__VA_ARGS__)) >>> +#define krealloc(...) alloc_hooks(krealloc_noprof(__VA_ARGS__)) >>=20 >> Hm wonder if krealloc() and krealloc_node_align() would be enough. Is >> krealloc_node() only used between patch 3 and 4? >> Also perhaps it would be more concise to only have >> krealloc_node_align_noprof() with alloc_hooks wrappers filling the >> NUMA_NO_NODE (and 1), so we don't need to #define the _noprof variant = of >> everything. The _noprof callers are rare so they can just always use >> krealloc_node_align_noprof() directly and also fill in the = NUMA_NO_NODE (and 1). >=20 > I don=E2=80=99t think that krealloc_node() is used at all at the = moment. I thought I=E2=80=99d define these to be symmetrical to = vmalloc() but if you believe these are redundant, I=E2=80=99m all for = removing them. >=20 Well, krealloc_noprof() appears to be used by nommu.c and it feels a bit = weird to make nommu code deal with NUMA nodes. So unless you feel = strongly about it, I would keep krealloc_noprof(). ~Vitaly >>=20 >>> void kfree(const void *objp); >>> void kfree_sensitive(const void *objp); >>> @@ -1041,18 +1047,23 @@ static inline __alloc_size(1) void = *kzalloc_noprof(size_t size, gfp_t flags) >>> #define kzalloc(...) alloc_hooks(kzalloc_noprof(__VA_ARGS__)) >>> #define kzalloc_node(_size, _flags, _node) kmalloc_node(_size, = (_flags)|__GFP_ZERO, _node) >>>=20 >>> -void *__kvmalloc_node_noprof(DECL_BUCKET_PARAMS(size, b), gfp_t = flags, int node) __alloc_size(1); >>> -#define kvmalloc_node_noprof(size, flags, node) \ >>> - __kvmalloc_node_noprof(PASS_BUCKET_PARAMS(size, NULL), flags, = node) >>> +void *__kvmalloc_node_noprof(DECL_BUCKET_PARAMS(size, b), unsigned = long align, >>> + gfp_t flags, int node) __alloc_size(1); >>> +#define kvmalloc_node_align_noprof(_size, _align, _flags, _node) \ >>> + __kvmalloc_node_noprof(PASS_BUCKET_PARAMS(_size, NULL), _align, = _flags, _node) >>> +#define kvmalloc_node_noprof(_size, _flags, _node) \ >>> + kvmalloc_node_align_noprof(_size, 1, _flags, _node) >>> +#define kvmalloc_node_align(...) \ >>> + alloc_hooks(kvmalloc_node_align_noprof(__VA_ARGS__)) >>> #define kvmalloc_node(...) = alloc_hooks(kvmalloc_node_noprof(__VA_ARGS__)) >>=20 >> Ditto. >>=20 >>>=20 >>> -#define kvmalloc(_size, _flags) kvmalloc_node(_size, _flags, = NUMA_NO_NODE) >>> -#define kvmalloc_noprof(_size, _flags) kvmalloc_node_noprof(_size, = _flags, NUMA_NO_NODE) >>> +#define kvmalloc_noprof(...) kvmalloc_node_noprof(__VA_ARGS__, = NUMA_NO_NODE) >>> +#define kvmalloc(...) alloc_hooks(kvmalloc_noprof(__VA_ARGS__)) >>> #define kvzalloc(_size, _flags) kvmalloc(_size, (_flags)|__GFP_ZERO) >>>=20 >>> -#define kvzalloc_node(_size, _flags, _node) kvmalloc_node(_size, = (_flags)|__GFP_ZERO, _node) >>> +#define kvzalloc_node(_s, _f, _n) kvmalloc_node(_s, = (_f)|__GFP_ZERO, _n) >>> #define kmem_buckets_valloc(_b, _size, _flags) \ >>> - alloc_hooks(__kvmalloc_node_noprof(PASS_BUCKET_PARAMS(_size, _b), = _flags, NUMA_NO_NODE)) >>> + alloc_hooks(__kvmalloc_node_noprof(PASS_BUCKET_PARAMS(_size, _b), = 1, _flags, NUMA_NO_NODE)) >>>=20 >>> static inline __alloc_size(1, 2) void * >>> kvmalloc_array_node_noprof(size_t n, size_t size, gfp_t flags, int = node) >>> @@ -1068,13 +1079,16 @@ kvmalloc_array_node_noprof(size_t n, size_t = size, gfp_t flags, int node) >>> #define kvmalloc_array_noprof(...) = kvmalloc_array_node_noprof(__VA_ARGS__, NUMA_NO_NODE) >>> #define kvcalloc_node_noprof(_n,_s,_f,_node) = kvmalloc_array_node_noprof(_n,_s,(_f)|__GFP_ZERO,_node) >>> #define kvcalloc_noprof(...) kvcalloc_node_noprof(__VA_ARGS__, = NUMA_NO_NODE) >>> - >>> #define kvmalloc_array(...) = alloc_hooks(kvmalloc_array_noprof(__VA_ARGS__)) >>> #define kvcalloc_node(...) = alloc_hooks(kvcalloc_node_noprof(__VA_ARGS__)) >>> #define kvcalloc(...) alloc_hooks(kvcalloc_noprof(__VA_ARGS__)) >>>=20 >>> -void *kvrealloc_noprof(const void *p, size_t size, gfp_t flags) >>> - __realloc_size(2); >>> +void *kvrealloc_node_align_noprof(const void *p, size_t size, = unsigned long align, >>> + gfp_t flags, int nid) __realloc_size(2); >>> +#define kvrealloc_node_align(...) = kvrealloc_node_align_noprof(__VA_ARGS__) >>> +#define kvrealloc_node_noprof(_p, _s, _f, _n) = kvrealloc_node_align_noprof(_p, _s, 1, _f, _n) >>> +#define kvrealloc_node(...) = alloc_hooks(kvrealloc_node_noprof(__VA_ARGS__)) >>> +#define kvrealloc_noprof(...) kvrealloc_node_noprof(__VA_ARGS__, = NUMA_NO_NODE) >>> #define kvrealloc(...) alloc_hooks(kvrealloc_noprof(__VA_ARGS__)) >>=20 >> Ditto. >>=20 >>> extern void kvfree(const void *addr); >>> diff --git a/mm/slub.c b/mm/slub.c >>> index c4b64821e680..881244c357dd 100644 >>> --- a/mm/slub.c >>> +++ b/mm/slub.c >>> @@ -4845,7 +4845,7 @@ void kfree(const void *object) >>> EXPORT_SYMBOL(kfree); >>>=20 >>> static __always_inline __realloc_size(2) void * >>> -__do_krealloc(const void *p, size_t new_size, gfp_t flags) >>> +__do_krealloc(const void *p, size_t new_size, unsigned long align, = gfp_t flags, int nid) >>> { >>> void *ret; >>> size_t ks =3D 0; >>> @@ -4859,6 +4859,20 @@ __do_krealloc(const void *p, size_t new_size, = gfp_t flags) >>> if (!kasan_check_byte(p)) >>> return NULL; >>>=20 >>> + /* refuse to proceed if alignment is bigger than what kmalloc() = provides */ >>> + if (!IS_ALIGNED((unsigned long)p, align) || new_size < align) >>> + return NULL; >>> + >>> + /* >>> + * If reallocation is not necessary (e. g. the new size is less >>> + * than the current allocated size), the current allocation will = be >>> + * preserved unless __GFP_THISNODE is set. In the latter case a = new >>> + * allocation on the requested node will be attempted. >>> + */ >>> + if (unlikely(flags & __GFP_THISNODE) && nid !=3D NUMA_NO_NODE && >>> + nid !=3D page_to_nid(vmalloc_to_page(p))) >>=20 >> We need virt_to_page() here not vmalloc_to_page(). >=20 > Indeed, thanks. It is a c=E2=80=99n=E2=80=99p error, we had = virt_to_page() in earlier patchsets (i. e. up until v10). >=20 >>=20 >>> + goto alloc_new; >>> + >>> if (is_kfence_address(p)) { >>> ks =3D orig_size =3D kfence_ksize(p); >>> } else {