diff options
Diffstat (limited to 'rust/kernel/task.rs')
| -rw-r--r-- | rust/kernel/task.rs | 33 | 
1 files changed, 33 insertions, 0 deletions
| diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs index 927413d85484..7d0935bc325c 100644 --- a/rust/kernel/task.rs +++ b/rust/kernel/task.rs @@ -173,6 +173,7 @@ impl Task {      /// Callers must ensure that the returned object is only used to access a [`CurrentTask`]      /// within the task context that was active when this function was called. For more details,      /// see the invariants section for [`CurrentTask`]. +    #[inline]      pub unsafe fn current() -> impl Deref<Target = CurrentTask> {          struct TaskRef {              task: *const CurrentTask, @@ -222,24 +223,28 @@ impl Task {      }      /// Returns the UID of the given task. +    #[inline]      pub fn uid(&self) -> Kuid {          // SAFETY: It's always safe to call `task_uid` on a valid task.          Kuid::from_raw(unsafe { bindings::task_uid(self.as_ptr()) })      }      /// Returns the effective UID of the given task. +    #[inline]      pub fn euid(&self) -> Kuid {          // SAFETY: It's always safe to call `task_euid` on a valid task.          Kuid::from_raw(unsafe { bindings::task_euid(self.as_ptr()) })      }      /// Determines whether the given task has pending signals. +    #[inline]      pub fn signal_pending(&self) -> bool {          // SAFETY: It's always safe to call `signal_pending` on a valid task.          unsafe { bindings::signal_pending(self.as_ptr()) != 0 }      }      /// Returns task's pid namespace with elevated reference count +    #[inline]      pub fn get_pid_ns(&self) -> Option<ARef<PidNamespace>> {          // SAFETY: By the type invariant, we know that `self.0` is valid.          let ptr = unsafe { bindings::task_get_pid_ns(self.as_ptr()) }; @@ -255,6 +260,7 @@ impl Task {      /// Returns the given task's pid in the provided pid namespace.      #[doc(alias = "task_tgid_nr_ns")] +    #[inline]      pub fn tgid_nr_ns(&self, pidns: Option<&PidNamespace>) -> Pid {          let pidns = match pidns {              Some(pidns) => pidns.as_ptr(), @@ -268,6 +274,7 @@ impl Task {      }      /// Wakes up the task. +    #[inline]      pub fn wake_up(&self) {          // SAFETY: It's always safe to call `wake_up_process` on a valid task, even if the task          // running. @@ -341,11 +348,13 @@ impl CurrentTask {  // SAFETY: The type invariants guarantee that `Task` is always refcounted.  unsafe impl crate::types::AlwaysRefCounted for Task { +    #[inline]      fn inc_ref(&self) {          // SAFETY: The existence of a shared reference means that the refcount is nonzero.          unsafe { bindings::get_task_struct(self.as_ptr()) };      } +    #[inline]      unsafe fn dec_ref(obj: ptr::NonNull<Self>) {          // SAFETY: The safety requirements guarantee that the refcount is nonzero.          unsafe { bindings::put_task_struct(obj.cast().as_ptr()) } @@ -391,3 +400,27 @@ impl PartialEq for Kuid {  }  impl Eq for Kuid {} + +/// Annotation for functions that can sleep. +/// +/// Equivalent to the C side [`might_sleep()`], this function serves as +/// a debugging aid and a potential scheduling point. +/// +/// This function can only be used in a nonatomic context. +/// +/// [`might_sleep()`]: https://docs.kernel.org/driver-api/basics.html#c.might_sleep +#[track_caller] +#[inline] +pub fn might_sleep() { +    #[cfg(CONFIG_DEBUG_ATOMIC_SLEEP)] +    { +        let loc = core::panic::Location::caller(); +        let file = kernel::file_from_location(loc); + +        // SAFETY: `file.as_ptr()` is valid for reading and guaranteed to be nul-terminated. +        unsafe { crate::bindings::__might_sleep(file.as_ptr().cast(), loc.line() as i32) } +    } + +    // SAFETY: Always safe to call. +    unsafe { crate::bindings::might_resched() } +} | 
