From: FUJITA Tomonori <fujita.tomonori@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: Daniel Almeida <daniel.almeida@collabora.com>,
Gary Guo <gary@garyguo.net>, Alice Ryhl <aliceryhl@google.com>,
Fiona Behrens <me@kloenk.dev>,
rust-for-linux@vger.kernel.org, netdev@vger.kernel.org,
andrew@lunn.ch, hkallweit1@gmail.com, tmgross@umich.edu,
ojeda@kernel.org, alex.gaynor@gmail.com,
bjorn3_gh@protonmail.com, benno.lossin@proton.me,
a.hindborg@samsung.com, anna-maria@linutronix.de,
frederic@kernel.org, tglx@linutronix.de, arnd@arndb.de,
jstultz@google.com, sboyd@kernel.org, mingo@redhat.com,
peterz@infradead.org, juri.lelli@redhat.com,
vincent.guittot@linaro.org, dietmar.eggemann@arm.com,
rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de,
vschneid@redhat.com, tgunders@redhat.com,
david.laight.linux@gmail.com
Subject: [PATCH v11 5/8] rust: time: Add wrapper for fsleep() function
Date: Thu, 20 Feb 2025 16:06:07 +0900 [thread overview]
Message-ID: <20250220070611.214262-6-fujita.tomonori@gmail.com> (raw)
In-Reply-To: <20250220070611.214262-1-fujita.tomonori@gmail.com>
Add a wrapper for fsleep(), flexible sleep functions in
include/linux/delay.h which typically deals with hardware delays.
The kernel supports several sleep functions to handle various lengths
of delay. This adds fsleep(), automatically chooses the best sleep
method based on a duration.
sleep functions including fsleep() belongs to TIMERS, not
TIMEKEEPING. They are maintained separately. rust/kernel/time.rs is an
abstraction for TIMEKEEPING. To make Rust abstractions match the C
side, add rust/kernel/time/delay.rs for this wrapper.
fsleep() can only be used in a nonatomic context. This requirement is
not checked by these abstractions, but it is intended that klint [1]
or a similar tool will be used to check it in the future.
Link: https://rust-for-linux.com/klint [1]
Tested-by: Daniel Almeida <daniel.almeida@collabora.com>
Reviewed-by: Gary Guo <gary@garyguo.net>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Fiona Behrens <me@kloenk.dev>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
---
rust/helpers/helpers.c | 1 +
rust/helpers/time.c | 8 +++++++
rust/kernel/time.rs | 2 ++
rust/kernel/time/delay.rs | 49 +++++++++++++++++++++++++++++++++++++++
4 files changed, 60 insertions(+)
create mode 100644 rust/helpers/time.c
create mode 100644 rust/kernel/time/delay.rs
diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c
index 0640b7e115be..9565485a1a54 100644
--- a/rust/helpers/helpers.c
+++ b/rust/helpers/helpers.c
@@ -31,6 +31,7 @@
#include "slab.c"
#include "spinlock.c"
#include "task.c"
+#include "time.c"
#include "uaccess.c"
#include "vmalloc.c"
#include "wait.c"
diff --git a/rust/helpers/time.c b/rust/helpers/time.c
new file mode 100644
index 000000000000..7ae64ad8141d
--- /dev/null
+++ b/rust/helpers/time.c
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/delay.h>
+
+void rust_helper_fsleep(unsigned long usecs)
+{
+ fsleep(usecs);
+}
diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs
index d64a05a4f4d1..eeb0f6a7e5d4 100644
--- a/rust/kernel/time.rs
+++ b/rust/kernel/time.rs
@@ -24,6 +24,8 @@
//! C header: [`include/linux/jiffies.h`](srctree/include/linux/jiffies.h).
//! C header: [`include/linux/ktime.h`](srctree/include/linux/ktime.h).
+pub mod delay;
+
/// The number of nanoseconds per microsecond.
pub const NSEC_PER_USEC: i64 = bindings::NSEC_PER_USEC as i64;
diff --git a/rust/kernel/time/delay.rs b/rust/kernel/time/delay.rs
new file mode 100644
index 000000000000..02b8731433c7
--- /dev/null
+++ b/rust/kernel/time/delay.rs
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0
+
+//! Delay and sleep primitives.
+//!
+//! This module contains the kernel APIs related to delay and sleep that
+//! have been ported or wrapped for usage by Rust code in the kernel.
+//!
+//! C header: [`include/linux/delay.h`](srctree/include/linux/delay.h).
+
+use super::Delta;
+use crate::ffi::c_ulong;
+
+/// Sleeps for a given duration at least.
+///
+/// Equivalent to the C side [`fsleep()`], flexible sleep function,
+/// which automatically chooses the best sleep method based on a duration.
+///
+/// `delta` must be within `[0, i32::MAX]` microseconds;
+/// otherwise, it is erroneous behavior. That is, it is considered a bug
+/// to call this function with an out-of-range value, in which case the function
+/// will sleep for at least the maximum value in the range and may warn
+/// in the future.
+///
+/// The behavior above differs from the C side [`fsleep()`] for which out-of-range
+/// values mean "infinite timeout" instead.
+///
+/// This function can only be used in a nonatomic context.
+///
+/// [`fsleep`]: https://docs.kernel.org/timers/delay_sleep_functions.html#c.fsleep
+pub fn fsleep(delta: Delta) {
+ // The maximum value is set to `i32::MAX` microseconds to prevent integer
+ // overflow inside fsleep, which could lead to unintentional infinite sleep.
+ const MAX_DELTA: Delta = Delta::from_micros(i32::MAX as i64);
+
+ let delta = if (Delta::ZERO..=MAX_DELTA).contains(&delta) {
+ delta
+ } else {
+ // TODO: Add WARN_ONCE() when it's supported.
+ MAX_DELTA
+ };
+
+ // SAFETY: It is always safe to call `fsleep()` with any duration.
+ unsafe {
+ // Convert the duration to microseconds and round up to preserve
+ // the guarantee; `fsleep()` sleeps for at least the provided duration,
+ // but that it may sleep for longer under some circumstances.
+ bindings::fsleep(delta.as_micros_ceil() as c_ulong)
+ }
+}
--
2.43.0
next prev parent reply other threads:[~2025-02-20 7:10 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-20 7:06 [PATCH v11 0/8] rust: Add IO polling FUJITA Tomonori
2025-02-20 7:06 ` [PATCH v11 1/8] sched/core: Add __might_sleep_precision() FUJITA Tomonori
2025-02-24 1:40 ` FUJITA Tomonori
2025-02-20 7:06 ` [PATCH v11 2/8] rust: time: Add PartialEq/Eq/PartialOrd/Ord trait to Ktime FUJITA Tomonori
2025-03-22 8:51 ` Andreas Hindborg
2025-02-20 7:06 ` [PATCH v11 3/8] rust: time: Introduce Delta type FUJITA Tomonori
2025-03-22 8:50 ` Andreas Hindborg
2025-02-20 7:06 ` [PATCH v11 4/8] rust: time: Introduce Instant type FUJITA Tomonori
2025-03-22 13:58 ` Andreas Hindborg
2025-04-03 4:40 ` FUJITA Tomonori
2025-04-03 10:41 ` Andreas Hindborg
2025-04-03 12:23 ` FUJITA Tomonori
2025-02-20 7:06 ` FUJITA Tomonori [this message]
2025-03-21 22:05 ` [PATCH v11 5/8] rust: time: Add wrapper for fsleep() function Frederic Weisbecker
2025-03-22 1:24 ` FUJITA Tomonori
2025-03-22 14:15 ` Andreas Hindborg
2025-03-22 14:10 ` Andreas Hindborg
2025-02-20 7:06 ` [PATCH v11 6/8] MAINTAINERS: rust: Add new sections for DELAY/SLEEP and TIMEKEEPING API FUJITA Tomonori
2025-03-20 19:05 ` Boqun Feng
2025-03-21 19:18 ` Andreas Hindborg
2025-03-21 20:38 ` Thomas Gleixner
2025-03-21 21:00 ` Boqun Feng
2025-03-22 2:07 ` FUJITA Tomonori
2025-03-22 12:57 ` Boqun Feng
2025-03-22 22:40 ` Andreas Hindborg
2025-03-31 14:03 ` Boqun Feng
2025-03-31 19:43 ` Andreas Hindborg
2025-04-03 8:18 ` FUJITA Tomonori
2025-04-03 10:54 ` Andreas Hindborg
2025-04-03 12:57 ` FUJITA Tomonori
2025-04-04 16:40 ` Boqun Feng
2025-04-02 14:16 ` FUJITA Tomonori
2025-04-02 16:29 ` Boqun Feng
2025-04-02 23:03 ` FUJITA Tomonori
2025-04-03 0:51 ` Boqun Feng
2025-04-03 3:02 ` FUJITA Tomonori
2025-04-03 3:17 ` Boqun Feng
2025-02-20 7:06 ` [PATCH v11 7/8] rust: Add read_poll_timeout functions FUJITA Tomonori
2025-02-20 15:04 ` Fiona Behrens
2025-02-21 11:20 ` FUJITA Tomonori
2025-03-22 16:02 ` Andreas Hindborg
2025-08-11 1:53 ` FUJITA Tomonori
2025-08-11 9:42 ` Andreas Hindborg
2025-08-14 5:53 ` FUJITA Tomonori
2025-07-28 12:44 ` Daniel Almeida
2025-07-28 12:52 ` FUJITA Tomonori
2025-07-28 12:57 ` Danilo Krummrich
2025-07-28 13:08 ` FUJITA Tomonori
2025-07-28 13:15 ` Danilo Krummrich
2025-07-28 14:13 ` Daniel Almeida
2025-07-28 14:30 ` Danilo Krummrich
2025-07-28 13:13 ` Danilo Krummrich
2025-08-02 1:42 ` FUJITA Tomonori
2025-08-02 11:06 ` Danilo Krummrich
2025-08-05 13:37 ` FUJITA Tomonori
2025-08-05 13:48 ` Danilo Krummrich
2025-08-05 13:53 ` Andrew Lunn
2025-08-05 14:03 ` Danilo Krummrich
2025-08-05 14:01 ` Daniel Almeida
2025-08-05 14:19 ` Danilo Krummrich
2025-02-20 7:06 ` [PATCH v11 8/8] net: phy: qt2025: Wait until PHY becomes ready FUJITA Tomonori
2025-02-27 17:29 ` [PATCH v11 0/8] rust: Add IO polling Daniel Almeida
2025-02-27 23:05 ` FUJITA Tomonori
2025-03-20 19:04 ` Boqun Feng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250220070611.214262-6-fujita.tomonori@gmail.com \
--to=fujita.tomonori@gmail.com \
--cc=a.hindborg@samsung.com \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=andrew@lunn.ch \
--cc=anna-maria@linutronix.de \
--cc=arnd@arndb.de \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=bsegall@google.com \
--cc=daniel.almeida@collabora.com \
--cc=david.laight.linux@gmail.com \
--cc=dietmar.eggemann@arm.com \
--cc=frederic@kernel.org \
--cc=gary@garyguo.net \
--cc=hkallweit1@gmail.com \
--cc=jstultz@google.com \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=me@kloenk.dev \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=sboyd@kernel.org \
--cc=tglx@linutronix.de \
--cc=tgunders@redhat.com \
--cc=tmgross@umich.edu \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).