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 492CAC3DA7F for ; Mon, 5 Aug 2024 15:20:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D44966B009B; Mon, 5 Aug 2024 11:20:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CF4966B009C; Mon, 5 Aug 2024 11:20:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BE3266B009D; Mon, 5 Aug 2024 11:20: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 A178B6B009B for ; Mon, 5 Aug 2024 11:20:58 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 48774141CDB for ; Mon, 5 Aug 2024 15:20:58 +0000 (UTC) X-FDA: 82418554596.06.7D03F9D Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf28.hostedemail.com (Postfix) with ESMTP id 08EA0C0020 for ; Mon, 5 Aug 2024 15:20:55 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=GJAyHZFL; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf28.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=1722871188; 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=U1xTY9rjR9QlOfwvr690HS+T8JAy2CA/mTv5J1WCnXU=; b=nioRkAQospT03IKiQp0rICOKUwkAO26BDr0fZpHWm9j+BMo6R77Z9YRKJT9KcfkAr4eBpF eQgf/WMffNzA8qFBIEadcHje9aGaEg/j9jnJfuVEILyRCVEY88qXq2MQQyQ1/NnzJpY3yk RkxLeoVk+CuBm2MKb21RF++52OSySPw= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1722871188; a=rsa-sha256; cv=none; b=JjBA7XQUVSWpBLLK/73UR6qybWkNaR8zFpxOcnxKgtl/LWdgxe9CEapkfdFuznDQG3W1Nn ZLJwrFshu97MBrTjWKPdyeQVUTLfyVmXX/abe11VxFAFXhgcyAt996zXkuXwycGg4qEj+Q tTBgYxLugVxj4mPwMcJPJX1rMN/f+cY= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=GJAyHZFL; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf28.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 E8502CE0B2C; Mon, 5 Aug 2024 15:20:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13970C4AF0B; Mon, 5 Aug 2024 15:20:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722871252; bh=4X9wSdLX4mWoeYIrAd5wlz1K/X7N03r6vTnYVQGkAO4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GJAyHZFLBa7Fe6Up0rMI4tOEodUpG6ICWZsYB2kS9icTwHsv0wtG66ktGFCoOjyxY pXCRPWZeor7R6vBE9LRo5MJNRiM4BLH8xXJI0PIBnIyvPd/YHQmtjyKZ9m/jKa8bTL VZd48fllVOFNugpuOyQOJWmnk7hjLZQPVN0ha/0JFtJrb6oF/A0kXmCcBG17FIZtWn 1xTk0MDC4qqfztXrPzUFAVOzBguUtCZHmg1pKUEEQCZqyIslqywKAbJ2MBEq+2ZAFG ZKjqokDjnAsjTlUD/6tbLaa5ffRzlKIlpoxxiV/EsMBdEOW2q5N3RO8OhT02M4Fvay jHkfPN2IYfWaQ== From: Danilo Krummrich To: ojeda@kernel.org, alex.gaynor@gmail.com, wedsonaf@gmail.com, boqun.feng@gmail.com, gary@garyguo.net, bjorn3_gh@protonmail.com, benno.lossin@proton.me, a.hindborg@samsung.com, aliceryhl@google.com, akpm@linux-foundation.org Cc: daniel.almeida@collabora.com, faith.ekstrand@collabora.com, boris.brezillon@collabora.com, lina@asahilina.net, mcanal@igalia.com, zhiw@nvidia.com, acurrid@nvidia.com, cjia@nvidia.com, jhubbard@nvidia.com, airlied@redhat.com, ajanulgu@redhat.com, lyude@redhat.com, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-mm@kvack.org, Danilo Krummrich Subject: [PATCH v4 07/28] rust: alloc: implement `KVmalloc` allocator Date: Mon, 5 Aug 2024 17:19:26 +0200 Message-ID: <20240805152004.5039-8-dakr@kernel.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240805152004.5039-1-dakr@kernel.org> References: <20240805152004.5039-1-dakr@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 08EA0C0020 X-Stat-Signature: yyjippfium8t614ph7iiiygjnwtabkmc X-Rspam-User: X-HE-Tag: 1722871255-437964 X-HE-Meta: U2FsdGVkX1++AZmJHhvCRzyV+K2hAJ4D5jfhwXbLJRcJO2CLlKofdz+8jT4HPuIgkZRP0LRw9xJCRLthiar4DwP/1FISqpORRlInSkqGMV+Gl9qT2AVzRmExI1vq5iqNMSC8F73lLIwAmNzOCBHENlw6OtE9Nlbe3mdpNWsq/zIBsR6mYF3HiUa6x3SLUSxutC5PM/13cF/uE2oShyF0kHFsO2AZEIFldewj5/KLLLYWsajfkBbASFSUokx/3bizdax7yjurZi6L9aIJeYgsGJ+Zo0UOB1NlO1IH3KekUDU0J45ujhAsM5W8YIhjAW/eFdDXUEY/HHyi0Luxsf4MOmVkghXR+0PoXqheUzBIZdY0aUfLni/HcqgFVRUwxEPELjyXRe9oPjRK3Q81EcC21hoqhbXAqtmQzmFbPEqYxX4NcbMifAfCxJsD8R67wiupXbiiF/oUOpwFYDZ88+4/Zwz4x8PR40aD7L1IBJtZADWFMyNEqnX0Gfiv/e4IuG82tFJYL9uJJirQtok9kdk47ZAn2MmgQlutBN7ZB8MhL0JhtYLon6MvBd7ICD7EdXXIsRHlY8//WyCrpQRB35P0EcKUT685PiLgDJeh2SOU6wSEekkOvEcY1TJRd4fhYSJImYte9mtKjDwbqwTJtDPg3JHHGvI3BJ5MbnyHAfwHrIcoKhEo5t+75Og7iotA6ELA5pQIWid4fuknaZL9HG8ApkWsWTEElGORQ4R+EPsbXI2MkcWJ0imS8b8hyODC89CaaAEEwkGga35yRPySdArrcbnhUfrHETfxnhKQIGYd9c/Z/adONaLfDWKJMpPSqgIkdPAyIqXJan7X/OBnJF+VPEzQWmEreuncEqQwVK8JIF7IcTHkz62ftBOkVtj5hgFianBXpirXlylOmKkx4ozHQrcB14rDGP4vDTjm9pppiS3XKV30okHDXi1S8e6P/sqyShCZHd3f/I3eBTqNxPW 2Is8XzeC 44wLuwd+ShcmQugmP7H3hYTXPkMi/HJQs39EoAdne6YwYJQJtov4LIuNZyqQnuPLT5ldvNMyOkJJ17IzCjIJHPFuNBIzAWbCKgs5tleQ5uRmY9B8x46d4GUZD+tX4/WngrT9G/VW265v/kvJiVCC6MGwUE9SGVN/8fhkch7BpjdBpHZf8o5QLUVIGVswT+/GKjJIrFBvu+hWBHzVUzOL4bq/Jlmk2Zc9udhMhtlNCzp4xOpSMMMjJ9YhoWzgpT+xqj2k6AMzffB6w5EW5LU9wvfQi+SlL78g79G6/orrUxehi/2s9QfkrKQwfwo2zUaHN57DZ5SgcvPMqZ80= 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 `Allocator` for `KVmalloc`, an `Allocator` that tries to allocate memory wth `kmalloc` first and, on failure, falls back to `vmalloc`. All memory allocations made with `KVmalloc` end up in `kvrealloc_noprof()`; all frees in `kvfree()`. Reviewed-by: Alice Ryhl Signed-off-by: Danilo Krummrich --- rust/helpers.c | 6 ++++++ rust/kernel/alloc/allocator.rs | 31 +++++++++++++++++++++++++++++ rust/kernel/alloc/allocator_test.rs | 1 + 3 files changed, 38 insertions(+) diff --git a/rust/helpers.c b/rust/helpers.c index 7406943f887d..3285a85765ff 100644 --- a/rust/helpers.c +++ b/rust/helpers.c @@ -206,6 +206,12 @@ void *rust_helper_vrealloc(const void *p, size_t size, gfp_t flags) } EXPORT_SYMBOL_GPL(rust_helper_vrealloc); +void *rust_helper_kvrealloc(const void *p, size_t size, gfp_t flags) +{ + return kvrealloc(p, size, flags); +} +EXPORT_SYMBOL_GPL(rust_helper_kvrealloc); + /* * `bindgen` binds the C `size_t` type as the Rust `usize` type, so we can * use it in contexts where Rust expects a `usize` like slice (array) indices. diff --git a/rust/kernel/alloc/allocator.rs b/rust/kernel/alloc/allocator.rs index bb55895cbd03..91ff21372a8f 100644 --- a/rust/kernel/alloc/allocator.rs +++ b/rust/kernel/alloc/allocator.rs @@ -23,6 +23,12 @@ /// contiguous kernel virtual space. pub struct Vmalloc; +/// The kvmalloc kernel allocator. +/// +/// Attempt to allocate physically contiguous memory, but upon failure, fall back to non-contiguous +/// (vmalloc) allocation. +pub struct KVmalloc; + /// Returns a proper size to alloc a new object aligned to `new_layout`'s alignment. fn aligned_size(new_layout: Layout) -> usize { // Customized layouts from `Layout::from_size_align()` can have size < align, so pad first. @@ -73,6 +79,11 @@ fn vrealloc() -> Self { Self(bindings::vrealloc) } + // INVARIANT: `vrealloc` satisfies the type invariants. + fn kvrealloc() -> Self { + Self(bindings::kvrealloc) + } + /// # Safety /// /// This method has the exact same safety requirements as `Allocator::realloc`. @@ -173,6 +184,26 @@ unsafe fn realloc( } } +unsafe impl Allocator for KVmalloc { + unsafe fn realloc( + ptr: Option>, + layout: Layout, + flags: Flags, + ) -> Result, AllocError> { + let realloc = ReallocFunc::kvrealloc(); + + // TODO: Support alignments larger than PAGE_SIZE. + if layout.align() > bindings::PAGE_SIZE { + pr_warn!("KVmalloc does not support alignments larger than PAGE_SIZE yet.\n"); + return Err(AllocError); + } + + // SAFETY: If not `None`, `ptr` is guaranteed to point to valid memory, which was previously + // allocated with this `Allocator`. + unsafe { realloc.call(ptr, layout, flags) } + } +} + #[global_allocator] static ALLOCATOR: Kmalloc = Kmalloc; diff --git a/rust/kernel/alloc/allocator_test.rs b/rust/kernel/alloc/allocator_test.rs index e7bf2982f68f..1b2642c547ec 100644 --- a/rust/kernel/alloc/allocator_test.rs +++ b/rust/kernel/alloc/allocator_test.rs @@ -8,6 +8,7 @@ pub struct Kmalloc; pub type Vmalloc = Kmalloc; +pub type KVmalloc = Kmalloc; unsafe impl Allocator for Kmalloc { unsafe fn realloc( -- 2.45.2