Skip to content

Commit ec575f4

Browse files
Darksonnjannau
authored andcommitted
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>
1 parent c9caa0d commit ec575f4

6 files changed

Lines changed: 366 additions & 0 deletions

File tree

MAINTAINERS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14680,6 +14680,8 @@ F: net/mctp/
1468014680

1468114681
MAPLE TREE
1468214682
M: Liam R. Howlett <Liam.Howlett@oracle.com>
14683+
R: Alice Ryhl <aliceryhl@google.com>
14684+
R: Andrew Ballance <andrewjballance@gmail.com>
1468314685
L: maple-tree@lists.infradead.org
1468414686
L: linux-mm@kvack.org
1468514687
S: Supported
@@ -14688,6 +14690,8 @@ F: include/linux/maple_tree.h
1468814690
F: include/trace/events/maple_tree.h
1468914691
F: lib/maple_tree.c
1469014692
F: lib/test_maple_tree.c
14693+
F: rust/helpers/maple_tree.c
14694+
F: rust/kernel/maple_tree.rs
1469114695
F: tools/testing/radix-tree/maple.c
1469214696
F: tools/testing/shared/linux/maple_tree.h
1469314697

include/linux/maple_tree.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,9 @@ struct ma_wr_state {
481481
#define MA_ERROR(err) \
482482
((struct maple_enode *)(((unsigned long)err << 2) | 2UL))
483483

484+
/*
485+
* When changing MA_STATE, remember to also change rust/kernel/maple_tree.rs
486+
*/
484487
#define MA_STATE(name, mt, first, end) \
485488
struct ma_state name = { \
486489
.tree = mt, \

rust/helpers/helpers.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "io.c"
3434
#include "jump_label.c"
3535
#include "kunit.c"
36+
#include "maple_tree.c"
3637
#include "mm.c"
3738
#include "mutex.c"
3839
#include "of.c"

rust/helpers/maple_tree.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
#include <linux/maple_tree.h>
4+
5+
void rust_helper_mt_init_flags(struct maple_tree *mt, unsigned int flags)
6+
{
7+
mt_init_flags(mt, flags);
8+
}

rust/kernel/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ pub mod jump_label;
117117
#[cfg(CONFIG_KUNIT)]
118118
pub mod kunit;
119119
pub mod list;
120+
pub mod maple_tree;
120121
pub mod miscdevice;
121122
pub mod mm;
122123
pub mod module_param;

0 commit comments

Comments
 (0)