twx-linux/rust/kernel
Alice Ryhl 7c098cd5ea workqueue: rust: add delayed work items
This patch is being sent for use in the various Rust GPU drivers that
are under development. It provides the additional feature of work items
that are executed after a delay.

The design of the existing workqueue is rather extensible, as most of
the logic is reused for delayed work items even though a different work
item type is required. The new logic consists of:

* A new DelayedWork struct that wraps struct delayed_work.
* A new impl_has_delayed_work! macro that provides adjusted versions of
  the container_of logic, that is suitable with delayed work items.
* A `enqueue_delayed` method that can enqueue a delayed work item.

This patch does *not* rely on the fact that `struct delayed_work`
contains `struct work_struct` at offset zero. It will continue to work
even if the layout is changed to hold the `work` field at a different
offset.

Please see the example introduced at the top of the file for example
usage of delayed work items.

Acked-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20250711-workqueue-delay-v3-1-3fe17b18b9d1@google.com
[ Replaced `as _` with `as ffi::c_int` to clean warning. - Miguel ]
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
2025-07-15 22:54:52 +02:00
..
alloc rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00
block pin-init changes for v6.17 2025-07-13 23:05:14 +02:00
drm rust: types: add Opaque::cast_from 2025-07-15 21:01:48 +02:00
fs rust: enable clippy::ref_as_ptr lint 2025-06-22 23:09:32 +02:00
list rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
mm rust: enable clippy::as_underscore lint 2025-06-22 23:09:17 +02:00
net rust: enable clippy::cast_lossless lint 2025-06-22 23:09:25 +02:00
sync rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00
time rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
.gitignore rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
alloc.rs rust: alloc: add missing Markdown code spans 2025-05-25 22:58:35 +02:00
auxiliary.rs Rust changes for v6.16 2025-06-04 21:18:37 -07:00
block.rs rust: block: introduce kernel::block::mq module 2024-06-14 07:45:04 -06:00
build_assert.rs rust: add build_error! to the prelude 2025-01-10 00:19:09 +01:00
clk.rs rust: Use consistent "# Examples" heading style in rustdoc 2025-06-24 01:02:30 +02:00
configfs.rs rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
cpu.rs rust: cpu: Add CpuId::current() to retrieve current CPU ID 2025-06-12 10:31:28 +05:30
cpufreq.rs rust: Use consistent "# Examples" heading style in rustdoc 2025-06-24 01:02:30 +02:00
cpumask.rs rust: Use consistent "# Examples" heading style in rustdoc 2025-06-24 01:02:30 +02:00
cred.rs cred,rust: mark Credential methods inline 2025-03-04 17:07:49 -05:00
device_id.rs rust: enable clippy::ref_as_ptr lint 2025-06-22 23:09:32 +02:00
device.rs rust: enable clippy::ptr_as_ptr lint 2025-06-22 23:08:42 +02:00
devres.rs rust: Use consistent "# Examples" heading style in rustdoc 2025-06-24 01:02:30 +02:00
dma.rs rust: enable clippy::as_underscore lint 2025-06-22 23:09:17 +02:00
driver.rs rust: make pin-init its own crate 2025-03-16 21:59:19 +01:00
error.rs rust: enable clippy::as_underscore lint 2025-06-22 23:09:17 +02:00
faux.rs rust/kernel/faux: mark Registration methods inline 2025-03-11 10:42:23 +01:00
firmware.rs rust: Use consistent "# Examples" heading style in rustdoc 2025-06-24 01:02:30 +02:00
fs.rs rust: file: add Rust abstraction for struct file 2024-09-30 13:02:28 +02:00
generated_arch_static_branch_asm.rs.S rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
init.rs rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
io.rs rust: io: avoid mentioning private fields in IoMem 2025-06-24 01:02:30 +02:00
ioctl.rs rust: start using the #[expect(...)] attribute 2024-10-07 21:39:57 +02:00
jump_label.rs rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
kunit.rs rust: kunit: use crate-level mapping for c_void 2025-06-24 00:55:22 +02:00
lib.rs rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
list.rs rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
miscdevice.rs rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00
mm.rs mm: rust: make CONFIG_MMU ifdefs more narrow 2025-05-31 22:46:12 -07:00
net.rs rust: core abstractions for network PHY drivers 2023-12-15 09:35:50 +00:00
of.rs rust: enable clippy::as_underscore lint 2025-06-22 23:09:17 +02:00
opp.rs rust: Use consistent "# Examples" heading style in rustdoc 2025-06-24 01:02:30 +02:00
page.rs rust: page: optimize rust symbol generation for Page 2025-05-12 00:20:25 +02:00
pci.rs rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00
pid_namespace.rs rust: add PidNamespace 2024-10-08 15:44:36 +02:00
platform.rs rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00
prelude.rs rust: uaccess: use newtype for user pointers 2025-07-14 23:52:45 +02:00
print.rs rust: enable clippy::ptr_as_ptr lint 2025-06-22 23:08:42 +02:00
rbtree.rs rust: rbtree: simplify finding current in remove_current 2025-07-14 23:53:35 +02:00
revocable.rs rust: revocable: document why &T is not used in RevocableGuard 2025-06-29 18:54:54 +02:00
security.rs lsm,rust: reword "destroy" -> "release" in SecurityCtx 2025-03-04 15:44:46 -05:00
seq_file.rs rust: enable clippy::ptr_as_ptr lint 2025-06-22 23:08:42 +02:00
sizes.rs rust: sizes: add commonly used constants 2024-08-30 10:27:34 +01:00
static_assert.rs rust: use absolute paths in macros referencing core and kernel 2025-05-23 00:12:14 +02:00
std_vendor.rs rust: convert raw URLs to Markdown autolinks in comments 2025-05-12 00:20:25 +02:00
str.rs rust: enable clippy::ref_as_ptr lint 2025-06-22 23:09:32 +02:00
sync.rs rust: Use consistent "# Examples" heading style in rustdoc 2025-06-24 01:02:30 +02:00
task.rs rust: task: add missing Markdown code spans and intra-doc links 2025-05-25 22:58:35 +02:00
time.rs rust: time: Introduce Instant type 2025-04-29 15:31:07 +02:00
tracepoint.rs rust: add tracepoint support 2024-11-04 16:21:44 -05:00
transmute.rs rust: kernel: move FromBytes and AsBytes traits to a new transmute module 2024-10-10 00:33:42 +02:00
types.rs rust: types: rename Opaque::raw_get to cast_into 2025-07-15 22:26:11 +02:00
uaccess.rs rust: uaccess: use newtype for user pointers 2025-07-14 23:52:45 +02:00
workqueue.rs workqueue: rust: add delayed work items 2025-07-15 22:54:52 +02:00
xarray.rs rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00