Re: [PATCH v5 4/7] rust: time: add Delta::to_jiffies() for timeout conversion

FUJITA Tomonori <[email protected]>
Newsgroups org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
On Fri, 07 Aug 2026 13:59:20 +0100
"Gary Guo" <[email protected]> wrote:

> On Fri Aug 7, 2026 at 1:38 PM BST, FUJITA Tomonori wrote:
>> On Thu, 06 Aug 2026 12:50:55 +0100
>> "Gary Guo" <[email protected]> wrote:
>>
>>> On Thu Aug 6, 2026 at 8:32 AM BST, FUJITA Tomonori wrote:
>>>> From: FUJITA Tomonori <[email protected]>
>>>>
>>>> Add Delta<Nsec>::to_jiffies() conversion that rounds up so the
>>>> resulting timeout is never shorter than the requested span, clamps a
>>>> negative span to an immediate timeout, and saturates an overlong span
>>>> to the kernel's MAX_JIFFY_OFFSET "wait forever" value.
>>>>
>>>> Reviewed-by: Gary Guo <[email protected]>
>>>> Signed-off-by: FUJITA Tomonori <[email protected]>
>>>> ---
>>>>  rust/kernel/time.rs | 21 +++++++++++++++++++++
>>>>  1 file changed, 21 insertions(+)
>>>>
>>>> diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs
>>>> index 9d65a6c1992a..5844ee985a7b 100644
>>>> --- a/rust/kernel/time.rs
>>>> +++ b/rust/kernel/time.rs
>>>> @@ -551,6 +551,27 @@ pub fn as_millis_ceil(self) -> i64 {
>>>>          }
>>>>      }
>>>>  
>>>> +    /// Convert this span to a [`Delta<Jiffy>`] suitable for use as a timeout.
>>>> +    ///
>>>> +    /// The value is rounded up to the next whole jiffy, so the resulting
>>>> +    /// timeout is never shorter than `self` (as `msecs_to_jiffies()` does).
>>>> +    /// A negative span clamps to zero jiffies (an immediate timeout).
>>>> +    #[inline]
>>>> +    pub fn to_jiffies(self) -> Delta<Jiffy> {
>>>> +        let msecs = self.as_millis_ceil();
>>>> +
>>>> +        // CAST: `msecs` is clamped to `0..=c_uint::MAX`, so it is non-negative and
>>>> +        // fits in `c_uint`.
>>>> +        let msecs = msecs.clamp(0, i64::from(crate::ffi::c_uint::MAX)) as crate::ffi::c_uint;
>>>> +
>>>> +        // SAFETY: `__msecs_to_jiffies()` is always safe to call.
>>>> +        let jiffies = unsafe { bindings::__msecs_to_jiffies(msecs) };
>>>> +
>>>> +        // CAST: `__msecs_to_jiffies()` returns a value in `0..=MAX_JIFFY_OFFSET`, i.e.
>>>> +        // `((LONG_MAX >> 1) - 1)`, which is non-negative and well within `isize`.
>>>> +        Delta::<Jiffy>::from_jiffies(jiffies as isize)
>>>> +    }
>>> 
>>> This should be using nsec_to_jiffies?
>>
>> nsecs_to_jiffies() is documented as unsuitable here, time.c says:
>>
>>     Unlike {m,u}secs_to_jiffies, type of input is not unsigned int but
>>     u64.  And this doesn't return MAX_JIFFY_OFFSET since this function
>>     is designed for scheduler, not for use in device drivers to
>>     calculate timeout value.
>>
>> It also truncates, so it's not suitable for a timeout.
>>
>> __msecs_to_jiffies() is the timeout-oriented helper: it rounds up and
>> saturates to MAX_JIFFY_OFFSET, which is what a timeout wants.
> 
> Which sounds like is what exactly is suitable here. What you want should be a
> different named function that does the ceiling and clamping?

Agreed, the ceiling and clamping should not hide behind a plan
conversion name.

I will rename it to to_jiffies_timeout() as Andreas suggested.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.