Message ID | 20240118-alice-file-v3-6-9694b6f9580c@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | File abstractions needed by Rust Binder | expand |
On 1/18/24 15:36, Alice Ryhl 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/ > Signed-off-by: Alice Ryhl <aliceryhl@google.com> > --- Reviewed-by: Benno Lossin <benno.lossin@proton.me>
diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs index 4665ff86ec00..396fe8154832 100644 --- a/rust/kernel/task.rs +++ b/rust/kernel/task.rs @@ -82,6 +82,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 @@ -104,14 +113,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, } }
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/ Signed-off-by: Alice Ryhl <aliceryhl@google.com> --- rust/kernel/task.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)