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 94006C8302F for ; Tue, 1 Jul 2025 11:22:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1342D6B00A7; Tue, 1 Jul 2025 07:22:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0E5066B00A9; Tue, 1 Jul 2025 07:22:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F15AF6B00AA; Tue, 1 Jul 2025 07:22:08 -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 DCAEE6B00A7 for ; Tue, 1 Jul 2025 07:22:08 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id B8601803FD for ; Tue, 1 Jul 2025 11:22:07 +0000 (UTC) X-FDA: 83615456694.30.8F4A52C Received: from mailrelay-egress12.pub.mailoutpod2-cph3.one.com (mailrelay-egress12.pub.mailoutpod2-cph3.one.com [46.30.211.187]) by imf10.hostedemail.com (Postfix) with ESMTP id DB757C0002 for ; Tue, 1 Jul 2025 11:22:05 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=GHxdOp1T; dkim=pass header.d=konsulko.se header.s=ed1 header.b=73Ubm0CM ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751368926; 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=ype0RXWkZlnpbFqpY1x56iV2OcirmQognCCOHtgnUhY=; b=Lbv70zj/c0g4CzngsOxlOdactbPGXEA5WcpiNp/Frjfmytnhmeg/lZum1UsUIWJ15iqtxq a6V+WoubooNFKP3ICmC9Cb8e3BZ5cE6kFRhZvgOe5ARZ3hu0OW9bj/4d+GS86BwhQLBsUl hdGOHDpsktWHgyvUjdTJ1pj3VnqRk7w= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=GHxdOp1T; dkim=pass header.d=konsulko.se header.s=ed1 header.b=73Ubm0CM; spf=none (imf10.hostedemail.com: domain of vitaly.wool@konsulko.se has no SPF policy when checking 46.30.211.187) smtp.mailfrom=vitaly.wool@konsulko.se; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751368926; a=rsa-sha256; cv=none; b=PBysLSENMqc7YIhn2vb1LdcvXU+PlmytY7ssRTMfOtsNZcxnp/4aC/FgLgkoq2iywiC5pm cVrux0GKuMcaRvVpYerCK1oVXh4KdWjrzD2+2pnMzZ5zgEEo45twf3A1RlPAKRto3fVfQr +jB+xZUjkTHjsVo7C8m0JK24/mNksAA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1751368924; x=1751973724; 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=ype0RXWkZlnpbFqpY1x56iV2OcirmQognCCOHtgnUhY=; b=GHxdOp1TQlnXScmmzp9jCJc+kUqZv8KWDtOOa8f44GFfzle2p3QZEHUju9yxNev7hnVG9JPA8vYbQ T70J26mZRkaJy+wV2Yqe5BJG3vZbVXpRdvHpKHee/p1KS2DZj+qZoLmG4H4a+Hz0s3rs/TYMU5sUEI mqhC/EmtTUz0FvXE9YCpLbqUOxi3FGUV4soren1gozCLplXkGVzv6NQJNgeSjqn+P4/JpvcNxK5H6/ NgM+2UzDHIGHhvjhSUMyVRwn/zukSjgItKo5dhkKVcAASklzQvgCkER2eORkdaLPSviLO1GEnzLxOK x8XJcOFMWUjl1trcsECQCNpwiZSod+g== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1751368924; x=1751973724; 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=ype0RXWkZlnpbFqpY1x56iV2OcirmQognCCOHtgnUhY=; b=73Ubm0CMpwm1Mu67KoqKjyrZpyKh+6Sb1jL5TC9Dhm9KAGTWm5AFOQkUqy/8/Y2IVApvr5GPsPb4e ipLNslWCw== X-HalOne-ID: 9ceca3db-566d-11f0-b5ef-f78b1f841584 Received: from smtpclient.apple (c188-150-224-8.bredband.tele2.se [188.150.224.8]) by mailrelay1.pub.mailoutpod2-cph3.one.com (Halon) with ESMTPSA id 9ceca3db-566d-11f0-b5ef-f78b1f841584; Tue, 01 Jul 2025 11:22:03 +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 v9 1/4] mm/vmalloc: allow to set node and align in vrealloc From: Vitaly Wool In-Reply-To: Date: Tue, 1 Jul 2025 13:21:53 +0200 Cc: linux-mm@kvack.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, Danilo Krummrich , Alice Ryhl , rust-for-linux@vger.kernel.org Content-Transfer-Encoding: quoted-printable Message-Id: <190A8A7B-A46B-4073-8EFC-14A0EB6EF3DC@konsulko.se> References: <20250630221511.3325123-1-vitaly.wool@konsulko.se> <20250630221615.3325221-1-vitaly.wool@konsulko.se> <31E257E1-AB52-4115-A264-56F545AB84A9@konsulko.se> To: Uladzislau Rezki X-Mailer: Apple Mail (2.3826.200.121) X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: DB757C0002 X-Stat-Signature: 73qhmip4zpk9obgne1y6wwu4crsmcdc6 X-HE-Tag: 1751368925-964892 X-HE-Meta: U2FsdGVkX18AhESYHJBbr+f+CG7u7XKjJGyc7ZKCyLHmgDFtUuMrNugLxZ67jN4UwPQkzX/ncElLALduDakWvnf4p+fwRc8CV1A0BUxFm04gcb3q6/ab7i4jd9OkM3aid2eCbxMvJFco/OLcVIL+pCDfEl1CMlcQBypHbHzeJ57x8io58RKeY76SmMmzLxlKEHvU3x5ZKG/MTC1pCZvMJH+19iIWMpcoKPB86IzbNctrdPOhjRjChsCsLrqvcBCpVpNXHr6OV/afjyIStFxJ74ZlNJ53eaQ9yeeHP2d262himgVjQauuRYzQqvg2jMf9W18hibivyFc04sqm0VWOyYnETpK04lR5h10mLrnpj3IwFyBqZEh8U4CZYBarNl2KlhGHxzgCZit/trWe6LdWd6FqHk+KWyT7zyJY+DMmUZTkBDgDsUBKMPbHokaUltycRI0lzCxWx5ZBKVBYzCBSWzqtWGagpGWNGaoilqu5gWesS9Jf360Xr6IYHYh+t+Je6AQqu8hsclmd4mJD9ZNBkX48kochw57aDOpASlK1/xMUNC3pkFUPnxjzwRMDbl0TpJfgbxtcKvgb8IIw2wQ6QOhm6Er+b4GasiZbaLI1T0Ff2s0VZRQixm4L9rs6ujoK9uh7g7/L478zNK2UF1kA0EuSpFHtmzSt3NlgaSIs3eTzzVMvxD6PSJnoE33la9pskA+Ob+qcASoNjsNi/o8KULqDKMv5imrj6JP1kRr9zOrPOrDnASDR0ryPJgPcVW7eIzXaUC9xTSNRjKZg7F44aGYlkfWJRNIReTPWNtNIbZ/9P7s2CXy2AgA1I1mXv5I2Hn4AxJCNbCr+GvfhcfbXNulbppXluYv3+gdMANZJgR2epLVq2HAjuKX1Vb2evehvgGCnJfFrOzCvLA3GuCH+2iOc8J8WV3tv1CMZU5Ma3+MCufc+i2EsyOH4k2dBHNYJOugZ+m9OgRisIA8b5ql W3xbLumW eydES6PX7g7vooYLnMb/pKiwXtUvm/W1ahcPwMHv1e81nc416qhoZjslT9agC4HxxDNw5wCSh+1emxjKQMMLreseLVlgncooxO61TW/jEV1jaA816htF0oJeL0n910gQP/fCBs82lYPyXl27XQlm3VTkB6SqVlyFd1YgkSZKJjvdFyLyrjrg4cHXh3Xc2GF2MAzeZGIqiTksRx1HMTDmokjP0cHXKfz0slauU44ario6v1QNbGlgXAilqM4829eLXCR8/NDEDdDZN8Z72IA3uEbSQBoYi4Oa0u0Qd 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 1, 2025, at 1:16=E2=80=AFPM, Uladzislau Rezki = wrote: >=20 > On Tue, Jul 01, 2025 at 12:54:36PM +0200, Vitaly Wool wrote: >>=20 >>=20 >>> On Jul 1, 2025, at 12:50=E2=80=AFPM, Uladzislau Rezki = wrote: >>>=20 >>> On Tue, Jul 01, 2025 at 12:16:15AM +0200, Vitaly Wool wrote: >>>> Reimplement vrealloc() to be able to set node and alignment should >>>> a user need to do so. Rename the function to vrealloc_node_align() >>>> to better match what it actually does now and introduce macros for >>>> vrealloc() and friends for backward compatibility. >>>>=20 >>>> With that change we also provide the ability for the Rust part of >>>> the kernel to set node and aligmnent in its allocations. >>>>=20 >>>> Signed-off-by: Vitaly Wool >>>> --- >>>> include/linux/vmalloc.h | 12 +++++++++--- >>>> mm/vmalloc.c | 19 +++++++++++++++---- >>>> 2 files changed, 24 insertions(+), 7 deletions(-) >>>>=20 >>>> diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h >>>> index fdc9aeb74a44..68791f7cb3ba 100644 >>>> --- a/include/linux/vmalloc.h >>>> +++ b/include/linux/vmalloc.h >>>> @@ -197,9 +197,15 @@ extern void *__vcalloc_noprof(size_t n, size_t = size, gfp_t flags) __alloc_size(1 >>>> extern void *vcalloc_noprof(size_t n, size_t size) __alloc_size(1, = 2); >>>> #define vcalloc(...) alloc_hooks(vcalloc_noprof(__VA_ARGS__)) >>>>=20 >>>> -void * __must_check vrealloc_noprof(const void *p, size_t size, = gfp_t flags) >>>> - __realloc_size(2); >>>> -#define vrealloc(...) alloc_hooks(vrealloc_noprof(__VA_ARGS__)) >>>> +void *__must_check vrealloc_node_align_noprof(const void *p, = size_t size, >>>> + unsigned long align, gfp_t flags, int nid) __realloc_size(2); >>>> +#define vrealloc_node_noprof(_p, _s, _f, _nid) \ >>>> + vrealloc_node_align_noprof(_p, _s, 1, _f, _nid) >>>> +#define vrealloc_noprof(_p, _s, _f) \ >>>> + vrealloc_node_align_noprof(_p, _s, 1, _f, NUMA_NO_NODE) >>>> +#define vrealloc_node_align(...) = alloc_hooks(vrealloc_node_align_noprof(__VA_ARGS__)) >>>> +#define vrealloc_node(...) = alloc_hooks(vrealloc_node_noprof(__VA_ARGS__)) >>>> +#define vrealloc(...) alloc_hooks(vrealloc_noprof(__VA_ARGS__)) >>>>=20 >>>> extern void vfree(const void *addr); >>>> extern void vfree_atomic(const void *addr); >>>> diff --git a/mm/vmalloc.c b/mm/vmalloc.c >>>> index 6dbcdceecae1..776c68f84ce2 100644 >>>> --- a/mm/vmalloc.c >>>> +++ b/mm/vmalloc.c >>>> @@ -4089,12 +4089,15 @@ void *vzalloc_node_noprof(unsigned long = size, int node) >>>> EXPORT_SYMBOL(vzalloc_node_noprof); >>>>=20 >>>> /** >>>> - * vrealloc - reallocate virtually contiguous memory; contents = remain unchanged >>>> + * vrealloc_node_align_noprof - reallocate virtually contiguous = memory; contents >>>> + * remain unchanged >>>> * @p: object to reallocate memory for >>>> * @size: the size to reallocate >>>> + * @align: requested alignment >>>> * @flags: the flags for the page level allocator >>>> + * @nid: node id >>>> * >>>> - * If @p is %NULL, vrealloc() behaves exactly like vmalloc(). If = @size is 0 and >>>> + * If @p is %NULL, vrealloc_XXX() behaves exactly like vmalloc(). = If @size is 0 and >>>> * @p is not a %NULL pointer, the object pointed to is freed. >>>> * >>>> * If __GFP_ZERO logic is requested, callers must ensure that, = starting with the >>>> @@ -4111,7 +4114,8 @@ EXPORT_SYMBOL(vzalloc_node_noprof); >>>> * Return: pointer to the allocated memory; %NULL if @size is zero = or in case of >>>> * failure >>>> */ >>>> -void *vrealloc_noprof(const void *p, size_t size, gfp_t flags) >>>> +void *vrealloc_node_align_noprof(const void *p, size_t size, = unsigned long align, >>>> + gfp_t flags, int nid) >>>> { >>>> struct vm_struct *vm =3D NULL; >>>> size_t alloced_size =3D 0; >>>> @@ -4135,6 +4139,11 @@ void *vrealloc_noprof(const void *p, size_t = size, gfp_t flags) >>>> if (WARN(alloced_size < old_size, >>>> "vrealloc() has mismatched area vs requested sizes (%p)\n", p)) >>>> return NULL; >>>> + if (WARN(!IS_ALIGNED((unsigned long)p, align), >>>> + "will not reallocate with a bigger alignment (0x%lx)\n", align)) >>>> + return NULL; >>>> + if (nid !=3D NUMA_NO_NODE && nid !=3D = page_to_nid(vmalloc_to_page(p))) >>>> + goto need_realloc; >>>>=20 >>> By this goto change, you bypass the two important checks below. For >>> example if you shrink the allocated size, you do not need to perform >>> any allocations. Instead the patch goes and allocates a new area. >>>=20 >>> You just need to remove: >>>=20 >>> - if (nid !=3D NUMA_NO_NODE && nid !=3D = page_to_nid(vmalloc_to_page(p))) >>> - goto need_realloc; >>>=20 >>> to make it working. >>>=20 >>=20 >> I am not sure I=E2=80=99m following. If we get a request to = reallocate for a different node then we should either reject it or do = the new allocation for this new node and copy the data to the new place. = Shrinking the allocation on the old node doesn=E2=80=99t seem to be = right. Or am I missing something? >>=20 > If your process migrates to a new NODE, which is fine, it does not = mean > that you have to perform all this bouncing movement(reallocate on a = new node). > Next time it can be migrated back. Process are allowed to migrate and = access > to a remote memory. >=20 Indeed, but in that case the caller is expected to specify NUMA_NO_NODE = in vrealloc_node_align(). If the caller did specify an exact node we = can=E2=80=99t just silently disregard that, we should either respect = that or fail. ~Vitaly