History

rust: hrtimer: add clocksource selection through `ClockId`

Allow selecting a clock source for timers by passing a `ClockId` variant to `HrTimer::new`.

Andreas Hindborg committed 1 year ago

Commit aa33de01 parent bfa3a412 files · +69 −2Browse files

Unified · Split

2 files
  1. rust/kernel/time.rs +66 −0
  2. rust/kernel/time/hrtimer.rs +3 −2
rust/kernel/time.rs+66−0
@@ -83,3 +83,69 @@ impl core::ops::Sub for Ktime { · 82 unmodified lines
8383 }
8484 }
8585 }
86+
87+/// An identifier for a clock. Used when specifying clock sources.
88+///
89+///
90+/// Selection of the clock depends on the use case. In some cases the usage of a
91+/// particular clock is mandatory, e.g. in network protocols, filesystems.In other
92+/// cases the user of the clock has to decide which clock is best suited for the
93+/// purpose. In most scenarios clock [`ClockId::Monotonic`] is the best choice as it
94+/// provides a accurate monotonic notion of time (leap second smearing ignored).
95+#[derive(Clone, Copy, PartialEq, Eq, Debug)]
96+#[repr(u32)]
97+pub enum ClockId {
98+ /// A settable system-wide clock that measures real (i.e., wall-clock) time.
99+ ///
100+ /// Setting this clock requires appropriate privileges. This clock is
101+ /// affected by discontinuous jumps in the system time (e.g., if the system
102+ /// administrator manually changes the clock), and by frequency adjustments
103+ /// performed by NTP and similar applications via adjtime(3), adjtimex(2),
104+ /// clock_adjtime(2), and ntp_adjtime(3). This clock normally counts the
105+ /// number of seconds since 1970-01-01 00:00:00 Coordinated Universal Time
106+ /// (UTC) except that it ignores leap seconds; near a leap second it may be
107+ /// adjusted by leap second smearing to stay roughly in sync with UTC. Leap
108+ /// second smearing applies frequency adjustments to the clock to speed up
109+ /// or slow down the clock to account for the leap second without
110+ /// discontinuities in the clock. If leap second smearing is not applied,
111+ /// the clock will experience discontinuity around leap second adjustment.
112+ RealTime = bindings::CLOCK_REALTIME,
113+ /// A monotonically increasing clock.
114+ ///
115+ /// A nonsettable system-wide clock that represents monotonic time since—as
116+ /// described by POSIX—"some unspecified point in the past". On Linux, that
117+ /// point corresponds to the number of seconds that the system has been
118+ /// running since it was booted.
119+ ///
120+ /// The CLOCK_MONOTONIC clock is not affected by discontinuous jumps in the
121+ /// CLOCK_REAL (e.g., if the system administrator manually changes the
122+ /// clock), but is affected by frequency adjustments. This clock does not
123+ /// count time that the system is suspended.
124+ Monotonic = bindings::CLOCK_MONOTONIC,
125+ /// A monotonic that ticks while system is suspended.
126+ ///
127+ /// A nonsettable system-wide clock that is identical to CLOCK_MONOTONIC,
128+ /// except that it also includes any time that the system is suspended. This
129+ /// allows applications to get a suspend-aware monotonic clock without
130+ /// having to deal with the complications of CLOCK_REALTIME, which may have
131+ /// discontinuities if the time is changed using settimeofday(2) or similar.
132+ BootTime = bindings::CLOCK_BOOTTIME,
133+ /// International Atomic Time.
134+ ///
135+ /// A system-wide clock derived from wall-clock time but counting leap seconds.
136+ ///
137+ /// This clock is coupled to CLOCK_REALTIME and will be set when CLOCK_REALTIME is
138+ /// set, or when the offset to CLOCK_REALTIME is changed via adjtimex(2). This
139+ /// usually happens during boot and **should** not happen during normal operations.
140+ /// However, if NTP or another application adjusts CLOCK_REALTIME by leap second
141+ /// smearing, this clock will not be precise during leap second smearing.
142+ ///
143+ /// The acronym TAI refers to International Atomic Time.
144+ TAI = bindings::CLOCK_TAI,
145+}
146+
147+impl ClockId {
148+ fn into_c(self) -> bindings::clockid_t {
149+ self as bindings::clockid_t
150+ }
151+}
rust/kernel/time/hrtimer.rs+3−2
@@ -67,6 +67,7 @@ · 66 unmodified lines
6767 //! A `restart` operation on a timer in the **stopped** state is equivalent to a
6868 //! `start` operation.
6969
70+use super::ClockId;
7071 use crate::{init::PinInit, prelude::*, time::Ktime, types::Opaque};
7172 use core::marker::PhantomData;
7273
@@ -94,7 +95,7 @@ unsafe impl<T> Sync for HrTimer<T> {} · 21 unmodified lines
9495
9596 impl<T> HrTimer<T> {
9697 /// Return an initializer for a new timer instance.
97− pub fn new(mode: HrTimerMode) -> impl PinInit<Self>
98+ pub fn new(mode: HrTimerMode, clock: ClockId) -> impl PinInit<Self>
9899 where
99100 T: HrTimerCallback,
100101 {
@@ -108,7 +109,7 @@ impl<T> HrTimer<T> { · 7 unmodified lines
108109 bindings::hrtimer_setup(
109110 place,
110111 Some(T::Pointer::run),
111− bindings::CLOCK_MONOTONIC as i32,
112+ clock.into_c(),
112113 mode.into_c(),
113114 );
114115 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t