Message ID | 20240725-alice-file-v8-2-55a2e80deaa8@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | File abstractions needed by Rust Binder | expand |
On Thu, 25 Jul 2024 14:27:35 +0000 Alice Ryhl <aliceryhl@google.com> wrote: > Introduces a safe function for getting a raw pointer to the current > task. > > When writing bindings that need to access the current task, it is often > more convenient to call a method that directly returns a raw pointer > than to use the existing `Task::current` method. However, the only way > to do that is `bindings::get_current()` which is unsafe since it calls > into C. By introducing `Task::current_raw()`, it becomes possible to > obtain a pointer to the current task without using unsafe. > > Link: https://lore.kernel.org/all/CAH5fLgjT48X-zYtidv31mox3C4_Ogoo_2cBOCmX0Ang3tAgGHA@mail.gmail.com/ > Reviewed-by: Benno Lossin <benno.lossin@proton.me> > Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> > Reviewed-by: Trevor Gross <tmgross@umich.edu> > Signed-off-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Gary Guo <gary@garyguo.net> > --- > rust/kernel/task.rs | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs index 278c623de0c6..367b4bbddd9f 100644 --- a/rust/kernel/task.rs +++ b/rust/kernel/task.rs @@ -97,6 +97,15 @@ unsafe impl Sync for Task {} type Pid = bindings::pid_t; impl Task { + /// Returns a raw pointer to the current task. + /// + /// It is up to the user to use the pointer correctly. + #[inline] + pub fn current_raw() -> *mut bindings::task_struct { + // SAFETY: Getting the current pointer is always safe. + unsafe { bindings::get_current() } + } + /// Returns a task reference for the currently executing task/thread. /// /// The recommended way to get the current task/thread is to use the @@ -119,14 +128,12 @@ fn deref(&self) -> &Self::Target { } } - // SAFETY: Just an FFI call with no additional safety requirements. - let ptr = unsafe { bindings::get_current() }; - + let current = Task::current_raw(); TaskRef { // SAFETY: If the current thread is still running, the current task is valid. Given // that `TaskRef` is not `Send`, we know it cannot be transferred to another thread // (where it could potentially outlive the caller). - task: unsafe { &*ptr.cast() }, + task: unsafe { &*current.cast() }, _not_send: NotThreadSafe, } }