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 D0C56C7EE30 for ; Thu, 26 Jun 2025 20:53:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4B0966B00A5; Thu, 26 Jun 2025 16:53:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 440C36B00A6; Thu, 26 Jun 2025 16:53:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2E0C76B00AA; Thu, 26 Jun 2025 16:53:45 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 18CAB6B00A5 for ; Thu, 26 Jun 2025 16:53:45 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 5C933803E5 for ; Thu, 26 Jun 2025 20:53:44 +0000 (UTC) X-FDA: 83598753168.16.5F0F7A6 Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) by imf14.hostedemail.com (Postfix) with ESMTP id 6873B100007 for ; Thu, 26 Jun 2025 20:53:42 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=BPHRtbIf; spf=pass (imf14.hostedemail.com: domain of tamird@gmail.com designates 209.85.208.182 as permitted sender) smtp.mailfrom=tamird@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750971222; 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=kHR0j6osj5JXjZAu8frswdQtAV7pwiXahW5jwmRCgMI=; b=Rfn5j1LiyzN4/9YcqyTURDgR+nhJY1vQmg48zEH9/eXUC4KsQe8ZQsbAOouG4bBFM7RCeL 9OR/r+IzNLE4Wj39APwK/d791B3AfLUv2fthM13RrCZp7xvRKMMmuVN4eobobQXickmXUp pDJDCpF64HZ+u6w2iBCfhdQ0nhdwUmE= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750971222; a=rsa-sha256; cv=none; b=e86TCqMjHUy7S9Z5t5u6ecaSgqzjW0A8qI3jxddjoxr+KftDBtMvxdP4rqp2ci8q58dmpo MIlK3LcAdhQPk5XDqsWrDxtR4S/StB6aTA/xmBCSTg6J46LDDtkZ4b73EG4E2JFUUhpOeS lfvczT3NvbVDQDojmfUMxAWgZCgD+5I= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=BPHRtbIf; spf=pass (imf14.hostedemail.com: domain of tamird@gmail.com designates 209.85.208.182 as permitted sender) smtp.mailfrom=tamird@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-32adebb15c5so10746811fa.3 for ; Thu, 26 Jun 2025 13:53:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750971220; x=1751576020; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=kHR0j6osj5JXjZAu8frswdQtAV7pwiXahW5jwmRCgMI=; b=BPHRtbIfPwiqDy9IWPzAgMdYAkzRYrOQ2h0caIW8K769/q4/Np44/MBsoR5NdaGliZ fajsGjCZXk88ZPvPYWiXUEJwMHISCMm3Av5eGBO5uSgRj8fZKSh71G/OgKg7D4F7dGSS 6h84MsHRGAApKX+lRQ5EeMdVbbIYxTKI9WSiHXKe+jX52Z7iH2wrmDfd9nUSvovb94pA cGgnUgxaoXC+q2EvZoMujOYZMqkQaZktwI0CAqnw4r4UzL2VHiWZ1qNrc69TCDJ5/9Xz mgda/jZHF5QQ0DX0p9ybktQGBQ3CXX2ymaZsUs80/qMk9E6Tt+CZ3aXeYU2S44rHyJ3s 1PhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750971220; x=1751576020; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kHR0j6osj5JXjZAu8frswdQtAV7pwiXahW5jwmRCgMI=; b=PXwgN2QYhczYCI6wAkSMU+7KG0Mko6ZdQdp3DGr+AbNebLG7nDEWKBPmCPPMvUKEq7 i39GoL3FocTGfX3Oogn9anxjN+2MKPhBI4O0ljGeB5tvjFWUbPrV034j8towtLbNoiXQ z5g2lXXjIH1069ylwc7Ji3o7kLQz76ansS0LoUBqzPTjxaSlVCWt/evJWl8P+nzmogDO 0xY+yquvRa2wC2zENKB9MZ90MBsoF8w0QEidiB2ZsugWomYo9Vc4bAG6v1PCQBQGF8CJ VM3tNthVSJ/uobzkN++TzWGfRyveiyyz5YlqQ9GoZP+vtbiJ+lMVBQYzsiZVYFBnH1q5 RleQ== X-Gm-Message-State: AOJu0YxOBXXbFDcMuSdFjTfj70EFoFx6MaMQzzUeQawFIUadjV13gxsW IZyOBJJWuxZNy+vmvjJvGgFOPzWcupVuE45v92pObFohXnHJ5O2y6+taAuilKR6sLCtWLnM48YV JhDAc7sXm0uyhAa6Od69MMtlm21feFwI= X-Gm-Gg: ASbGnctSEhTu+DzqVWo89TTbLy55EdWmn4wc6aY+7UqLUF6C52ItM94VnhLgS9c6RHd Z60bX25utvX1JmWXgYkqMyuTzTMIA2TulN3wYCV1NaBdRw6dlhoPScCgYqlQlVuZ6GXhsINC6C3 3CQmPQOC9ypFzJV3cuaksOh/0qRJJMPztN0eawiD6Nxbj9 X-Google-Smtp-Source: AGHT+IFAeiNVCuRuFxrOTBMGX/B06Ycb/XWjiNYp1OXtmPtAGsFpz5UnI23CDyMY2wmlK3gee5nSfzFKdZYV7oqhHzo= X-Received: by 2002:a2e:ae11:0:b0:32a:8ae2:a8a7 with SMTP id 38308e7fff4ca-32cdc4820a0mr1400421fa.8.1750971220105; Thu, 26 Jun 2025 13:53:40 -0700 (PDT) MIME-Version: 1.0 References: <20250626083516.3596197-1-vitaly.wool@konsulko.se> <20250626083632.3596363-1-vitaly.wool@konsulko.se> In-Reply-To: <20250626083632.3596363-1-vitaly.wool@konsulko.se> From: Tamir Duberstein Date: Thu, 26 Jun 2025 13:53:03 -0700 X-Gm-Features: Ac12FXzCJObvxzPse24yMd5WH8K7cSo47qQtOjEJRK-wxx22oD_vk28dKv_9NQg Message-ID: Subject: Re: [PATCH v4 2/4] mm/slub: allow to set node and align in k[v]realloc To: Vitaly Wool 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 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 6873B100007 X-Rspam-User: X-Rspamd-Server: rspam06 X-Stat-Signature: 1un77qanfmrwsj7j59eknddwr68ja6qq X-HE-Tag: 1750971222-802555 X-HE-Meta: U2FsdGVkX1+N2bM33Y9zS+oy3bd/Zb6aykta/pOs3fUEacSL/4+7jw9Q+ah+p4u0UnM9WPhyX7Wg3K/yPue4Y9jRxBkbkdQDUrRSmZbK+PWcC1bqGOKpjTgC4OA33j8ajg+nwokJvKAMJu47r+ClZ1wZ5QEF83jJMvDuQSBbVlcoR4EGbJXMtJFPMxk65G0aIk4QkwcEh///xPqRfUOuuGO1w1eyWHDEu9enF6VcKpCAQZsKw/r871v4098jX7oHLSTlfwppRtF7x763zfOahwhvjyA/EONZZz053g5sXPlMuVS7o6w5pnIju60llo1p/hYsRfT5FXpvQUG87K4T5+RcuJ2RgEBhVmUutrpdReVbMIDt4ICUR9MNiD0zXDp0lKnEucZwUoOJxPvvLmUMZULFhZ2LFiMC/3p46xxAOPRJOCU8nfS/QuflbIze4ZgCGaGdddRKtoE5XUWHknqWbRKaLNXq2fJIBXIddOMzr3aRKMrUT0STnYxEAEehLlpJ5RGv13prgw+55rIW1jFSt1tm4M/CwWfsBtCO55Z5qoN6HabFiaAnKiaH5otpzIa5QZVtD+yz9oYjcWEeOnuKnb7E8mSHHIPL4TCsjuYdGQxqdGMJSaz/nTmNzHb2HjB6CsVWBExE1rb4ShFAAP9PNQF47qPjep1QLTqVgjlHO5BWJGr4tCYKhVYn9jsuNK5y7wIYwU9y7UI4QYQrZKiv+P07RVl4M6Ux+viVsKZcSOTs4uC3Kpe6FckIUAU/ElVGjdhNvDtrBI2ya202d+2yvbJI3c8tpTuHBi+IOV48LjJn8eBtDxhwKr359cYLkyBZ3UGFEzeukKltWfjIv37La53FtzDtRuQkbW9wflGZBJ2y8s68Tm05bZiobgVOPsWRZ17Xw9kjcx9/FXRL610tpp5f41ZbbT9lwUKBsF17BZnUfUXihCxPu5LilkOW1iW7qjFV0qRGWqcM0H6Dc5j fOntPvYE a4HvelfA1M9KRECW6yG/Vb/w80uenf3smf+d2JmdHCQgAGR6MlYv7uc9HIAFXhE6mDiaTFqRF/MRiwSqPLUt0b/J1LlLO/vwa7DU+qeumFbe5yGPsPyRoY6r53EuyCJaXFYO5rPFalYnybDYg07cSB3q4kRj9IBhoj/oygFDRQpzQ10/xyqxAhxmAoHrsvphjF5JLNBHGBH6TxrvUzVzzCm929nOgS2FIwkhmnLSYiOmiplB1xQcH/eglPvCL3QNsSgzjE5km0PwpCBiBDbGaPDmcFvFD2MKd34fZQA9ICa1ISZb5KOnwb0fHZJVz9Qe9XaMDW6mrffSwD9RHSsB/0pyzknKFCgAhbWZK 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 Thu, Jun 26, 2025 at 1:39=E2=80=AFAM Vitaly Wool wrote: > > Reimplement k[v]realloc() to be able to set node and alignment > should a user need to do so. Rename the respective functions to > k[v]realloc_node() to better match what they actually do now and > introduce macros for k[v]realloc() for backward compatibility. > > With that change we also provide the ability for the Rust part of > the kernel to set node and aligmnent in its K[v]xxx [re]allocations. > > Signed-off-by: Vitaly Wool Hi Vitaly, there is a typo in the subject line: it should be slab, not slub= . > --- > include/linux/slab.h | 12 ++++++++---- > mm/slub.c | 33 ++++++++++++++++++++++----------- > 2 files changed, 30 insertions(+), 15 deletions(-) > > diff --git a/include/linux/slab.h b/include/linux/slab.h > index d5a8ab98035c..119f100978c8 100644 > --- a/include/linux/slab.h > +++ b/include/linux/slab.h > @@ -465,9 +465,11 @@ 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_nopr= of(__VA_ARGS__)) > +void * __must_check krealloc_node_noprof(const void *objp, size_t new_si= ze, > + gfp_t flags, int nid) __realloc_= size(2); > +#define krealloc_node(...) alloc_hooks(krealloc_node_noprof(= __VA_ARGS__)) > +#define krealloc_noprof(o, s, f) krealloc_node_noprof(o, s, f, NUM= A_NO_NODE) > +#define krealloc(...) alloc_hooks(krealloc_noprof(__VA_= ARGS__)) > > void kfree(const void *objp); > void kfree_sensitive(const void *objp); > @@ -1073,8 +1075,10 @@ kvmalloc_array_node_noprof(size_t n, size_t size, = gfp_t flags, int node) > #define kvcalloc_node(...) alloc_hooks(kvcalloc_node= _noprof(__VA_ARGS__)) > #define kvcalloc(...) alloc_hooks(kvcalloc_nopr= of(__VA_ARGS__)) > > -void *kvrealloc_noprof(const void *p, size_t size, gfp_t flags) > +void *kvrealloc_node_noprof(const void *p, size_t size, gfp_t flags, int= nid) > __realloc_size(2); > +#define kvrealloc_node(...) alloc_hooks(kvrealloc_nod= e_noprof(__VA_ARGS__)) > +#define kvrealloc_noprof(p, s, f) kvrealloc_node_noprof(p, = s, f, NUMA_NO_NODE) > #define kvrealloc(...) alloc_hooks(kvrealloc_nop= rof(__VA_ARGS__)) > > extern void kvfree(const void *addr); > diff --git a/mm/slub.c b/mm/slub.c > index c4b64821e680..2d5150d075d5 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -4845,7 +4845,7 @@ void kfree(const void *object) > EXPORT_SYMBOL(kfree); > > 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, gfp_t flags, int nid) > { > void *ret; > size_t ks =3D 0; > @@ -4859,6 +4859,15 @@ __do_krealloc(const void *p, size_t new_size, gfp_= t flags) > if (!kasan_check_byte(p)) > return NULL; > > + /* > + * it is possible to support reallocation with a different nid, b= ut > + * it doesn't go well with the concept of krealloc(). Such > + * reallocation should be done explicitly instead. > + */ > + if (WARN(nid !=3D NUMA_NO_NODE && nid !=3D page_to_nid(virt_to_pa= ge(p)), > + "krealloc() has mismatched nids\n")) > + return NULL; > + > if (is_kfence_address(p)) { > ks =3D orig_size =3D kfence_ksize(p); > } else { > @@ -4903,7 +4912,7 @@ __do_krealloc(const void *p, size_t new_size, gfp_t= flags) > return (void *)p; > > alloc_new: > - ret =3D kmalloc_node_track_caller_noprof(new_size, flags, NUMA_NO= _NODE, _RET_IP_); > + ret =3D kmalloc_node_track_caller_noprof(new_size, flags, nid, _R= ET_IP_); > if (ret && p) { > /* Disable KASAN checks as the object's redzone is access= ed. */ > kasan_disable_current(); > @@ -4919,6 +4928,7 @@ __do_krealloc(const void *p, size_t new_size, gfp_t= flags) > * @p: object to reallocate memory for. > * @new_size: how many bytes of memory are required. > * @flags: the type of memory to allocate. > + * @nid: NUMA node or NUMA_NO_NODE > * > * If @p is %NULL, krealloc() behaves exactly like kmalloc(). If @new_s= ize > * is 0 and @p is not a %NULL pointer, the object pointed to is freed. > @@ -4947,7 +4957,7 @@ __do_krealloc(const void *p, size_t new_size, gfp_t= flags) > * > * Return: pointer to the allocated memory or %NULL in case of error > */ > -void *krealloc_noprof(const void *p, size_t new_size, gfp_t flags) > +void *krealloc_node_noprof(const void *p, size_t new_size, gfp_t flags, = int nid) > { > void *ret; > > @@ -4956,13 +4966,13 @@ void *krealloc_noprof(const void *p, size_t new_s= ize, gfp_t flags) > return ZERO_SIZE_PTR; > } > > - ret =3D __do_krealloc(p, new_size, flags); > + ret =3D __do_krealloc(p, new_size, flags, nid); > if (ret && kasan_reset_tag(p) !=3D kasan_reset_tag(ret)) > kfree(p); > > return ret; > } > -EXPORT_SYMBOL(krealloc_noprof); > +EXPORT_SYMBOL(krealloc_node_noprof); > > static gfp_t kmalloc_gfp_adjust(gfp_t flags, size_t size) > { > @@ -5079,10 +5089,11 @@ void kvfree_sensitive(const void *addr, size_t le= n) > EXPORT_SYMBOL(kvfree_sensitive); > > /** > - * kvrealloc - reallocate memory; contents remain unchanged > + * kvrealloc_node - reallocate memory; contents remain unchanged > * @p: object to reallocate memory for > * @size: the size to reallocate > * @flags: the flags for the page level allocator > + * @nid: NUMA node id > * > * If @p is %NULL, kvrealloc() behaves exactly like kvmalloc(). If @size= is 0 > * and @p is not a %NULL pointer, the object pointed to is freed. > @@ -5100,17 +5111,17 @@ EXPORT_SYMBOL(kvfree_sensitive); > * > * Return: pointer to the allocated memory or %NULL in case of error > */ > -void *kvrealloc_noprof(const void *p, size_t size, gfp_t flags) > +void *kvrealloc_node_noprof(const void *p, size_t size, gfp_t flags, int= nid) > { > void *n; > > if (is_vmalloc_addr(p)) > - return vrealloc_noprof(p, size, flags); > + return vrealloc_node_noprof(p, size, 1, flags, nid); > > - n =3D krealloc_noprof(p, size, kmalloc_gfp_adjust(flags, size)); > + n =3D krealloc_node_noprof(p, size, kmalloc_gfp_adjust(flags, siz= e), nid); > if (!n) { > /* We failed to krealloc(), fall back to kvmalloc(). */ > - n =3D kvmalloc_noprof(size, flags); > + n =3D kvmalloc_node_noprof(size, flags, nid); > if (!n) > return NULL; > > @@ -5126,7 +5137,7 @@ void *kvrealloc_noprof(const void *p, size_t size, = gfp_t flags) > > return n; > } > -EXPORT_SYMBOL(kvrealloc_noprof); > +EXPORT_SYMBOL(kvrealloc_node_noprof); > > struct detached_freelist { > struct slab *slab; > -- > 2.39.2 > >