* [PATCH v11 0/2] rust: clist patches for nova-core memory management
@ 2026-02-24 22:27 Joel Fernandes
2026-02-24 22:27 ` [PATCH v11 1/2] rust: ffi: Convert pub use to pub mod and create ffi module Joel Fernandes
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: Joel Fernandes @ 2026-02-24 22:27 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
This series provides the clist module needed for nova-core memory management.
These patches are being sent separately from the rest of the preparatory
patches (DRM buddy movement, GPU buddy bindings, etc.) as they can go in
independently.
The clist module provides Rust abstractions for iterating over C
list_head-based linked lists. The primary use-case is iterating over GPU buddy
allocator blocks.
The git tree with all patches can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/jfern/linux.git (tag: clist-v11-20260224)
Detailed changelog
------------------
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 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 (2):
rust: ffi: Convert pub use to pub mod and create ffi module
rust: clist: Add support to interface with C linked lists
MAINTAINERS | 8 +
rust/helpers/helpers.c | 1 +
rust/helpers/list.c | 17 ++
rust/kernel/ffi/clist.rs | 338 +++++++++++++++++++++++++++++++++++++++
rust/kernel/ffi/mod.rs | 9 ++
rust/kernel/lib.rs | 4 +-
6 files changed, 375 insertions(+), 2 deletions(-)
create mode 100644 rust/helpers/list.c
create mode 100644 rust/kernel/ffi/clist.rs
create mode 100644 rust/kernel/ffi/mod.rs
base-commit: 2961f841b025fb234860bac26dfb7fa7cb0fb122
--
2.34.1
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v11 1/2] rust: ffi: Convert pub use to pub mod and create ffi module 2026-02-24 22:27 [PATCH v11 0/2] rust: clist patches for nova-core memory management Joel Fernandes @ 2026-02-24 22:27 ` Joel Fernandes 2026-02-24 22:27 ` [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists Joel Fernandes ` (4 subsequent siblings) 5 siblings, 0 replies; 13+ messages in thread From: Joel Fernandes @ 2026-02-24 22:27 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 Convert `pub use ffi` to `pub mod ffi` in lib.rs and create the corresponding `rust/kernel/ffi/mod.rs` module file. Also re-export all C type definitions from `ffi` crate so that existing `kernel::ffi::c_int` etc. paths continue to work. This prepares the ffi module to host additional sub-modules in later patches (clist). Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> --- rust/kernel/ffi/mod.rs | 7 +++++++ rust/kernel/lib.rs | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 rust/kernel/ffi/mod.rs diff --git a/rust/kernel/ffi/mod.rs b/rust/kernel/ffi/mod.rs new file mode 100644 index 000000000000..7d844e9cb339 --- /dev/null +++ b/rust/kernel/ffi/mod.rs @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! FFI infrastructure for interfacing with C code. + +// Re-export C type definitions from the `ffi` crate so that existing +// `kernel::ffi::c_int` etc. paths continue to work. +pub use ::ffi::*; diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 3da92f18f4ee..0a77b4c0ffeb 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -62,8 +62,6 @@ // Allow proc-macros to refer to `::kernel` inside the `kernel` crate (this crate). extern crate self as kernel; -pub use ffi; - pub mod acpi; pub mod alloc; #[cfg(CONFIG_AUXILIARY_BUS)] @@ -93,6 +91,7 @@ pub mod drm; pub mod error; pub mod faux; +pub mod ffi; #[cfg(CONFIG_RUST_FW_LOADER_ABSTRACTIONS)] pub mod firmware; pub mod fmt; -- 2.34.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists 2026-02-24 22:27 [PATCH v11 0/2] rust: clist patches for nova-core memory management Joel Fernandes 2026-02-24 22:27 ` [PATCH v11 1/2] rust: ffi: Convert pub use to pub mod and create ffi module Joel Fernandes @ 2026-02-24 22:27 ` Joel Fernandes 2026-02-25 8:09 ` Alexandre Courbot 2026-02-26 16:23 ` Alvin Sun 2026-02-24 22:37 ` ✗ CI.checkpatch: warning for rust: clist patches for nova-core memory management Patchwork ` (3 subsequent siblings) 5 siblings, 2 replies; 13+ messages in thread From: Joel Fernandes @ 2026-02-24 22:27 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 Add a new module `clist` 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> Acked-by: Gary Guo <gary@garyguo.net> Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> --- MAINTAINERS | 8 + rust/helpers/helpers.c | 1 + rust/helpers/list.c | 17 ++ rust/kernel/ffi/clist.rs | 338 +++++++++++++++++++++++++++++++++++++++ rust/kernel/ffi/mod.rs | 2 + rust/kernel/lib.rs | 1 + 6 files changed, 367 insertions(+) create mode 100644 rust/helpers/list.c create mode 100644 rust/kernel/ffi/clist.rs diff --git a/MAINTAINERS b/MAINTAINERS index dc82a6bd1a61..0dc318c94c99 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23181,6 +23181,14 @@ T: git https://github.com/Rust-for-Linux/linux.git alloc-next F: rust/kernel/alloc.rs F: rust/kernel/alloc/ +RUST [FFI HELPER] +M: Joel Fernandes <joelagnelf@nvidia.com> (CLIST) +M: Alexandre Courbot <acourbot@nvidia.com> (CLIST) +L: rust-for-linux@vger.kernel.org +S: Maintained +T: git https://github.com/Rust-for-Linux/linux.git ffi-next +F: rust/kernel/ffi/ + 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/ffi/clist.rs b/rust/kernel/ffi/clist.rs new file mode 100644 index 000000000000..a645358eee58 --- /dev/null +++ b/rust/kernel/ffi/clist.rs @@ -0,0 +1,338 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! FFI 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 an FFI 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: `item_ptr` calculation from `OFFSET` (calculated using offset_of!) + // is valid per 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::ffi::clist::CList::<$rust_type, OFFSET>::from_raw($head) } + }}; +} diff --git a/rust/kernel/ffi/mod.rs b/rust/kernel/ffi/mod.rs index 7d844e9cb339..8c235ca0d1e3 100644 --- a/rust/kernel/ffi/mod.rs +++ b/rust/kernel/ffi/mod.rs @@ -5,3 +5,5 @@ // Re-export C type definitions from the `ffi` crate so that existing // `kernel::ffi::c_int` etc. paths continue to work. pub use ::ffi::*; + +pub mod clist; diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 0a77b4c0ffeb..58dbb02c5197 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. -- 2.34.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists 2026-02-24 22:27 ` [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists Joel Fernandes @ 2026-02-25 8:09 ` Alexandre Courbot 2026-02-25 8:25 ` Alexandre Courbot 2026-02-26 0:24 ` Joel Fernandes 2026-02-26 16:23 ` Alvin Sun 1 sibling, 2 replies; 13+ messages in thread From: Alexandre Courbot @ 2026-02-25 8:09 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, Maarten Lankhorst, Maxime Ripard, 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, Alistair Popple, Andrea Righi, Zhi Wang, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev On Wed Feb 25, 2026 at 7:27 AM JST, Joel Fernandes wrote: > Add a new module `clist` 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> > Acked-by: Gary Guo <gary@garyguo.net> > Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> (with one small comment below) > --- > MAINTAINERS | 8 + > rust/helpers/helpers.c | 1 + > rust/helpers/list.c | 17 ++ > rust/kernel/ffi/clist.rs | 338 +++++++++++++++++++++++++++++++++++++++ > rust/kernel/ffi/mod.rs | 2 + > rust/kernel/lib.rs | 1 + > 6 files changed, 367 insertions(+) > create mode 100644 rust/helpers/list.c > create mode 100644 rust/kernel/ffi/clist.rs > > diff --git a/MAINTAINERS b/MAINTAINERS > index dc82a6bd1a61..0dc318c94c99 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -23181,6 +23181,14 @@ T: git https://github.com/Rust-for-Linux/linux.git alloc-next > F: rust/kernel/alloc.rs > F: rust/kernel/alloc/ > > +RUST [FFI HELPER] > +M: Joel Fernandes <joelagnelf@nvidia.com> (CLIST) > +M: Alexandre Courbot <acourbot@nvidia.com> (CLIST) > +L: rust-for-linux@vger.kernel.org > +S: Maintained > +T: git https://github.com/Rust-for-Linux/linux.git ffi-next > +F: rust/kernel/ffi/ Acked-by: Alexandre Courbot <acourbot@nvidia.com> <snip> > +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: `item_ptr` calculation from `OFFSET` (calculated using offset_of!) `item_ptr` does not exist. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists 2026-02-25 8:09 ` Alexandre Courbot @ 2026-02-25 8:25 ` Alexandre Courbot 2026-02-26 0:24 ` Joel Fernandes 1 sibling, 0 replies; 13+ messages in thread From: Alexandre Courbot @ 2026-02-25 8:25 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, Maarten Lankhorst, Maxime Ripard, 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, Alistair Popple, Andrea Righi, Zhi Wang, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev On Wed Feb 25, 2026 at 5:09 PM JST, Alexandre Courbot wrote: > On Wed Feb 25, 2026 at 7:27 AM JST, Joel Fernandes wrote: >> Add a new module `clist` 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> >> Acked-by: Gary Guo <gary@garyguo.net> >> Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> > > Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> > > (with one small comment below) Actually, one more. When trying to build the GPU buddy series on top of this, I got this warning: warning: this macro expands metavariables in an unsafe block --> ../rust/kernel/ffi/clist.rs:336:9 | 336 | unsafe { $crate::ffi::clist::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.93.0/index.html#macro_metavars_in_unsafe = note: `-W clippy::macro-metavars-in-unsafe` implied by `-W clippy::all` = help: to override `-W clippy::all` add `#[allow(clippy::macro_metavars_in_unsafe)]` The fix should be easy and as prescribed. Btw, your `nova/mm` branch has not been built with `CLIPPY=1` before submission - there are still a few of few. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists 2026-02-25 8:09 ` Alexandre Courbot 2026-02-25 8:25 ` Alexandre Courbot @ 2026-02-26 0:24 ` Joel Fernandes 1 sibling, 0 replies; 13+ messages in thread From: Joel Fernandes @ 2026-02-26 0:24 UTC (permalink / raw) To: Alexandre Courbot Cc: linux-kernel, Miguel Ojeda, Boqun Feng, Gary Guo, Bjorn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Alex Gaynor, Danilo Krummrich, Dave Airlie, Maarten Lankhorst, Maxime Ripard, Simona Vetter, Daniel Almeida, Koen Koning, Nikola Djukic, Philipp Stanner, Elle Rhumsaa, Jonathan Corbet, Alex Deucher, Christian Koenig, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellstrom, Helge Deller, Alistair Popple, Andrea Righi, Zhi Wang, alexeyi, Eliot Courtney, dri-devel, nouveau, rust-for-linux, linux-doc, amd-gfx, intel-gfx, intel-xe, linux-fbdev On Wed, 25 Feb 2026 17:09:22 +0900, Alexandre Courbot wrote: > On Wed Feb 25, 2026 at 7:27 AM JST, Joel Fernandes wrote: >> Add a new module `clist` for working with C's doubly circular linked >> lists. Provide low-level iteration over list nodes. <snip> > + // SAFETY: `item_ptr` calculation from `OFFSET` (calculated using offset_of!) > > `item_ptr` does not exist. Good catch, thanks! Fixed. -- Joel Fernandes ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists 2026-02-24 22:27 ` [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists Joel Fernandes 2026-02-25 8:09 ` Alexandre Courbot @ 2026-02-26 16:23 ` Alvin Sun 2026-02-26 19:34 ` Joel Fernandes 1 sibling, 1 reply; 13+ messages in thread From: Alvin Sun @ 2026-02-26 16:23 UTC (permalink / raw) To: Joel Fernandes, 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 On 2/25/26 06:27, Joel Fernandes wrote: > Add a new module `clist` 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> > Acked-by: Gary Guo <gary@garyguo.net> > Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> > --- > MAINTAINERS | 8 + > rust/helpers/helpers.c | 1 + > rust/helpers/list.c | 17 ++ > rust/kernel/ffi/clist.rs | 338 +++++++++++++++++++++++++++++++++++++++ > rust/kernel/ffi/mod.rs | 2 + > rust/kernel/lib.rs | 1 + > 6 files changed, 367 insertions(+) > create mode 100644 rust/helpers/list.c > create mode 100644 rust/kernel/ffi/clist.rs > > diff --git a/MAINTAINERS b/MAINTAINERS > index dc82a6bd1a61..0dc318c94c99 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -23181,6 +23181,14 @@ T: git https://github.com/Rust-for-Linux/linux.git alloc-next > F: rust/kernel/alloc.rs > F: rust/kernel/alloc/ > > +RUST [FFI HELPER] > +M: Joel Fernandes <joelagnelf@nvidia.com> (CLIST) > +M: Alexandre Courbot <acourbot@nvidia.com> (CLIST) > +L: rust-for-linux@vger.kernel.org > +S: Maintained > +T: git https://github.com/Rust-for-Linux/linux.git ffi-next > +F: rust/kernel/ffi/ > + > 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/ffi/clist.rs b/rust/kernel/ffi/clist.rs > new file mode 100644 > index 000000000000..a645358eee58 > --- /dev/null > +++ b/rust/kernel/ffi/clist.rs > @@ -0,0 +1,338 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! FFI 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 an FFI 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> { Hi, Joel Thanks for the clist abstraction. The Tyr debugfs [1] I'm implementing needs to iterate over a GpuVm's VA list, and I'd like to switch that to a CList-based implementation. Could you make CListHeadIter public and expose a public constructor? Or do you have a better suggestion? The VA list mixes two node types in one list — GpuVa (with driver-specific data) and KernelGpuVa — so we have to filter/skip nodes and can't use CList as-is. With a public CListHeadIter and new(), we can implement a custom iterator (like our current GpuVaIter) on top of CListHeadIter and then migrate that code to clist instead of hand-rolled list traversal. [1] https://gitlab.freedesktop.org/panfrost/linux/-/merge_requests/59/diffs?commit_id=0853a7b69a42b32832c8e57da63272a8585cb76b#23581e10c8b583e85ebde61a1675ac3a70e37c14_84_148 Thanks, Alvin Sun > + /// 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: `item_ptr` calculation from `OFFSET` (calculated using offset_of!) > + // is valid per 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::ffi::clist::CList::<$rust_type, OFFSET>::from_raw($head) } > + }}; > +} > diff --git a/rust/kernel/ffi/mod.rs b/rust/kernel/ffi/mod.rs > index 7d844e9cb339..8c235ca0d1e3 100644 > --- a/rust/kernel/ffi/mod.rs > +++ b/rust/kernel/ffi/mod.rs > @@ -5,3 +5,5 @@ > // Re-export C type definitions from the `ffi` crate so that existing > // `kernel::ffi::c_int` etc. paths continue to work. > pub use ::ffi::*; > + > +pub mod clist; > diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs > index 0a77b4c0ffeb..58dbb02c5197 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. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists 2026-02-26 16:23 ` Alvin Sun @ 2026-02-26 19:34 ` Joel Fernandes 2026-02-27 15:50 ` Alvin Sun 0 siblings, 1 reply; 13+ messages in thread From: Joel Fernandes @ 2026-02-26 19:34 UTC (permalink / raw) To: Alvin Sun Cc: linux-kernel, Miguel Ojeda, Boqun Feng, Gary Guo, Bjorn 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 Koenig, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellstrom, 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, 27 Feb 2026, Alvin Sun wrote: > Thanks for the clist abstraction. The Tyr debugfs [1] I'm implementing > needs to iterate over a GpuVm's VA list, and I'd like to switch that to > a CList-based implementation. Thanks for looking into using CList for this! > Could you make CListHeadIter public and expose a public constructor? > Or do you have a better suggestion? I think this can be handled without exposing CListHeadIter. See below. > The VA list mixes two node types in one list — GpuVa (with driver-specific > data) and KernelGpuVa — so we have to filter/skip nodes and can't use > CList as-is. With a public CListHeadIter and new(), we can implement a > custom iterator (like our current GpuVaIter) on top of CListHeadIter and > then migrate that code to clist instead of hand-rolled list traversal. Looking at the Tyr code, both GpuVa and KernelGpuVa are #[repr(transparent)] wrappers over the same C struct (drm_gpuva), linked through the same list_head field at the same offset. The "two types" are a Rust-level modeling choice for safety, not a structural difference in the list — every node in that list is a drm_gpuva. So CList's typed iteration already works here. You can iterate over all nodes using a common Rust wrapper type (like a #[repr(transparent)] wrapper over drm_gpuva), and then skip the kernel-reserved node by pointer identity — since drm_gpuvm has its kernel_alloc_node as a named field, its address is known. Something like: // Iterate all nodes as a common base type. let list = clist_create!(unsafe { head, RawGpuVa, drm_gpuva, rb.entry }); let kernel_ptr = unsafe { &raw mut (*gpuvm_raw).kernel_alloc_node }; for va in list.iter() { if va.as_raw() == kernel_ptr { continue; // skip } // Cast to &GpuVa let gpu_va = unsafe { GpuVa::from_raw(va.as_raw()) }; ... } If you need a named iterator type (e.g. for returning from a method), you can wrap CListIter in your own GpuVaIter struct that stores the kernel node pointer and filters in its Iterator::next() impl. That would probably also be cleaner. OTOH, with CListHeadIter you'd need to do container_of manually on each node, which might be more erroneous code, whereas CListIter handles that for you. And anyway, the pointer comparison needed to skip the kernel node is the same in both approaches. Would this work for the Tyr debugfs use case? -- Joel Fernandes ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists 2026-02-26 19:34 ` Joel Fernandes @ 2026-02-27 15:50 ` Alvin Sun 0 siblings, 0 replies; 13+ messages in thread From: Alvin Sun @ 2026-02-27 15:50 UTC (permalink / raw) To: Joel Fernandes Cc: linux-kernel, Miguel Ojeda, Boqun Feng, Gary Guo, Bjorn 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 Koenig, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Huang Rui, Matthew Auld, Matthew Brost, Lucas De Marchi, Thomas Hellstrom, 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 2/27/26 03:34, Joel Fernandes wrote: > On Fri, 27 Feb 2026, Alvin Sun wrote: >> Thanks for the clist abstraction. The Tyr debugfs [1] I'm implementing >> needs to iterate over a GpuVm's VA list, and I'd like to switch that to >> a CList-based implementation. > Thanks for looking into using CList for this! > >> Could you make CListHeadIter public and expose a public constructor? >> Or do you have a better suggestion? > I think this can be handled without exposing CListHeadIter. See below. > >> The VA list mixes two node types in one list — GpuVa (with driver-specific >> data) and KernelGpuVa — so we have to filter/skip nodes and can't use >> CList as-is. With a public CListHeadIter and new(), we can implement a >> custom iterator (like our current GpuVaIter) on top of CListHeadIter and >> then migrate that code to clist instead of hand-rolled list traversal. > Looking at the Tyr code, both GpuVa and KernelGpuVa are > #[repr(transparent)] wrappers over the same C struct (drm_gpuva), linked > through the same list_head field at the same offset. The "two types" are > a Rust-level modeling choice for safety, not a structural difference in > the list — every node in that list is a drm_gpuva. > > So CList's typed iteration already works here. You can iterate over all > nodes using a common Rust wrapper type (like a #[repr(transparent)] > wrapper over drm_gpuva), and then skip the kernel-reserved node by > pointer identity — since drm_gpuvm has its kernel_alloc_node as a named > field, its address is known. Something like: > > // Iterate all nodes as a common base type. > let list = clist_create!(unsafe { head, RawGpuVa, drm_gpuva, rb.entry }); > let kernel_ptr = unsafe { &raw mut (*gpuvm_raw).kernel_alloc_node }; > > for va in list.iter() { > if va.as_raw() == kernel_ptr { > continue; // skip > } > > // Cast to &GpuVa > let gpu_va = unsafe { GpuVa::from_raw(va.as_raw()) }; > ... > } > > If you need a named iterator type (e.g. for returning from a method), > you can wrap CListIter in your own GpuVaIter struct that stores the > kernel node pointer and filters in its Iterator::next() impl. That would > probably also be cleaner. That's a good idea! I will try to implement GpuVaIter based on CListIter. Thanks, Alvin Sun > > OTOH, with CListHeadIter you'd need to do container_of manually on each node, > which might be more erroneous code, whereas CListIter handles that for you. > And anyway, the pointer comparison needed to skip the kernel node is the same > in both approaches. > > Would this work for the Tyr debugfs use case? > > -- > Joel Fernandes > ^ permalink raw reply [flat|nested] 13+ messages in thread
* ✗ CI.checkpatch: warning for rust: clist patches for nova-core memory management 2026-02-24 22:27 [PATCH v11 0/2] rust: clist patches for nova-core memory management Joel Fernandes 2026-02-24 22:27 ` [PATCH v11 1/2] rust: ffi: Convert pub use to pub mod and create ffi module Joel Fernandes 2026-02-24 22:27 ` [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists Joel Fernandes @ 2026-02-24 22:37 ` Patchwork 2026-02-24 22:39 ` ✓ CI.KUnit: success " Patchwork ` (2 subsequent siblings) 5 siblings, 0 replies; 13+ messages in thread From: Patchwork @ 2026-02-24 22:37 UTC (permalink / raw) To: Joel Fernandes; +Cc: intel-xe == Series Details == Series: rust: clist patches for nova-core memory management URL : https://patchwork.freedesktop.org/series/162092/ State : warning == Summary == + KERNEL=/kernel + git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt Cloning into 'mt'... warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/ + git -C mt rev-list -n1 origin/master 1f57ba1afceae32108bd24770069f764d940a0e4 + cd /kernel + git config --global --add safe.directory /kernel + git log -n1 commit 0e1812d248797ab677aed0f89ea0c229a097fb72 Author: Joel Fernandes <joelagnelf@nvidia.com> Date: Tue Feb 24 17:27:34 2026 -0500 rust: clist: Add support to interface with C linked lists Add a new module `clist` 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> Acked-by: Gary Guo <gary@garyguo.net> Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com> + /mt/dim checkpatch 4caa4c7d4ff7bd4d24bca8e795773e460eb8bbfe drm-intel 439e103a753b rust: ffi: Convert pub use to pub mod and create ffi module -:18: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating? #18: new file mode 100644 total: 0 errors, 1 warnings, 0 checks, 22 lines checked 0e1812d24879 rust: clist: Add support to interface with C linked lists -:49: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating? #49: new file mode 100644 total: 0 errors, 1 warnings, 0 checks, 388 lines checked ^ permalink raw reply [flat|nested] 13+ messages in thread
* ✓ CI.KUnit: success for rust: clist patches for nova-core memory management 2026-02-24 22:27 [PATCH v11 0/2] rust: clist patches for nova-core memory management Joel Fernandes ` (2 preceding siblings ...) 2026-02-24 22:37 ` ✗ CI.checkpatch: warning for rust: clist patches for nova-core memory management Patchwork @ 2026-02-24 22:39 ` Patchwork 2026-02-24 23:22 ` ✓ Xe.CI.BAT: " Patchwork 2026-02-25 6:22 ` ✗ Xe.CI.FULL: failure " Patchwork 5 siblings, 0 replies; 13+ messages in thread From: Patchwork @ 2026-02-24 22:39 UTC (permalink / raw) To: Joel Fernandes; +Cc: intel-xe == Series Details == Series: rust: clist patches for nova-core memory management URL : https://patchwork.freedesktop.org/series/162092/ State : success == Summary == + trap cleanup EXIT + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [22:37:13] Configuring KUnit Kernel ... Generating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [22:37:20] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [22:38:21] Starting KUnit Kernel (1/1)... [22:38:21] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [22:38:21] ================== guc_buf (11 subtests) =================== [22:38:21] [PASSED] test_smallest [22:38:21] [PASSED] test_largest [22:38:21] [PASSED] test_granular [22:38:21] [PASSED] test_unique [22:38:21] [PASSED] test_overlap [22:38:21] [PASSED] test_reusable [22:38:21] [PASSED] test_too_big [22:38:21] [PASSED] test_flush [22:38:21] [PASSED] test_lookup [22:38:21] [PASSED] test_data [22:38:21] [PASSED] test_class [22:38:21] ===================== [PASSED] guc_buf ===================== [22:38:21] =================== guc_dbm (7 subtests) =================== [22:38:21] [PASSED] test_empty [22:38:21] [PASSED] test_default [22:38:21] ======================== test_size ======================== [22:38:21] [PASSED] 4 [22:38:21] [PASSED] 8 [22:38:21] [PASSED] 32 [22:38:21] [PASSED] 256 [22:38:21] ==================== [PASSED] test_size ==================== [22:38:21] ======================= test_reuse ======================== [22:38:21] [PASSED] 4 [22:38:21] [PASSED] 8 [22:38:21] [PASSED] 32 [22:38:21] [PASSED] 256 [22:38:21] =================== [PASSED] test_reuse ==================== [22:38:21] =================== test_range_overlap ==================== [22:38:21] [PASSED] 4 [22:38:21] [PASSED] 8 [22:38:21] [PASSED] 32 [22:38:21] [PASSED] 256 [22:38:21] =============== [PASSED] test_range_overlap ================ [22:38:21] =================== test_range_compact ==================== [22:38:21] [PASSED] 4 [22:38:21] [PASSED] 8 [22:38:21] [PASSED] 32 [22:38:21] [PASSED] 256 [22:38:21] =============== [PASSED] test_range_compact ================ [22:38:21] ==================== test_range_spare ===================== [22:38:21] [PASSED] 4 [22:38:21] [PASSED] 8 [22:38:21] [PASSED] 32 [22:38:21] [PASSED] 256 [22:38:21] ================ [PASSED] test_range_spare ================= [22:38:21] ===================== [PASSED] guc_dbm ===================== [22:38:21] =================== guc_idm (6 subtests) =================== [22:38:21] [PASSED] bad_init [22:38:21] [PASSED] no_init [22:38:21] [PASSED] init_fini [22:38:21] [PASSED] check_used [22:38:21] [PASSED] check_quota [22:38:21] [PASSED] check_all [22:38:21] ===================== [PASSED] guc_idm ===================== [22:38:21] ================== no_relay (3 subtests) =================== [22:38:21] [PASSED] xe_drops_guc2pf_if_not_ready [22:38:21] [PASSED] xe_drops_guc2vf_if_not_ready [22:38:21] [PASSED] xe_rejects_send_if_not_ready [22:38:21] ==================== [PASSED] no_relay ===================== [22:38:21] ================== pf_relay (14 subtests) ================== [22:38:21] [PASSED] pf_rejects_guc2pf_too_short [22:38:21] [PASSED] pf_rejects_guc2pf_too_long [22:38:21] [PASSED] pf_rejects_guc2pf_no_payload [22:38:21] [PASSED] pf_fails_no_payload [22:38:21] [PASSED] pf_fails_bad_origin [22:38:21] [PASSED] pf_fails_bad_type [22:38:21] [PASSED] pf_txn_reports_error [22:38:21] [PASSED] pf_txn_sends_pf2guc [22:38:21] [PASSED] pf_sends_pf2guc [22:38:21] [SKIPPED] pf_loopback_nop [22:38:21] [SKIPPED] pf_loopback_echo [22:38:21] [SKIPPED] pf_loopback_fail [22:38:21] [SKIPPED] pf_loopback_busy [22:38:21] [SKIPPED] pf_loopback_retry [22:38:21] ==================== [PASSED] pf_relay ===================== [22:38:21] ================== vf_relay (3 subtests) =================== [22:38:21] [PASSED] vf_rejects_guc2vf_too_short [22:38:21] [PASSED] vf_rejects_guc2vf_too_long [22:38:21] [PASSED] vf_rejects_guc2vf_no_payload [22:38:21] ==================== [PASSED] vf_relay ===================== [22:38:21] ================ pf_gt_config (9 subtests) ================= [22:38:21] [PASSED] fair_contexts_1vf [22:38:21] [PASSED] fair_doorbells_1vf [22:38:21] [PASSED] fair_ggtt_1vf [22:38:21] ====================== fair_vram_1vf ====================== [22:38:21] [PASSED] 3.50 GiB [22:38:21] [PASSED] 11.5 GiB [22:38:21] [PASSED] 15.5 GiB [22:38:21] [PASSED] 31.5 GiB [22:38:21] [PASSED] 63.5 GiB [22:38:21] [PASSED] 13.9 GiB [22:38:21] ================== [PASSED] fair_vram_1vf ================== [22:38:21] ================ fair_vram_1vf_admin_only ================= [22:38:21] [PASSED] 3.50 GiB [22:38:21] [PASSED] 11.5 GiB [22:38:21] [PASSED] 15.5 GiB [22:38:21] [PASSED] 31.5 GiB [22:38:21] [PASSED] 63.5 GiB [22:38:21] [PASSED] 13.9 GiB [22:38:21] ============ [PASSED] fair_vram_1vf_admin_only ============= [22:38:21] ====================== fair_contexts ====================== [22:38:21] [PASSED] 1 VF [22:38:21] [PASSED] 2 VFs [22:38:21] [PASSED] 3 VFs [22:38:21] [PASSED] 4 VFs [22:38:21] [PASSED] 5 VFs [22:38:21] [PASSED] 6 VFs [22:38:21] [PASSED] 7 VFs [22:38:21] [PASSED] 8 VFs [22:38:21] [PASSED] 9 VFs [22:38:21] [PASSED] 10 VFs [22:38:21] [PASSED] 11 VFs [22:38:21] [PASSED] 12 VFs [22:38:21] [PASSED] 13 VFs [22:38:21] [PASSED] 14 VFs [22:38:21] [PASSED] 15 VFs [22:38:21] [PASSED] 16 VFs [22:38:21] [PASSED] 17 VFs [22:38:21] [PASSED] 18 VFs [22:38:21] [PASSED] 19 VFs [22:38:21] [PASSED] 20 VFs [22:38:21] [PASSED] 21 VFs [22:38:21] [PASSED] 22 VFs [22:38:21] [PASSED] 23 VFs [22:38:21] [PASSED] 24 VFs [22:38:21] [PASSED] 25 VFs [22:38:21] [PASSED] 26 VFs [22:38:22] [PASSED] 27 VFs [22:38:22] [PASSED] 28 VFs [22:38:22] [PASSED] 29 VFs [22:38:22] [PASSED] 30 VFs [22:38:22] [PASSED] 31 VFs [22:38:22] [PASSED] 32 VFs [22:38:22] [PASSED] 33 VFs [22:38:22] [PASSED] 34 VFs [22:38:22] [PASSED] 35 VFs [22:38:22] [PASSED] 36 VFs [22:38:22] [PASSED] 37 VFs [22:38:22] [PASSED] 38 VFs [22:38:22] [PASSED] 39 VFs [22:38:22] [PASSED] 40 VFs [22:38:22] [PASSED] 41 VFs [22:38:22] [PASSED] 42 VFs [22:38:22] [PASSED] 43 VFs [22:38:22] [PASSED] 44 VFs [22:38:22] [PASSED] 45 VFs [22:38:22] [PASSED] 46 VFs [22:38:22] [PASSED] 47 VFs [22:38:22] [PASSED] 48 VFs [22:38:22] [PASSED] 49 VFs [22:38:22] [PASSED] 50 VFs [22:38:22] [PASSED] 51 VFs [22:38:22] [PASSED] 52 VFs [22:38:22] [PASSED] 53 VFs [22:38:22] [PASSED] 54 VFs [22:38:22] [PASSED] 55 VFs [22:38:22] [PASSED] 56 VFs [22:38:22] [PASSED] 57 VFs [22:38:22] [PASSED] 58 VFs [22:38:22] [PASSED] 59 VFs [22:38:22] [PASSED] 60 VFs [22:38:22] [PASSED] 61 VFs [22:38:22] [PASSED] 62 VFs [22:38:22] [PASSED] 63 VFs [22:38:22] ================== [PASSED] fair_contexts ================== [22:38:22] ===================== fair_doorbells ====================== [22:38:22] [PASSED] 1 VF [22:38:22] [PASSED] 2 VFs [22:38:22] [PASSED] 3 VFs [22:38:22] [PASSED] 4 VFs [22:38:22] [PASSED] 5 VFs [22:38:22] [PASSED] 6 VFs [22:38:22] [PASSED] 7 VFs [22:38:22] [PASSED] 8 VFs [22:38:22] [PASSED] 9 VFs [22:38:22] [PASSED] 10 VFs [22:38:22] [PASSED] 11 VFs [22:38:22] [PASSED] 12 VFs [22:38:22] [PASSED] 13 VFs [22:38:22] [PASSED] 14 VFs [22:38:22] [PASSED] 15 VFs [22:38:22] [PASSED] 16 VFs [22:38:22] [PASSED] 17 VFs [22:38:22] [PASSED] 18 VFs [22:38:22] [PASSED] 19 VFs [22:38:22] [PASSED] 20 VFs [22:38:22] [PASSED] 21 VFs [22:38:22] [PASSED] 22 VFs [22:38:22] [PASSED] 23 VFs [22:38:22] [PASSED] 24 VFs [22:38:22] [PASSED] 25 VFs [22:38:22] [PASSED] 26 VFs [22:38:22] [PASSED] 27 VFs [22:38:22] [PASSED] 28 VFs [22:38:22] [PASSED] 29 VFs [22:38:22] [PASSED] 30 VFs [22:38:22] [PASSED] 31 VFs [22:38:22] [PASSED] 32 VFs [22:38:22] [PASSED] 33 VFs [22:38:22] [PASSED] 34 VFs [22:38:22] [PASSED] 35 VFs [22:38:22] [PASSED] 36 VFs [22:38:22] [PASSED] 37 VFs [22:38:22] [PASSED] 38 VFs [22:38:22] [PASSED] 39 VFs [22:38:22] [PASSED] 40 VFs [22:38:22] [PASSED] 41 VFs [22:38:22] [PASSED] 42 VFs [22:38:22] [PASSED] 43 VFs [22:38:22] [PASSED] 44 VFs [22:38:22] [PASSED] 45 VFs [22:38:22] [PASSED] 46 VFs [22:38:22] [PASSED] 47 VFs [22:38:22] [PASSED] 48 VFs [22:38:22] [PASSED] 49 VFs [22:38:22] [PASSED] 50 VFs [22:38:22] [PASSED] 51 VFs [22:38:22] [PASSED] 52 VFs [22:38:22] [PASSED] 53 VFs [22:38:22] [PASSED] 54 VFs [22:38:22] [PASSED] 55 VFs [22:38:22] [PASSED] 56 VFs [22:38:22] [PASSED] 57 VFs [22:38:22] [PASSED] 58 VFs [22:38:22] [PASSED] 59 VFs [22:38:22] [PASSED] 60 VFs [22:38:22] [PASSED] 61 VFs [22:38:22] [PASSED] 62 VFs [22:38:22] [PASSED] 63 VFs [22:38:22] ================= [PASSED] fair_doorbells ================== [22:38:22] ======================== fair_ggtt ======================== [22:38:22] [PASSED] 1 VF [22:38:22] [PASSED] 2 VFs [22:38:22] [PASSED] 3 VFs [22:38:22] [PASSED] 4 VFs [22:38:22] [PASSED] 5 VFs [22:38:22] [PASSED] 6 VFs [22:38:22] [PASSED] 7 VFs [22:38:22] [PASSED] 8 VFs [22:38:22] [PASSED] 9 VFs [22:38:22] [PASSED] 10 VFs [22:38:22] [PASSED] 11 VFs [22:38:22] [PASSED] 12 VFs [22:38:22] [PASSED] 13 VFs [22:38:22] [PASSED] 14 VFs [22:38:22] [PASSED] 15 VFs [22:38:22] [PASSED] 16 VFs [22:38:22] [PASSED] 17 VFs [22:38:22] [PASSED] 18 VFs [22:38:22] [PASSED] 19 VFs [22:38:22] [PASSED] 20 VFs [22:38:22] [PASSED] 21 VFs [22:38:22] [PASSED] 22 VFs [22:38:22] [PASSED] 23 VFs [22:38:22] [PASSED] 24 VFs [22:38:22] [PASSED] 25 VFs [22:38:22] [PASSED] 26 VFs [22:38:22] [PASSED] 27 VFs [22:38:22] [PASSED] 28 VFs [22:38:22] [PASSED] 29 VFs [22:38:22] [PASSED] 30 VFs [22:38:22] [PASSED] 31 VFs [22:38:22] [PASSED] 32 VFs [22:38:22] [PASSED] 33 VFs [22:38:22] [PASSED] 34 VFs [22:38:22] [PASSED] 35 VFs [22:38:22] [PASSED] 36 VFs [22:38:22] [PASSED] 37 VFs [22:38:22] [PASSED] 38 VFs [22:38:22] [PASSED] 39 VFs [22:38:22] [PASSED] 40 VFs [22:38:22] [PASSED] 41 VFs [22:38:22] [PASSED] 42 VFs [22:38:22] [PASSED] 43 VFs [22:38:22] [PASSED] 44 VFs [22:38:22] [PASSED] 45 VFs [22:38:22] [PASSED] 46 VFs [22:38:22] [PASSED] 47 VFs [22:38:22] [PASSED] 48 VFs [22:38:22] [PASSED] 49 VFs [22:38:22] [PASSED] 50 VFs [22:38:22] [PASSED] 51 VFs [22:38:22] [PASSED] 52 VFs [22:38:22] [PASSED] 53 VFs [22:38:22] [PASSED] 54 VFs [22:38:22] [PASSED] 55 VFs [22:38:22] [PASSED] 56 VFs [22:38:22] [PASSED] 57 VFs [22:38:22] [PASSED] 58 VFs [22:38:22] [PASSED] 59 VFs [22:38:22] [PASSED] 60 VFs [22:38:22] [PASSED] 61 VFs [22:38:22] [PASSED] 62 VFs [22:38:22] [PASSED] 63 VFs [22:38:22] ==================== [PASSED] fair_ggtt ==================== [22:38:22] ======================== fair_vram ======================== [22:38:22] [PASSED] 1 VF [22:38:22] [PASSED] 2 VFs [22:38:22] [PASSED] 3 VFs [22:38:22] [PASSED] 4 VFs [22:38:22] [PASSED] 5 VFs [22:38:22] [PASSED] 6 VFs [22:38:22] [PASSED] 7 VFs [22:38:22] [PASSED] 8 VFs [22:38:22] [PASSED] 9 VFs [22:38:22] [PASSED] 10 VFs [22:38:22] [PASSED] 11 VFs [22:38:22] [PASSED] 12 VFs [22:38:22] [PASSED] 13 VFs [22:38:22] [PASSED] 14 VFs [22:38:22] [PASSED] 15 VFs [22:38:22] [PASSED] 16 VFs [22:38:22] [PASSED] 17 VFs [22:38:22] [PASSED] 18 VFs [22:38:22] [PASSED] 19 VFs [22:38:22] [PASSED] 20 VFs [22:38:22] [PASSED] 21 VFs [22:38:22] [PASSED] 22 VFs [22:38:22] [PASSED] 23 VFs [22:38:22] [PASSED] 24 VFs [22:38:22] [PASSED] 25 VFs [22:38:22] [PASSED] 26 VFs [22:38:22] [PASSED] 27 VFs [22:38:22] [PASSED] 28 VFs [22:38:22] [PASSED] 29 VFs [22:38:22] [PASSED] 30 VFs [22:38:22] [PASSED] 31 VFs [22:38:22] [PASSED] 32 VFs [22:38:22] [PASSED] 33 VFs [22:38:22] [PASSED] 34 VFs [22:38:22] [PASSED] 35 VFs [22:38:22] [PASSED] 36 VFs [22:38:22] [PASSED] 37 VFs [22:38:22] [PASSED] 38 VFs [22:38:22] [PASSED] 39 VFs [22:38:22] [PASSED] 40 VFs [22:38:22] [PASSED] 41 VFs [22:38:22] [PASSED] 42 VFs [22:38:22] [PASSED] 43 VFs [22:38:22] [PASSED] 44 VFs [22:38:22] [PASSED] 45 VFs [22:38:22] [PASSED] 46 VFs [22:38:22] [PASSED] 47 VFs [22:38:22] [PASSED] 48 VFs [22:38:22] [PASSED] 49 VFs [22:38:22] [PASSED] 50 VFs [22:38:22] [PASSED] 51 VFs [22:38:22] [PASSED] 52 VFs [22:38:22] [PASSED] 53 VFs [22:38:22] [PASSED] 54 VFs [22:38:22] [PASSED] 55 VFs [22:38:22] [PASSED] 56 VFs [22:38:22] [PASSED] 57 VFs [22:38:22] [PASSED] 58 VFs [22:38:22] [PASSED] 59 VFs [22:38:22] [PASSED] 60 VFs [22:38:22] [PASSED] 61 VFs [22:38:22] [PASSED] 62 VFs [22:38:22] [PASSED] 63 VFs [22:38:22] ==================== [PASSED] fair_vram ==================== [22:38:22] ================== [PASSED] pf_gt_config =================== [22:38:22] ===================== lmtt (1 subtest) ===================== [22:38:22] ======================== test_ops ========================= [22:38:22] [PASSED] 2-level [22:38:22] [PASSED] multi-level [22:38:22] ==================== [PASSED] test_ops ===================== [22:38:22] ====================== [PASSED] lmtt ======================= [22:38:22] ================= pf_service (11 subtests) ================= [22:38:22] [PASSED] pf_negotiate_any [22:38:22] [PASSED] pf_negotiate_base_match [22:38:22] [PASSED] pf_negotiate_base_newer [22:38:22] [PASSED] pf_negotiate_base_next [22:38:22] [SKIPPED] pf_negotiate_base_older [22:38:22] [PASSED] pf_negotiate_base_prev [22:38:22] [PASSED] pf_negotiate_latest_match [22:38:22] [PASSED] pf_negotiate_latest_newer [22:38:22] [PASSED] pf_negotiate_latest_next [22:38:22] [SKIPPED] pf_negotiate_latest_older [22:38:22] [SKIPPED] pf_negotiate_latest_prev [22:38:22] =================== [PASSED] pf_service ==================== [22:38:22] ================= xe_guc_g2g (2 subtests) ================== [22:38:22] ============== xe_live_guc_g2g_kunit_default ============== [22:38:22] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ========== [22:38:22] ============== xe_live_guc_g2g_kunit_allmem =============== [22:38:22] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ========== [22:38:22] =================== [SKIPPED] xe_guc_g2g =================== [22:38:22] =================== xe_mocs (2 subtests) =================== [22:38:22] ================ xe_live_mocs_kernel_kunit ================ [22:38:22] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============ [22:38:22] ================ xe_live_mocs_reset_kunit ================= [22:38:22] ============ [SKIPPED] xe_live_mocs_reset_kunit ============ [22:38:22] ==================== [SKIPPED] xe_mocs ===================== [22:38:22] ================= xe_migrate (2 subtests) ================== [22:38:22] ================= xe_migrate_sanity_kunit ================= [22:38:22] ============ [SKIPPED] xe_migrate_sanity_kunit ============= [22:38:22] ================== xe_validate_ccs_kunit ================== [22:38:22] ============= [SKIPPED] xe_validate_ccs_kunit ============== [22:38:22] =================== [SKIPPED] xe_migrate =================== [22:38:22] ================== xe_dma_buf (1 subtest) ================== [22:38:22] ==================== xe_dma_buf_kunit ===================== [22:38:22] ================ [SKIPPED] xe_dma_buf_kunit ================ [22:38:22] =================== [SKIPPED] xe_dma_buf =================== [22:38:22] ================= xe_bo_shrink (1 subtest) ================= [22:38:22] =================== xe_bo_shrink_kunit ==================== [22:38:22] =============== [SKIPPED] xe_bo_shrink_kunit =============== [22:38:22] ================== [SKIPPED] xe_bo_shrink ================== [22:38:22] ==================== xe_bo (2 subtests) ==================== [22:38:22] ================== xe_ccs_migrate_kunit =================== [22:38:22] ============== [SKIPPED] xe_ccs_migrate_kunit ============== [22:38:22] ==================== xe_bo_evict_kunit ==================== [22:38:22] =============== [SKIPPED] xe_bo_evict_kunit ================ [22:38:22] ===================== [SKIPPED] xe_bo ====================== [22:38:22] ==================== args (13 subtests) ==================== [22:38:22] [PASSED] count_args_test [22:38:22] [PASSED] call_args_example [22:38:22] [PASSED] call_args_test [22:38:22] [PASSED] drop_first_arg_example [22:38:22] [PASSED] drop_first_arg_test [22:38:22] [PASSED] first_arg_example [22:38:22] [PASSED] first_arg_test [22:38:22] [PASSED] last_arg_example [22:38:22] [PASSED] last_arg_test [22:38:22] [PASSED] pick_arg_example [22:38:22] [PASSED] if_args_example [22:38:22] [PASSED] if_args_test [22:38:22] [PASSED] sep_comma_example [22:38:22] ====================== [PASSED] args ======================= [22:38:22] =================== xe_pci (3 subtests) ==================== [22:38:22] ==================== check_graphics_ip ==================== [22:38:22] [PASSED] 12.00 Xe_LP [22:38:22] [PASSED] 12.10 Xe_LP+ [22:38:22] [PASSED] 12.55 Xe_HPG [22:38:22] [PASSED] 12.60 Xe_HPC [22:38:22] [PASSED] 12.70 Xe_LPG [22:38:22] [PASSED] 12.71 Xe_LPG [22:38:22] [PASSED] 12.74 Xe_LPG+ [22:38:22] [PASSED] 20.01 Xe2_HPG [22:38:22] [PASSED] 20.02 Xe2_HPG [22:38:22] [PASSED] 20.04 Xe2_LPG [22:38:22] [PASSED] 30.00 Xe3_LPG [22:38:22] [PASSED] 30.01 Xe3_LPG [22:38:22] [PASSED] 30.03 Xe3_LPG [22:38:22] [PASSED] 30.04 Xe3_LPG [22:38:22] [PASSED] 30.05 Xe3_LPG [22:38:22] [PASSED] 35.10 Xe3p_LPG [22:38:22] [PASSED] 35.11 Xe3p_XPC [22:38:22] ================ [PASSED] check_graphics_ip ================ [22:38:22] ===================== check_media_ip ====================== [22:38:22] [PASSED] 12.00 Xe_M [22:38:22] [PASSED] 12.55 Xe_HPM [22:38:22] [PASSED] 13.00 Xe_LPM+ [22:38:22] [PASSED] 13.01 Xe2_HPM [22:38:22] [PASSED] 20.00 Xe2_LPM [22:38:22] [PASSED] 30.00 Xe3_LPM [22:38:22] [PASSED] 30.02 Xe3_LPM [22:38:22] [PASSED] 35.00 Xe3p_LPM [22:38:22] [PASSED] 35.03 Xe3p_HPM [22:38:22] ================= [PASSED] check_media_ip ================== [22:38:22] =================== check_platform_desc =================== [22:38:22] [PASSED] 0x9A60 (TIGERLAKE) [22:38:22] [PASSED] 0x9A68 (TIGERLAKE) [22:38:22] [PASSED] 0x9A70 (TIGERLAKE) [22:38:22] [PASSED] 0x9A40 (TIGERLAKE) [22:38:22] [PASSED] 0x9A49 (TIGERLAKE) [22:38:22] [PASSED] 0x9A59 (TIGERLAKE) [22:38:22] [PASSED] 0x9A78 (TIGERLAKE) [22:38:22] [PASSED] 0x9AC0 (TIGERLAKE) [22:38:22] [PASSED] 0x9AC9 (TIGERLAKE) [22:38:22] [PASSED] 0x9AD9 (TIGERLAKE) [22:38:22] [PASSED] 0x9AF8 (TIGERLAKE) [22:38:22] [PASSED] 0x4C80 (ROCKETLAKE) [22:38:22] [PASSED] 0x4C8A (ROCKETLAKE) [22:38:22] [PASSED] 0x4C8B (ROCKETLAKE) [22:38:22] [PASSED] 0x4C8C (ROCKETLAKE) [22:38:22] [PASSED] 0x4C90 (ROCKETLAKE) [22:38:22] [PASSED] 0x4C9A (ROCKETLAKE) [22:38:22] [PASSED] 0x4680 (ALDERLAKE_S) [22:38:22] [PASSED] 0x4682 (ALDERLAKE_S) [22:38:22] [PASSED] 0x4688 (ALDERLAKE_S) [22:38:22] [PASSED] 0x468A (ALDERLAKE_S) [22:38:22] [PASSED] 0x468B (ALDERLAKE_S) [22:38:22] [PASSED] 0x4690 (ALDERLAKE_S) [22:38:22] [PASSED] 0x4692 (ALDERLAKE_S) [22:38:22] [PASSED] 0x4693 (ALDERLAKE_S) [22:38:22] [PASSED] 0x46A0 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46A1 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46A2 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46A3 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46A6 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46A8 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46AA (ALDERLAKE_P) [22:38:22] [PASSED] 0x462A (ALDERLAKE_P) [22:38:22] [PASSED] 0x4626 (ALDERLAKE_P) [22:38:22] [PASSED] 0x4628 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46B0 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46B1 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46B2 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46B3 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46C0 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46C1 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46C2 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46C3 (ALDERLAKE_P) [22:38:22] [PASSED] 0x46D0 (ALDERLAKE_N) [22:38:22] [PASSED] 0x46D1 (ALDERLAKE_N) [22:38:22] [PASSED] 0x46D2 (ALDERLAKE_N) [22:38:22] [PASSED] 0x46D3 (ALDERLAKE_N) [22:38:22] [PASSED] 0x46D4 (ALDERLAKE_N) [22:38:22] [PASSED] 0xA721 (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7A1 (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7A9 (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7AC (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7AD (ALDERLAKE_P) [22:38:22] [PASSED] 0xA720 (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7A0 (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7A8 (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7AA (ALDERLAKE_P) [22:38:22] [PASSED] 0xA7AB (ALDERLAKE_P) [22:38:22] [PASSED] 0xA780 (ALDERLAKE_S) [22:38:22] [PASSED] 0xA781 (ALDERLAKE_S) [22:38:22] [PASSED] 0xA782 (ALDERLAKE_S) [22:38:22] [PASSED] 0xA783 (ALDERLAKE_S) [22:38:22] [PASSED] 0xA788 (ALDERLAKE_S) [22:38:22] [PASSED] 0xA789 (ALDERLAKE_S) [22:38:22] [PASSED] 0xA78A (ALDERLAKE_S) [22:38:22] [PASSED] 0xA78B (ALDERLAKE_S) [22:38:22] [PASSED] 0x4905 (DG1) [22:38:22] [PASSED] 0x4906 (DG1) [22:38:22] [PASSED] 0x4907 (DG1) [22:38:22] [PASSED] 0x4908 (DG1) [22:38:22] [PASSED] 0x4909 (DG1) [22:38:22] [PASSED] 0x56C0 (DG2) [22:38:22] [PASSED] 0x56C2 (DG2) [22:38:22] [PASSED] 0x56C1 (DG2) [22:38:22] [PASSED] 0x7D51 (METEORLAKE) [22:38:22] [PASSED] 0x7DD1 (METEORLAKE) [22:38:22] [PASSED] 0x7D41 (METEORLAKE) [22:38:22] [PASSED] 0x7D67 (METEORLAKE) [22:38:22] [PASSED] 0xB640 (METEORLAKE) [22:38:22] [PASSED] 0x56A0 (DG2) [22:38:22] [PASSED] 0x56A1 (DG2) [22:38:22] [PASSED] 0x56A2 (DG2) [22:38:22] [PASSED] 0x56BE (DG2) [22:38:22] [PASSED] 0x56BF (DG2) [22:38:22] [PASSED] 0x5690 (DG2) [22:38:22] [PASSED] 0x5691 (DG2) [22:38:22] [PASSED] 0x5692 (DG2) [22:38:22] [PASSED] 0x56A5 (DG2) [22:38:22] [PASSED] 0x56A6 (DG2) [22:38:22] [PASSED] 0x56B0 (DG2) [22:38:22] [PASSED] 0x56B1 (DG2) [22:38:22] [PASSED] 0x56BA (DG2) [22:38:22] [PASSED] 0x56BB (DG2) [22:38:22] [PASSED] 0x56BC (DG2) [22:38:22] [PASSED] 0x56BD (DG2) [22:38:22] [PASSED] 0x5693 (DG2) [22:38:22] [PASSED] 0x5694 (DG2) [22:38:22] [PASSED] 0x5695 (DG2) [22:38:22] [PASSED] 0x56A3 (DG2) [22:38:22] [PASSED] 0x56A4 (DG2) [22:38:22] [PASSED] 0x56B2 (DG2) [22:38:22] [PASSED] 0x56B3 (DG2) [22:38:22] [PASSED] 0x5696 (DG2) [22:38:22] [PASSED] 0x5697 (DG2) [22:38:22] [PASSED] 0xB69 (PVC) [22:38:22] [PASSED] 0xB6E (PVC) [22:38:22] [PASSED] 0xBD4 (PVC) [22:38:22] [PASSED] 0xBD5 (PVC) [22:38:22] [PASSED] 0xBD6 (PVC) [22:38:22] [PASSED] 0xBD7 (PVC) [22:38:22] [PASSED] 0xBD8 (PVC) [22:38:22] [PASSED] 0xBD9 (PVC) [22:38:22] [PASSED] 0xBDA (PVC) [22:38:22] [PASSED] 0xBDB (PVC) [22:38:22] [PASSED] 0xBE0 (PVC) [22:38:22] [PASSED] 0xBE1 (PVC) [22:38:22] [PASSED] 0xBE5 (PVC) [22:38:22] [PASSED] 0x7D40 (METEORLAKE) [22:38:22] [PASSED] 0x7D45 (METEORLAKE) [22:38:22] [PASSED] 0x7D55 (METEORLAKE) [22:38:22] [PASSED] 0x7D60 (METEORLAKE) [22:38:22] [PASSED] 0x7DD5 (METEORLAKE) [22:38:22] [PASSED] 0x6420 (LUNARLAKE) [22:38:22] [PASSED] 0x64A0 (LUNARLAKE) [22:38:22] [PASSED] 0x64B0 (LUNARLAKE) [22:38:22] [PASSED] 0xE202 (BATTLEMAGE) [22:38:22] [PASSED] 0xE209 (BATTLEMAGE) [22:38:22] [PASSED] 0xE20B (BATTLEMAGE) [22:38:22] [PASSED] 0xE20C (BATTLEMAGE) [22:38:22] [PASSED] 0xE20D (BATTLEMAGE) [22:38:22] [PASSED] 0xE210 (BATTLEMAGE) [22:38:22] [PASSED] 0xE211 (BATTLEMAGE) [22:38:22] [PASSED] 0xE212 (BATTLEMAGE) [22:38:22] [PASSED] 0xE216 (BATTLEMAGE) [22:38:22] [PASSED] 0xE220 (BATTLEMAGE) [22:38:22] [PASSED] 0xE221 (BATTLEMAGE) [22:38:22] [PASSED] 0xE222 (BATTLEMAGE) [22:38:22] [PASSED] 0xE223 (BATTLEMAGE) [22:38:22] [PASSED] 0xB080 (PANTHERLAKE) [22:38:22] [PASSED] 0xB081 (PANTHERLAKE) [22:38:22] [PASSED] 0xB082 (PANTHERLAKE) [22:38:22] [PASSED] 0xB083 (PANTHERLAKE) [22:38:22] [PASSED] 0xB084 (PANTHERLAKE) [22:38:22] [PASSED] 0xB085 (PANTHERLAKE) [22:38:22] [PASSED] 0xB086 (PANTHERLAKE) [22:38:22] [PASSED] 0xB087 (PANTHERLAKE) [22:38:22] [PASSED] 0xB08F (PANTHERLAKE) [22:38:22] [PASSED] 0xB090 (PANTHERLAKE) [22:38:22] [PASSED] 0xB0A0 (PANTHERLAKE) [22:38:22] [PASSED] 0xB0B0 (PANTHERLAKE) [22:38:22] [PASSED] 0xFD80 (PANTHERLAKE) [22:38:22] [PASSED] 0xFD81 (PANTHERLAKE) [22:38:22] [PASSED] 0xD740 (NOVALAKE_S) [22:38:22] [PASSED] 0xD741 (NOVALAKE_S) [22:38:22] [PASSED] 0xD742 (NOVALAKE_S) [22:38:22] [PASSED] 0xD743 (NOVALAKE_S) [22:38:22] [PASSED] 0xD744 (NOVALAKE_S) [22:38:22] [PASSED] 0xD745 (NOVALAKE_S) [22:38:22] [PASSED] 0x674C (CRESCENTISLAND) [22:38:22] [PASSED] 0xD750 (NOVALAKE_P) [22:38:22] [PASSED] 0xD751 (NOVALAKE_P) [22:38:22] [PASSED] 0xD752 (NOVALAKE_P) [22:38:22] [PASSED] 0xD753 (NOVALAKE_P) [22:38:22] [PASSED] 0xD754 (NOVALAKE_P) [22:38:22] [PASSED] 0xD755 (NOVALAKE_P) [22:38:22] [PASSED] 0xD756 (NOVALAKE_P) [22:38:22] [PASSED] 0xD757 (NOVALAKE_P) [22:38:22] [PASSED] 0xD75F (NOVALAKE_P) [22:38:22] =============== [PASSED] check_platform_desc =============== [22:38:22] ===================== [PASSED] xe_pci ====================== [22:38:22] =================== xe_rtp (2 subtests) ==================== [22:38:22] =============== xe_rtp_process_to_sr_tests ================ [22:38:22] [PASSED] coalesce-same-reg [22:38:22] [PASSED] no-match-no-add [22:38:22] [PASSED] match-or [22:38:22] [PASSED] match-or-xfail [22:38:22] [PASSED] no-match-no-add-multiple-rules [22:38:22] [PASSED] two-regs-two-entries [22:38:22] [PASSED] clr-one-set-other [22:38:22] [PASSED] set-field [22:38:22] [PASSED] conflict-duplicate stty: 'standard input': Inappropriate ioctl for device [22:38:22] [PASSED] conflict-not-disjoint [22:38:22] [PASSED] conflict-reg-type [22:38:22] =========== [PASSED] xe_rtp_process_to_sr_tests ============ [22:38:22] ================== xe_rtp_process_tests =================== [22:38:22] [PASSED] active1 [22:38:22] [PASSED] active2 [22:38:22] [PASSED] active-inactive [22:38:22] [PASSED] inactive-active [22:38:22] [PASSED] inactive-1st_or_active-inactive [22:38:22] [PASSED] inactive-2nd_or_active-inactive [22:38:22] [PASSED] inactive-last_or_active-inactive [22:38:22] [PASSED] inactive-no_or_active-inactive [22:38:22] ============== [PASSED] xe_rtp_process_tests =============== [22:38:22] ===================== [PASSED] xe_rtp ====================== [22:38:22] ==================== xe_wa (1 subtest) ===================== [22:38:22] ======================== xe_wa_gt ========================= [22:38:22] [PASSED] TIGERLAKE B0 [22:38:22] [PASSED] DG1 A0 [22:38:22] [PASSED] DG1 B0 [22:38:22] [PASSED] ALDERLAKE_S A0 [22:38:22] [PASSED] ALDERLAKE_S B0 [22:38:22] [PASSED] ALDERLAKE_S C0 [22:38:22] [PASSED] ALDERLAKE_S D0 [22:38:22] [PASSED] ALDERLAKE_P A0 [22:38:22] [PASSED] ALDERLAKE_P B0 [22:38:22] [PASSED] ALDERLAKE_P C0 [22:38:22] [PASSED] ALDERLAKE_S RPLS D0 [22:38:22] [PASSED] ALDERLAKE_P RPLU E0 [22:38:22] [PASSED] DG2 G10 C0 [22:38:22] [PASSED] DG2 G11 B1 [22:38:22] [PASSED] DG2 G12 A1 [22:38:22] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0 [22:38:22] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0 [22:38:22] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0 [22:38:22] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0 [22:38:22] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0 [22:38:22] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1 [22:38:22] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0 [22:38:22] ==================== [PASSED] xe_wa_gt ===================== [22:38:22] ====================== [PASSED] xe_wa ====================== [22:38:22] ============================================================ [22:38:22] Testing complete. Ran 597 tests: passed: 579, skipped: 18 [22:38:22] Elapsed time: 69.090s total, 7.094s configuring, 60.925s building, 1.021s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [22:38:22] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [22:38:25] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [22:39:11] Starting KUnit Kernel (1/1)... [22:39:11] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [22:39:11] ============ drm_test_pick_cmdline (2 subtests) ============ [22:39:11] [PASSED] drm_test_pick_cmdline_res_1920_1080_60 [22:39:11] =============== drm_test_pick_cmdline_named =============== [22:39:11] [PASSED] NTSC [22:39:11] [PASSED] NTSC-J [22:39:11] [PASSED] PAL [22:39:11] [PASSED] PAL-M [22:39:11] =========== [PASSED] drm_test_pick_cmdline_named =========== [22:39:11] ============== [PASSED] drm_test_pick_cmdline ============== [22:39:11] == drm_test_atomic_get_connector_for_encoder (1 subtest) === [22:39:11] [PASSED] drm_test_drm_atomic_get_connector_for_encoder [22:39:11] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ==== [22:39:11] =========== drm_validate_clone_mode (2 subtests) =========== [22:39:11] ============== drm_test_check_in_clone_mode =============== [22:39:11] [PASSED] in_clone_mode [22:39:11] [PASSED] not_in_clone_mode [22:39:11] ========== [PASSED] drm_test_check_in_clone_mode =========== [22:39:11] =============== drm_test_check_valid_clones =============== [22:39:11] [PASSED] not_in_clone_mode [22:39:11] [PASSED] valid_clone [22:39:11] [PASSED] invalid_clone [22:39:11] =========== [PASSED] drm_test_check_valid_clones =========== [22:39:11] ============= [PASSED] drm_validate_clone_mode ============= [22:39:11] ============= drm_validate_modeset (1 subtest) ============= [22:39:11] [PASSED] drm_test_check_connector_changed_modeset [22:39:11] ============== [PASSED] drm_validate_modeset =============== [22:39:11] ====== drm_test_bridge_get_current_state (2 subtests) ====== [22:39:11] [PASSED] drm_test_drm_bridge_get_current_state_atomic [22:39:11] [PASSED] drm_test_drm_bridge_get_current_state_legacy [22:39:11] ======== [PASSED] drm_test_bridge_get_current_state ======== [22:39:11] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ====== [22:39:11] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic [22:39:11] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled [22:39:11] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy [22:39:11] ======== [PASSED] drm_test_bridge_helper_reset_crtc ======== [22:39:11] ============== drm_bridge_alloc (2 subtests) =============== [22:39:11] [PASSED] drm_test_drm_bridge_alloc_basic [22:39:11] [PASSED] drm_test_drm_bridge_alloc_get_put [22:39:11] ================ [PASSED] drm_bridge_alloc ================= [22:39:11] ============= drm_cmdline_parser (40 subtests) ============= [22:39:11] [PASSED] drm_test_cmdline_force_d_only [22:39:11] [PASSED] drm_test_cmdline_force_D_only_dvi [22:39:11] [PASSED] drm_test_cmdline_force_D_only_hdmi [22:39:11] [PASSED] drm_test_cmdline_force_D_only_not_digital [22:39:11] [PASSED] drm_test_cmdline_force_e_only [22:39:11] [PASSED] drm_test_cmdline_res [22:39:11] [PASSED] drm_test_cmdline_res_vesa [22:39:11] [PASSED] drm_test_cmdline_res_vesa_rblank [22:39:11] [PASSED] drm_test_cmdline_res_rblank [22:39:11] [PASSED] drm_test_cmdline_res_bpp [22:39:11] [PASSED] drm_test_cmdline_res_refresh [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh_margins [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital [22:39:11] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on [22:39:11] [PASSED] drm_test_cmdline_res_margins_force_on [22:39:11] [PASSED] drm_test_cmdline_res_vesa_margins [22:39:11] [PASSED] drm_test_cmdline_name [22:39:11] [PASSED] drm_test_cmdline_name_bpp [22:39:11] [PASSED] drm_test_cmdline_name_option [22:39:11] [PASSED] drm_test_cmdline_name_bpp_option [22:39:11] [PASSED] drm_test_cmdline_rotate_0 [22:39:11] [PASSED] drm_test_cmdline_rotate_90 [22:39:11] [PASSED] drm_test_cmdline_rotate_180 [22:39:11] [PASSED] drm_test_cmdline_rotate_270 [22:39:11] [PASSED] drm_test_cmdline_hmirror [22:39:11] [PASSED] drm_test_cmdline_vmirror [22:39:11] [PASSED] drm_test_cmdline_margin_options [22:39:11] [PASSED] drm_test_cmdline_multiple_options [22:39:11] [PASSED] drm_test_cmdline_bpp_extra_and_option [22:39:11] [PASSED] drm_test_cmdline_extra_and_option [22:39:11] [PASSED] drm_test_cmdline_freestanding_options [22:39:11] [PASSED] drm_test_cmdline_freestanding_force_e_and_options [22:39:11] [PASSED] drm_test_cmdline_panel_orientation [22:39:11] ================ drm_test_cmdline_invalid ================= [22:39:11] [PASSED] margin_only [22:39:11] [PASSED] interlace_only [22:39:11] [PASSED] res_missing_x [22:39:11] [PASSED] res_missing_y [22:39:11] [PASSED] res_bad_y [22:39:11] [PASSED] res_missing_y_bpp [22:39:11] [PASSED] res_bad_bpp [22:39:11] [PASSED] res_bad_refresh [22:39:11] [PASSED] res_bpp_refresh_force_on_off [22:39:11] [PASSED] res_invalid_mode [22:39:11] [PASSED] res_bpp_wrong_place_mode [22:39:11] [PASSED] name_bpp_refresh [22:39:11] [PASSED] name_refresh [22:39:11] [PASSED] name_refresh_wrong_mode [22:39:11] [PASSED] name_refresh_invalid_mode [22:39:11] [PASSED] rotate_multiple [22:39:11] [PASSED] rotate_invalid_val [22:39:11] [PASSED] rotate_truncated [22:39:11] [PASSED] invalid_option [22:39:11] [PASSED] invalid_tv_option [22:39:11] [PASSED] truncated_tv_option [22:39:11] ============ [PASSED] drm_test_cmdline_invalid ============= [22:39:11] =============== drm_test_cmdline_tv_options =============== [22:39:11] [PASSED] NTSC [22:39:11] [PASSED] NTSC_443 [22:39:11] [PASSED] NTSC_J [22:39:11] [PASSED] PAL [22:39:11] [PASSED] PAL_M [22:39:11] [PASSED] PAL_N [22:39:11] [PASSED] SECAM [22:39:11] [PASSED] MONO_525 [22:39:11] [PASSED] MONO_625 [22:39:11] =========== [PASSED] drm_test_cmdline_tv_options =========== [22:39:11] =============== [PASSED] drm_cmdline_parser ================ [22:39:11] ========== drmm_connector_hdmi_init (20 subtests) ========== [22:39:11] [PASSED] drm_test_connector_hdmi_init_valid [22:39:11] [PASSED] drm_test_connector_hdmi_init_bpc_8 [22:39:11] [PASSED] drm_test_connector_hdmi_init_bpc_10 [22:39:11] [PASSED] drm_test_connector_hdmi_init_bpc_12 [22:39:11] [PASSED] drm_test_connector_hdmi_init_bpc_invalid [22:39:11] [PASSED] drm_test_connector_hdmi_init_bpc_null [22:39:11] [PASSED] drm_test_connector_hdmi_init_formats_empty [22:39:11] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb [22:39:11] === drm_test_connector_hdmi_init_formats_yuv420_allowed === [22:39:11] [PASSED] supported_formats=0x9 yuv420_allowed=1 [22:39:11] [PASSED] supported_formats=0x9 yuv420_allowed=0 [22:39:11] [PASSED] supported_formats=0x3 yuv420_allowed=1 [22:39:11] [PASSED] supported_formats=0x3 yuv420_allowed=0 [22:39:11] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed === [22:39:11] [PASSED] drm_test_connector_hdmi_init_null_ddc [22:39:11] [PASSED] drm_test_connector_hdmi_init_null_product [22:39:11] [PASSED] drm_test_connector_hdmi_init_null_vendor [22:39:11] [PASSED] drm_test_connector_hdmi_init_product_length_exact [22:39:11] [PASSED] drm_test_connector_hdmi_init_product_length_too_long [22:39:11] [PASSED] drm_test_connector_hdmi_init_product_valid [22:39:11] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact [22:39:11] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long [22:39:11] [PASSED] drm_test_connector_hdmi_init_vendor_valid [22:39:11] ========= drm_test_connector_hdmi_init_type_valid ========= [22:39:11] [PASSED] HDMI-A [22:39:11] [PASSED] HDMI-B [22:39:11] ===== [PASSED] drm_test_connector_hdmi_init_type_valid ===== [22:39:11] ======== drm_test_connector_hdmi_init_type_invalid ======== [22:39:11] [PASSED] Unknown [22:39:11] [PASSED] VGA [22:39:11] [PASSED] DVI-I [22:39:11] [PASSED] DVI-D [22:39:11] [PASSED] DVI-A [22:39:11] [PASSED] Composite [22:39:11] [PASSED] SVIDEO [22:39:11] [PASSED] LVDS [22:39:11] [PASSED] Component [22:39:11] [PASSED] DIN [22:39:11] [PASSED] DP [22:39:11] [PASSED] TV [22:39:11] [PASSED] eDP [22:39:11] [PASSED] Virtual [22:39:11] [PASSED] DSI [22:39:11] [PASSED] DPI [22:39:11] [PASSED] Writeback [22:39:11] [PASSED] SPI [22:39:11] [PASSED] USB [22:39:11] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ==== [22:39:11] ============ [PASSED] drmm_connector_hdmi_init ============= [22:39:11] ============= drmm_connector_init (3 subtests) ============= [22:39:11] [PASSED] drm_test_drmm_connector_init [22:39:11] [PASSED] drm_test_drmm_connector_init_null_ddc [22:39:11] ========= drm_test_drmm_connector_init_type_valid ========= [22:39:11] [PASSED] Unknown [22:39:11] [PASSED] VGA [22:39:11] [PASSED] DVI-I [22:39:11] [PASSED] DVI-D [22:39:11] [PASSED] DVI-A [22:39:11] [PASSED] Composite [22:39:11] [PASSED] SVIDEO [22:39:11] [PASSED] LVDS [22:39:11] [PASSED] Component [22:39:11] [PASSED] DIN [22:39:11] [PASSED] DP [22:39:11] [PASSED] HDMI-A [22:39:11] [PASSED] HDMI-B [22:39:11] [PASSED] TV [22:39:11] [PASSED] eDP [22:39:11] [PASSED] Virtual [22:39:11] [PASSED] DSI [22:39:11] [PASSED] DPI [22:39:11] [PASSED] Writeback [22:39:11] [PASSED] SPI [22:39:11] [PASSED] USB [22:39:11] ===== [PASSED] drm_test_drmm_connector_init_type_valid ===== [22:39:11] =============== [PASSED] drmm_connector_init =============== [22:39:11] ========= drm_connector_dynamic_init (6 subtests) ========== [22:39:11] [PASSED] drm_test_drm_connector_dynamic_init [22:39:11] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc [22:39:11] [PASSED] drm_test_drm_connector_dynamic_init_not_added [22:39:11] [PASSED] drm_test_drm_connector_dynamic_init_properties [22:39:11] ===== drm_test_drm_connector_dynamic_init_type_valid ====== [22:39:11] [PASSED] Unknown [22:39:11] [PASSED] VGA [22:39:11] [PASSED] DVI-I [22:39:11] [PASSED] DVI-D [22:39:11] [PASSED] DVI-A [22:39:11] [PASSED] Composite [22:39:11] [PASSED] SVIDEO [22:39:11] [PASSED] LVDS [22:39:11] [PASSED] Component [22:39:11] [PASSED] DIN [22:39:11] [PASSED] DP [22:39:11] [PASSED] HDMI-A [22:39:11] [PASSED] HDMI-B [22:39:11] [PASSED] TV [22:39:11] [PASSED] eDP [22:39:11] [PASSED] Virtual [22:39:11] [PASSED] DSI [22:39:11] [PASSED] DPI [22:39:11] [PASSED] Writeback [22:39:11] [PASSED] SPI [22:39:11] [PASSED] USB [22:39:11] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid == [22:39:11] ======== drm_test_drm_connector_dynamic_init_name ========= [22:39:11] [PASSED] Unknown [22:39:11] [PASSED] VGA [22:39:11] [PASSED] DVI-I [22:39:11] [PASSED] DVI-D [22:39:11] [PASSED] DVI-A [22:39:11] [PASSED] Composite [22:39:11] [PASSED] SVIDEO [22:39:11] [PASSED] LVDS [22:39:11] [PASSED] Component [22:39:11] [PASSED] DIN [22:39:11] [PASSED] DP [22:39:11] [PASSED] HDMI-A [22:39:11] [PASSED] HDMI-B [22:39:11] [PASSED] TV [22:39:11] [PASSED] eDP [22:39:11] [PASSED] Virtual [22:39:11] [PASSED] DSI [22:39:11] [PASSED] DPI [22:39:11] [PASSED] Writeback [22:39:11] [PASSED] SPI [22:39:11] [PASSED] USB [22:39:11] ==== [PASSED] drm_test_drm_connector_dynamic_init_name ===== [22:39:11] =========== [PASSED] drm_connector_dynamic_init ============ [22:39:11] ==== drm_connector_dynamic_register_early (4 subtests) ===== [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_early_defer [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object [22:39:11] ====== [PASSED] drm_connector_dynamic_register_early ======= [22:39:11] ======= drm_connector_dynamic_register (7 subtests) ======== [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_on_list [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_no_defer [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_no_init [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_mode_object [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_sysfs [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name [22:39:11] [PASSED] drm_test_drm_connector_dynamic_register_debugfs [22:39:11] ========= [PASSED] drm_connector_dynamic_register ========== [22:39:11] = drm_connector_attach_broadcast_rgb_property (2 subtests) = [22:39:11] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property [22:39:11] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector [22:39:11] === [PASSED] drm_connector_attach_broadcast_rgb_property === [22:39:11] ========== drm_get_tv_mode_from_name (2 subtests) ========== [22:39:11] ========== drm_test_get_tv_mode_from_name_valid =========== [22:39:11] [PASSED] NTSC [22:39:11] [PASSED] NTSC-443 [22:39:11] [PASSED] NTSC-J [22:39:11] [PASSED] PAL [22:39:11] [PASSED] PAL-M [22:39:11] [PASSED] PAL-N [22:39:11] [PASSED] SECAM [22:39:11] [PASSED] Mono [22:39:11] ====== [PASSED] drm_test_get_tv_mode_from_name_valid ======= [22:39:11] [PASSED] drm_test_get_tv_mode_from_name_truncated [22:39:11] ============ [PASSED] drm_get_tv_mode_from_name ============ [22:39:11] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) = [22:39:11] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb [22:39:11] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc [22:39:11] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1 [22:39:11] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc [22:39:11] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1 [22:39:11] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double [22:39:11] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid = [22:39:11] [PASSED] VIC 96 [22:39:11] [PASSED] VIC 97 [22:39:11] [PASSED] VIC 101 [22:39:11] [PASSED] VIC 102 [22:39:11] [PASSED] VIC 106 [22:39:11] [PASSED] VIC 107 [22:39:11] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid === [22:39:11] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc [22:39:11] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc [22:39:11] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc [22:39:11] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc [22:39:11] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc [22:39:11] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ==== [22:39:11] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) == [22:39:11] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ==== [22:39:11] [PASSED] Automatic [22:39:11] [PASSED] Full [22:39:11] [PASSED] Limited 16:235 [22:39:11] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name === [22:39:11] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid [22:39:11] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ==== [22:39:11] == drm_hdmi_connector_get_output_format_name (2 subtests) == [22:39:11] === drm_test_drm_hdmi_connector_get_output_format_name ==== [22:39:11] [PASSED] RGB [22:39:11] [PASSED] YUV 4:2:0 [22:39:11] [PASSED] YUV 4:2:2 [22:39:11] [PASSED] YUV 4:4:4 [22:39:11] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name === [22:39:11] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid [22:39:11] ==== [PASSED] drm_hdmi_connector_get_output_format_name ==== [22:39:11] ============= drm_damage_helper (21 subtests) ============== [22:39:11] [PASSED] drm_test_damage_iter_no_damage [22:39:11] [PASSED] drm_test_damage_iter_no_damage_fractional_src [22:39:11] [PASSED] drm_test_damage_iter_no_damage_src_moved [22:39:11] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved [22:39:11] [PASSED] drm_test_damage_iter_no_damage_not_visible [22:39:11] [PASSED] drm_test_damage_iter_no_damage_no_crtc [22:39:11] [PASSED] drm_test_damage_iter_no_damage_no_fb [22:39:11] [PASSED] drm_test_damage_iter_simple_damage [22:39:11] [PASSED] drm_test_damage_iter_single_damage [22:39:11] [PASSED] drm_test_damage_iter_single_damage_intersect_src [22:39:11] [PASSED] drm_test_damage_iter_single_damage_outside_src [22:39:11] [PASSED] drm_test_damage_iter_single_damage_fractional_src [22:39:11] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src [22:39:11] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src [22:39:11] [PASSED] drm_test_damage_iter_single_damage_src_moved [22:39:11] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved [22:39:11] [PASSED] drm_test_damage_iter_damage [22:39:11] [PASSED] drm_test_damage_iter_damage_one_intersect [22:39:11] [PASSED] drm_test_damage_iter_damage_one_outside [22:39:11] [PASSED] drm_test_damage_iter_damage_src_moved [22:39:11] [PASSED] drm_test_damage_iter_damage_not_visible [22:39:11] ================ [PASSED] drm_damage_helper ================ [22:39:11] ============== drm_dp_mst_helper (3 subtests) ============== [22:39:11] ============== drm_test_dp_mst_calc_pbn_mode ============== [22:39:11] [PASSED] Clock 154000 BPP 30 DSC disabled [22:39:11] [PASSED] Clock 234000 BPP 30 DSC disabled [22:39:11] [PASSED] Clock 297000 BPP 24 DSC disabled [22:39:11] [PASSED] Clock 332880 BPP 24 DSC enabled [22:39:11] [PASSED] Clock 324540 BPP 24 DSC enabled [22:39:11] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ========== [22:39:11] ============== drm_test_dp_mst_calc_pbn_div =============== [22:39:11] [PASSED] Link rate 2000000 lane count 4 [22:39:11] [PASSED] Link rate 2000000 lane count 2 [22:39:11] [PASSED] Link rate 2000000 lane count 1 [22:39:11] [PASSED] Link rate 1350000 lane count 4 [22:39:11] [PASSED] Link rate 1350000 lane count 2 [22:39:11] [PASSED] Link rate 1350000 lane count 1 [22:39:11] [PASSED] Link rate 1000000 lane count 4 [22:39:11] [PASSED] Link rate 1000000 lane count 2 [22:39:11] [PASSED] Link rate 1000000 lane count 1 [22:39:11] [PASSED] Link rate 810000 lane count 4 [22:39:11] [PASSED] Link rate 810000 lane count 2 [22:39:11] [PASSED] Link rate 810000 lane count 1 [22:39:11] [PASSED] Link rate 540000 lane count 4 [22:39:11] [PASSED] Link rate 540000 lane count 2 [22:39:11] [PASSED] Link rate 540000 lane count 1 [22:39:11] [PASSED] Link rate 270000 lane count 4 [22:39:11] [PASSED] Link rate 270000 lane count 2 [22:39:11] [PASSED] Link rate 270000 lane count 1 [22:39:11] [PASSED] Link rate 162000 lane count 4 [22:39:11] [PASSED] Link rate 162000 lane count 2 [22:39:11] [PASSED] Link rate 162000 lane count 1 [22:39:11] ========== [PASSED] drm_test_dp_mst_calc_pbn_div =========== [22:39:11] ========= drm_test_dp_mst_sideband_msg_req_decode ========= [22:39:11] [PASSED] DP_ENUM_PATH_RESOURCES with port number [22:39:11] [PASSED] DP_POWER_UP_PHY with port number [22:39:11] [PASSED] DP_POWER_DOWN_PHY with port number [22:39:11] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks [22:39:11] [PASSED] DP_ALLOCATE_PAYLOAD with port number [22:39:11] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI [22:39:11] [PASSED] DP_ALLOCATE_PAYLOAD with PBN [22:39:11] [PASSED] DP_QUERY_PAYLOAD with port number [22:39:11] [PASSED] DP_QUERY_PAYLOAD with VCPI [22:39:11] [PASSED] DP_REMOTE_DPCD_READ with port number [22:39:11] [PASSED] DP_REMOTE_DPCD_READ with DPCD address [22:39:11] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes [22:39:11] [PASSED] DP_REMOTE_DPCD_WRITE with port number [22:39:11] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address [22:39:11] [PASSED] DP_REMOTE_DPCD_WRITE with data array [22:39:11] [PASSED] DP_REMOTE_I2C_READ with port number [22:39:11] [PASSED] DP_REMOTE_I2C_READ with I2C device ID [22:39:11] [PASSED] DP_REMOTE_I2C_READ with transactions array [22:39:11] [PASSED] DP_REMOTE_I2C_WRITE with port number [22:39:11] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID [22:39:11] [PASSED] DP_REMOTE_I2C_WRITE with data array [22:39:11] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID [22:39:11] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID [22:39:11] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event [22:39:11] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event [22:39:11] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior [22:39:11] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior [22:39:11] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode ===== [22:39:11] ================ [PASSED] drm_dp_mst_helper ================ [22:39:11] ================== drm_exec (7 subtests) =================== [22:39:11] [PASSED] sanitycheck [22:39:11] [PASSED] test_lock [22:39:11] [PASSED] test_lock_unlock [22:39:11] [PASSED] test_duplicates [22:39:11] [PASSED] test_prepare [22:39:11] [PASSED] test_prepare_array [22:39:11] [PASSED] test_multiple_loops [22:39:11] ==================== [PASSED] drm_exec ===================== [22:39:11] =========== drm_format_helper_test (17 subtests) =========== [22:39:11] ============== drm_test_fb_xrgb8888_to_gray8 ============== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ========== [22:39:11] ============= drm_test_fb_xrgb8888_to_rgb332 ============== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ========== [22:39:11] ============= drm_test_fb_xrgb8888_to_rgb565 ============== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ========== [22:39:11] ============ drm_test_fb_xrgb8888_to_xrgb1555 ============= [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 ========= [22:39:11] ============ drm_test_fb_xrgb8888_to_argb1555 ============= [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 ========= [22:39:11] ============ drm_test_fb_xrgb8888_to_rgba5551 ============= [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 ========= [22:39:11] ============= drm_test_fb_xrgb8888_to_rgb888 ============== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ========== [22:39:11] ============= drm_test_fb_xrgb8888_to_bgr888 ============== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ========== [22:39:11] ============ drm_test_fb_xrgb8888_to_argb8888 ============= [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 ========= [22:39:11] =========== drm_test_fb_xrgb8888_to_xrgb2101010 =========== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 ======= [22:39:11] =========== drm_test_fb_xrgb8888_to_argb2101010 =========== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 ======= [22:39:11] ============== drm_test_fb_xrgb8888_to_mono =============== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ========== [PASSED] drm_test_fb_xrgb8888_to_mono =========== [22:39:11] ==================== drm_test_fb_swab ===================== [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ================ [PASSED] drm_test_fb_swab ================= [22:39:11] ============ drm_test_fb_xrgb8888_to_xbgr8888 ============= [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 ========= [22:39:11] ============ drm_test_fb_xrgb8888_to_abgr8888 ============= [22:39:11] [PASSED] single_pixel_source_buffer [22:39:11] [PASSED] single_pixel_clip_rectangle [22:39:11] [PASSED] well_known_colors [22:39:11] [PASSED] destination_pitch [22:39:11] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 ========= [22:39:11] ================= drm_test_fb_clip_offset ================= [22:39:11] [PASSED] pass through [22:39:11] [PASSED] horizontal offset [22:39:11] [PASSED] vertical offset [22:39:11] [PASSED] horizontal and vertical offset [22:39:11] [PASSED] horizontal offset (custom pitch) [22:39:11] [PASSED] vertical offset (custom pitch) [22:39:11] [PASSED] horizontal and vertical offset (custom pitch) [22:39:11] ============= [PASSED] drm_test_fb_clip_offset ============= [22:39:11] =================== drm_test_fb_memcpy ==================== [22:39:11] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258) [22:39:11] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258) [22:39:11] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559) [22:39:11] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258) [22:39:11] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258) [22:39:11] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559) [22:39:11] [PASSED] well_known_colors: XB24 little-endian (0x34324258) [22:39:11] [PASSED] well_known_colors: XRA8 little-endian (0x38415258) [22:39:11] [PASSED] well_known_colors: YU24 little-endian (0x34325559) [22:39:11] [PASSED] destination_pitch: XB24 little-endian (0x34324258) [22:39:11] [PASSED] destination_pitch: XRA8 little-endian (0x38415258) [22:39:11] [PASSED] destination_pitch: YU24 little-endian (0x34325559) [22:39:11] =============== [PASSED] drm_test_fb_memcpy ================ [22:39:11] ============= [PASSED] drm_format_helper_test ============== [22:39:11] ================= drm_format (18 subtests) ================= [22:39:11] [PASSED] drm_test_format_block_width_invalid [22:39:11] [PASSED] drm_test_format_block_width_one_plane [22:39:11] [PASSED] drm_test_format_block_width_two_plane [22:39:11] [PASSED] drm_test_format_block_width_three_plane [22:39:11] [PASSED] drm_test_format_block_width_tiled [22:39:11] [PASSED] drm_test_format_block_height_invalid [22:39:11] [PASSED] drm_test_format_block_height_one_plane [22:39:11] [PASSED] drm_test_format_block_height_two_plane [22:39:11] [PASSED] drm_test_format_block_height_three_plane [22:39:11] [PASSED] drm_test_format_block_height_tiled [22:39:11] [PASSED] drm_test_format_min_pitch_invalid [22:39:11] [PASSED] drm_test_format_min_pitch_one_plane_8bpp [22:39:11] [PASSED] drm_test_format_min_pitch_one_plane_16bpp [22:39:11] [PASSED] drm_test_format_min_pitch_one_plane_24bpp [22:39:11] [PASSED] drm_test_format_min_pitch_one_plane_32bpp [22:39:11] [PASSED] drm_test_format_min_pitch_two_plane [22:39:11] [PASSED] drm_test_format_min_pitch_three_plane_8bpp [22:39:11] [PASSED] drm_test_format_min_pitch_tiled [22:39:11] =================== [PASSED] drm_format ==================== [22:39:11] ============== drm_framebuffer (10 subtests) =============== [22:39:11] ========== drm_test_framebuffer_check_src_coords ========== [22:39:11] [PASSED] Success: source fits into fb [22:39:11] [PASSED] Fail: overflowing fb with x-axis coordinate [22:39:11] [PASSED] Fail: overflowing fb with y-axis coordinate [22:39:11] [PASSED] Fail: overflowing fb with source width [22:39:11] [PASSED] Fail: overflowing fb with source height [22:39:11] ====== [PASSED] drm_test_framebuffer_check_src_coords ====== [22:39:11] [PASSED] drm_test_framebuffer_cleanup [22:39:11] =============== drm_test_framebuffer_create =============== [22:39:11] [PASSED] ABGR8888 normal sizes [22:39:11] [PASSED] ABGR8888 max sizes [22:39:11] [PASSED] ABGR8888 pitch greater than min required [22:39:11] [PASSED] ABGR8888 pitch less than min required [22:39:11] [PASSED] ABGR8888 Invalid width [22:39:11] [PASSED] ABGR8888 Invalid buffer handle [22:39:11] [PASSED] No pixel format [22:39:11] [PASSED] ABGR8888 Width 0 [22:39:11] [PASSED] ABGR8888 Height 0 [22:39:11] [PASSED] ABGR8888 Out of bound height * pitch combination [22:39:11] [PASSED] ABGR8888 Large buffer offset [22:39:11] [PASSED] ABGR8888 Buffer offset for inexistent plane [22:39:11] [PASSED] ABGR8888 Invalid flag [22:39:11] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers [22:39:11] [PASSED] ABGR8888 Valid buffer modifier [22:39:11] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) [22:39:11] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS [22:39:11] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS [22:39:11] [PASSED] NV12 Normal sizes [22:39:11] [PASSED] NV12 Max sizes [22:39:11] [PASSED] NV12 Invalid pitch [22:39:11] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag [22:39:11] [PASSED] NV12 different modifier per-plane [22:39:11] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE [22:39:11] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS [22:39:11] [PASSED] NV12 Modifier for inexistent plane [22:39:11] [PASSED] NV12 Handle for inexistent plane [22:39:11] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS [22:39:11] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier [22:39:11] [PASSED] YVU420 Normal sizes [22:39:11] [PASSED] YVU420 Max sizes [22:39:11] [PASSED] YVU420 Invalid pitch [22:39:11] [PASSED] YVU420 Different pitches [22:39:11] [PASSED] YVU420 Different buffer offsets/pitches [22:39:11] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS [22:39:11] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS [22:39:11] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS [22:39:11] [PASSED] YVU420 Valid modifier [22:39:11] [PASSED] YVU420 Different modifiers per plane [22:39:11] [PASSED] YVU420 Modifier for inexistent plane [22:39:11] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR) [22:39:11] [PASSED] X0L2 Normal sizes [22:39:11] [PASSED] X0L2 Max sizes [22:39:11] [PASSED] X0L2 Invalid pitch [22:39:11] [PASSED] X0L2 Pitch greater than minimum required [22:39:11] [PASSED] X0L2 Handle for inexistent plane [22:39:11] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set [22:39:11] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set [22:39:11] [PASSED] X0L2 Valid modifier [22:39:11] [PASSED] X0L2 Modifier for inexistent plane [22:39:11] =========== [PASSED] drm_test_framebuffer_create =========== [22:39:11] [PASSED] drm_test_framebuffer_free [22:39:11] [PASSED] drm_test_framebuffer_init [22:39:11] [PASSED] drm_test_framebuffer_init_bad_format [22:39:11] [PASSED] drm_test_framebuffer_init_dev_mismatch [22:39:11] [PASSED] drm_test_framebuffer_lookup [22:39:11] [PASSED] drm_test_framebuffer_lookup_inexistent [22:39:11] [PASSED] drm_test_framebuffer_modifiers_not_supported [22:39:11] ================= [PASSED] drm_framebuffer ================= [22:39:11] ================ drm_gem_shmem (8 subtests) ================ [22:39:11] [PASSED] drm_gem_shmem_test_obj_create [22:39:11] [PASSED] drm_gem_shmem_test_obj_create_private [22:39:11] [PASSED] drm_gem_shmem_test_pin_pages [22:39:11] [PASSED] drm_gem_shmem_test_vmap [22:39:11] [PASSED] drm_gem_shmem_test_get_sg_table [22:39:11] [PASSED] drm_gem_shmem_test_get_pages_sgt [22:39:11] [PASSED] drm_gem_shmem_test_madvise [22:39:11] [PASSED] drm_gem_shmem_test_purge [22:39:11] ================== [PASSED] drm_gem_shmem ================== [22:39:11] === drm_atomic_helper_connector_hdmi_check (27 subtests) === [22:39:11] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode [22:39:11] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1 [22:39:11] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode [22:39:11] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1 [22:39:11] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode [22:39:11] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1 [22:39:11] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 ======= [22:39:11] [PASSED] Automatic [22:39:11] [PASSED] Full [22:39:11] [PASSED] Limited 16:235 [22:39:11] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 === [22:39:11] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed [22:39:11] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed [22:39:11] [PASSED] drm_test_check_disable_connector [22:39:11] [PASSED] drm_test_check_hdmi_funcs_reject_rate [22:39:11] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb [22:39:11] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420 [22:39:11] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422 [22:39:11] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420 [22:39:11] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420 [22:39:11] [PASSED] drm_test_check_output_bpc_crtc_mode_changed [22:39:11] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed [22:39:11] [PASSED] drm_test_check_output_bpc_dvi [22:39:11] [PASSED] drm_test_check_output_bpc_format_vic_1 [22:39:11] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only [22:39:11] [PASSED] drm_test_check_output_bpc_format_display_rgb_only [22:39:11] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only [22:39:11] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only [22:39:11] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc [22:39:11] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc [22:39:11] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc [22:39:11] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ====== [22:39:11] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ==== [22:39:11] [PASSED] drm_test_check_broadcast_rgb_value [22:39:11] [PASSED] drm_test_check_bpc_8_value [22:39:11] [PASSED] drm_test_check_bpc_10_value [22:39:11] [PASSED] drm_test_check_bpc_12_value [22:39:11] [PASSED] drm_test_check_format_value [22:39:11] [PASSED] drm_test_check_tmds_char_value [22:39:11] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ====== [22:39:11] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) = [22:39:11] [PASSED] drm_test_check_mode_valid [22:39:11] [PASSED] drm_test_check_mode_valid_reject [22:39:11] [PASSED] drm_test_check_mode_valid_reject_rate [22:39:11] [PASSED] drm_test_check_mode_valid_reject_max_clock [22:39:11] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid === [22:39:11] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) = [22:39:11] [PASSED] drm_test_check_infoframes [22:39:11] [PASSED] drm_test_check_reject_avi_infoframe [22:39:11] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8 [22:39:11] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10 [22:39:11] [PASSED] drm_test_check_reject_audio_infoframe [22:39:11] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes === [22:39:11] ================= drm_managed (2 subtests) ================= [22:39:11] [PASSED] drm_test_managed_release_action [22:39:11] [PASSED] drm_test_managed_run_action [22:39:11] =================== [PASSED] drm_managed =================== [22:39:11] =================== drm_mm (6 subtests) ==================== [22:39:11] [PASSED] drm_test_mm_init [22:39:11] [PASSED] drm_test_mm_debug [22:39:11] [PASSED] drm_test_mm_align32 [22:39:11] [PASSED] drm_test_mm_align64 [22:39:11] [PASSED] drm_test_mm_lowest [22:39:11] [PASSED] drm_test_mm_highest [22:39:11] ===================== [PASSED] drm_mm ====================== [22:39:11] ============= drm_modes_analog_tv (5 subtests) ============= [22:39:11] [PASSED] drm_test_modes_analog_tv_mono_576i [22:39:11] [PASSED] drm_test_modes_analog_tv_ntsc_480i [22:39:11] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined [22:39:11] [PASSED] drm_test_modes_analog_tv_pal_576i [22:39:11] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined [22:39:11] =============== [PASSED] drm_modes_analog_tv =============== [22:39:11] ============== drm_plane_helper (2 subtests) =============== [22:39:11] =============== drm_test_check_plane_state ================ [22:39:11] [PASSED] clipping_simple [22:39:11] [PASSED] clipping_rotate_reflect [22:39:11] [PASSED] positioning_simple [22:39:11] [PASSED] upscaling [22:39:11] [PASSED] downscaling [22:39:11] [PASSED] rounding1 [22:39:11] [PASSED] rounding2 [22:39:11] [PASSED] rounding3 [22:39:11] [PASSED] rounding4 [22:39:11] =========== [PASSED] drm_test_check_plane_state ============ [22:39:11] =========== drm_test_check_invalid_plane_state ============ [22:39:11] [PASSED] positioning_invalid [22:39:11] [PASSED] upscaling_invalid [22:39:11] [PASSED] downscaling_invalid [22:39:11] ======= [PASSED] drm_test_check_invalid_plane_state ======== [22:39:11] ================ [PASSED] drm_plane_helper ================= [22:39:11] ====== drm_connector_helper_tv_get_modes (1 subtest) ======= [22:39:11] ====== drm_test_connector_helper_tv_get_modes_check ======= [22:39:11] [PASSED] None [22:39:11] [PASSED] PAL [22:39:11] [PASSED] NTSC [22:39:11] [PASSED] Both, NTSC Default [22:39:11] [PASSED] Both, PAL Default [22:39:11] [PASSED] Both, NTSC Default, with PAL on command-line [22:39:11] [PASSED] Both, PAL Default, with NTSC on command-line [22:39:11] == [PASSED] drm_test_connector_helper_tv_get_modes_check === [22:39:11] ======== [PASSED] drm_connector_helper_tv_get_modes ======== [22:39:11] ================== drm_rect (9 subtests) =================== [22:39:11] [PASSED] drm_test_rect_clip_scaled_div_by_zero [22:39:11] [PASSED] drm_test_rect_clip_scaled_not_clipped [22:39:11] [PASSED] drm_test_rect_clip_scaled_clipped [22:39:11] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned [22:39:11] ================= drm_test_rect_intersect ================= [22:39:11] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0 [22:39:11] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1 [22:39:11] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0 [22:39:11] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1 [22:39:11] [PASSED] right x left: 2x1+0+0 x 3x1+1+0 [22:39:11] [PASSED] left x right: 3x1+1+0 x 2x1+0+0 [22:39:11] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1 [22:39:11] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0 [22:39:11] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1 [22:39:11] [PASSED] touching side: 1x1+0+0 x 1x1+1+0 [22:39:11] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0 [22:39:11] [PASSED] inside another: 2x2+0+0 x 1x1+1+1 [22:39:11] [PASSED] far away: 1x1+0+0 x 1x1+3+6 [22:39:11] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10 [22:39:11] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10 [22:39:11] ============= [PASSED] drm_test_rect_intersect ============= [22:39:11] ================ drm_test_rect_calc_hscale ================ [22:39:11] [PASSED] normal use [22:39:11] [PASSED] out of max range [22:39:11] [PASSED] out of min range [22:39:11] [PASSED] zero dst [22:39:11] [PASSED] negative src [22:39:11] [PASSED] negative dst [22:39:11] ============ [PASSED] drm_test_rect_calc_hscale ============ [22:39:11] ================ drm_test_rect_calc_vscale ================ [22:39:11] [PASSED] normal use [22:39:11] [PASSED] out of max range [22:39:11] [PASSED] out of min range [22:39:11] [PASSED] zero dst [22:39:11] [PASSED] negative src [22:39:11] [PASSED] negative dst stty: 'standard input': Inappropriate ioctl for device [22:39:11] ============ [PASSED] drm_test_rect_calc_vscale ============ [22:39:11] ================== drm_test_rect_rotate =================== [22:39:11] [PASSED] reflect-x [22:39:11] [PASSED] reflect-y [22:39:11] [PASSED] rotate-0 [22:39:11] [PASSED] rotate-90 [22:39:11] [PASSED] rotate-180 [22:39:11] [PASSED] rotate-270 [22:39:11] ============== [PASSED] drm_test_rect_rotate =============== [22:39:11] ================ drm_test_rect_rotate_inv ================= [22:39:11] [PASSED] reflect-x [22:39:11] [PASSED] reflect-y [22:39:11] [PASSED] rotate-0 [22:39:11] [PASSED] rotate-90 [22:39:11] [PASSED] rotate-180 [22:39:11] [PASSED] rotate-270 [22:39:11] ============ [PASSED] drm_test_rect_rotate_inv ============= [22:39:11] ==================== [PASSED] drm_rect ===================== [22:39:11] ============ drm_sysfb_modeset_test (1 subtest) ============ [22:39:11] ============ drm_test_sysfb_build_fourcc_list ============= [22:39:11] [PASSED] no native formats [22:39:11] [PASSED] XRGB8888 as native format [22:39:11] [PASSED] remove duplicates [22:39:11] [PASSED] convert alpha formats [22:39:11] [PASSED] random formats [22:39:11] ======== [PASSED] drm_test_sysfb_build_fourcc_list ========= [22:39:11] ============= [PASSED] drm_sysfb_modeset_test ============== [22:39:11] ================== drm_fixp (2 subtests) =================== [22:39:11] [PASSED] drm_test_int2fixp [22:39:11] [PASSED] drm_test_sm2fixp [22:39:11] ==================== [PASSED] drm_fixp ===================== [22:39:11] ============================================================ [22:39:11] Testing complete. Ran 621 tests: passed: 621 [22:39:11] Elapsed time: 49.107s total, 2.717s configuring, 46.120s building, 0.257s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig [22:39:11] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [22:39:14] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [22:39:24] Starting KUnit Kernel (1/1)... [22:39:24] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [22:39:24] ================= ttm_device (5 subtests) ================== [22:39:24] [PASSED] ttm_device_init_basic [22:39:24] [PASSED] ttm_device_init_multiple [22:39:24] [PASSED] ttm_device_fini_basic [22:39:24] [PASSED] ttm_device_init_no_vma_man [22:39:24] ================== ttm_device_init_pools ================== [22:39:24] [PASSED] No DMA allocations, no DMA32 required [22:39:24] [PASSED] DMA allocations, DMA32 required [22:39:24] [PASSED] No DMA allocations, DMA32 required [22:39:24] [PASSED] DMA allocations, no DMA32 required [22:39:24] ============== [PASSED] ttm_device_init_pools ============== [22:39:24] =================== [PASSED] ttm_device ==================== [22:39:24] ================== ttm_pool (8 subtests) =================== [22:39:24] ================== ttm_pool_alloc_basic =================== [22:39:24] [PASSED] One page [22:39:24] [PASSED] More than one page [22:39:24] [PASSED] Above the allocation limit [22:39:24] [PASSED] One page, with coherent DMA mappings enabled [22:39:24] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [22:39:24] ============== [PASSED] ttm_pool_alloc_basic =============== [22:39:24] ============== ttm_pool_alloc_basic_dma_addr ============== [22:39:24] [PASSED] One page [22:39:24] [PASSED] More than one page [22:39:24] [PASSED] Above the allocation limit [22:39:24] [PASSED] One page, with coherent DMA mappings enabled [22:39:24] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [22:39:24] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ========== [22:39:24] [PASSED] ttm_pool_alloc_order_caching_match [22:39:24] [PASSED] ttm_pool_alloc_caching_mismatch [22:39:24] [PASSED] ttm_pool_alloc_order_mismatch [22:39:24] [PASSED] ttm_pool_free_dma_alloc [22:39:24] [PASSED] ttm_pool_free_no_dma_alloc [22:39:24] [PASSED] ttm_pool_fini_basic [22:39:24] ==================== [PASSED] ttm_pool ===================== [22:39:24] ================ ttm_resource (8 subtests) ================= [22:39:24] ================= ttm_resource_init_basic ================= [22:39:24] [PASSED] Init resource in TTM_PL_SYSTEM [22:39:24] [PASSED] Init resource in TTM_PL_VRAM [22:39:24] [PASSED] Init resource in a private placement [22:39:24] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags [22:39:24] ============= [PASSED] ttm_resource_init_basic ============= [22:39:24] [PASSED] ttm_resource_init_pinned [22:39:24] [PASSED] ttm_resource_fini_basic [22:39:24] [PASSED] ttm_resource_manager_init_basic [22:39:24] [PASSED] ttm_resource_manager_usage_basic [22:39:24] [PASSED] ttm_resource_manager_set_used_basic [22:39:24] [PASSED] ttm_sys_man_alloc_basic [22:39:24] [PASSED] ttm_sys_man_free_basic [22:39:24] ================== [PASSED] ttm_resource =================== [22:39:24] =================== ttm_tt (15 subtests) =================== [22:39:24] ==================== ttm_tt_init_basic ==================== [22:39:24] [PASSED] Page-aligned size [22:39:24] [PASSED] Extra pages requested [22:39:24] ================ [PASSED] ttm_tt_init_basic ================ [22:39:24] [PASSED] ttm_tt_init_misaligned [22:39:24] [PASSED] ttm_tt_fini_basic [22:39:24] [PASSED] ttm_tt_fini_sg [22:39:24] [PASSED] ttm_tt_fini_shmem [22:39:24] [PASSED] ttm_tt_create_basic [22:39:24] [PASSED] ttm_tt_create_invalid_bo_type [22:39:24] [PASSED] ttm_tt_create_ttm_exists [22:39:24] [PASSED] ttm_tt_create_failed [22:39:24] [PASSED] ttm_tt_destroy_basic [22:39:24] [PASSED] ttm_tt_populate_null_ttm [22:39:24] [PASSED] ttm_tt_populate_populated_ttm [22:39:24] [PASSED] ttm_tt_unpopulate_basic [22:39:24] [PASSED] ttm_tt_unpopulate_empty_ttm [22:39:24] [PASSED] ttm_tt_swapin_basic [22:39:24] ===================== [PASSED] ttm_tt ====================== [22:39:24] =================== ttm_bo (14 subtests) =================== [22:39:24] =========== ttm_bo_reserve_optimistic_no_ticket =========== [22:39:24] [PASSED] Cannot be interrupted and sleeps [22:39:24] [PASSED] Cannot be interrupted, locks straight away [22:39:24] [PASSED] Can be interrupted, sleeps [22:39:24] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket ======= [22:39:24] [PASSED] ttm_bo_reserve_locked_no_sleep [22:39:24] [PASSED] ttm_bo_reserve_no_wait_ticket [22:39:24] [PASSED] ttm_bo_reserve_double_resv [22:39:24] [PASSED] ttm_bo_reserve_interrupted [22:39:24] [PASSED] ttm_bo_reserve_deadlock [22:39:24] [PASSED] ttm_bo_unreserve_basic [22:39:24] [PASSED] ttm_bo_unreserve_pinned [22:39:24] [PASSED] ttm_bo_unreserve_bulk [22:39:24] [PASSED] ttm_bo_fini_basic [22:39:24] [PASSED] ttm_bo_fini_shared_resv [22:39:24] [PASSED] ttm_bo_pin_basic [22:39:24] [PASSED] ttm_bo_pin_unpin_resource [22:39:24] [PASSED] ttm_bo_multiple_pin_one_unpin [22:39:24] ===================== [PASSED] ttm_bo ====================== [22:39:24] ============== ttm_bo_validate (21 subtests) =============== [22:39:24] ============== ttm_bo_init_reserved_sys_man =============== [22:39:24] [PASSED] Buffer object for userspace [22:39:24] [PASSED] Kernel buffer object [22:39:24] [PASSED] Shared buffer object [22:39:24] ========== [PASSED] ttm_bo_init_reserved_sys_man =========== [22:39:24] ============== ttm_bo_init_reserved_mock_man ============== [22:39:24] [PASSED] Buffer object for userspace [22:39:24] [PASSED] Kernel buffer object [22:39:24] [PASSED] Shared buffer object [22:39:24] ========== [PASSED] ttm_bo_init_reserved_mock_man ========== [22:39:24] [PASSED] ttm_bo_init_reserved_resv [22:39:24] ================== ttm_bo_validate_basic ================== [22:39:24] [PASSED] Buffer object for userspace [22:39:24] [PASSED] Kernel buffer object [22:39:24] [PASSED] Shared buffer object [22:39:24] ============== [PASSED] ttm_bo_validate_basic ============== [22:39:24] [PASSED] ttm_bo_validate_invalid_placement [22:39:24] ============= ttm_bo_validate_same_placement ============== [22:39:24] [PASSED] System manager [22:39:24] [PASSED] VRAM manager [22:39:24] ========= [PASSED] ttm_bo_validate_same_placement ========== [22:39:24] [PASSED] ttm_bo_validate_failed_alloc [22:39:24] [PASSED] ttm_bo_validate_pinned [22:39:24] [PASSED] ttm_bo_validate_busy_placement [22:39:24] ================ ttm_bo_validate_multihop ================= [22:39:24] [PASSED] Buffer object for userspace [22:39:24] [PASSED] Kernel buffer object [22:39:24] [PASSED] Shared buffer object [22:39:24] ============ [PASSED] ttm_bo_validate_multihop ============= [22:39:24] ========== ttm_bo_validate_no_placement_signaled ========== [22:39:24] [PASSED] Buffer object in system domain, no page vector [22:39:24] [PASSED] Buffer object in system domain with an existing page vector [22:39:24] ====== [PASSED] ttm_bo_validate_no_placement_signaled ====== [22:39:24] ======== ttm_bo_validate_no_placement_not_signaled ======== [22:39:24] [PASSED] Buffer object for userspace [22:39:24] [PASSED] Kernel buffer object [22:39:24] [PASSED] Shared buffer object [22:39:24] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ==== [22:39:24] [PASSED] ttm_bo_validate_move_fence_signaled [22:39:24] ========= ttm_bo_validate_move_fence_not_signaled ========= [22:39:24] [PASSED] Waits for GPU [22:39:24] [PASSED] Tries to lock straight away [22:39:24] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled ===== [22:39:24] [PASSED] ttm_bo_validate_happy_evict [22:39:24] [PASSED] ttm_bo_validate_all_pinned_evict [22:39:24] [PASSED] ttm_bo_validate_allowed_only_evict [22:39:24] [PASSED] ttm_bo_validate_deleted_evict [22:39:24] [PASSED] ttm_bo_validate_busy_domain_evict [22:39:24] [PASSED] ttm_bo_validate_evict_gutting [22:39:24] [PASSED] ttm_bo_validate_recrusive_evict stty: 'standard input': Inappropriate ioctl for device [22:39:24] ================= [PASSED] ttm_bo_validate ================= [22:39:24] ============================================================ [22:39:24] Testing complete. Ran 101 tests: passed: 101 [22:39:24] Elapsed time: 12.458s total, 2.830s configuring, 9.361s building, 0.228s running + cleanup ++ stat -c %u:%g /kernel + chown -R 1003:1003 /kernel ^ permalink raw reply [flat|nested] 13+ messages in thread
* ✓ Xe.CI.BAT: success for rust: clist patches for nova-core memory management 2026-02-24 22:27 [PATCH v11 0/2] rust: clist patches for nova-core memory management Joel Fernandes ` (3 preceding siblings ...) 2026-02-24 22:39 ` ✓ CI.KUnit: success " Patchwork @ 2026-02-24 23:22 ` Patchwork 2026-02-25 6:22 ` ✗ Xe.CI.FULL: failure " Patchwork 5 siblings, 0 replies; 13+ messages in thread From: Patchwork @ 2026-02-24 23:22 UTC (permalink / raw) To: Joel Fernandes; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 874 bytes --] == Series Details == Series: rust: clist patches for nova-core memory management URL : https://patchwork.freedesktop.org/series/162092/ State : success == Summary == CI Bug Log - changes from xe-4608-81bad6eee78e11939cab053edf9734fbf8125913_BAT -> xe-pw-162092v1_BAT ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (13 -> 13) ------------------------------ No changes in participating hosts Changes ------- No changes found Build changes ------------- * Linux: xe-4608-81bad6eee78e11939cab053edf9734fbf8125913 -> xe-pw-162092v1 IGT_8769: 8769 xe-4608-81bad6eee78e11939cab053edf9734fbf8125913: 81bad6eee78e11939cab053edf9734fbf8125913 xe-pw-162092v1: 162092v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162092v1/index.html [-- Attachment #2: Type: text/html, Size: 1422 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* ✗ Xe.CI.FULL: failure for rust: clist patches for nova-core memory management 2026-02-24 22:27 [PATCH v11 0/2] rust: clist patches for nova-core memory management Joel Fernandes ` (4 preceding siblings ...) 2026-02-24 23:22 ` ✓ Xe.CI.BAT: " Patchwork @ 2026-02-25 6:22 ` Patchwork 5 siblings, 0 replies; 13+ messages in thread From: Patchwork @ 2026-02-25 6:22 UTC (permalink / raw) To: Joel Fernandes; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 2117 bytes --] == Series Details == Series: rust: clist patches for nova-core memory management URL : https://patchwork.freedesktop.org/series/162092/ State : failure == Summary == CI Bug Log - changes from xe-4608-81bad6eee78e11939cab053edf9734fbf8125913_FULL -> xe-pw-162092v1_FULL ==================================================== Summary ------- **FAILURE** Serious unknown changes coming with xe-pw-162092v1_FULL absolutely need to be verified manually. If you think the reported changes have nothing to do with the changes introduced in xe-pw-162092v1_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them to document this new failure mode, which will reduce false positives in CI. Participating hosts (2 -> 2) ------------------------------ No changes in participating hosts Possible new issues ------------------- Here are the unknown changes that may have been introduced in xe-pw-162092v1_FULL: ### IGT changes ### #### Possible regressions #### * igt@xe_exec_system_allocator@many-stride-mmap-file-nomemset: - shard-bmg: NOTRUN -> [ABORT][1] [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162092v1/shard-bmg-3/igt@xe_exec_system_allocator@many-stride-mmap-file-nomemset.html Known issues ------------ Here are the changes found in xe-pw-162092v1_FULL that come from known issues: ### IGT changes ### #### Issues hit #### * igt@kms_frontbuffer_tracking@psr-1p-pri-indfb-multidraw: - shard-bmg: NOTRUN -> [SKIP][2] ([Intel XE#2313]) [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162092v1/shard-bmg-3/igt@kms_frontbuffer_tracking@psr-1p-pri-indfb-multidraw.html [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313 Build changes ------------- * Linux: xe-4608-81bad6eee78e11939cab053edf9734fbf8125913 -> xe-pw-162092v1 IGT_8769: 8769 xe-4608-81bad6eee78e11939cab053edf9734fbf8125913: 81bad6eee78e11939cab053edf9734fbf8125913 xe-pw-162092v1: 162092v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-162092v1/index.html [-- Attachment #2: Type: text/html, Size: 2721 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-03-02 16:21 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-02-24 22:27 [PATCH v11 0/2] rust: clist patches for nova-core memory management Joel Fernandes 2026-02-24 22:27 ` [PATCH v11 1/2] rust: ffi: Convert pub use to pub mod and create ffi module Joel Fernandes 2026-02-24 22:27 ` [PATCH v11 2/2] rust: clist: Add support to interface with C linked lists Joel Fernandes 2026-02-25 8:09 ` Alexandre Courbot 2026-02-25 8:25 ` Alexandre Courbot 2026-02-26 0:24 ` Joel Fernandes 2026-02-26 16:23 ` Alvin Sun 2026-02-26 19:34 ` Joel Fernandes 2026-02-27 15:50 ` Alvin Sun 2026-02-24 22:37 ` ✗ CI.checkpatch: warning for rust: clist patches for nova-core memory management Patchwork 2026-02-24 22:39 ` ✓ CI.KUnit: success " Patchwork 2026-02-24 23:22 ` ✓ Xe.CI.BAT: " Patchwork 2026-02-25 6:22 ` ✗ Xe.CI.FULL: failure " Patchwork
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox