Message ID | 20241025033118.44452-4-fujita.tomonori@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | rust: Add IO polling | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessing tree name failed - patch did not apply |
On Fri, Oct 25, 2024 at 12:31:14PM +0900, FUJITA Tomonori wrote: > Introduce a type representing a specific point in time. We could use > the Ktime type but C's ktime_t is used for both timestamp and > timedelta. To avoid confusion, introduce a new Instant type for > timestamp. > > Rename Ktime to Instant and modify their methods for timestamp. > > Implement the subtraction operator for Instant: > > Delta = Instant A - Instant B > > The operation never overflows (Instant ranges from 0 to > `KTIME_MAX`). > > Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> > --- > rust/kernel/time.rs | 48 +++++++++++++++------------------------------ > 1 file changed, 16 insertions(+), 32 deletions(-) > > diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs > index 574e72d3956b..3cc1a8a76777 100644 > --- a/rust/kernel/time.rs > +++ b/rust/kernel/time.rs > @@ -31,59 +31,43 @@ pub fn msecs_to_jiffies(msecs: Msecs) -> Jiffies { > unsafe { bindings::__msecs_to_jiffies(msecs) } > } > > -/// A Rust wrapper around a `ktime_t`. > +/// A specific point in time. > #[repr(transparent)] > #[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord)] > -pub struct Ktime { > +pub struct Instant { > + // Range from 0 to `KTIME_MAX`. > inner: bindings::ktime_t, > } > > -impl Ktime { > - /// Create a `Ktime` from a raw `ktime_t`. > +impl Instant { > + /// Create a `Instant` from a raw `ktime_t`. > #[inline] > - pub fn from_raw(inner: bindings::ktime_t) -> Self { > + fn from_raw(inner: bindings::ktime_t) -> Self { > Self { inner } > } > > /// Get the current time using `CLOCK_MONOTONIC`. I think eventually we want to have the `Instant` generic over clocksource, i.e. an `Instant<MONOTOMIC>` cannot substract an `Instant<BOOTTIME>`, but that's something we can do later. Reviewed-by: Boqun Feng <boqun.feng@gmail.com> Regards, Boqun > #[inline] > - pub fn ktime_get() -> Self { > + pub fn now() -> Self { > // SAFETY: It is always safe to call `ktime_get` outside of NMI context. > Self::from_raw(unsafe { bindings::ktime_get() }) > } > > - /// Divide the number of nanoseconds by a compile-time constant. > #[inline] > - fn divns_constant<const DIV: i64>(self) -> i64 { > - self.to_ns() / DIV > - } > - > - /// Returns the number of nanoseconds. > - #[inline] > - pub fn to_ns(self) -> i64 { > - self.inner > - } > - > - /// Returns the number of milliseconds. > - #[inline] > - pub fn to_ms(self) -> i64 { > - self.divns_constant::<NSEC_PER_MSEC>() > + /// Return the amount of time elapsed since the `Instant`. > + pub fn elapsed(&self) -> Delta { > + Self::now() - *self > } > } > > -/// Returns the number of milliseconds between two ktimes. > -#[inline] > -pub fn ktime_ms_delta(later: Ktime, earlier: Ktime) -> i64 { > - (later - earlier).to_ms() > -} > - > -impl core::ops::Sub for Ktime { > - type Output = Ktime; > +impl core::ops::Sub for Instant { > + type Output = Delta; > > + // never overflows > #[inline] > - fn sub(self, other: Ktime) -> Ktime { > - Self { > - inner: self.inner - other.inner, > + fn sub(self, other: Instant) -> Delta { > + Delta { > + nanos: self.inner - other.inner, > } > } > } > -- > 2.43.0 > >
diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs index 574e72d3956b..3cc1a8a76777 100644 --- a/rust/kernel/time.rs +++ b/rust/kernel/time.rs @@ -31,59 +31,43 @@ pub fn msecs_to_jiffies(msecs: Msecs) -> Jiffies { unsafe { bindings::__msecs_to_jiffies(msecs) } } -/// A Rust wrapper around a `ktime_t`. +/// A specific point in time. #[repr(transparent)] #[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord)] -pub struct Ktime { +pub struct Instant { + // Range from 0 to `KTIME_MAX`. inner: bindings::ktime_t, } -impl Ktime { - /// Create a `Ktime` from a raw `ktime_t`. +impl Instant { + /// Create a `Instant` from a raw `ktime_t`. #[inline] - pub fn from_raw(inner: bindings::ktime_t) -> Self { + fn from_raw(inner: bindings::ktime_t) -> Self { Self { inner } } /// Get the current time using `CLOCK_MONOTONIC`. #[inline] - pub fn ktime_get() -> Self { + pub fn now() -> Self { // SAFETY: It is always safe to call `ktime_get` outside of NMI context. Self::from_raw(unsafe { bindings::ktime_get() }) } - /// Divide the number of nanoseconds by a compile-time constant. #[inline] - fn divns_constant<const DIV: i64>(self) -> i64 { - self.to_ns() / DIV - } - - /// Returns the number of nanoseconds. - #[inline] - pub fn to_ns(self) -> i64 { - self.inner - } - - /// Returns the number of milliseconds. - #[inline] - pub fn to_ms(self) -> i64 { - self.divns_constant::<NSEC_PER_MSEC>() + /// Return the amount of time elapsed since the `Instant`. + pub fn elapsed(&self) -> Delta { + Self::now() - *self } } -/// Returns the number of milliseconds between two ktimes. -#[inline] -pub fn ktime_ms_delta(later: Ktime, earlier: Ktime) -> i64 { - (later - earlier).to_ms() -} - -impl core::ops::Sub for Ktime { - type Output = Ktime; +impl core::ops::Sub for Instant { + type Output = Delta; + // never overflows #[inline] - fn sub(self, other: Ktime) -> Ktime { - Self { - inner: self.inner - other.inner, + fn sub(self, other: Instant) -> Delta { + Delta { + nanos: self.inner - other.inner, } } }
Introduce a type representing a specific point in time. We could use the Ktime type but C's ktime_t is used for both timestamp and timedelta. To avoid confusion, introduce a new Instant type for timestamp. Rename Ktime to Instant and modify their methods for timestamp. Implement the subtraction operator for Instant: Delta = Instant A - Instant B The operation never overflows (Instant ranges from 0 to `KTIME_MAX`). Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> --- rust/kernel/time.rs | 48 +++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 32 deletions(-)