linux/rust/kernel
Alice Ryhl a48026315c rust: list: add tracking for ListArc
Add the ability to track whether a ListArc exists for a given value,
allowing for the creation of ListArcs without going through UniqueArc.

The `impl_list_arc_safe!` macro is extended with a `tracked_by` strategy
that defers the tracking of ListArcs to a field of the struct.
Additionally, the AtomicListArcTracker type is introduced, which can
track whether a ListArc exists using an atomic. By deferring the
tracking to a field of type AtomicListArcTracker, structs gain the
ability to create ListArcs without going through a UniqueArc.

Rust Binder uses this for some objects where we want to be able to
insert them into a linked list at any time. Using the
AtomicListArcTracker, we are able to check whether an item is already in
the list, and if not, we can create a `ListArc` and push it.

The macro has the ability to defer the tracking of ListArcs to a field,
using whatever strategy that field has. Since we don't add any
strategies other than AtomicListArcTracker, another similar option would
be to hard-code that the field should be an AtomicListArcTracker.
However, Rust Binder has a case where the AtomicListArcTracker is not
stored directly in the struct, but in a sub-struct. Furthermore, the
outer struct is generic:

struct Wrapper<T: ?Sized> {
    links: ListLinks,
    inner: T,
}

Here, the Wrapper struct implements ListArcSafe with `tracked_by inner`,
and then the various types used with `inner` also uses the macro to
implement ListArcSafe. Some of them use the untracked strategy, and some
of them use tracked_by with an AtomicListArcTracker. This way, Wrapper
just inherits whichever choice `inner` has made.

Reviewed-by: Benno Lossin <benno.lossin@proton.me>
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20240814-linked-list-v5-3-f5f5e8075da0@google.com
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
2024-08-23 06:26:57 +02:00
..
alloc rust: kernel: add drop_contents to BoxExt 2024-08-22 00:16:06 +02:00
block rust: block: do not use removed queue flag API 2024-06-20 06:54:48 -06:00
init rust: init: add assert_pinned macro 2024-08-23 06:25:59 +02:00
list rust: list: add tracking for ListArc 2024-08-23 06:26:57 +02:00
net Rust changes for v6.10 2024-05-13 15:13:54 -07:00
sync rust: Implement the smart pointer InPlaceInit for Arc 2024-08-18 23:10:53 +02:00
alloc.rs rust: add abstraction for struct page 2024-07-08 23:44:01 +02:00
block.rs rust: block: introduce kernel::block::mq module 2024-06-14 07:45:04 -06:00
build_assert.rs rust: upgrade to Rust 1.68.2 2023-05-31 17:35:03 +02:00
device.rs device: rust: improve safety comments 2024-06-20 16:14:58 +02:00
error.rs rust: error: allow useless_conversion for 32-bit builds 2024-08-18 23:10:53 +02:00
firmware.rs rust: firmware: fix invalid rustdoc link 2024-07-31 13:24:29 +02:00
init.rs rust: init: add assert_pinned macro 2024-08-23 06:25:59 +02:00
ioctl.rs rust: kernel: mark code fragments in docs with backticks 2024-02-18 21:22:27 +01:00
kunit.rs rust: support srctree-relative links 2023-12-21 20:54:17 +01:00
lib.rs rust: list: add ListArc 2024-08-23 06:26:57 +02:00
list.rs rust: list: add tracking for ListArc 2024-08-23 06:26:57 +02:00
net.rs rust: core abstractions for network PHY drivers 2023-12-15 09:35:50 +00:00
page.rs rust: add abstraction for struct page 2024-07-08 23:44:01 +02:00
prelude.rs rust: init: add write_[pin_]init functions 2024-08-22 00:16:16 +02:00
print.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
static_assert.rs
std_vendor.rs rust: update dbg!() to format column number 2024-05-05 18:09:04 +02:00
str.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
sync.rs rust: sync: implement Default for LockClassKey 2024-05-05 19:22:25 +02:00
task.rs rust: kernel: remove redundant imports 2024-05-05 19:22:25 +02:00
time.rs rust: time: doc: Add missing C header links 2024-05-01 00:04:47 +02:00
types.rs rust: types: improve ForeignOwnable documentation 2024-08-18 23:10:53 +02:00
uaccess.rs rust: uaccess: add typed accessors for userspace pointers 2024-07-08 23:44:01 +02:00
workqueue.rs rust: kernel: make impl_has_work compatible with more generics 2024-07-08 22:39:39 +02:00