[PATCH v3 0/2] rust: use Delta and new Jiffies type instead of raw jiffies for timeouts and delays
FUJITA Tomonori <[email protected]>
| Newsgroups | org.kernel.vger.rust-for-linux |
|---|---|
| Message-ID | <[email protected]> |
From: FUJITA Tomonori <[email protected]> CondVar::wait_interruptible_timeout() and Queue::enqueue_delayed() use a raw jiffies count (a plain c_ulong alias with no type safety). Callers have to know on their own that the value meant jiffies and convert to/from it themselves, which is easy to get wrong (e.g. passing a millisecond value where a jiffies value is expected). Unlike the previous versions, v3 introduces a dedicated `Jiffies` newtype instead. The APIs take `impl Into<Jiffies>`, so a caller can pass either a `Delta` (the duration is converted once, rounding up) or a `Jiffies` directly with no conversion. Jiffies returned by the C side stay as `Jiffies`, so a caller that works in jiffies never converts and the round trip is gone. Why a `Jiffies` type, but no `Micros`/`Nanos`/... types? `Delta` represents a span of time as a nanosecond count. Microseconds, milliseconds and seconds are exact multiples of a nanosecond, so they embed into `Delta` losslessly and round-trip through it losslessly; they are already covered by Delta's constructors and accessors (from_millis(), as_millis_ceil(), ...) and would gain nothing from their own types. A jiffy is 1/HZ of a second, which is generally not an exact number of nanoseconds (e.g. HZ=300). Converting between jiffies and Delta is therefore inherently lossy in both directions, and that is exactly what makes a jiffies count a distinct quantity -- a count of timer ticks -- rather than just another way to spell a Delta. So it, and only it, gets its own (unsigned) newtype. The Delta -> Jiffies conversion reuses the C `__msecs_to_jiffies()` helper -- the same routine the existing Rust `msecs_to_jiffies()` wrapper already called. The arithmetic (and the range clamping) is done on the C side so it works on 32-bit architectures. v3: - Add new Jiffies type and convert the APIs to take impl Into<Jiffies> v2: https://lore.kernel.org/rust-for-linux/[email protected]/ - Fix potential overflow in from_jiffies() - Fix inflating bug in as_jiffies_ceil() - Add a patch to convert enqueue_delayed() - Add a patch to remove Jiffies/Msecs aliases v1: https://lore.kernel.org/rust-for-linux/[email protected]/ FUJITA Tomonori (2): rust: time: add Delta::as_millis_ceil() rust: use Delta and a Jiffies newtype for timeouts and delays drivers/android/binder/process.rs | 7 ++-- rust/kernel/sync/condvar.rs | 21 +++++++--- rust/kernel/time.rs | 64 ++++++++++++++++++++++++++----- rust/kernel/workqueue.rs | 11 ++++-- 4 files changed, 82 insertions(+), 21 deletions(-) base-commit: 7059bdf4f04a3e14f4fafb3ac35fdca913e3e21a -- 2.43.0