* [PATCH v12 0/1] rust: interop: Add list module for C linked list interface @ 2026-03-06 20:36 Joel Fernandes 2026-03-06 20:36 ` [PATCH v12 1/1] " Joel Fernandes 0 siblings, 1 reply; 11+ messages in thread From: Joel Fernandes @ 2026-03-06 20:36 UTC (permalink / raw) To: linux-kernel Cc: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Danilo Krummrich, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Alexandre Courbot, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev, Joel Fernandes The interop/list module provides Rust abstractions for iterating over C list_head-based linked lists. The primary use-case right now is iterating over GPU buddy allocator blocks. This series provides the interop/list module required for GPU buddy bindings, which is inturn required for nova-core memory memory management. This patch is being sent separately from the rest of the preparatory patches (DRM buddy movement, GPU buddy bindings, etc.) as it can go in independently. The git tree with the patch can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/jfern/linux.git (tag: interop-v12-20260306) Change log: Changes from v11 to v12: - Renamed module from ffi/clist to interop/list, reflecting community feedback that 'interop' better describes the purpose than 'ffi' (credit to Boqun for starting this idea.) - Updated MAINTAINERS entry from "RUST [FFI HELPER]" to "RUST [INTEROP]" and updated git tree reference. - Added Acked-by from Miguel. Changes from v10 to v11: - Sending only the ffi/clist patches separately from the rest of the preparatory series, as these can go in independently. - MAINTAINERS entry: Renamed from "RUST TO C LIST INTERFACES" to "RUST [FFI HELPER]" with (CLIST) scope annotations for maintainers, following Danilo's suggestion. Note: There is still an ongoing discussion about the MAINTAINER file entry naming between Miguel and Danilo: https://lore.kernel.org/all/DGJXYEXCYIII.Z6FOAA8YYMAZ@kernel.org/ - Updated clist.rs module documentation per Danilo's review: generalized the FFI usage description and added explicit note directing Rust-only users to kernel::list::List instead. - Implemented suggestions from Alice related to safety of CList wrt concurrent modifications. - Removed unnecessary trailing comment markers from example imports. - Added feature guard for offset_of_nested (Eliot). Changes from v9 to v10: - Combined clist/ffi patches into the larger "Preparatory patches for nova-core memory management" series (8 patches total). - Added new ffi module patch: Convert pub use to pub mod and create rust/kernel/ffi/mod.rs to host clist as a sub-module. - Moved clist from rust/kernel/clist.rs to rust/kernel/ffi/clist.rs. - Added Reviewed-by and Acked-by tags from Gary and Daniel. Changes from v8 to v9: - Added nova-core Kconfig change to select GPU_BUDDY. - Minor fixups. Changes from v7 to v8: - Various changes suggested by Danilo, Gary, Daniel. Added tags. Changes from v6 to v7: - Extracted clist and GPU buddy patches from the larger RFC v6 nova-core memory management series into a standalone series. - Changes based on suggestions by Gary and Dave. Changes from v5 to v6: - Part of the larger RFC v6 nova-core memory management series (26 patches). Changes from v4 to v5: - Part of the larger RFC v5 nova-core memory management series (6 patches). Changes from v3 to v4: - Combined the clist and DRM buddy series back together. - Added Rust bindings for the GPU buddy allocator. - Moved DRM buddy allocator one level up to drivers/gpu/ so it can be used by GPU drivers (e.g. nova-core) that have non-DRM usecases. Changes from v2 to v3: - Consolidated 3 patches into a single patch. Changes from v1 to v2: - Dropped the DRM buddy allocator patches. Series now focuses solely on the clist module. - Dropped samples and added doctests. - Added proper lifetime management similar to scatterlist. Link to v11: https://lore.kernel.org/all/20260224222734.3153931-1-joelagnelf@nvidia.com/ Link to v10: https://lore.kernel.org/all/20260218205507.689429-1-joelagnelf@nvidia.com/ Link to v9: https://lore.kernel.org/all/20260210233204.790524-1-joelagnelf@nvidia.com/ Link to v8: https://lore.kernel.org/all/20260209214246.2783990-1-joelagnelf@nvidia.com/ Link to v7: https://lore.kernel.org/all/20260206004110.1914814-1-joelagnelf@nvidia.com/ Joel Fernandes (1): rust: interop: Add list module for C linked list interface MAINTAINERS | 8 + rust/helpers/helpers.c | 1 + rust/helpers/list.c | 17 ++ rust/kernel/interop/list.rs | 338 ++++++++++++++++++++++++++++++++++++ rust/kernel/interop/mod.rs | 9 + rust/kernel/lib.rs | 2 + 6 files changed, 375 insertions(+) create mode 100644 rust/helpers/list.c create mode 100644 rust/kernel/interop/list.rs create mode 100644 rust/kernel/interop/mod.rs base-commit: 877552aa875839314afad7154b5a561889e87ea9 -- 2.34.1 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-06 20:36 [PATCH v12 0/1] rust: interop: Add list module for C linked list interface Joel Fernandes @ 2026-03-06 20:36 ` Joel Fernandes 2026-03-12 17:42 ` Danilo Krummrich ` (3 more replies) 0 siblings, 4 replies; 11+ messages in thread From: Joel Fernandes @ 2026-03-06 20:36 UTC (permalink / raw) To: linux-kernel Cc: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Danilo Krummrich, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Alexandre Courbot, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev, Joel Fernandes, Miguel Ojeda Add a new module `kernel::interop::list` for working with C's doubly circular linked lists. Provide low-level iteration over list nodes. Typed iteration over actual items is provided with a `clist_create` macro to assist in creation of the `CList` type. Cc: Nikola Djukic <ndjukic@nvidia.com> Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Acked-by: Alexandre Courbot <acourbot@nvidia.com> Acked-by: Gary Guo <gary@garyguo.net> Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> --- MAINTAINERS | 8 + rust/helpers/helpers.c | 1 + rust/helpers/list.c | 17 ++ rust/kernel/interop/list.rs | 338 ++++++++++++++++++++++++++++++++++++ rust/kernel/interop/mod.rs | 9 + rust/kernel/lib.rs | 2 + 6 files changed, 375 insertions(+) create mode 100644 rust/helpers/list.c create mode 100644 rust/kernel/interop/list.rs create mode 100644 rust/kernel/interop/mod.rs diff --git a/MAINTAINERS b/MAINTAINERS index 2842d7529a65..4c66f8261ff2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23219,6 +23219,14 @@ T: git https://github.com/Rust-for-Linux/linux.git alloc-next F: rust/kernel/alloc.rs F: rust/kernel/alloc/ +RUST [INTEROP] +M: Joel Fernandes <joelagnelf@nvidia.com> +M: Alexandre Courbot <acourbot@nvidia.com> +L: rust-for-linux@vger.kernel.org +S: Maintained +T: git https://github.com/Rust-for-Linux/linux.git interop-next +F: rust/kernel/interop/ + RUST [NUM] M: Alexandre Courbot <acourbot@nvidia.com> R: Yury Norov <yury.norov@gmail.com> diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c index a3c42e51f00a..724fcb8240ac 100644 --- a/rust/helpers/helpers.c +++ b/rust/helpers/helpers.c @@ -35,6 +35,7 @@ #include "io.c" #include "jump_label.c" #include "kunit.c" +#include "list.c" #include "maple_tree.c" #include "mm.c" #include "mutex.c" diff --git a/rust/helpers/list.c b/rust/helpers/list.c new file mode 100644 index 000000000000..18095a5593c5 --- /dev/null +++ b/rust/helpers/list.c @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Helpers for C circular doubly linked list implementation. + */ + +#include <linux/list.h> + +__rust_helper void rust_helper_INIT_LIST_HEAD(struct list_head *list) +{ + INIT_LIST_HEAD(list); +} + +__rust_helper void rust_helper_list_add_tail(struct list_head *new, struct list_head *head) +{ + list_add_tail(new, head); +} diff --git a/rust/kernel/interop/list.rs b/rust/kernel/interop/list.rs new file mode 100644 index 000000000000..bd6409f8bca2 --- /dev/null +++ b/rust/kernel/interop/list.rs @@ -0,0 +1,338 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Rust interface for C doubly circular intrusive linked lists. +//! +//! This module provides Rust abstractions for iterating over C `list_head`-based +//! linked lists. It should only be used for cases where C and Rust code share +//! direct access to the same linked list through a C interop interface. +//! +//! Note: This *must not* be used by Rust components that just need a linked list +//! primitive. Use [`kernel::list::List`] instead. +//! +//! # Examples +//! +//! ``` +//! use kernel::{ +//! bindings, +//! clist_create, +//! types::Opaque, +//! }; +//! # // Create test list with values (0, 10, 20) - normally done by C code but it is +//! # // emulated here for doctests using the C bindings. +//! # use core::mem::MaybeUninit; +//! # +//! # /// C struct with embedded `list_head` (typically will be allocated by C code). +//! # #[repr(C)] +//! # pub struct SampleItemC { +//! # pub value: i32, +//! # pub link: bindings::list_head, +//! # } +//! # +//! # let mut head = MaybeUninit::<bindings::list_head>::uninit(); +//! # +//! # let head = head.as_mut_ptr(); +//! # // SAFETY: head and all the items are test objects allocated in this scope. +//! # unsafe { bindings::INIT_LIST_HEAD(head) }; +//! # +//! # let mut items = [ +//! # MaybeUninit::<SampleItemC>::uninit(), +//! # MaybeUninit::<SampleItemC>::uninit(), +//! # MaybeUninit::<SampleItemC>::uninit(), +//! # ]; +//! # +//! # for (i, item) in items.iter_mut().enumerate() { +//! # let ptr = item.as_mut_ptr(); +//! # // SAFETY: `ptr` points to a valid `MaybeUninit<SampleItemC>`. +//! # unsafe { (*ptr).value = i as i32 * 10 }; +//! # // SAFETY: `&raw mut` creates a pointer valid for `INIT_LIST_HEAD`. +//! # unsafe { bindings::INIT_LIST_HEAD(&raw mut (*ptr).link) }; +//! # // SAFETY: `link` was just initialized and `head` is a valid list head. +//! # unsafe { bindings::list_add_tail(&mut (*ptr).link, head) }; +//! # } +//! +//! // Rust wrapper for the C struct. +//! // The list item struct in this example is defined in C code as: +//! // struct SampleItemC { +//! // int value; +//! // struct list_head link; +//! // }; +//! // +//! #[repr(transparent)] +//! pub struct Item(Opaque<SampleItemC>); +//! +//! impl Item { +//! pub fn value(&self) -> i32 { +//! // SAFETY: [`Item`] has same layout as [`SampleItemC`]. +//! unsafe { (*self.0.get()).value } +//! } +//! } +//! +//! // Create typed [`CList`] from sentinel head. +//! // SAFETY: head is valid and initialized, items are `SampleItemC` with +//! // embedded `link` field, and `Item` is `#[repr(transparent)]` over `SampleItemC`. +//! let list = clist_create!(unsafe { head, Item, SampleItemC, link }); +//! +//! // Iterate directly over typed items. +//! let mut found_0 = false; +//! let mut found_10 = false; +//! let mut found_20 = false; +//! +//! for item in list.iter() { +//! let val = item.value(); +//! if val == 0 { found_0 = true; } +//! if val == 10 { found_10 = true; } +//! if val == 20 { found_20 = true; } +//! } +//! +//! assert!(found_0 && found_10 && found_20); +//! ``` + +use core::{ + iter::FusedIterator, + marker::PhantomData, // +}; + +use crate::{ + bindings, + types::Opaque, // +}; + +use pin_init::{ + pin_data, + pin_init, + PinInit, // +}; + +/// FFI wrapper for a C `list_head` object used in intrusive linked lists. +/// +/// # Invariants +/// +/// - The underlying `list_head` has been initialized (e.g. via `INIT_LIST_HEAD()`) and its +/// `next`/`prev` pointers are valid and non-NULL. +#[pin_data] +#[repr(transparent)] +pub struct CListHead { + #[pin] + inner: Opaque<bindings::list_head>, +} + +impl CListHead { + /// Create a `&CListHead` reference from a raw `list_head` pointer. + /// + /// # Safety + /// + /// - `ptr` must be a valid pointer to an initialized `list_head` (e.g. via + /// `INIT_LIST_HEAD()`), with valid non-NULL `next`/`prev` pointers. + /// - `ptr` must remain valid for the lifetime `'a`. + /// - The list and all linked `list_head` nodes must not be modified from + /// anywhere for the lifetime `'a`, unless done so via any [`CListHead`] APIs. + #[inline] + pub unsafe fn from_raw<'a>(ptr: *mut bindings::list_head) -> &'a Self { + // SAFETY: + // - [`CListHead`] has same layout as `list_head`. + // - `ptr` is valid and unmodified for 'a per caller guarantees. + unsafe { &*ptr.cast() } + } + + /// Get the raw `list_head` pointer. + #[inline] + pub fn as_raw(&self) -> *mut bindings::list_head { + self.inner.get() + } + + /// Get the next [`CListHead`] in the list. + #[inline] + pub fn next(&self) -> &Self { + let raw = self.as_raw(); + // SAFETY: + // - `self.as_raw()` is valid and initialized per type invariants. + // - The `next` pointer is valid and non-NULL per type invariants + // (initialized via `INIT_LIST_HEAD()` or equivalent). + unsafe { Self::from_raw((*raw).next) } + } + + /// Check if this node is linked in a list (not isolated). + #[inline] + pub fn is_linked(&self) -> bool { + let raw = self.as_raw(); + // SAFETY: self.as_raw() is valid per type invariants. + unsafe { (*raw).next != raw && (*raw).prev != raw } + } + + /// Pin-initializer that initializes the list head. + pub fn new() -> impl PinInit<Self> { + pin_init!(Self { + // SAFETY: `INIT_LIST_HEAD` initializes `slot` to a valid empty list. + inner <- Opaque::ffi_init(|slot| unsafe { bindings::INIT_LIST_HEAD(slot) }), + }) + } +} + +// SAFETY: `list_head` contains no thread-bound state; it only holds +// `next`/`prev` pointers. +unsafe impl Send for CListHead {} + +// SAFETY: `CListHead` can be shared among threads as modifications are +// not allowed at the moment. +unsafe impl Sync for CListHead {} + +impl PartialEq for CListHead { + #[inline] + fn eq(&self, other: &Self) -> bool { + core::ptr::eq(self, other) + } +} + +impl Eq for CListHead {} + +/// Low-level iterator over `list_head` nodes. +/// +/// An iterator used to iterate over a C intrusive linked list (`list_head`). Caller has to +/// perform conversion of returned [`CListHead`] to an item (using `container_of` macro or similar). +/// +/// # Invariants +/// +/// [`CListHeadIter`] is iterating over an initialized and valid list. +struct CListHeadIter<'a> { + /// Current position in the list. + current: &'a CListHead, + /// The sentinel head (used to detect end of iteration). + sentinel: &'a CListHead, +} + +impl<'a> Iterator for CListHeadIter<'a> { + type Item = &'a CListHead; + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + // Check if we've reached the sentinel (end of list). + if self.current == self.sentinel { + return None; + } + + let item = self.current; + self.current = item.next(); + Some(item) + } +} + +impl<'a> FusedIterator for CListHeadIter<'a> {} + +/// A typed C linked list with a sentinel head intended for FFI use-cases where +/// C subsystem manages a linked list that Rust code needs to read. Generally +/// required only for special cases. +/// +/// A sentinel head [`CListHead`] represents the entire linked list and can be used +/// for iteration over items of type `T`, it is not associated with a specific item. +/// +/// The const generic `OFFSET` specifies the byte offset of the `list_head` field within +/// the struct that `T` wraps. +/// +/// # Invariants +/// +/// - The sentinel [`CListHead`] has been initialized (e.g. via `INIT_LIST_HEAD()`) with valid +/// non-NULL `next`/`prev` pointers. +/// - `OFFSET` is the byte offset of the `list_head` field within the struct that `T` wraps. +/// - All the list's `list_head` nodes have been initialized with valid non-NULL `next`/`prev` +/// pointers. +#[repr(transparent)] +pub struct CList<T, const OFFSET: usize>(CListHead, PhantomData<T>); + +impl<T, const OFFSET: usize> CList<T, OFFSET> { + /// Create a typed [`CList`] reference from a raw sentinel `list_head` pointer. + /// + /// # Safety + /// + /// - `ptr` must be a valid pointer to an initialized sentinel `list_head` (e.g. via + /// `INIT_LIST_HEAD()`), with valid non-NULL `next`/`prev` pointers. + /// - `ptr` must remain valid for the lifetime `'a`. + /// - The list and all linked nodes must not be concurrently modified for the lifetime `'a`. + /// - The list must contain items where the `list_head` field is at byte offset `OFFSET`. + /// - `T` must be `#[repr(transparent)]` over the C struct. + #[inline] + pub unsafe fn from_raw<'a>(ptr: *mut bindings::list_head) -> &'a Self { + // SAFETY: + // - [`CList`] has same layout as [`CListHead`] due to repr(transparent). + // - Caller guarantees `ptr` is a valid, sentinel `list_head` object. + unsafe { &*ptr.cast() } + } + + /// Check if the list is empty. + #[inline] + pub fn is_empty(&self) -> bool { + !self.0.is_linked() + } + + /// Create an iterator over typed items. + #[inline] + pub fn iter(&self) -> CListIter<'_, T, OFFSET> { + let head = &self.0; + CListIter { + head_iter: CListHeadIter { + current: head.next(), + sentinel: head, + }, + _phantom: PhantomData, + } + } +} + +/// High-level iterator over typed list items. +pub struct CListIter<'a, T, const OFFSET: usize> { + head_iter: CListHeadIter<'a>, + _phantom: PhantomData<&'a T>, +} + +impl<'a, T, const OFFSET: usize> Iterator for CListIter<'a, T, OFFSET> { + type Item = &'a T; + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + let head = self.head_iter.next()?; + + // Convert to item using OFFSET. + // SAFETY: The pointer calculation is valid because `OFFSET` is derived + // from `offset_of!` per type invariants. + Some(unsafe { &*head.as_raw().byte_sub(OFFSET).cast::<T>() }) + } +} + +impl<'a, T, const OFFSET: usize> FusedIterator for CListIter<'a, T, OFFSET> {} + +/// Create a C doubly-circular linked list interface `CList` from a raw `list_head` pointer. +/// +/// This macro creates a `CList<T, OFFSET>` that can iterate over items of type `$rust_type` +/// linked via the `$field` field in the underlying C struct `$c_type`. +/// +/// # Arguments +/// +/// - `$head`: Raw pointer to the sentinel `list_head` object (`*mut bindings::list_head`). +/// - `$rust_type`: Each item's rust wrapper type. +/// - `$c_type`: Each item's C struct type that contains the embedded `list_head`. +/// - `$field`: The name of the `list_head` field within the C struct. +/// +/// # Safety +/// +/// The caller must ensure: +/// +/// - `$head` is a valid, initialized sentinel `list_head` (e.g. via `INIT_LIST_HEAD()`) +/// pointing to a list that is not concurrently modified for the lifetime of the `CList`. +/// - The list contains items of type `$c_type` linked via an embedded `$field`. +/// - `$rust_type` is `#[repr(transparent)]` over `$c_type` or has compatible layout. +/// +/// # Examples +/// +/// Refer to the examples in this module's documentation. +#[macro_export] +macro_rules! clist_create { + (unsafe { $head:expr, $rust_type:ty, $c_type:ty, $($field:tt).+ }) => {{ + // Compile-time check that field path is a list_head. + let _: fn(*const $c_type) -> *const $crate::bindings::list_head = + |p| unsafe { &raw const (*p).$($field).+ }; + + // Calculate offset and create `CList`. + const OFFSET: usize = ::core::mem::offset_of!($c_type, $($field).+); + // SAFETY: The caller of this macro is responsible for ensuring safety. + unsafe { $crate::interop::list::CList::<$rust_type, OFFSET>::from_raw($head) } + }}; +} diff --git a/rust/kernel/interop/mod.rs b/rust/kernel/interop/mod.rs new file mode 100644 index 000000000000..b88140cf76dc --- /dev/null +++ b/rust/kernel/interop/mod.rs @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Infrastructure for interfacing Rust code with C kernel subsystems. +//! +//! This module is intended for low-level, unsafe Rust infrastructure code +//! that interoperates between Rust and C. It is NOT for use directly in +//! Rust drivers. + +pub mod list; diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 3da92f18f4ee..bb741f1e0dfd 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -28,6 +28,7 @@ #![feature(lint_reasons)] // // Stable since Rust 1.82.0. +#![feature(offset_of_nested)] #![feature(raw_ref_op)] // // Stable since Rust 1.83.0. @@ -103,6 +104,7 @@ #[doc(hidden)] pub mod impl_flags; pub mod init; +pub mod interop; pub mod io; pub mod ioctl; pub mod iommu; -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-06 20:36 ` [PATCH v12 1/1] " Joel Fernandes @ 2026-03-12 17:42 ` Danilo Krummrich 2026-03-12 19:15 ` Miguel Ojeda 2026-03-12 19:16 ` Miguel Ojeda ` (2 subsequent siblings) 3 siblings, 1 reply; 11+ messages in thread From: Danilo Krummrich @ 2026-03-12 17:42 UTC (permalink / raw) To: Joel Fernandes, Miguel Ojeda Cc: linux-kernel, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Alexandre Courbot, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev, Miguel Ojeda On Fri Mar 6, 2026 at 9:36 PM CET, Joel Fernandes wrote: > Add a new module `kernel::interop::list` for working with C's doubly > circular linked lists. Provide low-level iteration over list nodes. > > Typed iteration over actual items is provided with a `clist_create` > macro to assist in creation of the `CList` type. > > Cc: Nikola Djukic <ndjukic@nvidia.com> > Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com> > Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> > Acked-by: Alexandre Courbot <acourbot@nvidia.com> > Acked-by: Gary Guo <gary@garyguo.net> > Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> Was this given off-list? I can't find a corresponding reply from Miguel. > Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> I'm asking since I'm looking forward to pick this up as a dependency for GPU buddy. Thanks, Danilo ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-12 17:42 ` Danilo Krummrich @ 2026-03-12 19:15 ` Miguel Ojeda 0 siblings, 0 replies; 11+ messages in thread From: Miguel Ojeda @ 2026-03-12 19:15 UTC (permalink / raw) To: Danilo Krummrich Cc: Joel Fernandes, Miguel Ojeda, linux-kernel, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Alexandre Courbot, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev On Thu, Mar 12, 2026 at 6:42 PM Danilo Krummrich <dakr@kernel.org> wrote: > > Was this given off-list? I can't find a corresponding reply from Miguel. Thanks for double-checking that -- it is fine. I am sending some nits and Clippy issues independently though. Cheers, Miguel ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-06 20:36 ` [PATCH v12 1/1] " Joel Fernandes 2026-03-12 17:42 ` Danilo Krummrich @ 2026-03-12 19:16 ` Miguel Ojeda 2026-03-16 18:47 ` Joel Fernandes 2026-03-12 19:20 ` Miguel Ojeda 2026-03-16 4:34 ` Alexandre Courbot 3 siblings, 1 reply; 11+ messages in thread From: Miguel Ojeda @ 2026-03-12 19:16 UTC (permalink / raw) To: Joel Fernandes Cc: linux-kernel, Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Danilo Krummrich, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Alexandre Courbot, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev On Fri, Mar 6, 2026 at 9:37 PM Joel Fernandes <joelagnelf@nvidia.com> wrote: > > Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> Acked-by: Miguel Ojeda <ojeda@kernel.org> > +//! # // SAFETY: head and all the items are test objects allocated in this scope. `head` > +//! // Rust wrapper for the C struct. Empty newline comment between these: //! // Actually, should this be `//! ///`? > +//! // The list item struct in this example is defined in C code as: > +//! // struct SampleItemC { > +//! // int value; > +//! // struct list_head link; > +//! // }; > +//! // Let's try to use the usual style, i.e. no empty newline at the end of docs for an item. And the example should be in a proper code block with a C tag, so all together something like: //! /// Rust wrapper for the C struct. //! /// //! /// The list item struct in this example is defined in C code as: //! /// //! /// ```c //! /// struct SampleItemC { //! /// int value; //! /// struct list_head link; //! /// }; //! /// ``` > +//! // SAFETY: [`Item`] has same layout as [`SampleItemC`]. No need for intra-doc links in comments (for now at least). > +//! // Create typed [`CList`] from sentinel head. Empty newline comment. > +//! // SAFETY: head is valid and initialized, items are `SampleItemC` with `head` However, this is giving me a Clippy issue (please see the other email). > +/// `next`/`prev` pointers are valid and non-NULL. We started using `NULL` recently as a convention for the null pointer. > + // - [`CListHead`] has same layout as `list_head`. Intra-doc link not needed. > + // - `ptr` is valid and unmodified for 'a per caller guarantees. `'a` > + // SAFETY: self.as_raw() is valid per type invariants. `self.as_raw()` > +/// perform conversion of returned [`CListHead`] to an item (using `container_of` macro or similar). Intra-doc link to `container_of`? > + // - [`CList`] has same layout as [`CListHead`] due to repr(transparent). Intra-doc link not needed. > + // Convert to item using OFFSET. `OFFSET` Newline comment after this one. > +/// Create a C doubly-circular linked list interface `CList` from a raw `list_head` pointer. [`CList`] > +/// pointing to a list that is not concurrently modified for the lifetime of the `CList`. [`CList`] > +/// Refer to the examples in this module's documentation. Perhaps we could have an intra-doc link here to the module. > + // Compile-time check that field path is a list_head. `list_head` Cheers, Miguel ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-12 19:16 ` Miguel Ojeda @ 2026-03-16 18:47 ` Joel Fernandes 0 siblings, 0 replies; 11+ messages in thread From: Joel Fernandes @ 2026-03-16 18:47 UTC (permalink / raw) To: Miguel Ojeda Cc: Miguel Ojeda, Danilo Krummrich, linux-kernel, Boqun Feng, Gary Guo, Alexandre Courbot, rust-for-linux, dri-devel, nouveau On Thu, 12 Mar 2026 20:16:00 +0100, Miguel Ojeda wrote: >> Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> > > Acked-by: Miguel Ojeda <ojeda@kernel.org> Thanks, will change to this. >> +//! # // SAFETY: head and all the items are test objects allocated in this scope. > > `head` Fixed. >> +//! // Rust wrapper for the C struct. > > Empty newline comment between these: > > //! // > > Actually, should this be `//! ///`? > >> +//! // The list item struct in this example is defined in C code as: >> +//! // struct SampleItemC { >> +//! // int value; >> +//! // struct list_head link; >> +//! // }; >> +//! // > > Let's try to use the usual style, i.e. no empty newline at the end of > docs for an item. > > And the example should be in a proper code block with a C tag, so all > together something like: > > //! /// Rust wrapper for the C struct. > //! /// > //! /// The list item struct in this example is defined in C code as: > //! /// > //! /// ```c > //! /// struct SampleItemC { > //! /// int value; > //! /// struct list_head link; > //! /// }; > //! /// ``` Fixed. >> +//! // SAFETY: [`Item`] has same layout as [`SampleItemC`]. > > No need for intra-doc links in comments (for now at least). Fixed. >> +//! // Create typed [`CList`] from sentinel head. > > Empty newline comment. Fixed. >> +//! // SAFETY: head is valid and initialized, items are `SampleItemC` with > > `head` > > However, this is giving me a Clippy issue (please see the other email). Fixed. >> +/// `next`/`prev` pointers are valid and non-NULL. > > We started using `NULL` recently as a convention for the null pointer. Fixed. >> + // - [`CListHead`] has same layout as `list_head`. > > Intra-doc link not needed. Fixed. >> + // - `ptr` is valid and unmodified for 'a per caller guarantees. > > `'a` Fixed. >> + // SAFETY: self.as_raw() is valid per type invariants. > > `self.as_raw()` Fixed. >> +/// perform conversion of returned [`CListHead`] to an item (using `container_of` macro or similar). > > Intra-doc link to `container_of`? Added. >> + // - [`CList`] has same layout as [`CListHead`] due to repr(transparent). > > Intra-doc link not needed. >> + // Convert to item using OFFSET. > > `OFFSET` > > Newline comment after this one. >> +/// Create a C doubly-circular linked list interface `CList` from a raw `list_head` pointer. > > [`CList`] >> +/// pointing to a list that is not concurrently modified for the lifetime of the `CList`. > > [`CList`] Fixed all these. >> +/// Refer to the examples in this module's documentation. > > Perhaps we could have an intra-doc link here to the module. Added. >> + // Compile-time check that field path is a list_head. > > `list_head` Fixed. Thanks for the thorough review! -- Joel Fernandes ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-06 20:36 ` [PATCH v12 1/1] " Joel Fernandes 2026-03-12 17:42 ` Danilo Krummrich 2026-03-12 19:16 ` Miguel Ojeda @ 2026-03-12 19:20 ` Miguel Ojeda 2026-03-12 19:50 ` Danilo Krummrich 2026-03-16 18:54 ` Joel Fernandes 2026-03-16 4:34 ` Alexandre Courbot 3 siblings, 2 replies; 11+ messages in thread From: Miguel Ojeda @ 2026-03-12 19:20 UTC (permalink / raw) To: Joel Fernandes Cc: linux-kernel, Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Danilo Krummrich, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Alexandre Courbot, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev On Fri, Mar 6, 2026 at 9:37 PM Joel Fernandes <joelagnelf@nvidia.com> wrote: > > +//! // Create typed [`CList`] from sentinel head. > +//! // SAFETY: head is valid and initialized, items are `SampleItemC` with > +//! // embedded `link` field, and `Item` is `#[repr(transparent)]` over `SampleItemC`. > +//! let list = clist_create!(unsafe { head, Item, SampleItemC, link }); Was the patch tested with Clippy? It has several issues. The worst news is that it seems the "supposed to be `unsafe` block" does not count as one for Clippy, i.e.: let list = clist_create!(unsafe { head, Item, SampleItemC, link }); So we get: error: statement has unnecessary safety comment --> rust/doctests_kernel_generated.rs:7416:1 | 7416 | let list = clist_create!(unsafe { head, Item, SampleItemC, link }); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | help: consider removing the safety comment --> rust/doctests_kernel_generated.rs:7414:4 | 7414 | // SAFETY: head is valid and initialized, items are `SampleItemC` with | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#unnecessary_safety_comment = note: `-D clippy::unnecessary-safety-comment` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::unnecessary_safety_comment)]` For this, we could write them as a `// SAFETY*: ` comment or similar, to make progress for now, but it would best to request upstream Clippy to detect this or to rework the macro to force the `unsafe` block outside. In addition: error: unsafe block missing a safety comment --> rust/kernel/interop/list.rs:357:17 | 112 | let _list = clist_create!(unsafe { head, Item, SampleItemC, link }); | --------------------------------------------------------- in this macro invocation ... 357 | |p| unsafe { &raw const (*p).$($field).+ }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: consider adding a safety comment on the preceding line = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#undocumented_unsafe_blocks = note: `-D clippy::undocumented-unsafe-blocks` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::undocumented_unsafe_blocks)]` = note: this error originates in the macro `clist_create` (in Nightly builds, run with -Z macro-backtrace for more info) So this needs a `// SAFETY:` comment on top of the closure. error: this macro expands metavariables in an unsafe block --> rust/kernel/interop/list.rs:362:9 | 362 | unsafe { $crate::interop::list::CList::<$rust_type, OFFSET>::from_raw($head) } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: this allows the user of the macro to write unsafe code outside of an unsafe block = help: consider expanding any metavariables outside of this block, e.g. by storing them in a variable = help: ... or also expand referenced metavariables in a safe context to require an unsafe block at callsite = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#macro_metavars_in_unsafe = note: `-D clippy::macro-metavars-in-unsafe` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::macro_metavars_in_unsafe)]` For this one, to begin with, do we expect to have actual expressions for `$head`, or could we constrain it for now to an identifier for instance? With an identifier there is no issue then -- the example currently has just an identifier anyway. I hope that helps. Cheers, Miguel ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-12 19:20 ` Miguel Ojeda @ 2026-03-12 19:50 ` Danilo Krummrich 2026-03-16 17:57 ` Joel Fernandes 2026-03-16 18:54 ` Joel Fernandes 1 sibling, 1 reply; 11+ messages in thread From: Danilo Krummrich @ 2026-03-12 19:50 UTC (permalink / raw) To: Miguel Ojeda, Joel Fernandes Cc: linux-kernel, Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Alexandre Courbot, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev On Thu Mar 12, 2026 at 8:20 PM CET, Miguel Ojeda wrote: > On Fri, Mar 6, 2026 at 9:37 PM Joel Fernandes <joelagnelf@nvidia.com> wrote: >> >> +//! // Create typed [`CList`] from sentinel head. >> +//! // SAFETY: head is valid and initialized, items are `SampleItemC` with >> +//! // embedded `link` field, and `Item` is `#[repr(transparent)]` over `SampleItemC`. >> +//! let list = clist_create!(unsafe { head, Item, SampleItemC, link }); > > Was the patch tested with Clippy? It has several issues. I did not give it a shot yet, but given this and the other nits, this is beyond what I want to fix up when applying the patch. @Joel, can you please resend? Thanks, Danilo ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-12 19:50 ` Danilo Krummrich @ 2026-03-16 17:57 ` Joel Fernandes 0 siblings, 0 replies; 11+ messages in thread From: Joel Fernandes @ 2026-03-16 17:57 UTC (permalink / raw) To: Danilo Krummrich Cc: Miguel Ojeda, Miguel Ojeda, linux-kernel, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Alexandre Courbot, rust-for-linux, dri-devel, nouveau On Thu, 12 Mar 2026 20:50:34 +0100, Danilo Krummrich wrote: > I did not give it a shot yet, but given this and the other nits, this is beyond > what I want to fix up when applying the patch. > > @Joel, can you please resend? Sure, I will address all of Miguel's review commentsand send v13 shortly (probably by tomorrow). thanks, -- Joel Fernandes ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-12 19:20 ` Miguel Ojeda 2026-03-12 19:50 ` Danilo Krummrich @ 2026-03-16 18:54 ` Joel Fernandes 1 sibling, 0 replies; 11+ messages in thread From: Joel Fernandes @ 2026-03-16 18:54 UTC (permalink / raw) To: Miguel Ojeda Cc: Miguel Ojeda, Danilo Krummrich, linux-kernel, Boqun Feng, Gary Guo, Alexandre Courbot, rust-for-linux, dri-devel, nouveau On Thu, 12 Mar 2026 20:20:10 +0100, Miguel Ojeda wrote: > Was the patch tested with Clippy? It has several issues. > > The worst news is that it seems the "supposed to be `unsafe` block" > does not count as one for Clippy, i.e.: > > let list = clist_create!(unsafe { head, Item, SampleItemC, link }); > > So we get: > > error: statement has unnecessary safety comment > > For this, we could write them as a `// SAFETY*: ` comment or similar, > to make progress for now, but it would best to request upstream Clippy > to detect this or to rework the macro to force the `unsafe` block > outside. Used `// SAFETY*:` for now as you suggested. > error: unsafe block missing a safety comment > --> rust/kernel/interop/list.rs:357:17 > | > 357 | |p| unsafe { &raw const (*p).$($field).+ }; > > So this needs a `// SAFETY:` comment on top of the closure. Fixed. Added: // SAFETY: `p` is a valid pointer to `$c_type`. > error: this macro expands metavariables in an unsafe block > --> rust/kernel/interop/list.rs:362:9 > | > 362 | unsafe { $crate::interop::list::CList::<$rust_type, > OFFSET>::from_raw($head) } > > For this one, to begin with, do we expect to have actual expressions > for $head, or could we constrain it for now to an identifier for > instance? > > With an identifier there is no issue then -- the example currently has > just an identifier anyway. Yes, identifier should be Ok. Changed to it. thanks, -- Joel Fernandes ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/1] rust: interop: Add list module for C linked list interface 2026-03-06 20:36 ` [PATCH v12 1/1] " Joel Fernandes ` (2 preceding siblings ...) 2026-03-12 19:20 ` Miguel Ojeda @ 2026-03-16 4:34 ` Alexandre Courbot 3 siblings, 0 replies; 11+ messages in thread From: Alexandre Courbot @ 2026-03-16 4:34 UTC (permalink / raw) To: Joel Fernandes Cc: linux-kernel, Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Danilo Krummrich, Dave Airlie, David Airlie, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian König, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellström, Helge Deller, John Hubbard, Alistair Popple, Timur Tabi, Edwin Peer, Andrea Righi, Andy Ritger, Zhi Wang, Balbir Singh, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev, Miguel Ojeda On Sat Mar 7, 2026 at 5:36 AM JST, Joel Fernandes wrote: > Add a new module `kernel::interop::list` for working with C's doubly > circular linked lists. Provide low-level iteration over list nodes. > > Typed iteration over actual items is provided with a `clist_create` > macro to assist in creation of the `CList` type. > > Cc: Nikola Djukic <ndjukic@nvidia.com> > Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com> > Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> > Acked-by: Alexandre Courbot <acourbot@nvidia.com> > Acked-by: Gary Guo <gary@garyguo.net> > Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> > Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> > --- > MAINTAINERS | 8 + > rust/helpers/helpers.c | 1 + > rust/helpers/list.c | 17 ++ > rust/kernel/interop/list.rs | 338 ++++++++++++++++++++++++++++++++++++ > rust/kernel/interop/mod.rs | 9 + I think I have mentioned that in another context, but the standard seems to be to use `interop.rs` instead of `interop/mod.rs` (Miguel please correct me if I'm wrong). Also, and once again, please, please build with CLIPPY=1 before sending. The buddy series also has clippy warnings. Fixing them before I can review is tedious. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-03-16 18:54 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-03-06 20:36 [PATCH v12 0/1] rust: interop: Add list module for C linked list interface Joel Fernandes 2026-03-06 20:36 ` [PATCH v12 1/1] " Joel Fernandes 2026-03-12 17:42 ` Danilo Krummrich 2026-03-12 19:15 ` Miguel Ojeda 2026-03-12 19:16 ` Miguel Ojeda 2026-03-16 18:47 ` Joel Fernandes 2026-03-12 19:20 ` Miguel Ojeda 2026-03-12 19:50 ` Danilo Krummrich 2026-03-16 17:57 ` Joel Fernandes 2026-03-16 18:54 ` Joel Fernandes 2026-03-16 4:34 ` Alexandre Courbot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox