mirror-linux/rust/kernel
Alice Ryhl da939ef4c4 rust: maple_tree: add MapleTree
Patch series "Add Rust abstraction for Maple Trees", v3.

This will be used in the Tyr driver [1] to allocate from the GPU's VA
space that is not owned by userspace, but by the kernel, for kernel GPU
mappings.

Danilo tells me that in nouveau, the maple tree is used for keeping track
of "VM regions" on top of GPUVM, and that he will most likely end up doing
the same in the Rust Nova driver as well.

These abstractions intentionally do not expose any way to make use of
external locking.  You are required to use the internal spinlock.  For
now, we do not support loads that only utilize rcu for protection.

This contains some parts taken from Andrew Ballance's RFC [2] from April. 
However, it has also been reworked significantly compared to that RFC
taking the use-cases in Tyr into account.


This patch (of 3):

The maple tree will be used in the Tyr driver to allocate and keep track
of GPU allocations created internally (i.e.  not by userspace).  It will
likely also be used in the Nova driver eventually.

This adds the simplest methods for additional and removal that do not
require any special care with respect to concurrency.

This implementation is based on the RFC by Andrew but with significant
changes to simplify the implementation.

[ojeda@kernel.org: fix intra-doc links]
  Link: https://lkml.kernel.org/r/20250910140212.997771-1-ojeda@kernel.org
