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

Showing the changes to rust/kernel (2 of 2 files). Show all

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
83 }83 }
84 }84 }
85}85}
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)]
97pub 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
147impl 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
67//! A `restart` operation on a timer in the **stopped** state is equivalent to a67//! A `restart` operation on a timer in the **stopped** state is equivalent to a
68//! `start` operation.68//! `start` operation.
69 69
70use super::ClockId;
70use crate::{init::PinInit, prelude::*, time::Ktime, types::Opaque};71use crate::{init::PinInit, prelude::*, time::Ktime, types::Opaque};
71use core::marker::PhantomData;72use core::marker::PhantomData;
72 73
@@ -94,7 +95,7 @@ unsafe impl<T> Sync for HrTimer<T> {} · 21 unmodified lines
94 95
95impl<T> HrTimer<T> {96impl<T> HrTimer<T> {
96 /// Return an initializer for a new timer instance.97 /// 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>
98 where99 where
99 T: HrTimerCallback,100 T: HrTimerCallback,
100 {101 {
@@ -108,7 +109,7 @@ impl<T> HrTimer<T> { · 7 unmodified lines
108 bindings::hrtimer_setup(109 bindings::hrtimer_setup(
109 place,110 place,
110 Some(T::Pointer::run),111 Some(T::Pointer::run),
111 bindings::CLOCK_MONOTONIC as i32,112 clock.into_c(),
112 mode.into_c(),113 mode.into_c(),
113 );114 );
114 }115 }

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