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`.
#[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
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 > >
© 2016 - 2024 Red Hat, Inc.