From: Sami Tolvanen <[email protected]> A DRM driver that lets userspace pick GPU virtual addresses needs the address space size of the calling task, so it can offer a GPU range that the CPU can map at the same addresses. TASK_SIZE_OF() is a macro, so reading it from Rust needs a helper.
Add CurrentTask::task_size(). It is bound to the current task because TASK_SIZE_OF() falls back to TASK_SIZE on architectures that do not define it, and TASK_SIZE describes current. Signed-off-by: Sami Tolvanen <[email protected]> [ Add the <linux/mm.h> include, needed where TASK_SIZE is defined in <asm/pgtable.h> (e.g. riscv). - Alvin ] Co-developed-by: Alvin Sun <[email protected]> Signed-off-by: Alvin Sun <[email protected]> --- rust/helpers/task.c | 6 ++++++ rust/kernel/task.rs | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/rust/helpers/task.c b/rust/helpers/task.c index b46b1433a67e8..b49bd40027154 100644 --- a/rust/helpers/task.c +++ b/rust/helpers/task.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 #include <linux/kernel.h> +#include <linux/mm.h> #include <linux/sched/task.h> __rust_helper void rust_helper_might_resched(void) @@ -13,6 +14,11 @@ __rust_helper struct task_struct *rust_helper_get_current(void) return current; } +__rust_helper unsigned long rust_helper_current_task_size(void) +{ + return TASK_SIZE_OF(current); +} + __rust_helper void rust_helper_get_task_struct(struct task_struct *t) { get_task_struct(t); diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs index eaa0031416a98..e60a0f0727889 100644 --- a/rust/kernel/task.rs +++ b/rust/kernel/task.rs @@ -314,6 +314,18 @@ pub fn mm(&self) -> Option<&MmWithUser> { Some(unsafe { MmWithUser::from_raw(mm) }) } + /// Returns the size of the userspace address space of the current task. + /// + /// This is the first address above the userspace range, so it is smaller + /// for a task running in compat mode than for a native one. See + /// `TASK_SIZE_OF()` in [`include/linux/sched.h`](srctree/include/linux/sched.h). + #[doc(alias = "TASK_SIZE_OF")] + #[inline] + pub fn task_size(&self) -> usize { + // SAFETY: FFI call without preconditions, valid in any context. + unsafe { bindings::current_task_size() as usize } + } + /// Access the pid namespace of the current task. /// /// This function does not touch the refcount of the namespace or use RCU protection. -- 2.43.0
