On Fri Mar 20, 2026 at 4:57 AM GMT, Joel Fernandes wrote: > Add safe Rust abstractions over the Linux kernel's GPU buddy > allocator for physical memory management. The GPU buddy allocator > implements a binary buddy system useful for GPU physical memory > allocation. nova-core will use it for physical memory allocation. > > Cc: Nikola Djukic <[email protected]> > Signed-off-by: Joel Fernandes <[email protected]> > --- > MAINTAINERS | 6 + > rust/bindings/bindings_helper.h | 11 + > rust/helpers/gpu.c | 23 ++ > rust/helpers/helpers.c | 1 + > rust/kernel/gpu.rs | 6 + > rust/kernel/gpu/buddy.rs | 613 ++++++++++++++++++++++++++++++++ > rust/kernel/lib.rs | 2 + > 7 files changed, 662 insertions(+) > create mode 100644 rust/helpers/gpu.c > create mode 100644 rust/kernel/gpu.rs > create mode 100644 rust/kernel/gpu/buddy.rs > > diff --git a/MAINTAINERS b/MAINTAINERS > index e847099efcc2..cd9505d3be60 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -8531,7 +8531,10 @@ T: git > https://gitlab.freedesktop.org/drm/rust/kernel.git > F: drivers/gpu/drm/nova/ > F: drivers/gpu/drm/tyr/ > F: drivers/gpu/nova-core/ > +F: rust/helpers/gpu.c > F: rust/kernel/drm/ > +F: rust/kernel/gpu.rs > +F: rust/kernel/gpu/ > > DRM DRIVERS FOR ALLWINNER A10 > M: Chen-Yu Tsai <[email protected]> > @@ -8952,6 +8955,9 @@ F: drivers/gpu/drm/drm_buddy.c > F: drivers/gpu/tests/gpu_buddy_test.c > F: include/drm/drm_buddy.h > F: include/linux/gpu_buddy.h > +F: rust/helpers/gpu.c > +F: rust/kernel/gpu.rs > +F: rust/kernel/gpu/ > > DRM AUTOMATED TESTING > M: Helen Koike <[email protected]> > diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h > index 083cc44aa952..dbb765a9fdbd 100644 > --- a/rust/bindings/bindings_helper.h > +++ b/rust/bindings/bindings_helper.h > @@ -29,6 +29,7 @@ > #include <linux/hrtimer_types.h> > > #include <linux/acpi.h> > +#include <linux/gpu_buddy.h> > #include <drm/drm_device.h> > #include <drm/drm_drv.h> > #include <drm/drm_file.h> > @@ -146,6 +147,16 @@ const vm_flags_t RUST_CONST_HELPER_VM_MIXEDMAP = > VM_MIXEDMAP; > const vm_flags_t RUST_CONST_HELPER_VM_HUGEPAGE = VM_HUGEPAGE; > const vm_flags_t RUST_CONST_HELPER_VM_NOHUGEPAGE = VM_NOHUGEPAGE; > > +#if IS_ENABLED(CONFIG_GPU_BUDDY) > +const unsigned long RUST_CONST_HELPER_GPU_BUDDY_RANGE_ALLOCATION = > GPU_BUDDY_RANGE_ALLOCATION; > +const unsigned long RUST_CONST_HELPER_GPU_BUDDY_TOPDOWN_ALLOCATION = > GPU_BUDDY_TOPDOWN_ALLOCATION; > +const unsigned long RUST_CONST_HELPER_GPU_BUDDY_CONTIGUOUS_ALLOCATION = > + > GPU_BUDDY_CONTIGUOUS_ALLOCATION; > +const unsigned long RUST_CONST_HELPER_GPU_BUDDY_CLEAR_ALLOCATION = > GPU_BUDDY_CLEAR_ALLOCATION; > +const unsigned long RUST_CONST_HELPER_GPU_BUDDY_CLEARED = GPU_BUDDY_CLEARED; > +const unsigned long RUST_CONST_HELPER_GPU_BUDDY_TRIM_DISABLE = > GPU_BUDDY_TRIM_DISABLE; > +#endif > + > #if IS_ENABLED(CONFIG_ANDROID_BINDER_IPC_RUST) > #include "../../drivers/android/binder/rust_binder.h" > #include "../../drivers/android/binder/rust_binder_events.h" > diff --git a/rust/helpers/gpu.c b/rust/helpers/gpu.c > new file mode 100644 > index 000000000000..38b1a4e6bef8 > --- /dev/null > +++ b/rust/helpers/gpu.c > @@ -0,0 +1,23 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include <linux/gpu_buddy.h> > + > +#ifdef CONFIG_GPU_BUDDY > + > +__rust_helper u64 rust_helper_gpu_buddy_block_offset(const struct > gpu_buddy_block *block) > +{ > + return gpu_buddy_block_offset(block); > +} > + > +__rust_helper unsigned int rust_helper_gpu_buddy_block_order(struct > gpu_buddy_block *block) > +{ > + return gpu_buddy_block_order(block); > +} > + > +__rust_helper u64 rust_helper_gpu_buddy_block_size(struct gpu_buddy *mm, > + struct gpu_buddy_block > *block) > +{ > + return gpu_buddy_block_size(mm, block); > +}
>From Sashiko: https://sashiko.dev/#/patchset/20260320045711.43494-1-joelagnelf%40nvidia.com Does the Rust wrapper use this helper? It looks like AllocatedBlock::size() manually duplicates the bitwise logic (chunk_size << order) rather than calling this helper, which could create a divergence risk if the underlying C allocator implementation changes. Many other review comments there seem to be false positive, but it might worth confirming. Best, Gary > + > +#endif /* CONFIG_GPU_BUDDY */ > diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c > index 724fcb8240ac..a53929ce52a3 100644 > --- a/rust/helpers/helpers.c > +++ b/rust/helpers/helpers.c > @@ -32,6 +32,7 @@ > #include "err.c" > #include "irq.c" > #include "fs.c" > +#include "gpu.c" > #include "io.c" > #include "jump_label.c" > #include "kunit.c" > diff --git a/rust/kernel/gpu.rs b/rust/kernel/gpu.rs > new file mode 100644 > index 000000000000..1dc5d0c8c09d > --- /dev/null > +++ b/rust/kernel/gpu.rs > @@ -0,0 +1,6 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! GPU subsystem abstractions. > + > +#[cfg(CONFIG_GPU_BUDDY = "y")] > +pub mod buddy;
