From patchwork Wed Jul 17 22:24:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Danilo Krummrich X-Patchwork-Id: 13735867 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 A029DC3DA5D for ; Wed, 17 Jul 2024 22:25:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2427B6B00A8; Wed, 17 Jul 2024 18:25:34 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1F2A66B00B6; Wed, 17 Jul 2024 18:25:34 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0932D6B00B8; Wed, 17 Jul 2024 18:25:34 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id DEC606B00B6 for ; Wed, 17 Jul 2024 18:25:33 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 5E9D780CA2 for ; Wed, 17 Jul 2024 22:25:33 +0000 (UTC) X-FDA: 82350677346.18.146BA86 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf13.hostedemail.com (Postfix) with ESMTP id 23F0720028 for ; Wed, 17 Jul 2024 22:25:30 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=mMdu6Px9; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf13.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1721255086; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+tmN+7huRBZwtjtCb2iu946Hq1PJVgyuDl+Alo90jZA=; b=PoYfVC7xDvBVAgDfX6UkM2ISJx7p/twSnmJG3h90XA4m15LobE0q9RvO9zY7eB8bJsH/6f vXidAWdEb1QT6v4rpn9Mo56fiK6+VfUwDXG4qLqLMxD+1U62ygPjlsCfL3a9NUQaLCc335 pXkpvjGHSc2Su/5rfenUSlMGorJp7IU= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1721255086; a=rsa-sha256; cv=none; b=w37z4oR+mt7KXXlnu59gbb1P7i3KiPJvv0A00DUTVlwlxHqF0zyT9lxQbb8qmWxJFBJB4I gMqafjkHWJqqY5loDiXC2L+dsgWF9yIZqcsoiwghae5QjR/QqsWOihTtM5MZkX8g6wPN6Y Jjl8ITbYNTqM1X61H9mlaj9j7CxLpR4= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=mMdu6Px9; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf13.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id C14AACE1874; Wed, 17 Jul 2024 22:25:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDF41C2BD10; Wed, 17 Jul 2024 22:25:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1721255126; bh=tXaAq6dQU0DYi9kqEOhCwnRJo8WINgtfsOO12DLQp/M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mMdu6Px9696h6a8IIIg+uuDYZ+vEQr1pGnPPwtF0lQLYRAYhTXlLJOoW0DYmJJvvN moaMm+DS2g/0CQ2kGqQ2NXanXuFNoEzPrdI76Xm71x/mBW14OxbdVJFcps8FNwPSCU zLovJ+77wkGbLSB7G+Myp51+g3b5DsDmngzwo2kIy8hI3xZlGlx7G3sac3A0yGz64x r+DvvOm6Jk/Q0azeEiCwfBil5E84SuVBqFI9/cVeDjvYBMCkqajYnzUH5GpqoHHNVX tIo7fYDQzBPnaE/KYK6mSQAvA8yqYx0pGFcsHg8U/xSFIvrrGTPBZpA6Qp4OsmB0qR RECBeGKGKEi5Q== From: Danilo Krummrich To: cl@linux.com, penberg@kernel.org, rientjes@google.com, iamjoonsoo.kim@lge.com, akpm@linux-foundation.org, vbabka@suse.cz, roman.gushchin@linux.dev, 42.hyeyoo@gmail.com, urezki@gmail.com, hch@infradead.org, kees@kernel.org, ojeda@kernel.org, wedsonaf@gmail.com, mhocko@kernel.org, mpe@ellerman.id.au, chandan.babu@oracle.com, christian.koenig@amd.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, rust-for-linux@vger.kernel.org, Danilo Krummrich Subject: [PATCH 1/2] mm: vmalloc: implement vrealloc() Date: Thu, 18 Jul 2024 00:24:01 +0200 Message-ID: <20240717222427.2211-2-dakr@kernel.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240717222427.2211-1-dakr@kernel.org> References: <20240717222427.2211-1-dakr@kernel.org> MIME-Version: 1.0 X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 23F0720028 X-Stat-Signature: 5ixo5e53jzp3mjm88bo7jzz63fy7ypd3 X-Rspam-User: X-HE-Tag: 1721255130-561150 X-HE-Meta: U2FsdGVkX193hHMp/v5axF9CiAU/ZLIFIML5AWlDoWA/eskeiW308wutZwH76T37ce3+p8CUZKXOaSdrIfrsxxkiLpj0V7mCRqM09bNa+wSFX4Hr7xSjLAMoH5Kne3PuARV6ykFzjD6nMZs4FrZQBDfQtMJhsS3m2RQEep2TcwJibimPETnIS0+MMseMZw+zvMIDz36rzRIBNtxOjByYr/4sPY7K+TmpUJ6UoF+ROJfuhxDfrJlBg5+FjIg0Trd1mJ098X2L4cL47aGaUzYC++/txNzYQgyHzN3OCmvscqDdqai6mKEAdIWDorXyn3E7N9PqRWASateXP3BLAHXA4edpPrVeisJKODetrWuT6vcgCAPVU0m57MSP8GeKhqZxnboqQLFvqLGFxVyP+3LW6Dr9LbAaSTY/HmVG85DI/Il5lYZG5Zk3r6YbQn4XNpufUBFhxZtU0yLrov+VdjFWx1R3U/KcAvVMbi0aL3JqMnKVWmNUHpRazDYsW3bEjJZIpBfKdMb8vhZYjpm8tIFvwDFB0Pv2qFTfQzONlUhsm8cTKGoG5wUh6V+jRRvMtxBVAHNvVRz8X6xb9+FRwN1qkI9g7Awt0dEpKrS3tu46dHgF/Ad0UJ3Rnpno+0YgKkXea1B09gMtFNAZLaDHM5miefW/mVBrkyLGbNCarcn/FsnQ1twhdZ4SuIvsCI6mTELhC+IGxOR+HkYtq9zuIAdzdYsaDKMnQfxnh/PTLrifgZO9nLU2YdGrYfUxbk812KcHYrrz6fcLRhffT6DJkABHMhggzYXu1nXWDVHhVZzlX3373eGorYb+dPf1y3Pibvr/zJnzpVmSVz2u4BRd1hUchYn78NTrRYc65rBa+2kjMtwp/nARzAnyHyw3yr+3H0Nj/bmd4ItmI0tSqaFL7jTpljAxBywEIhkF7TlbaH9Z2Ybu1S+/OxqITIuonX5ewh3FcIX72hmb9zvIzaR+vkx O6FCqdb0 uR1fcKoIOyDYT0o2mlOBZtPhiHlSMH5EEDwNgH9z2BeSexXANqwhJCepkeh3j96qStK1j+hNlPHwY38Yd71vRmMz7Uo/fTKRVKuI/N5rbCa9Gn7b+DX55uf2QcFgilYv+G9/XgBPvDULS4ZvVoEr5ntndEBhlx63eyx19B+RZEXF2EFAN/cDEwUtvNvp2OQ+mKEjwKaZ91rOx65m00KhIse2+2ha8LDcTGvC434XfR4pgEBgIocdHzArqTxFhvAA7ncOOBartauLhWHJB+H96ms19JQdWnHEt5TeBe9EwsCTnLKOwR8bI0JIoFA== 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: Implement vrealloc() analogous to krealloc(). Currently, krealloc() requires the caller to pass the size of the previous memory allocation, which, instead, should be self-contained. We attempt to fix this in a subsequent patch which, in order to do so, requires vrealloc(). Besides that, we need realloc() functions for kernel allocators in Rust too. With `Vec` or `KVec` respectively, potentially growing (and shrinking) data structures are rather common. Signed-off-by: Danilo Krummrich --- include/linux/vmalloc.h | 4 +++ mm/vmalloc.c | 58 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index e4a631ec430b..9ff0a8e5c323 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -189,6 +189,10 @@ 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__)) +extern 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__)) + extern void vfree(const void *addr); extern void vfree_atomic(const void *addr); diff --git a/mm/vmalloc.c b/mm/vmalloc.c index e34ea860153f..4ec949ac9d9d 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -4036,6 +4036,64 @@ void *vzalloc_node_noprof(unsigned long size, int node) } EXPORT_SYMBOL(vzalloc_node_noprof); +/** + * vrealloc - reallocate virtually contiguous memory; contents remain unchanged + * @p: object to reallocate memory for + * @size: the size to reallocate + * @flags: the flags for the page level allocator + * + * The contents of the object pointed to are preserved up to the lesser of the + * new and old size (__GFP_ZERO flag is effectively ignored). + * + * If @p is %NULL, vrealloc() behaves exactly like vmalloc(). If @size is 0 and + * @p is not a %NULL pointer, the object pointed to is freed. + * + * 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) +{ + size_t old_size = 0; + void *n; + + if (!size) { + vfree(p); + return NULL; + } + + if (p) { + struct vm_struct *vm; + + vm = find_vm_area(p); + if (unlikely(!vm)) { + WARN(1, "Trying to vrealloc() nonexistent vm area (%p)\n", p); + return NULL; + } + + old_size = get_vm_area_size(vm); + } + + if (size <= old_size) { + /* TODO: Can we optimize and shrink the allocation? What would + * be a good metric for when to shrink the vm_area? + */ + return (void *)p; + } + + /* TODO: Can we optimize and extend the existing allocation if we have + * enough contiguous space left in the virtual address space? + */ + n = __vmalloc_noprof(size, flags); + + if (p) { + memcpy(n, p, old_size); + vfree(p); + } + + return n; +} +EXPORT_SYMBOL(vrealloc_noprof); + #if defined(CONFIG_64BIT) && defined(CONFIG_ZONE_DMA32) #define GFP_VMALLOC32 (GFP_DMA32 | GFP_KERNEL) #elif defined(CONFIG_64BIT) && defined(CONFIG_ZONE_DMA)