rust: hrtimer: Add HrTimer::expires()

Add a simple callback for retrieving the current expiry time for an
HrTimer. In rvkms, we use the HrTimer expiry value in order to calculate
the approximate vblank timestamp during each emulated vblank interrupt.

Signed-off-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org>
Link: https://lore.kernel.org/r/20250821193259.964504-8-lyude@redhat.com
Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
This commit is contained in:
Lyude Paul 2025-08-21 15:32:47 -04:00 committed by Andreas Hindborg
parent 583802cc99
commit 4b01474942
2 changed files with 23 additions and 1 deletions

View File

@ -211,7 +211,6 @@ pub(crate) fn as_nanos(&self) -> i64 {
/// # Safety /// # Safety
/// ///
/// The caller promises that `ktime` is in the range from 0 to `KTIME_MAX`. /// The caller promises that `ktime` is in the range from 0 to `KTIME_MAX`.
#[expect(unused)]
#[inline] #[inline]
pub(crate) unsafe fn from_ktime(ktime: bindings::ktime_t) -> Self { pub(crate) unsafe fn from_ktime(ktime: bindings::ktime_t) -> Self {
debug_assert!(ktime >= 0); debug_assert!(ktime >= 0);

View File

@ -223,6 +223,29 @@ pub fn forward_now(self: Pin<&mut Self>, interval: Delta) -> u64
{ {
self.forward(HrTimerInstant::<T>::now(), interval) self.forward(HrTimerInstant::<T>::now(), interval)
} }
/// Return the time expiry for this [`HrTimer`].
///
/// This value should only be used as a snapshot, as the actual expiry time could change after
/// this function is called.
pub fn expires(&self) -> HrTimerInstant<T>
where
T: HasHrTimer<T>,
{
// SAFETY: `self` is an immutable reference and thus always points to a valid `HrTimer`.
let c_timer_ptr = unsafe { HrTimer::raw_get(self) };
// SAFETY:
// - Timers cannot have negative ktime_t values as their expiration time.
// - There's no actual locking here, a racy read is fine and expected
unsafe {
Instant::from_ktime(
// This `read_volatile` is intended to correspond to a READ_ONCE call.
// FIXME(read_once): Replace with `read_once` when available on the Rust side.
core::ptr::read_volatile(&raw const ((*c_timer_ptr).node.expires)),
)
}
}
} }
/// Implemented by pointer types that point to structs that contain a [`HrTimer`]. /// Implemented by pointer types that point to structs that contain a [`HrTimer`].