[PATCH 1/5] rust: task: add safe schedule_timeout() wrapper
Danilo Krummrich <[email protected]> Mon, 27 Jul 2026 00:36:07 +0200
| Newsgroups | org.kernel.vger.rust-for-linux,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Add a safe wrapper around schedule_timeout() that takes and returns Jiffies, handling the c_long conversion internally. Signed-off-by: Danilo Krummrich <[email protected]> --- rust/kernel/task.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/rust/kernel/task.rs b/rust/kernel/task.rs index 38273f4eedb5..0d63beb3fb37 100644 --- a/rust/kernel/task.rs +++ b/rust/kernel/task.rs @@ -10,6 +10,7 @@ pid_namespace::PidNamespace, prelude::*, sync::aref::ARef, + time::Jiffies, types::{NotThreadSafe, Opaque}, }; use core::{ @@ -20,6 +21,18 @@ /// A sentinel value used for infinite timeouts. pub const MAX_SCHEDULE_TIMEOUT: c_long = c_long::MAX; +/// Sleeps for the given timeout in [`Jiffies`], or until woken. +/// +/// Returns the remaining time in [`Jiffies`], or zero if the timeout expired. The task state +/// should be set before calling this. +#[inline] +pub fn schedule_timeout(timeout: Jiffies) -> Jiffies { + let timeout = timeout.try_into().unwrap_or(MAX_SCHEDULE_TIMEOUT); + + // SAFETY: `schedule_timeout()` is always safe to call. + unsafe { bindings::schedule_timeout(timeout) as Jiffies } +} + /// Bitmask for tasks that are sleeping in an interruptible state. pub const TASK_INTERRUPTIBLE: c_int = bindings::TASK_INTERRUPTIBLE as c_int; /// Bitmask for tasks that are sleeping in an uninterruptible state. -- 2.55.0