]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rust: workqueue: add delayed work support for ARef<T>
authorDaniel Almeida <daniel.almeida@collabora.com>
Mon, 23 Mar 2026 23:27:01 +0000 (20:27 -0300)
committerAlice Ryhl <aliceryhl@google.com>
Thu, 26 Mar 2026 13:08:48 +0000 (13:08 +0000)
The preceding patches added support for ARef<T> work items. By the same
token, add support for delayed work items too.

The rationale is the same: it may be convenient or even necessary at times
to implement HasDelayedWork directly on ARef<T>. A follow up patch will
also implement support for drm::Device as the first user.

Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Acked-by: Danilo Krummrich <dakr@kernel.org>
Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com>
Link: https://lore.kernel.org/r/20260323-aref-workitem-v3-3-f59729b812aa@collabora.com
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
rust/kernel/workqueue.rs

index 6ae7f3fb3496a0e6fef02448def1624b0c280685..4ee4ff56719767cd253733dd9336d179ef445224 100644 (file)
@@ -1007,6 +1007,17 @@ where
     }
 }
 
+// SAFETY: By the safety requirements of `HasDelayedWork`, the `work_struct` returned by methods in
+// `HasWork` provides a `work_struct` that is the `work` field of a `delayed_work`, and the rest of
+// the `delayed_work` has the same access rules as its `work` field.
+unsafe impl<T, const ID: u64> RawDelayedWorkItem<ID> for ARef<T>
+where
+    T: WorkItem<ID, Pointer = Self>,
+    T: HasDelayedWork<T, ID>,
+    T: AlwaysRefCounted,
+{
+}
+
 /// Returns the system work queue (`system_wq`).
 ///
 /// It is the one used by `schedule[_delayed]_work[_on]()`. Multi-CPU multi-threaded. There are