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 16BEBC8303C for ; Tue, 8 Jul 2025 14:03:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B0FC46B0304; Tue, 8 Jul 2025 10:03:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AE7DE6B0305; Tue, 8 Jul 2025 10:03:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9D6F16B0306; Tue, 8 Jul 2025 10:03:58 -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 8AF966B0304 for ; Tue, 8 Jul 2025 10:03:58 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 0EE325A227 for ; Tue, 8 Jul 2025 14:03:58 +0000 (UTC) X-FDA: 83641266156.30.589B421 Received: from mailrelay-egress16.pub.mailoutpod3-cph3.one.com (mailrelay-egress16.pub.mailoutpod3-cph3.one.com [46.30.212.3]) by imf22.hostedemail.com (Postfix) with ESMTP id 9DB89C0013 for ; Tue, 8 Jul 2025 14:03:55 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=lG2RiA0k; dkim=pass header.d=konsulko.se header.s=ed1 header.b=XNOynaG7 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751983436; 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=qZUWksruLaSEO+NHp3fF03+PfoUOrcJmckXB6q0rWxo=; b=LkPEfTj7bKdKe0QRb9Ej2cwpH4sqf6+uFajKZ0huf2yDPf1KDZNJvq//tKhUhVeO8rypxP i21RaQNIokWAUfvXf/87G6OiELM8EKDHePGdRKw5vIChaSTNoUL4XhHdgUtoyy56Xm1sQc kcHRrgg61sZQ/wma+Orz+J40t9HMhVo= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=lG2RiA0k; dkim=pass header.d=konsulko.se header.s=ed1 header.b=XNOynaG7; spf=none (imf22.hostedemail.com: domain of vitaly.wool@konsulko.se has no SPF policy when checking 46.30.212.3) smtp.mailfrom=vitaly.wool@konsulko.se; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751983436; a=rsa-sha256; cv=none; b=vpD2odu6JfnfTO2mBV9140w+zeoz4Sv5d/nppc8QAdaIbD8nmU3fI5PZURO6d9YvMJSAFg rFyuWM6edc7YFMeApy57TAp0KFWlI2DsTIriMeho5cik2awREtCTxusB9+L5eYfav36crr LTm2k2lOzokPYHKOGCqpEMIQJTJNOx4= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1751983433; x=1752588233; 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=qZUWksruLaSEO+NHp3fF03+PfoUOrcJmckXB6q0rWxo=; b=lG2RiA0knTFgs+6fK3rSxfikHOgQxVE1PQOecN28LbbjX9c5zhaJOQkq8VOHGJqIVDYy8bpNPwteC XsOplf2BG4JQkwbpg87rh65l53+oTjBxue3AYdeujAPM4g/yhjMdCoHvPc0OwBAl7McWogR63Ys4+Q UzMdiazKEgCJg9ncHXxNA+Tmr0AUVZ3uGVGkgnm5BX3kvaUCbVlCj9uXnZUqlbd/KSkKAXW51CSujU 5b0iwyiW/AEYKUw8AdH9wvNz+Nfd/lOQhkEDzwar85TPZC1y/5SMFXCg5qU0Mpqv2V0+n3920AUpO5 mf5VJT8yS+FDj8f6tX8VgI9+k2zH4vA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1751983433; x=1752588233; 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=qZUWksruLaSEO+NHp3fF03+PfoUOrcJmckXB6q0rWxo=; b=XNOynaG7bnNGKzwhY1g4GLaq1BIIeOpEAw8hGBruVXlIIBNNYI/KTR1BEYAYabDDciiWRVcoQji3W fd93vaHBQ== X-HalOne-ID: 60bc3ac4-5c04-11f0-a53e-494313b7f784 Received: from smtpclient.apple (c188-150-224-8.bredband.tele2.se [188.150.224.8]) by mailrelay6.pub.mailoutpod2-cph3.one.com (Halon) with ESMTPSA id 60bc3ac4-5c04-11f0-a53e-494313b7f784; Tue, 08 Jul 2025 14:03:52 +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: <4c5852cc-2ca5-432b-8426-01c108df66cb@suse.cz> Date: Tue, 8 Jul 2025 16:03:41 +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: <76FFFF68-15F3-4A36-BF1D-A33CF36FDC9E@konsulko.se> References: <20250707164755.631374-1-vitaly.wool@konsulko.se> <20250707164908.631462-1-vitaly.wool@konsulko.se> <4c5852cc-2ca5-432b-8426-01c108df66cb@suse.cz> To: Vlastimil Babka X-Mailer: Apple Mail (2.3826.200.121) X-Stat-Signature: 4qzri18tteioyn53p5m19xjwyzz9x5su X-Rspamd-Queue-Id: 9DB89C0013 X-Rspam-User: X-Rspamd-Server: rspam07 X-HE-Tag: 1751983435-49861 X-HE-Meta: U2FsdGVkX1/yuAKxGQkQEXVOp3MAj8SJyog7W4numwqJA2SgMCG1VmmSabUd8odMBp2PVqglgE5Y4Dp7P5Tn7OqSYCTDGcntqVKOm0ArO3NbTxdoViqSSTUS6nASN4cPaeV+T5p6aq1ZfuUMl0aFEMBhSFk3fH34cUcv3btMQxf2LSV1iS9/8+OrXgZT7fr3SuYYPZXnH8MBFQ0SN2/Dq3aju4UOQ6Avzl/2AqoUkJhXT07foT7nD78QQB0qOyl0/Um4uWnadJkpWdH8Aih6n0Z8YvJI9wbvMNytXCmkKresIvikWAt5ee+OW9kwotc9I5UuL8e3DJD8jq0yIfPScPKCdkNQ6BtqSZ9TY3mD8hk6bjxH3wuaW0KFUTXNt2FHFTjqhq1VTsT6dqzZmq9KJ7zpmZp3I3bZ7VkXRroIEqoXWUAbm4i/TDKjz0Nbt7kwAqJpQJkcWcovbxTU1HjQO6u/fVDV9Rz+em5Ayyfcx9e/E+5wQp2KSy4POmyXtcUC/7Ah2hLh592XxE5h+Zzieh9V6AEboRnoQNUn11aaBbOBXELfLKzPno8p7ZzTC0XNebB2XghPN9W9975nGnqwQvR4mQxVbYXSiNJ3oQl8mU17MP7KkLXDTW4QGqO612iWj/q/f1HuhBPald6zEqLLXrcOFVIJOOZjL/YJ2hYT+AGBLHKYiLQIEV4awUwVPioRM6E0mZKsKw9hlgm/cP6H5k0GY5CQ7Rdi0w3hkPKbBSyTybtlU3pYSYIHgg8iwMLR0lhd63A7JaqEarjcNjGlIntmG4/P3QETbcjEjWoWVPDLewXxPdBfBIJ0r1StD7yMgfVw4JeUdh6nUQXgTsdw8IIl9Pc6ErKCD+UEkEhcQviXwmA78Q9qHy5LdBsgxme1kQMz9zzSaS6aV0pbtFpJp1QhK7v9oyiHPyTFmgmoRAIqUIY578yvvKec2o77SXmjYWhQ1+iilfaxaroVVjy Uacl+e17 lW8TVa7xQeVa5d1vaWjLjTQFnWk6s3utBjmv1L+PLDWRMBhXv3+AOlnzw4tHl4uWDQxKS/XMFvb7FLwQXzHuRVj7c2Xqo3+x+TcSV4LINUEwaLRiIoDAzG6o89HY4ZC9w7oqSNclbaxwZfziwzcwM20w+KaUiEQkKEr1oZe9RD6IEowLdKly78lH5WUGk8spyBqppS+WDR+H3ZMcD/1944zGIRPNfU2pNHMHmhGJFs/tIbA5JIWuWQYEWet8wHN0qnWhrJzXHT2aRD2GtII+IBHimhGX8oYyxV5/wFtbZNCmrtr4= 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 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). 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 >> 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(). 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 >> + goto alloc_new; >> + >> if (is_kfence_address(p)) { >> ks =3D orig_size =3D kfence_ksize(p); >> } else {