linux/rust/kernel
Danilo Krummrich f5d3ef25d2 rust: devres: get rid of Devres' inner Arc
So far Devres uses an inner memory allocation and reference count, i.e.
an inner Arc, in order to ensure that the devres callback can't run into
a use-after-free in case where the Devres object is dropped while the
devres callback runs concurrently.

Instead, use a completion in order to avoid a potential UAF: In
Devres::drop(), if we detect that we can't remove the devres action
anymore, we wait for the completion that is completed from the devres
callback. If, in turn, we were able to successfully remove the devres
action, we can just go ahead.

This, again, allows us to get rid of the internal Arc, and instead let
Devres consume an `impl PinInit<T, E>` in order to return an
`impl PinInit<Devres<T>, E>`, which enables us to get away with less
memory allocations.

Additionally, having the resulting explicit synchronization in
Devres::drop() prevents potential subtle undesired side effects of the
devres callback dropping the final Arc reference asynchronously within
the devres callback.

Reviewed-by: Benno Lossin <lossin@kernel.org>
Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
Link: https://lore.kernel.org/r/20250626200054.243480-4-dakr@kernel.org
[ Move '# Invariants' below '# Examples'. - Danilo ]
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
2025-06-28 18:08:50 +02:00
..
alloc rust: alloc: add missing Markdown code span 2025-05-25 22:58:35 +02:00
block rust: pin-init: change blanket impls for [Pin]Init and add one for Result<T, E> 2025-06-11 21:13:56 +02:00
device rust: device: implement FwNode::is_of_node() 2025-06-25 18:10:12 +02:00
drm rust: devres: replace Devres::new_foreign_owned() 2025-06-28 18:06:53 +02:00
fs rust: file: improve safety comments 2025-05-30 07:12:05 +02:00
list rust: list: Fix typo much in arc.rs 2025-05-29 23:35:44 +02:00
mm mm: rust: make CONFIG_MMU ifdefs more narrow 2025-05-31 22:46:12 -07:00
net net: phy: pass PHY driver to .match_phy_device OP 2025-05-21 15:56:09 -07:00
sync rust: completion: implement initial abstraction 2025-06-13 23:46:56 +02:00
time rust: time: Fix compile error in impl_has_hr_timer macro 2025-06-10 20:11:36 +02:00
.gitignore rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
acpi.rs rust: acpi: add acpi::DeviceId abstraction 2025-06-26 23:22:17 +02: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: clk: Add initial abstractions 2025-05-19 12:55:40 +05:30
configfs.rs Rust changes for v6.16 2025-06-04 21:18:37 -07:00
cpu.rs rust: cpu: Add CpuId::current() to retrieve current CPU ID 2025-06-12 10:31:28 +05:30
cpufreq.rs rust: devres: replace Devres::new_foreign_owned() 2025-06-28 18:06:53 +02:00
cpumask.rs rust: Use CpuId in place of raw CPU numbers 2025-06-12 10:31:28 +05:30
cred.rs cred,rust: mark Credential methods inline 2025-03-04 17:07:49 -05:00
device.rs rust: device: Move property_present() to FwNode 2025-06-13 00:58:52 +02:00
device_id.rs rust: use absolute paths in macros referencing core and kernel 2025-05-23 00:12:14 +02:00
devres.rs rust: devres: get rid of Devres' inner Arc 2025-06-28 18:08:50 +02:00
dma.rs Rust changes for v6.16 2025-06-04 21:18:37 -07:00
driver.rs rust: driver: Add ACPI id table support to Adapter trait 2025-06-26 23:26:10 +02:00
error.rs Rust changes for v6.15 2025-03-30 17:03:26 -07:00
faux.rs rust/kernel/faux: mark Registration methods inline 2025-03-11 10:42:23 +01:00
firmware.rs rust: firmware: Use ffi::c_char type in FwFunc 2025-04-14 14:13:23 +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 changes for v6.15 2025-03-30 17:03:26 -07:00
io.rs rust: io: rename io::Io accessors 2025-02-22 15:44:19 +01: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: add kunit_tests to the prelude 2025-05-27 20:09:59 +02:00
lib.rs rust: acpi: add acpi::DeviceId abstraction 2025-06-26 23:22:17 +02:00
list.rs rust: list: Add examples for linked list 2025-05-22 12:00:52 +02:00
miscdevice.rs Char/Misc/IIO pull request for 6.16-rc1 2025-06-06 11:50:47 -07: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: of: add of::DeviceId abstraction 2024-12-20 17:21:04 +01:00
opp.rs rust: opp: Move cfg(CONFIG_OF) attribute to the top of doc test 2025-05-27 15:29:17 +02:00
page.rs rust: page: optimize rust symbol generation for Page 2025-05-12 00:20:25 +02:00
pci.rs rust: devres: get rid of Devres' inner Arc 2025-06-28 18:08:50 +02:00
pid_namespace.rs rust: add PidNamespace 2024-10-08 15:44:36 +02:00
platform.rs rust: platform: Add ACPI match table support to Driver trait 2025-06-26 23:26:15 +02:00
prelude.rs rust: add kunit_tests to the prelude 2025-05-27 20:09:59 +02:00
print.rs rust: replace rustdoc references to alloc::format 2025-05-12 00:20:25 +02:00
rbtree.rs rust: retain pointer mut-ness in container_of! 2025-05-28 18:54:09 +02:00
revocable.rs rust: revocable: support fallible PinInit types 2025-06-28 18:06:52 +02:00
security.rs lsm,rust: reword "destroy" -> "release" in SecurityCtx 2025-03-04 15:44:46 -05:00
seq_file.rs Rust changes for v6.15 2025-03-30 17:03:26 -07: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: str: take advantage of the -> Result support in KUnit #[test]'s 2025-05-27 20:09:59 +02:00
sync.rs rust: completion: implement initial abstraction 2025-06-13 23:46:56 +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: implement Wrapper<T> for Opaque<T> 2025-06-28 14:58:08 +02:00
uaccess.rs Alloc changes for v6.16 2025-05-18 20:56:03 +02:00
workqueue.rs rust: workqueue: remove HasWork::OFFSET 2025-05-29 01:34:52 +02:00
xarray.rs rust: xarray: Add an abstraction for XArray 2025-05-01 11:37:59 +02:00