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 DB8B2C52D7F for ; Fri, 16 Aug 2024 00:12:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5E18C8D0014; Thu, 15 Aug 2024 20:12:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 591E58D0002; Thu, 15 Aug 2024 20:12:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 432848D0014; Thu, 15 Aug 2024 20:12:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 2636E8D0002 for ; Thu, 15 Aug 2024 20:12:52 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id D87ECA886D for ; Fri, 16 Aug 2024 00:12:51 +0000 (UTC) X-FDA: 82456182942.16.CC4891D Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf18.hostedemail.com (Postfix) with ESMTP id 93AFD1C0019 for ; Fri, 16 Aug 2024 00:12:49 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="t/wdDl6u"; spf=pass (imf18.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1723767134; 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=CjoFBg6FjyKuFUDXBdN8jKXJtYkPUu1fNu2pQTTGwLQ=; b=NVcgVz8DPOZiYP+QXxYSpp/U+juey0ILoGTL7/XPfzDuflR6iWEudbMyjadqK1KO+bTSFP STt0XIxMkBLwNpB1HKtxRZSclP6XXc+rKqZUMdHpFn70L79LBI0LIJR6BficP0m2L7zeen hv/BdtvWhSppEdgKD7QloRc1lt2D4L0= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="t/wdDl6u"; spf=pass (imf18.hostedemail.com: domain of dakr@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=dakr@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1723767134; a=rsa-sha256; cv=none; b=D8ORACF/LT2k5BiBMVAOzf7ya1Q6SfBsEsTbXvqdcFqMqf5caNqKL1WyGxvSbPioUJQcnI eHIF6xPS6KZECVQhZ6Bcp5+oAgxNWKXeSL9rsQYTxDkSRquk0yrzYreeij2oWE5/uKWWca LPvyj/EH9LKuTEoDr0SM9HC4mg/c3qM= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 022D7CE1E96; Fri, 16 Aug 2024 00:12:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 57C8DC32786; Fri, 16 Aug 2024 00:12:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1723767166; bh=COuk7znl+HjiX4xGBpCWDPtlc/E5h9xKKHzNxA7pQHE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t/wdDl6uEHh61aUhmM3qE0AxoF1wgEbdP+4ptANWSkk1u38xN8evOIHWgEeI3nd2k tqS5HoiMPXj2sd5aVUM8bk2eGVGRqBDQMRP/oYxY4rgzOnB793kd+luf0I/aiTnSZA WC/5YorGjI50ujd+LVTKYlHJs4jMSps/fPte5nv3Zx+ByzEAiSwGM4EPFobVWqCJe0 dihBbG/9rKwLNVETLKf8FGzBVGhY3j8N6ohKceKLKqVzBZmd2VdD7lXrLJ5cTq/LIu tjLrDnQLA4u/3d3edKAS0z+1Ysqntk+BHKBaRMAQ7eHquxYbgBycvFfPaimtG6DXp5 ESpHgA2rgRSfA== 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, 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 v6 04/26] rust: alloc: implement `Allocator` for `Kmalloc` Date: Fri, 16 Aug 2024 02:10:46 +0200 Message-ID: <20240816001216.26575-5-dakr@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240816001216.26575-1-dakr@kernel.org> References: <20240816001216.26575-1-dakr@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam03 X-Rspam-User: X-Rspamd-Queue-Id: 93AFD1C0019 X-Stat-Signature: dreommz18m4syiajx365eirijpumhgp1 X-HE-Tag: 1723767169-581620 X-HE-Meta: U2FsdGVkX1/QztLmvX2zU7ZSxu6MkUbPvYnLcX7tnu66/BA35iE2+UTFHu9XoUOF5f0fp+9J6EPzHHpQR5DfQTPo5p/tT00rqU92A9ggB0QLmuitovR/Mya777EAyTvfGMJm7O6vVyoqS2lCLTiIP7XyIbn7Qgi4ybys0coZOkmJHTYS+U93TrOPxGQ1UsmXauNRIHwoHTmZCvn0z0FokhTnhA2JLzeexvcs5zDzY7ugnCFVyCHRNkcBXeq/JYntOoGF4YCbed9IwXxYtMyTMNAWivsmxt2WJtdp1hcKm8LyGZMw20Ns84q2dOOFz1Ygkna9j0OOCdkd6i25gkSgC1w9zs9fDKishiIJs2EuhrwARtlqkFrFcxquf840XmLI3tMG96VHES8Y+hKpiEY+42sPD8H0ZjZUdCNqgWcV+42ij7oCtDgsk4yMk7ewOhv+sVCv9/nrNRphNuB5ajA40Pzzm/GXVLlJeFje8PSOncxG9Myn2BYuUvy1w49fCNxWpLLEqhnYsSU2UHGwtUZT21pTAB3icnWlL5OKckFC7VXqvLT0NlO3Xv0DEpkJb++uz3vNpHjMQFxtLGvrgEkzFLByyQTAG+YpMoCD3mDskTSie9Eo99jttTFRYbaaXZqicewLAKmIJKwmGxvVclQyOM+5+K7maOLdADtszf8HzWZR/+ij0hHDXfD0y0yHR+9m8sibDgcO/PmaX9Zej5qrpQblB8M80m6H5mPn8fCtzhlWDjqm01XwpeWC02wNE9JZWh/fzU9dYCp4/5J5eXBvngCgQwH+FHJpRakpSsWxSQB3pdb3EPSpACJGHRx049lH6HI2hXjZg0ElM+Bktx2wY2gVV4HmN+mZfq7DNzhFeB6VL41R3YqefoOPZqNDrVgOiBRdpbDz2sPKH5wsYgGEpLs2cdmwVS+a99xK2PUSPyUml8/GTNNAaMd1ROXyYfHYFsIcGqW5K8U9S7Uuo75 w3U0efwh Z7O5lHbxFV3nBhuxBoo9BQ/ZljL82o7+CL+zJyW1WPuvfypaNS94TH0cI+HBk9kHDg2DEu0YY4GabeaUvn/4iRdEzkTCwyqvfNDGP+KE8qBK0AzfXrstz/lioRXcRRXLi8BocupTPejyIZ3Tz0cv/S7UK4PerH7piw9uaBEu7zxYBZUAkmuUiHKEAJ8Y2MtZwlaXgNGuyzfA51t3eUlZ4GrR2I0lRIldY+XK1Kt2HXxURXFKZiiUZHfMGNWaNM6qa9vMS4ioqphW7i+y6cJ1FeGtFqeAn1dVV6F5VP/w3P+M9WtqpAOyS7/Z36PzfQDNJBK12cz5HHRwbduY= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000002, 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 `Kmalloc`, the kernel's default allocator, typically used for objects smaller than page size. All memory allocations made with `Kmalloc` end up in `krealloc()`. It serves as allocator for the subsequently introduced types `KBox` and `KVec`. Signed-off-by: Danilo Krummrich --- rust/kernel/alloc.rs | 2 +- rust/kernel/alloc/allocator.rs | 72 +++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/rust/kernel/alloc.rs b/rust/kernel/alloc.rs index 9932f21b0539..477dbe3c5a2f 100644 --- a/rust/kernel/alloc.rs +++ b/rust/kernel/alloc.rs @@ -4,7 +4,7 @@ #[cfg(not(test))] #[cfg(not(testlib))] -mod allocator; +pub mod allocator; pub mod box_ext; pub mod vec_ext; diff --git a/rust/kernel/alloc/allocator.rs b/rust/kernel/alloc/allocator.rs index e32182f91167..78e7d5488843 100644 --- a/rust/kernel/alloc/allocator.rs +++ b/rust/kernel/alloc/allocator.rs @@ -1,12 +1,28 @@ // SPDX-License-Identifier: GPL-2.0 //! Allocator support. +//! +//! Documentation for the kernel's memory allocators can found in the "Memory Allocation Guide" +//! linked below. For instance, this includes the concept of "get free page" (GFP) flags and the +//! typical application of the different kernel allocators. +//! +//! Reference: use super::{flags::*, Flags}; use core::alloc::{GlobalAlloc, Layout}; use core::ptr; +use core::ptr::NonNull; -struct Kmalloc; +use crate::alloc::{AllocError, Allocator}; +use crate::bindings; + +/// The contiguous kernel allocator. +/// +/// `Kmalloc` is typically used for physically contiguous allocations up to page size, but also +/// supports larger allocations up to `bindings::KMALLOC_MAX_SIZE`, which is hardware specific. +/// +/// For more details see [self]. +pub struct Kmalloc; /// Returns a proper size to alloc a new object aligned to `new_layout`'s alignment. fn aligned_size(new_layout: Layout) -> usize { @@ -36,6 +52,60 @@ pub(crate) unsafe fn krealloc_aligned(ptr: *mut u8, new_layout: Layout, flags: F unsafe { bindings::krealloc(ptr as *const core::ffi::c_void, size, flags.0) as *mut u8 } } +/// # Invariants +/// +/// One of the following `krealloc`, `vrealloc`, `kvrealloc`. +struct ReallocFunc( + unsafe extern "C" fn(*const core::ffi::c_void, usize, u32) -> *mut core::ffi::c_void, +); + +impl ReallocFunc { + // INVARIANT: `krealloc` satisfies the type invariants. + const KREALLOC: Self = Self(bindings::krealloc); + + /// # Safety + /// + /// This method has the same safety requirements as [`Allocator::realloc`]. + unsafe fn call( + &self, + ptr: Option>, + layout: Layout, + flags: Flags, + ) -> Result, AllocError> { + let size = aligned_size(layout); + let ptr = match ptr { + Some(ptr) => ptr.as_ptr(), + None => ptr::null(), + }; + + // SAFETY: `ptr` is either NULL or valid by the safety requirements of this function. + let raw_ptr = unsafe { + // If `size == 0` and `ptr != NULL` the memory behind the pointer is freed. + self.0(ptr.cast(), size, flags.0).cast() + }; + + let ptr = if size == 0 { + NonNull::dangling() + } else { + NonNull::new(raw_ptr).ok_or(AllocError)? + }; + + Ok(NonNull::slice_from_raw_parts(ptr, size)) + } +} + +unsafe impl Allocator for Kmalloc { + #[inline] + unsafe fn realloc( + ptr: Option>, + layout: Layout, + flags: Flags, + ) -> Result, AllocError> { + // SAFETY: `ReallocFunc::call` has the same safety requirements as `Allocator::realloc`. + unsafe { ReallocFunc::KREALLOC.call(ptr, layout, flags) } + } +} + unsafe impl GlobalAlloc for Kmalloc { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { // SAFETY: `ptr::null_mut()` is null and `layout` has a non-zero size by the function safety -- 2.46.0