Link: https://lkml.kernel.org/r/20250902-maple-tree-v3-0-fb5c8958fb1e@google.com
Link: https://lkml.kernel.org/r/20250902-maple-tree-v3-1-fb5c8958fb1e@google.com
Link: https://lore.kernel.org/r/20250627-tyr-v1-1-cb5f4c6ced46@collabora.com [1]
Link: https://lore.kernel.org/r/20250405060154.1550858-1-andrewjballance@gmail.com [2]
Co-developed-by: Andrew Ballance <andrewjballance@gmail.com>
Signed-off-by: Andrew Ballance <andrewjballance@gmail.com>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Danilo Krummrich <dakr@kernel.org>
Cc: Andreas Hindborg <a.hindborg@kernel.org>
Cc: Björn Roy Baron <bjorn3_gh@protonmail.com>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Daniel Almeida <daniel.almeida@collabora.com>
Cc: Gary Guo <gary@garyguo.net>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Miguel Ojeda <ojeda@kernel.org>
Cc: Trevor Gross <tmgross@umich.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2025-09-21 14:22:19 -07:00
..
alloc rust: allocator: add KUnit tests for alignment guarantees 2025-09-13 16:55:00 -07:00
block pin-init changes for v6.17 2025-07-13 23:05:14 +02:00
device rust: device: implement FwNode::is_of_node() 2025-06-25 18:10:12 +02:00
drm rust: drm: don't pass the address of drm::Device to drm_dev_put() 2025-08-11 23:21:45 +02:00
fs rust: enable `clippy::ref_as_ptr` lint 2025-06-22 23:09:32 +02:00
io rust: io: fix broken intra-doc links to `platform::Device` 2025-07-22 11:08:59 +02:00
list rust: list: remove nonexistent generic parameter in link 2025-07-20 19:29:19 +02:00
mm rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net Rust changes for v6.17 2025-08-03 13:49:10 -07:00
sync Rust changes for v6.17 2025-08-03 13:49:10 -07:00
time rust: time: Pass correct timer mode ID to hrtimer_start_range_ns 2025-07-17 00:55:35 +02:00
.gitignore rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
acpi.rs rust: device_id: split out index support into a separate trait 2025-07-16 23:38:21 +02:00
alloc.rs rust: add support for NUMA ids in allocations 2025-09-13 16:54:46 -07:00
auxiliary.rs rust: device_id: split out index support into a separate trait 2025-07-16 23:38:21 +02:00
bits.rs rust: bits: add support for bits/genmask macros 2025-07-19 23:18:18 +02:00
block.rs rust: block: introduce `kernel::block::mq` module 2024-06-14 07:45:04 -06:00
bug.rs rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
build_assert.rs rust: add `build_error!` to the prelude 2025-01-10 00:19:09 +01:00
clk.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
configfs.rs rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
cpu.rs device: rust: rename Device::as_ref() to Device::from_raw() 2025-07-16 23:37:49 +02:00
cpufreq.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
cpumask.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
cred.rs cred,rust: mark Credential methods inline 2025-03-04 17:07:49 -05:00
device.rs device: rust: expand documentation for Device 2025-08-12 15:23:46 +02:00
device_id.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
devres.rs rust: devres: fix leaking call to devm_add_action() 2025-08-14 01:52:15 +02:00
dma.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
driver.rs driver: rust: expand documentation for driver infrastructure 2025-08-12 15:23:49 +02:00
error.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
faux.rs rust: faux: fix C header link 2025-08-13 17:40:28 +02:00
firmware.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
fmt.rs rust: kernel: add `fmt` module 2025-07-21 01:16:35 +02:00
fs.rs rust: file: add Rust abstraction for `struct file` 2024-09-30 13:02:28 +02:00
generated_arch_reachable_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
generated_arch_static_branch_asm.rs.S rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
generated_arch_warn_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
init.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
io.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
ioctl.rs rust: start using the `#[expect(...)]` attribute 2024-10-07 21:39:57 +02:00
jump_label.rs rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
kunit.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
lib.rs rust: maple_tree: add MapleTree 2025-09-21 14:22:19 -07:00
list.rs rust: list: remove OFFSET constants 2025-07-19 23:18:18 +02:00
maple_tree.rs rust: maple_tree: add MapleTree 2025-09-21 14:22:19 -07:00
miscdevice.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
mm.rs rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net.rs rust: core abstractions for network PHY drivers 2023-12-15 09:35:50 +00:00
of.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
opp.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
page.rs rust: page: optimize rust symbol generation for Page 2025-05-12 00:20:25 +02:00
pci.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
pid_namespace.rs rust: add PidNamespace 2024-10-08 15:44:36 +02:00
platform.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
prelude.rs rust: kernel: remove `fmt!`, fix clippy::uninlined-format-args 2025-07-21 01:15:51 +02:00
print.rs rust: use `kernel::{fmt,prelude::fmt!}` 2025-07-21 01:16:35 +02:00
rbtree.rs rust: rbtree: simplify finding `current` in `remove_current` 2025-07-14 23:53:35 +02:00
regulator.rs rust: regulator: add a bare minimum regulator abstraction 2025-07-15 15:07:40 +01:00
revocable.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
security.rs lsm,rust: reword "destroy" -> "release" in SecurityCtx 2025-03-04 15:44:46 -05:00
seq_file.rs rust: enable `clippy::ptr_as_ptr` lint 2025-06-22 23:08:42 +02:00
sizes.rs rust: sizes: add constants up to SZ_2G 2025-06-23 18:12:30 +02:00
static_assert.rs rust: use absolute paths in macros referencing core and kernel 2025-05-23 00:12:14 +02:00
std_vendor.rs rust: convert raw URLs to Markdown autolinks in comments 2025-05-12 00:20:25 +02:00
str.rs rust: kernel: use `core::ffi::CStr` method names 2025-07-21 01:16:36 +02:00
sync.rs rust: kernel: move ARef and AlwaysRefCounted to sync::aref 2025-07-22 13:52:14 +02:00
task.rs rust: task: Add Rust version of might_sleep() 2025-06-24 15:53:50 -07:00
time.rs rust: time: Add wrapper for fsleep() function 2025-06-30 13:22:05 +02:00
tracepoint.rs rust: add tracepoint support 2024-11-04 16:21:44 -05:00
transmute.rs rust: kernel: move `FromBytes` and `AsBytes` traits to a new `transmute` module 2024-10-10 00:33:42 +02:00
types.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
uaccess.rs rust: uaccess: use newtype for user pointers 2025-07-14 23:52:45 +02:00
workqueue.rs workqueue: rust: add delayed work items 2025-07-15 22:54:52 +02:00
xarray.rs rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00