[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250826.205941.963904478024459782.fujita.tomonori@gmail.com>
Date: Tue, 26 Aug 2025 20:59:41 +0900 (JST)
From: FUJITA Tomonori <fujita.tomonori@...il.com>
To: a.hindborg@...nel.org
Cc: fujita.tomonori@...il.com, alex.gaynor@...il.com, ojeda@...nel.org,
aliceryhl@...gle.com, anna-maria@...utronix.de, bjorn3_gh@...tonmail.com,
boqun.feng@...il.com, dakr@...nel.org, frederic@...nel.org,
gary@...yguo.net, jstultz@...gle.com, linux-kernel@...r.kernel.org,
lossin@...nel.org, lyude@...hat.com, rust-for-linux@...r.kernel.org,
sboyd@...nel.org, tglx@...utronix.de, tmgross@...ch.edu,
acourbot@...dia.com, daniel.almeida@...labora.com
Subject: Re: [PATCH v1 1/2] rust: add udelay() function
On Tue, 26 Aug 2025 11:09:12 +0200
Andreas Hindborg <a.hindborg@...nel.org> wrote:
>> +/// Inserts a delay based on microseconds with busy waiting.
>> +///
>> +/// Equivalent to the C side [`udelay()`], which delays in microseconds.
>> +///
>> +/// `delta` must be within `[0, `MAX_UDELAY_MS`]` in milliseconds;
>> +/// 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 insert a delay for at least the maximum value in the range and
>> +/// may warn in the future.
>> +///
>> +/// The behavior above differs from the C side [`udelay()`] for which out-of-range
>> +/// values could lead to an overflow and unexpected behavior.
>> +///
>> +/// [`udelay()`]: https://docs.kernel.org/timers/delay_sleep_functions.html#c.udelay
>> +pub fn udelay(delta: Delta) {
>> + const MAX_UDELAY_DELTA: Delta = Delta::from_millis(bindings::MAX_UDELAY_MS as i64);
>> +
>> + let delta = if (Delta::ZERO..=MAX_UDELAY_DELTA).contains(&delta) {
>> + delta
>> + } else {
>> + // TODO: Add WARN_ONCE() when it's supported.
>> + MAX_UDELAY_DELTA
>> + };
>> +
>> + // SAFETY: It is always safe to call `udelay()` with any duration.
>
> Function documentation says it is overflow and unexpected behavior to
> call `udelay` with out of range value, but above comment says any
> duration is safe. Which is it?
This can lead to an unexpected delay duration, but it's safe in Rust’s
sense of safety?
If not, how about the followings?
// SAFETY: `delta` is clamped to the range [0, MAX_UDELAY_DELTA],
// so calling `udelay()` with it is always safe.
Powered by blists - more mailing lists