| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- // SPDX-License-Identifier: GPL-2.0
- //! Time related primitives.
- //!
- //! This module contains the kernel APIs related to time and timers that
- //! have been ported or wrapped for usage by Rust code in the kernel.
- //!
- //! C header: [`include/linux/jiffies.h`](srctree/include/linux/jiffies.h).
- //! C header: [`include/linux/ktime.h`](srctree/include/linux/ktime.h).
- /// The number of nanoseconds per millisecond.
- pub const NSEC_PER_MSEC: i64 = bindings::NSEC_PER_MSEC as i64;
- /// The time unit of Linux kernel. One jiffy equals (1/HZ) second.
- pub type Jiffies = crate::ffi::c_ulong;
- /// The millisecond time unit.
- pub type Msecs = crate::ffi::c_uint;
- /// Converts milliseconds to jiffies.
- #[inline]
- pub fn msecs_to_jiffies(msecs: Msecs) -> Jiffies {
- // SAFETY: The `__msecs_to_jiffies` function is always safe to call no
- // matter what the argument is.
- unsafe { bindings::__msecs_to_jiffies(msecs) }
- }
- /// A Rust wrapper around a `ktime_t`.
- #[repr(transparent)]
- #[derive(Copy, Clone)]
- pub struct Ktime {
- inner: bindings::ktime_t,
- }
- impl Ktime {
- /// Create a `Ktime` from a raw `ktime_t`.
- #[inline]
- pub fn from_raw(inner: bindings::ktime_t) -> Self {
- Self { inner }
- }
- /// Get the current time using `CLOCK_MONOTONIC`.
- #[inline]
- pub fn ktime_get() -> 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>()
- }
- }
- /// 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;
- #[inline]
- fn sub(self, other: Ktime) -> Ktime {
- Self {
- inner: self.inner - other.inner,
- }
- }
- }
|