[PATCH v2 00/14] hrtimer Rust API

From: Andreas Hindborg
Date: Tue Sep 17 2024 - 18:29:01 EST


Hi!

This series adds support for using the `hrtimer` subsystem from Rust code.

I tried breaking up the code in some smaller patches, hopefully that will
ease the review process a bit.

The major change in this series is the use of a handle to carry ownership
of the callback target. In v1, we used the armed timer to carry ownership
of the callback target. This caused issues when the live timer became the
last owner of the callback target, because the target would be dropped in
timer callback context. That is solved by using a handle instead.

A request from Thomas on v1 was to add a more complete API. While I did add
more features, we are still missing some. In the interest of getting the
patches on list prior to LPC 2024, I am leaving out the following planned
features:

- hrtimer_sleeper, schedule_hrtimeout, hrtimer_nanosleep and friends
- introspection functions:
- try_cancel
- get_remaining
- active
- queued
- callback_running
- hrtimer_forward
- access to timer callback target through timer handle

I plan to add these features in the comming months. Adding the above
features should not cause much churn, and pending positive review, I see no
reason to not pick up this series first.

To make it absolutely clear that I am willing to maintain the code I
submit, I added a mantainer entry in the last patch. Feel free to drop it,
if you want to make other arrangements.

---

Changes from v1:
- use a handle to own the timer callback target
- add ability to for callback to reschedule timer
- improve `impl_has_timer` to allow generics
- add support for stack allocated timers
- add support for scheduling closures
- use `Ktime` for setting expiration
- use `CondVar` instead of `AtomicBool` in examples
- rebase on 6.11
- improve documentation

This series is a dependency for unmerged features of the Rust null block driver
[1], and for rkvms [2].

Link: https://git.kernel.org/pub/scm/linux/kernel/git/a.hindborg/linux.git/log/?h=rnull-v6.11-rc2 [1]
Link: https://gitlab.freedesktop.org/lyudess/linux/-/tree/rvkms-wip [2]

---

Andreas Hindborg (13):
rust: hrtimer: introduce hrtimer support
rust: sync: add `Arc::as_ptr`
rust: sync: add `Arc::clone_from_raw`
rust: hrtimer: implement `TimerPointer` for `Arc`
rust: hrtimer: allow timer restart from timer handler
rust: hrtimer: add `UnsafeTimerPointer`
rust: hrtimer: implement `UnsafeTimerPointer` for `Pin<&T>`
rust: hrtimer: implement `UnsafeTimerPointer` for `Pin<&mut T>`
rust: hrtimer: add `hrtimer::ScopedTimerPointer`
rust: hrtimer: allow specifying a distinct callback parameter
rust: hrtimer: implement `TimerPointer` for `Pin<Box<T>>`
rust: hrtimer: add `schedule_function` to schedule closures
rust: hrtimer: add maintainer entry

Lyude Paul (1):
rust: time: Add Ktime::from_ns()

MAINTAINERS | 10 +
rust/kernel/hrtimer.rs | 550 +++++++++++++++++++++++++++++++++
rust/kernel/hrtimer/arc.rs | 86 ++++++
rust/kernel/hrtimer/closure.rs | 72 +++++
rust/kernel/hrtimer/pin.rs | 97 ++++++
rust/kernel/hrtimer/pin_mut.rs | 99 ++++++
rust/kernel/hrtimer/tbox.rs | 95 ++++++
rust/kernel/lib.rs | 1 +
rust/kernel/sync/arc.rs | 28 ++
rust/kernel/time.rs | 8 +
10 files changed, 1046 insertions(+)
create mode 100644 rust/kernel/hrtimer.rs
create mode 100644 rust/kernel/hrtimer/arc.rs
create mode 100644 rust/kernel/hrtimer/closure.rs
create mode 100644 rust/kernel/hrtimer/pin.rs
create mode 100644 rust/kernel/hrtimer/pin_mut.rs
create mode 100644 rust/kernel/hrtimer/tbox.rs


base-commit: 98f7e32f20d28ec452afb208f9cffc08448a2652
--
2.46.0