* [RFC PATCH] dma-buf: Add generic dma_resv wound-wait transaction API
2026-06-05 11:26 [RFC PATCH 0/3] Use a dma_resv wound-wait transaction API for drm_exec Thomas Hellström
@ 2026-06-05 11:26 ` Thomas Hellström
2026-06-05 11:26 ` [RFC PATCH] drm/exec: Rebuild drm_exec on top of dma_resv_txn Thomas Hellström
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Hellström @ 2026-06-05 11:26 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström
Introduce dma_resv_txn, a subsystem-agnostic wound-wait locking
protocol for sets of dma_resv objects. It is a lower-level analogue
of drm_exec, usable with any object that embeds or references a
dma_resv — not just GEM buffers.
Each participant type provides an ops vtable with callbacks to retrieve
the associated dma_resv and release the object reference.
dma_resv_txn_force_retry() allows callers to trigger an unconditional
retry to recover from non-ww errors such as memory pressure.
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/dma-buf/Makefile | 2 +-
drivers/dma-buf/dma-resv-txn.c | 300 +++++++++++++++++++++++++++++++++
include/linux/dma-resv-txn.h | 223 ++++++++++++++++++++++++
3 files changed, 524 insertions(+), 1 deletion(-)
create mode 100644 drivers/dma-buf/dma-resv-txn.c
create mode 100644 include/linux/dma-resv-txn.h
diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile
index b25d7550bacf..6ea13c4bc896 100644
--- a/drivers/dma-buf/Makefile
+++ b/drivers/dma-buf/Makefile
@@ -1,5 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-only
-obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
+obj-y := dma-resv-txn.o dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
dma-fence-unwrap.o dma-resv.o dma-buf-mapping.o
obj-$(CONFIG_DMABUF_HEAPS) += dma-heap.o
obj-$(CONFIG_DMABUF_HEAPS) += heaps/
diff --git a/drivers/dma-buf/dma-resv-txn.c b/drivers/dma-buf/dma-resv-txn.c
new file mode 100644
index 000000000000..3f86add4f700
--- /dev/null
+++ b/drivers/dma-buf/dma-resv-txn.c
@@ -0,0 +1,300 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
+/*
+ * Copyright (C) 2022 Christian König <christian.koenig@amd.com>
+ * Copyright (C) 2023 Rob Clark <robdclark@chromium.org>
+ * Copyright (C) 2023-2026 Thomas Hellström <thomas.hellstrom@linux.intel.com>
+ * Copyright (C) 2024 Danilo Krummrich <dakr@kernel.org>
+ * Copyright (C) 2025 Thomas Zimmermann <tzimmermann@suse.de>
+ *
+ * Based on drivers/gpu/drm/drm_exec.c
+ */
+
+#include <linux/dma-resv-txn.h>
+#include <linux/dma-resv.h>
+#include <linux/export.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+
+/**
+ * DOC: Overview
+ *
+ * dma_resv_txn provides a generic wound-wait locking protocol for sets of
+ * dma_resv objects. It is a lower-level, subsystem-agnostic analogue of
+ * drm_exec, usable with any object that embeds or references a dma_resv —
+ * not just GEM buffers.
+ *
+ * The caller must take a reference to each owning object before calling
+ * dma_resv_txn_lock(); that reference is unconditionally consumed by the
+ * call regardless of the return value:
+ *
+ * * On success the reference is stored in the array slot; the transaction
+ * releases it via @ops->put when the slot is removed.
+ * * On -EDEADLK the reference is transferred to @txn->contended and held
+ * across the unlock/retry cycle.
+ * * On all other returns the reference is released immediately via @ops->put.
+ */
+
+static void txn_obj_put(struct dma_resv_txn_obj *obj)
+{
+ if (obj->ops && obj->ops->put)
+ obj->ops->put(obj);
+}
+
+static void txn_unlock_all(struct dma_resv_txn *txn)
+{
+ while (txn->num_objects) {
+ struct dma_resv_txn_obj *obj = &txn->objects[--txn->num_objects];
+
+ dma_resv_unlock(obj->ops->resv(obj));
+ txn_obj_put(obj);
+ }
+
+ if (txn->prelocked.ops) {
+ dma_resv_unlock(txn->prelocked.ops->resv(&txn->prelocked));
+ txn_obj_put(&txn->prelocked);
+ txn->prelocked.ops = NULL;
+ }
+}
+
+static int txn_obj_append(struct dma_resv_txn *txn, void *object,
+ const struct dma_resv_txn_obj_ops *ops)
+{
+ if (unlikely(txn->num_objects == txn->max_objects)) {
+ size_t old_size = txn->max_objects * sizeof(*txn->objects);
+ void *tmp;
+
+ tmp = kvrealloc(txn->objects, old_size + PAGE_SIZE, GFP_KERNEL);
+ if (!tmp)
+ return -ENOMEM;
+
+ txn->objects = tmp;
+ txn->max_objects += PAGE_SIZE / sizeof(*txn->objects);
+ }
+
+ txn->objects[txn->num_objects++] = (struct dma_resv_txn_obj){
+ .ops = ops,
+ .object = object,
+ };
+ return 0;
+}
+
+/**
+ * dma_resv_txn_init() - initialize a transaction
+ * @txn: the transaction to initialize
+ * @flags: DMA_RESV_TXN_* control flags
+ * @nr: initial capacity hint; 0 means use a default
+ *
+ * Prepares the transaction for use.
+ */
+void dma_resv_txn_init(struct dma_resv_txn *txn, u32 flags, unsigned int nr)
+{
+ if (!nr)
+ nr = PAGE_SIZE / sizeof(*txn->objects);
+
+ txn->flags = flags;
+ txn->started = false;
+ txn->objects = kvmalloc_array(nr, sizeof(*txn->objects), GFP_KERNEL);
+ txn->max_objects = txn->objects ? nr : 0;
+ txn->num_objects = 0;
+ txn->contended.ops = NULL;
+ txn->prelocked.ops = NULL;
+}
+EXPORT_SYMBOL_GPL(dma_resv_txn_init);
+
+/**
+ * dma_resv_txn_fini() - finalize a transaction
+ * @txn: the transaction to finalize
+ *
+ * Unlocks all held objects, releases all references, and frees resources.
+ * Safe to call at any point after dma_resv_txn_init().
+ */
+void dma_resv_txn_fini(struct dma_resv_txn *txn)
+{
+ txn_unlock_all(txn);
+ kvfree(txn->objects);
+
+ if (txn->contended.ops) {
+ txn_obj_put(&txn->contended);
+ txn->contended.ops = NULL;
+ }
+
+ if (txn->started)
+ ww_acquire_fini(&txn->ctx);
+}
+EXPORT_SYMBOL_GPL(dma_resv_txn_fini);
+
+/**
+ * dma_resv_txn_cleanup() - loop condition for dma_resv_txn_until_all_locked()
+ * @txn: the transaction
+ *
+ * Not intended for direct use; drive the retry loop with
+ * dma_resv_txn_until_all_locked() instead.
+ *
+ * Return: true if the loop body should run, false when all locks are held.
+ */
+bool dma_resv_txn_cleanup(struct dma_resv_txn *txn)
+{
+ if (!txn->started) {
+ ww_acquire_init(&txn->ctx, &reservation_ww_class);
+ txn->started = true;
+ return true;
+ }
+
+ if (likely(!txn->contended.ops)) {
+ ww_acquire_done(&txn->ctx);
+ return false;
+ }
+
+ txn_unlock_all(txn);
+ return true;
+}
+EXPORT_SYMBOL_GPL(dma_resv_txn_cleanup);
+
+static int txn_lock_contended(struct dma_resv_txn *txn)
+{
+ struct dma_resv_txn_obj *cont = &txn->contended;
+ struct dma_resv *resv;
+ int ret;
+
+ if (!cont->ops)
+ return 0;
+
+ resv = cont->ops->resv(cont);
+
+ if (txn->flags & DMA_RESV_TXN_INTERRUPTIBLE) {
+ ret = dma_resv_lock_slow_interruptible(resv, &txn->ctx);
+ if (unlikely(ret)) {
+ txn_obj_put(cont);
+ cont->ops = NULL;
+ return ret;
+ }
+ } else {
+ dma_resv_lock_slow(resv, &txn->ctx);
+ }
+
+ txn->prelocked = *cont;
+ cont->ops = NULL;
+ return 0;
+}
+
+/**
+ * dma_resv_txn_lock() - lock a dma_resv object under this transaction
+ * @txn: the transaction
+ * @object: opaque pointer to the owning object; stored for iteration
+ * @ops: operations for this object, including the @resv accessor
+ *
+ * The caller must hold one reference to the owning object before calling.
+ * That reference is always consumed, regardless of the return value:
+ *
+ * * 0 — success; reference stored in the locked-objects array.
+ * * -EDEADLK — contention detected; reference transferred to
+ * @txn->contended. Call dma_resv_txn_retry_on_contention().
+ * * -EALREADY — the resv returned by @ops->resv() is already locked by this
+ * context; reference released via @ops->put. Suppress with
+ * DMA_RESV_TXN_IGNORE_DUPLICATES.
+ * * Other negative — interrupted or allocation failure; reference released
+ * via @ops->put.
+ *
+ * Return: 0 on success, negative error code otherwise.
+ */
+int dma_resv_txn_lock(struct dma_resv_txn *txn, void *object,
+ const struct dma_resv_txn_obj_ops *ops)
+{
+ struct dma_resv_txn_obj caller = { .ops = ops, .object = object };
+ struct dma_resv *resv = ops->resv(&caller);
+ int ret;
+
+ ret = txn_lock_contended(txn);
+ if (unlikely(ret)) {
+ txn_obj_put(&caller);
+ return ret;
+ }
+
+ /*
+ * If the prelocked resv matches, the lock is already held from the
+ * slow path. Consume the caller's ref into the array and release
+ * the separate ref held by the prelocked slot.
+ */
+ if (txn->prelocked.ops &&
+ txn->prelocked.ops->resv(&txn->prelocked) == resv) {
+ ret = txn_obj_append(txn, object, ops);
+ if (unlikely(ret)) {
+ dma_resv_unlock(resv);
+ txn_obj_put(&txn->prelocked);
+ txn->prelocked.ops = NULL;
+ txn_obj_put(&caller);
+ return ret;
+ }
+ txn_obj_put(&txn->prelocked);
+ txn->prelocked.ops = NULL;
+ return 0;
+ }
+
+ if (txn->flags & DMA_RESV_TXN_INTERRUPTIBLE)
+ ret = dma_resv_lock_interruptible(resv, &txn->ctx);
+ else
+ ret = dma_resv_lock(resv, &txn->ctx);
+
+ if (unlikely(ret == -EDEADLK)) {
+ /* Transfer caller's ref to the contended slot. */
+ txn->contended = caller;
+ return -EDEADLK;
+ }
+
+ if (unlikely(ret)) {
+ if (ret == -EALREADY &&
+ (txn->flags & DMA_RESV_TXN_IGNORE_DUPLICATES))
+ ret = 0;
+ txn_obj_put(&caller);
+ return ret;
+ }
+
+ ret = txn_obj_append(txn, object, ops);
+ if (unlikely(ret)) {
+ dma_resv_unlock(resv);
+ txn_obj_put(&caller);
+ return ret;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(dma_resv_txn_lock);
+
+/**
+ * dma_resv_txn_unlock() - unlock and remove a single object
+ * @txn: the transaction
+ * @object: opaque pointer identifying the object to unlock
+ *
+ * Scans the locked-objects array from the tail for an entry whose @object
+ * field matches @object, unlocks its resv, releases its reference via
+ * @ops->put, and compacts the array. Scanning from the tail is efficient
+ * for the common case of unlocking the most recently locked objects.
+ */
+void dma_resv_txn_unlock(struct dma_resv_txn *txn, void *object)
+{
+ unsigned int i;
+
+ for (i = txn->num_objects; i--;) {
+ struct dma_resv_txn_obj *obj = &txn->objects[i];
+
+ if (obj->object != object)
+ continue;
+
+ dma_resv_unlock(obj->ops->resv(obj));
+ txn_obj_put(obj);
+
+ /* Compact: shift remaining entries down by one. */
+ for (++i; i < txn->num_objects; ++i)
+ txn->objects[i - 1] = txn->objects[i];
+ --txn->num_objects;
+ return;
+ }
+
+ WARN(1, "%s: object %p not found in transaction\n", __func__, object);
+}
+EXPORT_SYMBOL_GPL(dma_resv_txn_unlock);
+
+MODULE_DESCRIPTION("dma-resv transaction locking");
+MODULE_LICENSE("Dual MIT/GPL");
+
diff --git a/include/linux/dma-resv-txn.h b/include/linux/dma-resv-txn.h
new file mode 100644
index 000000000000..26be05db51eb
--- /dev/null
+++ b/include/linux/dma-resv-txn.h
@@ -0,0 +1,223 @@
+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
+/*
+ * Copyright (C) 2022 Christian König <christian.koenig@amd.com>
+ * Copyright (C) 2023 Rob Clark <robdclark@chromium.org>
+ * Copyright (C) 2023-2026 Thomas Hellström <thomas.hellstrom@linux.intel.com>
+ *
+ * Based on include/drm/drm_exec.h
+ */
+
+#ifndef __LINUX_DMA_RESV_TXN_H
+#define __LINUX_DMA_RESV_TXN_H
+
+#include <linux/compiler.h>
+#include <linux/types.h>
+#include <linux/ww_mutex.h>
+
+struct dma_resv;
+
+/**
+ * define DMA_RESV_TXN_INTERRUPTIBLE - use interruptible waits
+ *
+ * Use interruptible variants of the ww_mutex locking functions.
+ */
+#define DMA_RESV_TXN_INTERRUPTIBLE BIT(0)
+
+/**
+ * define DMA_RESV_TXN_IGNORE_DUPLICATES - silently skip already-locked resvs
+ *
+ * When a dma_resv is already held by this transaction (e.g. because multiple
+ * objects share the same dma_resv), return 0 instead of -EALREADY.
+ */
+#define DMA_RESV_TXN_IGNORE_DUPLICATES BIT(1)
+
+/**
+ * struct dma_resv_txn_obj - one participant in a transaction
+ *
+ * Represents an object registered with a transaction. @object is opaque
+ * to the transaction and available to the @ops callbacks.
+ */
+struct dma_resv_txn_obj {
+ /** @ops: operations for this object; NULL marks an unoccupied slot */
+ const struct dma_resv_txn_obj_ops *ops;
+ /** @object: opaque pointer to the owning object */
+ void *object;
+};
+
+/**
+ * struct dma_resv_txn_obj_ops - per-participant operations
+ *
+ * @resv is mandatory; @put is optional.
+ */
+struct dma_resv_txn_obj_ops {
+ /**
+ * @resv: return the &dma_resv associated with @obj.
+ *
+ * Must not return NULL. Required.
+ */
+ struct dma_resv *(*resv)(struct dma_resv_txn_obj *obj);
+ /**
+ * @put: release the caller's reference to the owning object.
+ *
+ * Use @obj->object to identify the owner. May be NULL.
+ */
+ void (*put)(struct dma_resv_txn_obj *obj);
+};
+
+/**
+ * struct dma_resv_txn - wound-wait transaction over dma_resv objects
+ *
+ * Manages the wound-wait retry loop required to acquire multiple dma_resv
+ * locks without deadlock. Drive with dma_resv_txn_until_all_locked().
+ *
+ * The caller must take a reference to each owning object before calling
+ * dma_resv_txn_lock(); that reference is unconditionally consumed by the
+ * call regardless of the return value.
+ */
+struct dma_resv_txn {
+ /** @flags: DMA_RESV_TXN_* control flags */
+ u32 flags;
+ /** @started: wound-wait context active */
+ bool started;
+ /** @ctx: wound-wait acquire context (ticket) */
+ struct ww_acquire_ctx ctx;
+ /**
+ * @num_objects: number of objects currently in @objects
+ */
+ unsigned int num_objects;
+ /**
+ * @max_objects: allocated capacity of @objects
+ */
+ unsigned int max_objects;
+ /**
+ * @objects: array of locked object descriptors.
+ */
+ struct dma_resv_txn_obj *objects;
+ /**
+ * @contended: object whose resv caused -EDEADLK; held until the next retry.
+ */
+ struct dma_resv_txn_obj contended;
+ /**
+ * @prelocked: object acquired via the slow path, pending claim by the
+ * next matching dma_resv_txn_lock() call.
+ */
+ struct dma_resv_txn_obj prelocked;
+};
+
+void dma_resv_txn_init(struct dma_resv_txn *txn, u32 flags, unsigned int nr);
+void dma_resv_txn_fini(struct dma_resv_txn *txn);
+bool dma_resv_txn_cleanup(struct dma_resv_txn *txn);
+int dma_resv_txn_lock(struct dma_resv_txn *txn, void *object,
+ const struct dma_resv_txn_obj_ops *ops);
+void dma_resv_txn_unlock(struct dma_resv_txn *txn, void *object);
+
+/* Internal helpers for the iteration macros; do not use directly. */
+#define __dma_resv_txn_for_each_obj_ops(txn, obj, __ops, __curs) \
+ for (struct dma_resv_txn_obj *__curs = (txn)->objects; \
+ __curs < &(txn)->objects[(txn)->num_objects] && \
+ ((obj) = __curs->object, true); \
+ ++__curs) \
+ if (unlikely(__curs->ops != (__ops))) {} else
+
+#define __dma_resv_txn_for_each_obj_ops_reverse(txn, obj, __ops, __idx) \
+ for (unsigned long __idx = (txn)->num_objects; \
+ __idx-- > 0 && \
+ ((obj) = (txn)->objects[__idx].object, true); \
+ ) \
+ if (unlikely((txn)->objects[__idx].ops != (__ops))) {} else
+
+/**
+ * dma_resv_txn_for_each_obj_ops - iterate over locked objects with matching ops
+ * @txn: the transaction
+ * @obj: cursor (void *), set to the @object field of each matching slot
+ * @ops: pointer to the &dma_resv_txn_obj_ops to match against
+ *
+ * Iterate over all locked objects in @txn whose @ops pointer matches @ops.
+ * Useful for subsystems that share a transaction and need to visit only
+ * their own objects.
+ */
+#define dma_resv_txn_for_each_obj_ops(txn, obj, ops) \
+ __dma_resv_txn_for_each_obj_ops(txn, obj, ops, __UNIQUE_ID(__drt_c))
+
+/**
+ * dma_resv_txn_for_each_obj_ops_reverse - iterate in reverse lock order
+ * @txn: the transaction
+ * @obj: cursor (void *), set to the @object field of each matching slot
+ * @ops: pointer to the &dma_resv_txn_obj_ops to match against
+ *
+ * Like dma_resv_txn_for_each_obj_ops() but in reverse acquisition order.
+ * Required when unlocking.
+ */
+#define dma_resv_txn_for_each_obj_ops_reverse(txn, obj, ops) \
+ __dma_resv_txn_for_each_obj_ops_reverse(txn, obj, ops, \
+ __UNIQUE_ID(__drt_c))
+
+/* Internal helper for dma_resv_txn_until_all_locked(). Do not use directly. */
+#define __dma_resv_txn_until_all_locked(txn, _label) \
+_label: \
+ for (void *const __maybe_unused __txn_retry_ptr = &&_label; \
+ dma_resv_txn_cleanup(txn);)
+
+/**
+ * dma_resv_txn_until_all_locked() - retry loop until all objects locked
+ * @txn: the transaction
+ *
+ * Drives the wound-wait retry loop. The body is re-entered as long as
+ * contention is detected; at the start of each iteration no locks are held.
+ * Use dma_resv_txn_retry_on_contention() after each lock call.
+ *
+ * Example::
+ *
+ * dma_resv_txn_until_all_locked(&txn) {
+ * ret = dma_resv_txn_lock(&txn, obj_a, &my_ops);
+ * dma_resv_txn_retry_on_contention(&txn);
+ * if (ret) goto error;
+ *
+ * ret = dma_resv_txn_lock(&txn, obj_b, &my_ops);
+ * dma_resv_txn_retry_on_contention(&txn);
+ * if (ret) goto error;
+ * }
+ */
+#define dma_resv_txn_until_all_locked(txn) \
+ __dma_resv_txn_until_all_locked(txn, __UNIQUE_ID(dma_resv_txn_l))
+
+/**
+ * dma_resv_txn_retry_on_contention() - restart loop if contention set
+ * @txn: the transaction
+ *
+ * Must be called after each dma_resv_txn_lock() inside the
+ * dma_resv_txn_until_all_locked() body.
+ */
+#define dma_resv_txn_retry_on_contention(txn) \
+ do { \
+ if (unlikely(dma_resv_txn_is_contended(txn))) \
+ goto *__txn_retry_ptr; \
+ } while (0)
+
+/**
+ * dma_resv_txn_force_retry() - unconditionally restart the retry loop
+ * @txn: the transaction
+ *
+ * Force a fresh retry iteration regardless of ww contention. Use this to
+ * unwind the current locking round after a non-ww error (e.g. memory
+ * pressure). Must be called inside dma_resv_txn_until_all_locked() and
+ * only when no contention is pending.
+ */
+#define dma_resv_txn_force_retry(txn) \
+ do { \
+ WARN_ON(dma_resv_txn_is_contended(txn)); \
+ goto *__txn_retry_ptr; \
+ } while (0)
+
+/**
+ * dma_resv_txn_is_contended() - check whether contention was detected
+ * @txn: the transaction
+ *
+ * Return: true if contention was detected and the retry loop must restart.
+ */
+static inline bool dma_resv_txn_is_contended(struct dma_resv_txn *txn)
+{
+ return !!txn->contended.ops;
+}
+
+#endif /* __LINUX_DMA_RESV_TXN_H */
--
2.54.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC PATCH] drm/exec: Rebuild drm_exec on top of dma_resv_txn
2026-06-05 11:26 [RFC PATCH 0/3] Use a dma_resv wound-wait transaction API for drm_exec Thomas Hellström
2026-06-05 11:26 ` [RFC PATCH] dma-buf: Add generic dma_resv wound-wait transaction API Thomas Hellström
@ 2026-06-05 11:26 ` Thomas Hellström
2026-06-05 11:27 ` [RFC PATCH] drm/xe/tests: Add drm_exec locking benchmark kunit test Thomas Hellström
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Hellström @ 2026-06-05 11:26 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström
Replace the standalone drm_exec wound-wait implementation with a thin
wrapper around the generic dma_resv_txn layer.
drm_exec retains its full public API; existing callers need no changes.
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/drm_exec.c | 203 ++++---------------------------------
include/drm/drm_exec.h | 161 +++++++++--------------------
2 files changed, 70 insertions(+), 294 deletions(-)
diff --git a/drivers/gpu/drm/drm_exec.c b/drivers/gpu/drm/drm_exec.c
index 7988f5e7d56a..0dddcb76cd88 100644
--- a/drivers/gpu/drm/drm_exec.c
+++ b/drivers/gpu/drm/drm_exec.c
@@ -26,7 +26,7 @@
* struct drm_exec exec;
* int ret;
*
- * drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
+ * drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT, 0);
* drm_exec_until_all_locked(&exec) {
* ret = drm_exec_prepare_obj(&exec, boA, 1);
* drm_exec_retry_on_contention(&exec);
@@ -44,152 +44,41 @@
* ...
* }
* drm_exec_fini(&exec);
- *
- * See struct dma_exec for more details.
*/
-/* Unlock all objects and drop references */
-static void drm_exec_unlock_all(struct drm_exec *exec)
+static struct dma_resv *drm_exec_obj_resv(struct dma_resv_txn_obj *txn_obj)
{
- struct drm_gem_object *obj;
-
- drm_exec_for_each_locked_object_reverse(exec, obj) {
- dma_resv_unlock(obj->resv);
- drm_gem_object_put(obj);
- }
+ return ((struct drm_gem_object *)txn_obj->object)->resv;
+}
- drm_gem_object_put(exec->prelocked);
- exec->prelocked = NULL;
+static void drm_exec_obj_put(struct dma_resv_txn_obj *txn_obj)
+{
+ drm_gem_object_put(txn_obj->object);
}
+const struct dma_resv_txn_obj_ops drm_exec_obj_ops = {
+ .resv = drm_exec_obj_resv,
+ .put = drm_exec_obj_put,
+};
+EXPORT_SYMBOL(drm_exec_obj_ops);
+
/**
* drm_exec_init - initialize a drm_exec object
* @exec: the drm_exec object to initialize
* @flags: controls locking behavior, see DRM_EXEC_* defines
- * @nr: the initial # of objects
+ * @nr: the initial # of objects; 0 means use a default
*
* Initialize the object and make sure that we can track locked objects.
*
* If nr is non-zero then it is used as the initial objects table size.
* In either case, the table will grow (be re-allocated) on demand.
*/
-void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr)
+void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned int nr)
{
- if (!nr)
- nr = PAGE_SIZE / sizeof(void *);
-
- exec->flags = flags;
- exec->objects = kvmalloc_array(nr, sizeof(void *), GFP_KERNEL);
-
- /* If allocation here fails, just delay that till the first use */
- exec->max_objects = exec->objects ? nr : 0;
- exec->num_objects = 0;
- exec->contended = DRM_EXEC_DUMMY;
- exec->prelocked = NULL;
+ dma_resv_txn_init(&exec->txn, flags, nr);
}
EXPORT_SYMBOL(drm_exec_init);
-/**
- * drm_exec_fini - finalize a drm_exec object
- * @exec: the drm_exec object to finalize
- *
- * Unlock all locked objects, drop the references to objects and free all memory
- * used for tracking the state.
- */
-void drm_exec_fini(struct drm_exec *exec)
-{
- drm_exec_unlock_all(exec);
- kvfree(exec->objects);
- if (exec->contended != DRM_EXEC_DUMMY) {
- drm_gem_object_put(exec->contended);
- ww_acquire_fini(&exec->ticket);
- }
-}
-EXPORT_SYMBOL(drm_exec_fini);
-
-/**
- * drm_exec_cleanup - cleanup when contention is detected
- * @exec: the drm_exec object to cleanup
- *
- * Cleanup the current state and return true if we should stay inside the retry
- * loop, false if there wasn't any contention detected and we can keep the
- * objects locked.
- */
-bool drm_exec_cleanup(struct drm_exec *exec)
-{
- if (likely(!exec->contended)) {
- ww_acquire_done(&exec->ticket);
- return false;
- }
-
- if (likely(exec->contended == DRM_EXEC_DUMMY)) {
- exec->contended = NULL;
- ww_acquire_init(&exec->ticket, &reservation_ww_class);
- return true;
- }
-
- drm_exec_unlock_all(exec);
- exec->num_objects = 0;
- return true;
-}
-EXPORT_SYMBOL(drm_exec_cleanup);
-
-/* Track the locked object in the array */
-static int drm_exec_obj_locked(struct drm_exec *exec,
- struct drm_gem_object *obj)
-{
- if (unlikely(exec->num_objects == exec->max_objects)) {
- size_t size = exec->max_objects * sizeof(void *);
- void *tmp;
-
- tmp = kvrealloc(exec->objects, size + PAGE_SIZE, GFP_KERNEL);
- if (!tmp)
- return -ENOMEM;
-
- exec->objects = tmp;
- exec->max_objects += PAGE_SIZE / sizeof(void *);
- }
- drm_gem_object_get(obj);
- exec->objects[exec->num_objects++] = obj;
-
- return 0;
-}
-
-/* Make sure the contended object is locked first */
-static int drm_exec_lock_contended(struct drm_exec *exec)
-{
- struct drm_gem_object *obj = exec->contended;
- int ret;
-
- if (likely(!obj))
- return 0;
-
- /* Always cleanup the contention so that error handling can kick in */
- exec->contended = NULL;
- if (exec->flags & DRM_EXEC_INTERRUPTIBLE_WAIT) {
- ret = dma_resv_lock_slow_interruptible(obj->resv,
- &exec->ticket);
- if (unlikely(ret))
- goto error_dropref;
- } else {
- dma_resv_lock_slow(obj->resv, &exec->ticket);
- }
-
- ret = drm_exec_obj_locked(exec, obj);
- if (unlikely(ret))
- goto error_unlock;
-
- exec->prelocked = obj;
- return 0;
-
-error_unlock:
- dma_resv_unlock(obj->resv);
-
-error_dropref:
- drm_gem_object_put(obj);
- return ret;
-}
-
/**
* drm_exec_lock_obj - lock a GEM object for use
* @exec: the drm_exec object with the state
@@ -203,45 +92,8 @@ static int drm_exec_lock_contended(struct drm_exec *exec)
*/
int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj)
{
- int ret;
-
- ret = drm_exec_lock_contended(exec);
- if (unlikely(ret))
- return ret;
-
- if (exec->prelocked == obj) {
- drm_gem_object_put(exec->prelocked);
- exec->prelocked = NULL;
- return 0;
- }
-
- if (exec->flags & DRM_EXEC_INTERRUPTIBLE_WAIT)
- ret = dma_resv_lock_interruptible(obj->resv, &exec->ticket);
- else
- ret = dma_resv_lock(obj->resv, &exec->ticket);
-
- if (unlikely(ret == -EDEADLK)) {
- drm_gem_object_get(obj);
- exec->contended = obj;
- return -EDEADLK;
- }
-
- if (unlikely(ret == -EALREADY) &&
- exec->flags & DRM_EXEC_IGNORE_DUPLICATES)
- return 0;
-
- if (unlikely(ret))
- return ret;
-
- ret = drm_exec_obj_locked(exec, obj);
- if (ret)
- goto error_unlock;
-
- return 0;
-
-error_unlock:
- dma_resv_unlock(obj->resv);
- return ret;
+ drm_gem_object_get(obj);
+ return dma_resv_txn_lock(&exec->txn, obj, &drm_exec_obj_ops);
}
EXPORT_SYMBOL(drm_exec_lock_obj);
@@ -256,19 +108,7 @@ EXPORT_SYMBOL(drm_exec_lock_obj);
*/
void drm_exec_unlock_obj(struct drm_exec *exec, struct drm_gem_object *obj)
{
- unsigned int i;
-
- for (i = exec->num_objects; i--;) {
- if (exec->objects[i] == obj) {
- dma_resv_unlock(obj->resv);
- for (++i; i < exec->num_objects; ++i)
- exec->objects[i - 1] = exec->objects[i];
- --exec->num_objects;
- drm_gem_object_put(obj);
- return;
- }
-
- }
+ dma_resv_txn_unlock(&exec->txn, obj);
}
EXPORT_SYMBOL(drm_exec_unlock_obj);
@@ -320,10 +160,9 @@ int drm_exec_prepare_array(struct drm_exec *exec,
unsigned int num_objects,
unsigned int num_fences)
{
- int ret;
-
for (unsigned int i = 0; i < num_objects; ++i) {
- ret = drm_exec_prepare_obj(exec, objects[i], num_fences);
+ int ret = drm_exec_prepare_obj(exec, objects[i], num_fences);
+
if (unlikely(ret))
return ret;
}
diff --git a/include/drm/drm_exec.h b/include/drm/drm_exec.h
index 8725ba92ff91..91e1377d2ea4 100644
--- a/include/drm/drm_exec.h
+++ b/include/drm/drm_exec.h
@@ -4,113 +4,70 @@
#define __DRM_EXEC_H__
#include <linux/compiler.h>
-#include <linux/ww_mutex.h>
+#include <linux/dma-resv-txn.h>
-#define DRM_EXEC_INTERRUPTIBLE_WAIT BIT(0)
-#define DRM_EXEC_IGNORE_DUPLICATES BIT(1)
-
-/*
- * Dummy value used to initially enter the retry loop.
- * internal use only.
- */
-#define DRM_EXEC_DUMMY ((void *)~0)
+#define DRM_EXEC_INTERRUPTIBLE_WAIT DMA_RESV_TXN_INTERRUPTIBLE
+#define DRM_EXEC_IGNORE_DUPLICATES DMA_RESV_TXN_IGNORE_DUPLICATES
struct drm_gem_object;
/**
* struct drm_exec - Execution context
+ *
+ * Manages locking of a set of GEM objects via the wound-wait protocol.
+ * Built on top of &dma_resv_txn. All fields are private; use the API.
*/
struct drm_exec {
- /**
- * @flags: Flags to control locking behavior
- */
- u32 flags;
-
- /**
- * @ticket: WW ticket used for acquiring locks
- */
- struct ww_acquire_ctx ticket;
-
- /**
- * @num_objects: number of objects locked
- */
- unsigned int num_objects;
-
- /**
- * @max_objects: maximum objects in array
- */
- unsigned int max_objects;
-
- /**
- * @objects: array of the locked objects
- */
- struct drm_gem_object **objects;
-
- /**
- * @contended: contended GEM object we backed off for
- */
- struct drm_gem_object *contended;
-
- /**
- * @prelocked: already locked GEM object due to contention
- */
- struct drm_gem_object *prelocked;
+ /** @txn: underlying wound-wait transaction */
+ struct dma_resv_txn txn;
};
+extern const struct dma_resv_txn_obj_ops drm_exec_obj_ops;
+
/**
- * drm_exec_obj() - Return the object for a give drm_exec index
- * @exec: Pointer to the drm_exec context
- * @index: The index.
+ * drm_exec_ticket() - return the ww_acquire_ctx for this execution context
+ * @exec: the drm_exec object
*
- * Return: Pointer to the locked object corresponding to @index if
- * index is within the number of locked objects. NULL otherwise.
+ * Return: Pointer to the &ww_acquire_ctx used by this execution context.
*/
-static inline struct drm_gem_object *
-drm_exec_obj(struct drm_exec *exec, unsigned long index)
+static inline struct ww_acquire_ctx *drm_exec_ticket(struct drm_exec *exec)
{
- return index < exec->num_objects ? exec->objects[index] : NULL;
+ return &exec->txn.ctx;
}
-/* Helper for drm_exec_for_each_locked_object(). Internal use only. */
-#define __drm_exec_for_each_locked_object(exec, obj, __index) \
- for (unsigned long __index = 0; ((obj) = drm_exec_obj(exec, __index)); ++__index)
/**
- * drm_exec_for_each_locked_object - iterate over all the locked objects
+ * drm_exec_is_contended() - check for contention
* @exec: drm_exec object
- * @obj: the current GEM object
*
- * Iterate over all the locked GEM objects inside the drm_exec object.
+ * Return: true if a lock attempt detected contention and the retry loop
+ * must restart.
*/
-#define drm_exec_for_each_locked_object(exec, obj) \
- __drm_exec_for_each_locked_object(exec, obj, __UNIQUE_ID(drm_exec))
+static inline bool drm_exec_is_contended(struct drm_exec *exec)
+{
+ return dma_resv_txn_is_contended(&exec->txn);
+}
-/* Helper for drm_exec_for_each_locked_object_reverse(). Internal use only. */
-#define __drm_exec_for_each_locked_object_reverse(exec, obj, __index) \
- for (unsigned long __index = (exec)->num_objects - 1; \
- ((obj) = drm_exec_obj(exec, __index)); --__index)
/**
- * drm_exec_for_each_locked_object_reverse - iterate over all the locked
- * objects in reverse locking order
+ * drm_exec_for_each_locked_object - iterate over all the locked objects
* @exec: drm_exec object
- * @obj: the current GEM object
+ * @obj: the current GEM object (struct drm_gem_object *)
*
- * Iterate over all the locked GEM objects inside the drm_exec object in
- * reverse locking order. Note that the internal index may wrap around,
- * but that will be caught by drm_exec_obj(), returning a NULL object.
+ * Iterate over all GEM objects currently locked by @exec in acquisition order.
*/
-#define drm_exec_for_each_locked_object_reverse(exec, obj) \
- __drm_exec_for_each_locked_object_reverse(exec, obj, __UNIQUE_ID(drm_exec))
+#define drm_exec_for_each_locked_object(exec, obj) \
+ dma_resv_txn_for_each_obj_ops(&(exec)->txn, obj, &drm_exec_obj_ops)
-/*
- * Helper to drm_exec_until_all_locked(). Don't use directly.
+/**
+ * drm_exec_for_each_locked_object_reverse - iterate in reverse locking order
+ * @exec: drm_exec object
+ * @obj: the current GEM object (struct drm_gem_object *)
*
- * Since labels can't be defined local to the loop's body we use a jump pointer
- * to make sure that the retry is only used from within the loop's body.
+ * Iterate over all GEM objects currently locked by @exec in reverse
+ * acquisition order, as required when unlocking.
*/
-#define __drm_exec_until_all_locked(exec, _label) \
-_label: \
- for (void *const __maybe_unused __drm_exec_retry_ptr = &&_label; \
- drm_exec_cleanup(exec);)
+#define drm_exec_for_each_locked_object_reverse(exec, obj) \
+ dma_resv_txn_for_each_obj_ops_reverse(&(exec)->txn, obj, \
+ &drm_exec_obj_ops)
/**
* drm_exec_until_all_locked - loop until all GEM objects are locked
@@ -120,33 +77,18 @@ _label: \
* locked and no more contention exists. At the beginning of the loop it is
* guaranteed that no GEM object is locked.
*/
-#define drm_exec_until_all_locked(exec) \
- __drm_exec_until_all_locked(exec, __UNIQUE_ID(drm_exec))
+#define drm_exec_until_all_locked(exec) \
+ dma_resv_txn_until_all_locked(&(exec)->txn)
/**
- * drm_exec_retry_on_contention - restart the loop to grap all locks
+ * drm_exec_retry_on_contention - restart the loop to grab all locks
* @exec: drm_exec object
*
* Control flow helper to continue when a contention was detected and we need to
* clean up and re-start the loop to prepare all GEM objects.
*/
-#define drm_exec_retry_on_contention(exec) \
- do { \
- if (unlikely(drm_exec_is_contended(exec))) \
- goto *__drm_exec_retry_ptr; \
- } while (0)
-
-/**
- * drm_exec_is_contended - check for contention
- * @exec: drm_exec object
- *
- * Returns true if the drm_exec object has run into some contention while
- * locking a GEM object and needs to clean up.
- */
-static inline bool drm_exec_is_contended(struct drm_exec *exec)
-{
- return !!exec->contended;
-}
+#define drm_exec_retry_on_contention(exec) \
+ dma_resv_txn_retry_on_contention(&(exec)->txn)
/**
* drm_exec_retry() - Unconditionally restart the loop to grab all locks.
@@ -155,26 +97,21 @@ static inline bool drm_exec_is_contended(struct drm_exec *exec)
* Unconditionally retry the loop to lock all objects. For consistency,
* the exec object needs to be newly initialized.
*/
-#define drm_exec_retry(_exec) \
- do { \
- WARN_ON((_exec)->contended != DRM_EXEC_DUMMY); \
- goto *__drm_exec_retry_ptr; \
- } while (0)
+#define drm_exec_retry(exec) dma_resv_txn_force_retry(&(exec)->txn)
/**
- * drm_exec_ticket - return the ww_acquire_ctx for this exec context
- * @exec: drm_exec object
+ * drm_exec_fini() - finalize a drm_exec object
+ * @exec: the drm_exec object to finalize
*
- * Return: Pointer to the ww_acquire_ctx embedded in @exec.
+ * Unlock all locked objects, drop references, and free resources.
+ * Safe to call at any point after drm_exec_init().
*/
-static inline struct ww_acquire_ctx *drm_exec_ticket(struct drm_exec *exec)
+static inline void drm_exec_fini(struct drm_exec *exec)
{
- return &exec->ticket;
+ dma_resv_txn_fini(&exec->txn);
}
-void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned nr);
-void drm_exec_fini(struct drm_exec *exec);
-bool drm_exec_cleanup(struct drm_exec *exec);
+void drm_exec_init(struct drm_exec *exec, u32 flags, unsigned int nr);
int drm_exec_lock_obj(struct drm_exec *exec, struct drm_gem_object *obj);
void drm_exec_unlock_obj(struct drm_exec *exec, struct drm_gem_object *obj);
int drm_exec_prepare_obj(struct drm_exec *exec, struct drm_gem_object *obj,
--
2.54.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [RFC PATCH] drm/xe/tests: Add drm_exec locking benchmark kunit test
2026-06-05 11:26 [RFC PATCH 0/3] Use a dma_resv wound-wait transaction API for drm_exec Thomas Hellström
2026-06-05 11:26 ` [RFC PATCH] dma-buf: Add generic dma_resv wound-wait transaction API Thomas Hellström
2026-06-05 11:26 ` [RFC PATCH] drm/exec: Rebuild drm_exec on top of dma_resv_txn Thomas Hellström
@ 2026-06-05 11:27 ` Thomas Hellström
2026-06-05 12:16 ` ✗ CI.checkpatch: warning for " Patchwork
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Hellström @ 2026-06-05 11:27 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström
Add a live kunit test that benchmarks the drm_exec wound-wait locking
sequence with a set of GEM buffer objects. Lock, iterate, and fini
phases are timed and reported separately, along with the retry count.
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/xe/tests/Makefile | 3 +-
drivers/gpu/drm/xe/tests/xe_drm_exec_kunit.c | 130 +++++++++++++++++++
drivers/gpu/drm/xe/tests/xe_live_test_mod.c | 2 +
drivers/gpu/drm/xe/xe_bo.c | 3 +
4 files changed, 137 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/xe/tests/xe_drm_exec_kunit.c
diff --git a/drivers/gpu/drm/xe/tests/Makefile b/drivers/gpu/drm/xe/tests/Makefile
index f7aa47f11a36..bdb85d33f23a 100644
--- a/drivers/gpu/drm/xe/tests/Makefile
+++ b/drivers/gpu/drm/xe/tests/Makefile
@@ -2,7 +2,8 @@
# "live" kunit tests
obj-$(CONFIG_DRM_XE_KUNIT_TEST) += xe_live_test.o
-xe_live_test-y = xe_live_test_mod.o
+xe_live_test-y = xe_live_test_mod.o \
+ xe_drm_exec_kunit.o
# Normal kunit tests
obj-$(CONFIG_DRM_XE_KUNIT_TEST) += xe_test.o
diff --git a/drivers/gpu/drm/xe/tests/xe_drm_exec_kunit.c b/drivers/gpu/drm/xe/tests/xe_drm_exec_kunit.c
new file mode 100644
index 000000000000..b5592ff94607
--- /dev/null
+++ b/drivers/gpu/drm/xe/tests/xe_drm_exec_kunit.c
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: GPL-2.0 AND MIT
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#include <kunit/test.h>
+#include <kunit/visibility.h>
+
+#include <linux/ktime.h>
+#include <linux/slab.h>
+
+#include <drm/drm_exec.h>
+#include <uapi/drm/xe_drm.h>
+
+#include "tests/xe_kunit_helpers.h"
+#include "tests/xe_pci_test.h"
+
+#include "xe_bo.h"
+#include "xe_device.h"
+
+#define DRME_BENCH_NUM_OBJECTS 256
+
+/**
+ * DOC: drm_exec benchmark
+ *
+ * Measures the time to lock a set of GEM objects via a drm_exec sequence,
+ * iterate over all locked objects, and finalize (unlock) the exec context.
+ * Each phase is timed independently and reported via kunit_info().
+ */
+
+static void xe_drm_exec_bench_kunit(struct kunit *test)
+{
+ struct xe_device *xe = test->priv;
+ struct xe_bo **bos;
+ struct drm_gem_object *obj;
+ struct drm_exec exec;
+ ktime_t t_start, t_lock, t_iter, t_fini;
+ s64 ns_lock, ns_iter, ns_fini;
+ unsigned int count = 0;
+ unsigned int retries = 0;
+ int i;
+
+ bos = kunit_kcalloc(test, DRME_BENCH_NUM_OBJECTS, sizeof(*bos), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, bos);
+
+ for (i = 0; i < DRME_BENCH_NUM_OBJECTS; i++) {
+ bos[i] = xe_bo_create_user(xe, NULL, PAGE_SIZE,
+ DRM_XE_GEM_CPU_CACHING_WB,
+ XE_BO_FLAG_SYSTEM |
+ XE_BO_FLAG_DEFER_BACKING, NULL);
+ if (IS_ERR(bos[i])) {
+ KUNIT_FAIL(test, "bo[%d] create failed: %pe\n", i,
+ bos[i]);
+ bos[i] = NULL;
+ goto out_put;
+ }
+ }
+
+ t_start = ktime_get();
+
+ drm_exec_init(&exec, DRM_EXEC_IGNORE_DUPLICATES, DRME_BENCH_NUM_OBJECTS);
+
+ drm_exec_until_all_locked(&exec) {
+ for (i = 0; i < DRME_BENCH_NUM_OBJECTS; i++) {
+ int err = drm_exec_lock_obj(&exec, &bos[i]->ttm.base);
+ if (err == -EDEADLK)
+ retries++;
+ drm_exec_retry_on_contention(&exec);
+ if (err) {
+ KUNIT_FAIL(test, "bo[%d] lock failed: %pe\n",
+ i, ERR_PTR(err));
+ drm_exec_fini(&exec);
+ goto out_put;
+ }
+ }
+ }
+
+ t_lock = ktime_get();
+ ns_lock = ktime_to_ns(ktime_sub(t_lock, t_start));
+
+ t_start = ktime_get();
+
+ drm_exec_for_each_locked_object(&exec, obj) {
+ READ_ONCE(obj->resv);
+ count++;
+ }
+
+ t_iter = ktime_get();
+ ns_iter = ktime_to_ns(ktime_sub(t_iter, t_start));
+
+ KUNIT_EXPECT_EQ(test, count, DRME_BENCH_NUM_OBJECTS);
+
+ /*
+ * With CONFIG_DEBUG_WW_MUTEX_SLOWPATH the kernel injects artificial
+ * -EDEADLK cases to exercise the slowpath, so retries are expected.
+ * Without it, no other thread holds these objects, so any retry
+ * indicates a real locking bug.
+ */
+ if (!IS_ENABLED(CONFIG_DEBUG_WW_MUTEX_SLOWPATH))
+ KUNIT_EXPECT_EQ_MSG(test, retries, 0,
+ "unexpected ww-mutex retries on uncontested objects\n");
+
+ t_start = ktime_get();
+ drm_exec_fini(&exec);
+ t_fini = ktime_get();
+ ns_fini = ktime_to_ns(ktime_sub(t_fini, t_start));
+
+ kunit_info(test,
+ "drm_exec bench: %u objects: lock=%lldns iter=%lldns fini=%lldns retries=%u\n",
+ DRME_BENCH_NUM_OBJECTS, ns_lock, ns_iter, ns_fini, retries);
+
+out_put:
+ for (i = 0; i < DRME_BENCH_NUM_OBJECTS; i++) {
+ if (bos[i])
+ xe_bo_put(bos[i]);
+ }
+}
+
+static struct kunit_case xe_drm_exec_bench_cases[] = {
+ KUNIT_CASE_PARAM(xe_drm_exec_bench_kunit, xe_pci_live_device_gen_param),
+ {}
+};
+
+VISIBLE_IF_KUNIT
+struct kunit_suite xe_drm_exec_bench_test_suite = {
+ .name = "xe_drm_exec_bench",
+ .test_cases = xe_drm_exec_bench_cases,
+ .init = xe_kunit_helper_xe_device_live_test_init,
+};
+EXPORT_SYMBOL_IF_KUNIT(xe_drm_exec_bench_test_suite);
diff --git a/drivers/gpu/drm/xe/tests/xe_live_test_mod.c b/drivers/gpu/drm/xe/tests/xe_live_test_mod.c
index c55e46f1ae92..926868d9e0cc 100644
--- a/drivers/gpu/drm/xe/tests/xe_live_test_mod.c
+++ b/drivers/gpu/drm/xe/tests/xe_live_test_mod.c
@@ -8,6 +8,7 @@
extern struct kunit_suite xe_bo_test_suite;
extern struct kunit_suite xe_bo_shrink_test_suite;
extern struct kunit_suite xe_dma_buf_test_suite;
+extern struct kunit_suite xe_drm_exec_bench_test_suite;
extern struct kunit_suite xe_migrate_test_suite;
extern struct kunit_suite xe_mocs_test_suite;
extern struct kunit_suite xe_guc_g2g_test_suite;
@@ -15,6 +16,7 @@ extern struct kunit_suite xe_guc_g2g_test_suite;
kunit_test_suite(xe_bo_test_suite);
kunit_test_suite(xe_bo_shrink_test_suite);
kunit_test_suite(xe_dma_buf_test_suite);
+kunit_test_suite(xe_drm_exec_bench_test_suite);
kunit_test_suite(xe_migrate_test_suite);
kunit_test_suite(xe_mocs_test_suite);
kunit_test_suite(xe_guc_g2g_test_suite);
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 4c80bac67622..2c1e47fdd3f5 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -5,6 +5,7 @@
#include "xe_bo.h"
+#include <kunit/visibility.h>
#include <linux/dma-buf.h>
#include <linux/nospec.h>
@@ -2641,6 +2642,7 @@ struct xe_bo *xe_bo_create_user(struct xe_device *xe,
return bo;
}
+EXPORT_SYMBOL_IF_KUNIT(xe_bo_create_user);
/**
* xe_bo_create_pin_range_novm() - Create and pin a BO with range options.
@@ -3839,6 +3841,7 @@ void xe_bo_put(struct xe_bo *bo)
drm_gem_object_put(&bo->ttm.base);
}
}
+EXPORT_SYMBOL_IF_KUNIT(xe_bo_put);
/**
* xe_bo_dumb_create - Create a dumb bo as backing for a fb
--
2.54.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* ✗ CI.checkpatch: warning for drm/xe/tests: Add drm_exec locking benchmark kunit test
2026-06-05 11:26 [RFC PATCH 0/3] Use a dma_resv wound-wait transaction API for drm_exec Thomas Hellström
` (2 preceding siblings ...)
2026-06-05 11:27 ` [RFC PATCH] drm/xe/tests: Add drm_exec locking benchmark kunit test Thomas Hellström
@ 2026-06-05 12:16 ` Patchwork
2026-06-05 12:18 ` ✓ CI.KUnit: success " Patchwork
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2026-06-05 12:16 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: drm/xe/tests: Add drm_exec locking benchmark kunit test
URL : https://patchwork.freedesktop.org/series/167950/
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
061140b9bc586ae7f40abc1249c97e1cc72d1b9d
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 93d015b8f1085d00c6041da4d286ae0f55f05d89
Author: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Date: Fri Jun 5 13:26:58 2026 +0200
dma-buf: Add generic dma_resv wound-wait transaction API
Introduce dma_resv_txn, a subsystem-agnostic wound-wait locking
protocol for sets of dma_resv objects. It is a lower-level analogue
of drm_exec, usable with any object that embeds or references a
dma_resv — not just GEM buffers.
Each participant type provides an ops vtable with callbacks to retrieve
the associated dma_resv and release the object reference.
dma_resv_txn_force_retry() allows callers to trigger an unconditional
retry to recover from non-ww errors such as memory pressure.
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
+ /mt/dim checkpatch fe3f27ecb39e8357b0af59cfe9402fd5cc0c07b1 drm-intel
93d015b8f108 dma-buf: Add generic dma_resv wound-wait transaction API
-:35: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#35:
new file mode 100644
-:460: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#460: FILE: include/linux/dma-resv-txn.h:115:
+#define __dma_resv_txn_for_each_obj_ops(txn, obj, __ops, __curs) \
+ for (struct dma_resv_txn_obj *__curs = (txn)->objects; \
+ __curs < &(txn)->objects[(txn)->num_objects] && \
+ ((obj) = __curs->object, true); \
+ ++__curs) \
+ if (unlikely(__curs->ops != (__ops))) {} else
BUT SEE:
do {} while (0) advice is over-stated in a few situations:
The more obvious case is macros, like MODULE_PARM_DESC, invoked at
file-scope, where C disallows code (it must be in functions). See
$exceptions if you have one to add by name.
More troublesome is declarative macros used at top of new scope,
like DECLARE_PER_CPU. These might just compile with a do-while-0
wrapper, but would be incorrect. Most of these are handled by
detecting struct,union,etc declaration primitives in $exceptions.
Theres also macros called inside an if (block), which "return" an
expression. These cannot do-while, and need a ({}) wrapper.
Enjoy this qualification while we work to improve our heuristics.
-:460: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'txn' - possible side-effects?
#460: FILE: include/linux/dma-resv-txn.h:115:
+#define __dma_resv_txn_for_each_obj_ops(txn, obj, __ops, __curs) \
+ for (struct dma_resv_txn_obj *__curs = (txn)->objects; \
+ __curs < &(txn)->objects[(txn)->num_objects] && \
+ ((obj) = __curs->object, true); \
+ ++__curs) \
+ if (unlikely(__curs->ops != (__ops))) {} else
-:460: CHECK:MACRO_ARG_REUSE: Macro argument reuse '__curs' - possible side-effects?
#460: FILE: include/linux/dma-resv-txn.h:115:
+#define __dma_resv_txn_for_each_obj_ops(txn, obj, __ops, __curs) \
+ for (struct dma_resv_txn_obj *__curs = (txn)->objects; \
+ __curs < &(txn)->objects[(txn)->num_objects] && \
+ ((obj) = __curs->object, true); \
+ ++__curs) \
+ if (unlikely(__curs->ops != (__ops))) {} else
-:460: CHECK:MACRO_ARG_PRECEDENCE: Macro argument '__curs' may be better as '(__curs)' to avoid precedence issues
#460: FILE: include/linux/dma-resv-txn.h:115:
+#define __dma_resv_txn_for_each_obj_ops(txn, obj, __ops, __curs) \
+ for (struct dma_resv_txn_obj *__curs = (txn)->objects; \
+ __curs < &(txn)->objects[(txn)->num_objects] && \
+ ((obj) = __curs->object, true); \
+ ++__curs) \
+ if (unlikely(__curs->ops != (__ops))) {} else
-:465: ERROR:TRAILING_STATEMENTS: trailing statements should be on next line
#465: FILE: include/linux/dma-resv-txn.h:120:
+ if (unlikely(__curs->ops != (__ops))) {} else
-:465: CHECK:BRACES: braces {} should be used on all arms of this statement
#465: FILE: include/linux/dma-resv-txn.h:120:
+ if (unlikely(__curs->ops != (__ops))) {} else
[...]
+ if (unlikely(__curs->ops != (__ops))) {} else
[...]
-:467: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#467: FILE: include/linux/dma-resv-txn.h:122:
+#define __dma_resv_txn_for_each_obj_ops_reverse(txn, obj, __ops, __idx) \
+ for (unsigned long __idx = (txn)->num_objects; \
+ __idx-- > 0 && \
+ ((obj) = (txn)->objects[__idx].object, true); \
+ ) \
+ if (unlikely((txn)->objects[__idx].ops != (__ops))) {} else
BUT SEE:
do {} while (0) advice is over-stated in a few situations:
The more obvious case is macros, like MODULE_PARM_DESC, invoked at
file-scope, where C disallows code (it must be in functions). See
$exceptions if you have one to add by name.
More troublesome is declarative macros used at top of new scope,
like DECLARE_PER_CPU. These might just compile with a do-while-0
wrapper, but would be incorrect. Most of these are handled by
detecting struct,union,etc declaration primitives in $exceptions.
Theres also macros called inside an if (block), which "return" an
expression. These cannot do-while, and need a ({}) wrapper.
Enjoy this qualification while we work to improve our heuristics.
-:467: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'txn' - possible side-effects?
#467: FILE: include/linux/dma-resv-txn.h:122:
+#define __dma_resv_txn_for_each_obj_ops_reverse(txn, obj, __ops, __idx) \
+ for (unsigned long __idx = (txn)->num_objects; \
+ __idx-- > 0 && \
+ ((obj) = (txn)->objects[__idx].object, true); \
+ ) \
+ if (unlikely((txn)->objects[__idx].ops != (__ops))) {} else
-:467: CHECK:MACRO_ARG_REUSE: Macro argument reuse '__idx' - possible side-effects?
#467: FILE: include/linux/dma-resv-txn.h:122:
+#define __dma_resv_txn_for_each_obj_ops_reverse(txn, obj, __ops, __idx) \
+ for (unsigned long __idx = (txn)->num_objects; \
+ __idx-- > 0 && \
+ ((obj) = (txn)->objects[__idx].object, true); \
+ ) \
+ if (unlikely((txn)->objects[__idx].ops != (__ops))) {} else
-:472: ERROR:TRAILING_STATEMENTS: trailing statements should be on next line
#472: FILE: include/linux/dma-resv-txn.h:127:
+ if (unlikely((txn)->objects[__idx].ops != (__ops))) {} else
-:472: CHECK:BRACES: braces {} should be used on all arms of this statement
#472: FILE: include/linux/dma-resv-txn.h:127:
+ if (unlikely((txn)->objects[__idx].ops != (__ops))) {} else
[...]
+ if (unlikely((txn)->objects[__idx].ops != (__ops))) {} else
[...]
-:501: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#501: FILE: include/linux/dma-resv-txn.h:156:
+#define __dma_resv_txn_until_all_locked(txn, _label) \
+_label: \
+ for (void *const __maybe_unused __txn_retry_ptr = &&_label; \
+ dma_resv_txn_cleanup(txn);)
BUT SEE:
do {} while (0) advice is over-stated in a few situations:
The more obvious case is macros, like MODULE_PARM_DESC, invoked at
file-scope, where C disallows code (it must be in functions). See
$exceptions if you have one to add by name.
More troublesome is declarative macros used at top of new scope,
like DECLARE_PER_CPU. These might just compile with a do-while-0
wrapper, but would be incorrect. Most of these are handled by
detecting struct,union,etc declaration primitives in $exceptions.
Theres also macros called inside an if (block), which "return" an
expression. These cannot do-while, and need a ({}) wrapper.
Enjoy this qualification while we work to improve our heuristics.
-:501: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_label' - possible side-effects?
#501: FILE: include/linux/dma-resv-txn.h:156:
+#define __dma_resv_txn_until_all_locked(txn, _label) \
+_label: \
+ for (void *const __maybe_unused __txn_retry_ptr = &&_label; \
+ dma_resv_txn_cleanup(txn);)
-:502: ERROR:SPACING: spaces required around that ':' (ctx:VxE)
#502: FILE: include/linux/dma-resv-txn.h:157:
+_label: \
^
-:536: WARNING:MACRO_WITH_FLOW_CONTROL: Macros with flow control statements should be avoided
#536: FILE: include/linux/dma-resv-txn.h:191:
+#define dma_resv_txn_retry_on_contention(txn) \
+ do { \
+ if (unlikely(dma_resv_txn_is_contended(txn))) \
+ goto *__txn_retry_ptr; \
+ } while (0)
-:551: WARNING:MACRO_WITH_FLOW_CONTROL: Macros with flow control statements should be avoided
#551: FILE: include/linux/dma-resv-txn.h:206:
+#define dma_resv_txn_force_retry(txn) \
+ do { \
+ WARN_ON(dma_resv_txn_is_contended(txn)); \
+ goto *__txn_retry_ptr; \
+ } while (0)
total: 6 errors, 3 warnings, 8 checks, 529 lines checked
^ permalink raw reply [flat|nested] 8+ messages in thread* ✓ CI.KUnit: success for drm/xe/tests: Add drm_exec locking benchmark kunit test
2026-06-05 11:26 [RFC PATCH 0/3] Use a dma_resv wound-wait transaction API for drm_exec Thomas Hellström
` (3 preceding siblings ...)
2026-06-05 12:16 ` ✗ CI.checkpatch: warning for " Patchwork
@ 2026-06-05 12:18 ` Patchwork
2026-06-05 13:13 ` ✓ Xe.CI.BAT: " Patchwork
2026-06-05 23:49 ` ✓ Xe.CI.FULL: " Patchwork
6 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2026-06-05 12:18 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: drm/xe/tests: Add drm_exec locking benchmark kunit test
URL : https://patchwork.freedesktop.org/series/167950/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[12:16:55] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[12:17:02] 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
[12:17:35] Starting KUnit Kernel (1/1)...
[12:17:35] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[12:17:35] ================== guc_buf (11 subtests) ===================
[12:17:35] [PASSED] test_smallest
[12:17:35] [PASSED] test_largest
[12:17:35] [PASSED] test_granular
[12:17:35] [PASSED] test_unique
[12:17:35] [PASSED] test_overlap
[12:17:35] [PASSED] test_reusable
[12:17:35] [PASSED] test_too_big
[12:17:35] [PASSED] test_flush
[12:17:35] [PASSED] test_lookup
[12:17:35] [PASSED] test_data
[12:17:35] [PASSED] test_class
[12:17:35] ===================== [PASSED] guc_buf =====================
[12:17:35] =================== guc_dbm (7 subtests) ===================
[12:17:35] [PASSED] test_empty
[12:17:35] [PASSED] test_default
[12:17:35] ======================== test_size ========================
[12:17:35] [PASSED] 4
[12:17:35] [PASSED] 8
[12:17:35] [PASSED] 32
[12:17:35] [PASSED] 256
[12:17:35] ==================== [PASSED] test_size ====================
[12:17:35] ======================= test_reuse ========================
[12:17:35] [PASSED] 4
[12:17:35] [PASSED] 8
[12:17:35] [PASSED] 32
[12:17:35] [PASSED] 256
[12:17:35] =================== [PASSED] test_reuse ====================
[12:17:35] =================== test_range_overlap ====================
[12:17:35] [PASSED] 4
[12:17:35] [PASSED] 8
[12:17:35] [PASSED] 32
[12:17:35] [PASSED] 256
[12:17:35] =============== [PASSED] test_range_overlap ================
[12:17:35] =================== test_range_compact ====================
[12:17:35] [PASSED] 4
[12:17:35] [PASSED] 8
[12:17:35] [PASSED] 32
[12:17:35] [PASSED] 256
[12:17:35] =============== [PASSED] test_range_compact ================
[12:17:35] ==================== test_range_spare =====================
[12:17:35] [PASSED] 4
[12:17:35] [PASSED] 8
[12:17:35] [PASSED] 32
[12:17:35] [PASSED] 256
[12:17:35] ================ [PASSED] test_range_spare =================
[12:17:35] ===================== [PASSED] guc_dbm =====================
[12:17:35] =================== guc_idm (6 subtests) ===================
[12:17:35] [PASSED] bad_init
[12:17:35] [PASSED] no_init
[12:17:35] [PASSED] init_fini
[12:17:35] [PASSED] check_used
[12:17:35] [PASSED] check_quota
[12:17:35] [PASSED] check_all
[12:17:35] ===================== [PASSED] guc_idm =====================
[12:17:35] ================== no_relay (3 subtests) ===================
[12:17:35] [PASSED] xe_drops_guc2pf_if_not_ready
[12:17:35] [PASSED] xe_drops_guc2vf_if_not_ready
[12:17:35] [PASSED] xe_rejects_send_if_not_ready
[12:17:35] ==================== [PASSED] no_relay =====================
[12:17:35] ================== pf_relay (14 subtests) ==================
[12:17:35] [PASSED] pf_rejects_guc2pf_too_short
[12:17:35] [PASSED] pf_rejects_guc2pf_too_long
[12:17:35] [PASSED] pf_rejects_guc2pf_no_payload
[12:17:35] [PASSED] pf_fails_no_payload
[12:17:35] [PASSED] pf_fails_bad_origin
[12:17:35] [PASSED] pf_fails_bad_type
[12:17:35] [PASSED] pf_txn_reports_error
[12:17:35] [PASSED] pf_txn_sends_pf2guc
[12:17:35] [PASSED] pf_sends_pf2guc
[12:17:35] [SKIPPED] pf_loopback_nop
[12:17:35] [SKIPPED] pf_loopback_echo
[12:17:35] [SKIPPED] pf_loopback_fail
[12:17:35] [SKIPPED] pf_loopback_busy
[12:17:35] [SKIPPED] pf_loopback_retry
[12:17:35] ==================== [PASSED] pf_relay =====================
[12:17:35] ================== vf_relay (3 subtests) ===================
[12:17:35] [PASSED] vf_rejects_guc2vf_too_short
[12:17:35] [PASSED] vf_rejects_guc2vf_too_long
[12:17:35] [PASSED] vf_rejects_guc2vf_no_payload
[12:17:35] ==================== [PASSED] vf_relay =====================
[12:17:35] ================ pf_gt_config (9 subtests) =================
[12:17:35] [PASSED] fair_contexts_1vf
[12:17:35] [PASSED] fair_doorbells_1vf
[12:17:35] [PASSED] fair_ggtt_1vf
[12:17:35] ====================== fair_vram_1vf ======================
[12:17:35] [PASSED] 3.50 GiB
[12:17:35] [PASSED] 11.5 GiB
[12:17:35] [PASSED] 15.5 GiB
[12:17:35] [PASSED] 31.5 GiB
[12:17:35] [PASSED] 63.5 GiB
[12:17:35] [PASSED] 1.91 GiB
[12:17:35] ================== [PASSED] fair_vram_1vf ==================
[12:17:35] ================ fair_vram_1vf_admin_only =================
[12:17:35] [PASSED] 3.50 GiB
[12:17:35] [PASSED] 11.5 GiB
[12:17:35] [PASSED] 15.5 GiB
[12:17:35] [PASSED] 31.5 GiB
[12:17:35] [PASSED] 63.5 GiB
[12:17:35] [PASSED] 1.91 GiB
[12:17:35] ============ [PASSED] fair_vram_1vf_admin_only =============
[12:17:35] ====================== fair_contexts ======================
[12:17:35] [PASSED] 1 VF
[12:17:35] [PASSED] 2 VFs
[12:17:35] [PASSED] 3 VFs
[12:17:35] [PASSED] 4 VFs
[12:17:35] [PASSED] 5 VFs
[12:17:35] [PASSED] 6 VFs
[12:17:35] [PASSED] 7 VFs
[12:17:35] [PASSED] 8 VFs
[12:17:35] [PASSED] 9 VFs
[12:17:35] [PASSED] 10 VFs
[12:17:35] [PASSED] 11 VFs
[12:17:35] [PASSED] 12 VFs
[12:17:35] [PASSED] 13 VFs
[12:17:35] [PASSED] 14 VFs
[12:17:35] [PASSED] 15 VFs
[12:17:35] [PASSED] 16 VFs
[12:17:35] [PASSED] 17 VFs
[12:17:35] [PASSED] 18 VFs
[12:17:35] [PASSED] 19 VFs
[12:17:35] [PASSED] 20 VFs
[12:17:35] [PASSED] 21 VFs
[12:17:35] [PASSED] 22 VFs
[12:17:35] [PASSED] 23 VFs
[12:17:35] [PASSED] 24 VFs
[12:17:35] [PASSED] 25 VFs
[12:17:35] [PASSED] 26 VFs
[12:17:35] [PASSED] 27 VFs
[12:17:35] [PASSED] 28 VFs
[12:17:35] [PASSED] 29 VFs
[12:17:35] [PASSED] 30 VFs
[12:17:35] [PASSED] 31 VFs
[12:17:35] [PASSED] 32 VFs
[12:17:35] [PASSED] 33 VFs
[12:17:35] [PASSED] 34 VFs
[12:17:35] [PASSED] 35 VFs
[12:17:35] [PASSED] 36 VFs
[12:17:35] [PASSED] 37 VFs
[12:17:35] [PASSED] 38 VFs
[12:17:35] [PASSED] 39 VFs
[12:17:35] [PASSED] 40 VFs
[12:17:35] [PASSED] 41 VFs
[12:17:35] [PASSED] 42 VFs
[12:17:35] [PASSED] 43 VFs
[12:17:35] [PASSED] 44 VFs
[12:17:35] [PASSED] 45 VFs
[12:17:35] [PASSED] 46 VFs
[12:17:35] [PASSED] 47 VFs
[12:17:35] [PASSED] 48 VFs
[12:17:35] [PASSED] 49 VFs
[12:17:35] [PASSED] 50 VFs
[12:17:35] [PASSED] 51 VFs
[12:17:35] [PASSED] 52 VFs
[12:17:35] [PASSED] 53 VFs
[12:17:35] [PASSED] 54 VFs
[12:17:35] [PASSED] 55 VFs
[12:17:35] [PASSED] 56 VFs
[12:17:35] [PASSED] 57 VFs
[12:17:35] [PASSED] 58 VFs
[12:17:35] [PASSED] 59 VFs
[12:17:35] [PASSED] 60 VFs
[12:17:35] [PASSED] 61 VFs
[12:17:35] [PASSED] 62 VFs
[12:17:35] [PASSED] 63 VFs
[12:17:35] ================== [PASSED] fair_contexts ==================
[12:17:35] ===================== fair_doorbells ======================
[12:17:35] [PASSED] 1 VF
[12:17:35] [PASSED] 2 VFs
[12:17:35] [PASSED] 3 VFs
[12:17:35] [PASSED] 4 VFs
[12:17:35] [PASSED] 5 VFs
[12:17:35] [PASSED] 6 VFs
[12:17:35] [PASSED] 7 VFs
[12:17:35] [PASSED] 8 VFs
[12:17:35] [PASSED] 9 VFs
[12:17:35] [PASSED] 10 VFs
[12:17:35] [PASSED] 11 VFs
[12:17:35] [PASSED] 12 VFs
[12:17:35] [PASSED] 13 VFs
[12:17:35] [PASSED] 14 VFs
[12:17:35] [PASSED] 15 VFs
[12:17:35] [PASSED] 16 VFs
[12:17:35] [PASSED] 17 VFs
[12:17:35] [PASSED] 18 VFs
[12:17:35] [PASSED] 19 VFs
[12:17:35] [PASSED] 20 VFs
[12:17:35] [PASSED] 21 VFs
[12:17:35] [PASSED] 22 VFs
[12:17:35] [PASSED] 23 VFs
[12:17:35] [PASSED] 24 VFs
[12:17:35] [PASSED] 25 VFs
[12:17:35] [PASSED] 26 VFs
[12:17:35] [PASSED] 27 VFs
[12:17:35] [PASSED] 28 VFs
[12:17:35] [PASSED] 29 VFs
[12:17:35] [PASSED] 30 VFs
[12:17:35] [PASSED] 31 VFs
[12:17:35] [PASSED] 32 VFs
[12:17:35] [PASSED] 33 VFs
[12:17:35] [PASSED] 34 VFs
[12:17:35] [PASSED] 35 VFs
[12:17:35] [PASSED] 36 VFs
[12:17:35] [PASSED] 37 VFs
[12:17:35] [PASSED] 38 VFs
[12:17:35] [PASSED] 39 VFs
[12:17:35] [PASSED] 40 VFs
[12:17:35] [PASSED] 41 VFs
[12:17:35] [PASSED] 42 VFs
[12:17:35] [PASSED] 43 VFs
[12:17:35] [PASSED] 44 VFs
[12:17:35] [PASSED] 45 VFs
[12:17:35] [PASSED] 46 VFs
[12:17:35] [PASSED] 47 VFs
[12:17:35] [PASSED] 48 VFs
[12:17:35] [PASSED] 49 VFs
[12:17:35] [PASSED] 50 VFs
[12:17:35] [PASSED] 51 VFs
[12:17:35] [PASSED] 52 VFs
[12:17:35] [PASSED] 53 VFs
[12:17:35] [PASSED] 54 VFs
[12:17:35] [PASSED] 55 VFs
[12:17:35] [PASSED] 56 VFs
[12:17:35] [PASSED] 57 VFs
[12:17:35] [PASSED] 58 VFs
[12:17:35] [PASSED] 59 VFs
[12:17:35] [PASSED] 60 VFs
[12:17:35] [PASSED] 61 VFs
[12:17:35] [PASSED] 62 VFs
[12:17:35] [PASSED] 63 VFs
[12:17:35] ================= [PASSED] fair_doorbells ==================
[12:17:35] ======================== fair_ggtt ========================
[12:17:35] [PASSED] 1 VF
[12:17:35] [PASSED] 2 VFs
[12:17:35] [PASSED] 3 VFs
[12:17:35] [PASSED] 4 VFs
[12:17:35] [PASSED] 5 VFs
[12:17:35] [PASSED] 6 VFs
[12:17:35] [PASSED] 7 VFs
[12:17:35] [PASSED] 8 VFs
[12:17:35] [PASSED] 9 VFs
[12:17:35] [PASSED] 10 VFs
[12:17:35] [PASSED] 11 VFs
[12:17:35] [PASSED] 12 VFs
[12:17:35] [PASSED] 13 VFs
[12:17:35] [PASSED] 14 VFs
[12:17:35] [PASSED] 15 VFs
[12:17:35] [PASSED] 16 VFs
[12:17:35] [PASSED] 17 VFs
[12:17:35] [PASSED] 18 VFs
[12:17:35] [PASSED] 19 VFs
[12:17:35] [PASSED] 20 VFs
[12:17:35] [PASSED] 21 VFs
[12:17:35] [PASSED] 22 VFs
[12:17:35] [PASSED] 23 VFs
[12:17:35] [PASSED] 24 VFs
[12:17:35] [PASSED] 25 VFs
[12:17:35] [PASSED] 26 VFs
[12:17:35] [PASSED] 27 VFs
[12:17:35] [PASSED] 28 VFs
[12:17:35] [PASSED] 29 VFs
[12:17:35] [PASSED] 30 VFs
[12:17:35] [PASSED] 31 VFs
[12:17:35] [PASSED] 32 VFs
[12:17:35] [PASSED] 33 VFs
[12:17:35] [PASSED] 34 VFs
[12:17:35] [PASSED] 35 VFs
[12:17:35] [PASSED] 36 VFs
[12:17:35] [PASSED] 37 VFs
[12:17:35] [PASSED] 38 VFs
[12:17:35] [PASSED] 39 VFs
[12:17:35] [PASSED] 40 VFs
[12:17:35] [PASSED] 41 VFs
[12:17:35] [PASSED] 42 VFs
[12:17:35] [PASSED] 43 VFs
[12:17:35] [PASSED] 44 VFs
[12:17:35] [PASSED] 45 VFs
[12:17:35] [PASSED] 46 VFs
[12:17:35] [PASSED] 47 VFs
[12:17:35] [PASSED] 48 VFs
[12:17:35] [PASSED] 49 VFs
[12:17:35] [PASSED] 50 VFs
[12:17:35] [PASSED] 51 VFs
[12:17:35] [PASSED] 52 VFs
[12:17:35] [PASSED] 53 VFs
[12:17:35] [PASSED] 54 VFs
[12:17:35] [PASSED] 55 VFs
[12:17:35] [PASSED] 56 VFs
[12:17:35] [PASSED] 57 VFs
[12:17:35] [PASSED] 58 VFs
[12:17:35] [PASSED] 59 VFs
[12:17:35] [PASSED] 60 VFs
[12:17:35] [PASSED] 61 VFs
[12:17:35] [PASSED] 62 VFs
[12:17:35] [PASSED] 63 VFs
[12:17:35] ==================== [PASSED] fair_ggtt ====================
[12:17:35] ======================== fair_vram ========================
[12:17:35] [PASSED] 1 VF
[12:17:35] [PASSED] 2 VFs
[12:17:35] [PASSED] 3 VFs
[12:17:35] [PASSED] 4 VFs
[12:17:35] [PASSED] 5 VFs
[12:17:35] [PASSED] 6 VFs
[12:17:35] [PASSED] 7 VFs
[12:17:35] [PASSED] 8 VFs
[12:17:35] [PASSED] 9 VFs
[12:17:35] [PASSED] 10 VFs
[12:17:35] [PASSED] 11 VFs
[12:17:35] [PASSED] 12 VFs
[12:17:35] [PASSED] 13 VFs
[12:17:35] [PASSED] 14 VFs
[12:17:35] [PASSED] 15 VFs
[12:17:35] [PASSED] 16 VFs
[12:17:35] [PASSED] 17 VFs
[12:17:35] [PASSED] 18 VFs
[12:17:35] [PASSED] 19 VFs
[12:17:35] [PASSED] 20 VFs
[12:17:35] [PASSED] 21 VFs
[12:17:35] [PASSED] 22 VFs
[12:17:35] [PASSED] 23 VFs
[12:17:35] [PASSED] 24 VFs
[12:17:35] [PASSED] 25 VFs
[12:17:35] [PASSED] 26 VFs
[12:17:35] [PASSED] 27 VFs
[12:17:35] [PASSED] 28 VFs
[12:17:35] [PASSED] 29 VFs
[12:17:35] [PASSED] 30 VFs
[12:17:35] [PASSED] 31 VFs
[12:17:35] [PASSED] 32 VFs
[12:17:35] [PASSED] 33 VFs
[12:17:35] [PASSED] 34 VFs
[12:17:35] [PASSED] 35 VFs
[12:17:35] [PASSED] 36 VFs
[12:17:35] [PASSED] 37 VFs
[12:17:35] [PASSED] 38 VFs
[12:17:35] [PASSED] 39 VFs
[12:17:35] [PASSED] 40 VFs
[12:17:35] [PASSED] 41 VFs
[12:17:35] [PASSED] 42 VFs
[12:17:35] [PASSED] 43 VFs
[12:17:35] [PASSED] 44 VFs
[12:17:35] [PASSED] 45 VFs
[12:17:35] [PASSED] 46 VFs
[12:17:35] [PASSED] 47 VFs
[12:17:35] [PASSED] 48 VFs
[12:17:35] [PASSED] 49 VFs
[12:17:35] [PASSED] 50 VFs
[12:17:35] [PASSED] 51 VFs
[12:17:35] [PASSED] 52 VFs
[12:17:35] [PASSED] 53 VFs
[12:17:35] [PASSED] 54 VFs
[12:17:35] [PASSED] 55 VFs
[12:17:35] [PASSED] 56 VFs
[12:17:35] [PASSED] 57 VFs
[12:17:35] [PASSED] 58 VFs
[12:17:35] [PASSED] 59 VFs
[12:17:35] [PASSED] 60 VFs
[12:17:35] [PASSED] 61 VFs
[12:17:35] [PASSED] 62 VFs
[12:17:35] [PASSED] 63 VFs
[12:17:35] ==================== [PASSED] fair_vram ====================
[12:17:35] ================== [PASSED] pf_gt_config ===================
[12:17:35] ===================== lmtt (1 subtest) =====================
[12:17:35] ======================== test_ops =========================
[12:17:35] [PASSED] 2-level
[12:17:35] [PASSED] multi-level
[12:17:35] ==================== [PASSED] test_ops =====================
[12:17:35] ====================== [PASSED] lmtt =======================
[12:17:35] ================= pf_service (11 subtests) =================
[12:17:35] [PASSED] pf_negotiate_any
[12:17:35] [PASSED] pf_negotiate_base_match
[12:17:35] [PASSED] pf_negotiate_base_newer
[12:17:35] [PASSED] pf_negotiate_base_next
[12:17:35] [SKIPPED] pf_negotiate_base_older
[12:17:35] [PASSED] pf_negotiate_base_prev
[12:17:35] [PASSED] pf_negotiate_latest_match
[12:17:35] [PASSED] pf_negotiate_latest_newer
[12:17:35] [PASSED] pf_negotiate_latest_next
[12:17:35] [SKIPPED] pf_negotiate_latest_older
[12:17:35] [SKIPPED] pf_negotiate_latest_prev
[12:17:35] =================== [PASSED] pf_service ====================
[12:17:35] ================= xe_guc_g2g (2 subtests) ==================
[12:17:35] ============== xe_live_guc_g2g_kunit_default ==============
[12:17:35] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[12:17:35] ============== xe_live_guc_g2g_kunit_allmem ===============
[12:17:35] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[12:17:35] =================== [SKIPPED] xe_guc_g2g ===================
[12:17:35] =================== xe_mocs (2 subtests) ===================
[12:17:35] ================ xe_live_mocs_kernel_kunit ================
[12:17:35] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[12:17:35] ================ xe_live_mocs_reset_kunit =================
[12:17:35] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[12:17:35] ==================== [SKIPPED] xe_mocs =====================
[12:17:35] ================= xe_migrate (2 subtests) ==================
[12:17:35] ================= xe_migrate_sanity_kunit =================
[12:17:35] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[12:17:35] ================== xe_validate_ccs_kunit ==================
[12:17:35] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[12:17:35] =================== [SKIPPED] xe_migrate ===================
[12:17:35] ================== xe_dma_buf (1 subtest) ==================
[12:17:35] ==================== xe_dma_buf_kunit =====================
[12:17:35] ================ [SKIPPED] xe_dma_buf_kunit ================
[12:17:35] =================== [SKIPPED] xe_dma_buf ===================
[12:17:35] ================= xe_bo_shrink (1 subtest) =================
[12:17:35] =================== xe_bo_shrink_kunit ====================
[12:17:35] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[12:17:35] ================== [SKIPPED] xe_bo_shrink ==================
[12:17:35] ==================== xe_bo (2 subtests) ====================
[12:17:35] ================== xe_ccs_migrate_kunit ===================
[12:17:35] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[12:17:35] ==================== xe_bo_evict_kunit ====================
[12:17:35] =============== [SKIPPED] xe_bo_evict_kunit ================
[12:17:35] ===================== [SKIPPED] xe_bo ======================
[12:17:35] ==================== args (13 subtests) ====================
[12:17:35] [PASSED] count_args_test
[12:17:35] [PASSED] call_args_example
[12:17:35] [PASSED] call_args_test
[12:17:35] [PASSED] drop_first_arg_example
[12:17:35] [PASSED] drop_first_arg_test
[12:17:35] [PASSED] first_arg_example
[12:17:35] [PASSED] first_arg_test
[12:17:35] [PASSED] last_arg_example
[12:17:35] [PASSED] last_arg_test
[12:17:35] [PASSED] pick_arg_example
[12:17:35] [PASSED] if_args_example
[12:17:35] [PASSED] if_args_test
[12:17:35] [PASSED] sep_comma_example
[12:17:35] ====================== [PASSED] args =======================
[12:17:35] =================== xe_pci (3 subtests) ====================
[12:17:35] ==================== check_graphics_ip ====================
[12:17:35] [PASSED] 12.00 Xe_LP
[12:17:35] [PASSED] 12.10 Xe_LP+
[12:17:35] [PASSED] 12.55 Xe_HPG
[12:17:35] [PASSED] 12.60 Xe_HPC
[12:17:35] [PASSED] 12.70 Xe_LPG
[12:17:35] [PASSED] 12.71 Xe_LPG
[12:17:35] [PASSED] 12.74 Xe_LPG+
[12:17:35] [PASSED] 20.01 Xe2_HPG
[12:17:35] [PASSED] 20.02 Xe2_HPG
[12:17:35] [PASSED] 20.04 Xe2_LPG
[12:17:35] [PASSED] 30.00 Xe3_LPG
[12:17:35] [PASSED] 30.01 Xe3_LPG
[12:17:35] [PASSED] 30.03 Xe3_LPG
[12:17:35] [PASSED] 30.04 Xe3_LPG
[12:17:35] [PASSED] 30.05 Xe3_LPG
[12:17:35] [PASSED] 35.10 Xe3p_LPG
[12:17:35] [PASSED] 35.11 Xe3p_XPC
[12:17:35] ================ [PASSED] check_graphics_ip ================
[12:17:35] ===================== check_media_ip ======================
[12:17:35] [PASSED] 12.00 Xe_M
[12:17:35] [PASSED] 12.55 Xe_HPM
[12:17:35] [PASSED] 13.00 Xe_LPM+
[12:17:35] [PASSED] 13.01 Xe2_HPM
[12:17:35] [PASSED] 20.00 Xe2_LPM
[12:17:35] [PASSED] 30.00 Xe3_LPM
[12:17:35] [PASSED] 30.02 Xe3_LPM
[12:17:35] [PASSED] 35.00 Xe3p_LPM
[12:17:35] [PASSED] 35.03 Xe3p_HPM
[12:17:35] ================= [PASSED] check_media_ip ==================
[12:17:35] =================== check_platform_desc ===================
[12:17:35] [PASSED] 0x9A60 (TIGERLAKE)
[12:17:35] [PASSED] 0x9A68 (TIGERLAKE)
[12:17:35] [PASSED] 0x9A70 (TIGERLAKE)
[12:17:35] [PASSED] 0x9A40 (TIGERLAKE)
[12:17:35] [PASSED] 0x9A49 (TIGERLAKE)
[12:17:35] [PASSED] 0x9A59 (TIGERLAKE)
[12:17:35] [PASSED] 0x9A78 (TIGERLAKE)
[12:17:35] [PASSED] 0x9AC0 (TIGERLAKE)
[12:17:35] [PASSED] 0x9AC9 (TIGERLAKE)
[12:17:35] [PASSED] 0x9AD9 (TIGERLAKE)
[12:17:35] [PASSED] 0x9AF8 (TIGERLAKE)
[12:17:35] [PASSED] 0x4C80 (ROCKETLAKE)
[12:17:35] [PASSED] 0x4C8A (ROCKETLAKE)
[12:17:35] [PASSED] 0x4C8B (ROCKETLAKE)
[12:17:35] [PASSED] 0x4C8C (ROCKETLAKE)
[12:17:35] [PASSED] 0x4C90 (ROCKETLAKE)
[12:17:35] [PASSED] 0x4C9A (ROCKETLAKE)
[12:17:35] [PASSED] 0x4680 (ALDERLAKE_S)
[12:17:35] [PASSED] 0x4682 (ALDERLAKE_S)
[12:17:35] [PASSED] 0x4688 (ALDERLAKE_S)
[12:17:35] [PASSED] 0x468A (ALDERLAKE_S)
[12:17:35] [PASSED] 0x468B (ALDERLAKE_S)
[12:17:35] [PASSED] 0x4690 (ALDERLAKE_S)
[12:17:35] [PASSED] 0x4692 (ALDERLAKE_S)
[12:17:35] [PASSED] 0x4693 (ALDERLAKE_S)
[12:17:35] [PASSED] 0x46A0 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46A1 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46A2 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46A3 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46A6 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46A8 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46AA (ALDERLAKE_P)
[12:17:35] [PASSED] 0x462A (ALDERLAKE_P)
[12:17:35] [PASSED] 0x4626 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x4628 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46B0 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46B1 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46B2 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46B3 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46C0 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46C1 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46C2 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46C3 (ALDERLAKE_P)
[12:17:35] [PASSED] 0x46D0 (ALDERLAKE_N)
[12:17:35] [PASSED] 0x46D1 (ALDERLAKE_N)
[12:17:35] [PASSED] 0x46D2 (ALDERLAKE_N)
[12:17:35] [PASSED] 0x46D3 (ALDERLAKE_N)
[12:17:35] [PASSED] 0x46D4 (ALDERLAKE_N)
[12:17:35] [PASSED] 0xA721 (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7A1 (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7A9 (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7AC (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7AD (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA720 (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7A0 (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7A8 (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7AA (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA7AB (ALDERLAKE_P)
[12:17:35] [PASSED] 0xA780 (ALDERLAKE_S)
[12:17:35] [PASSED] 0xA781 (ALDERLAKE_S)
[12:17:35] [PASSED] 0xA782 (ALDERLAKE_S)
[12:17:35] [PASSED] 0xA783 (ALDERLAKE_S)
[12:17:35] [PASSED] 0xA788 (ALDERLAKE_S)
[12:17:35] [PASSED] 0xA789 (ALDERLAKE_S)
[12:17:35] [PASSED] 0xA78A (ALDERLAKE_S)
[12:17:35] [PASSED] 0xA78B (ALDERLAKE_S)
[12:17:35] [PASSED] 0x4905 (DG1)
[12:17:35] [PASSED] 0x4906 (DG1)
[12:17:35] [PASSED] 0x4907 (DG1)
[12:17:35] [PASSED] 0x4908 (DG1)
[12:17:35] [PASSED] 0x4909 (DG1)
[12:17:35] [PASSED] 0x56C0 (DG2)
[12:17:35] [PASSED] 0x56C2 (DG2)
[12:17:35] [PASSED] 0x56C1 (DG2)
[12:17:35] [PASSED] 0x7D51 (METEORLAKE)
[12:17:35] [PASSED] 0x7DD1 (METEORLAKE)
[12:17:35] [PASSED] 0x7D41 (METEORLAKE)
[12:17:35] [PASSED] 0x7D67 (METEORLAKE)
[12:17:35] [PASSED] 0xB640 (METEORLAKE)
[12:17:35] [PASSED] 0x56A0 (DG2)
[12:17:35] [PASSED] 0x56A1 (DG2)
[12:17:35] [PASSED] 0x56A2 (DG2)
[12:17:35] [PASSED] 0x56BE (DG2)
[12:17:35] [PASSED] 0x56BF (DG2)
[12:17:35] [PASSED] 0x5690 (DG2)
[12:17:35] [PASSED] 0x5691 (DG2)
[12:17:35] [PASSED] 0x5692 (DG2)
[12:17:35] [PASSED] 0x56A5 (DG2)
[12:17:35] [PASSED] 0x56A6 (DG2)
[12:17:35] [PASSED] 0x56B0 (DG2)
[12:17:35] [PASSED] 0x56B1 (DG2)
[12:17:35] [PASSED] 0x56BA (DG2)
[12:17:35] [PASSED] 0x56BB (DG2)
[12:17:35] [PASSED] 0x56BC (DG2)
[12:17:35] [PASSED] 0x56BD (DG2)
[12:17:35] [PASSED] 0x5693 (DG2)
[12:17:35] [PASSED] 0x5694 (DG2)
[12:17:35] [PASSED] 0x5695 (DG2)
[12:17:35] [PASSED] 0x56A3 (DG2)
[12:17:35] [PASSED] 0x56A4 (DG2)
[12:17:35] [PASSED] 0x56B2 (DG2)
[12:17:35] [PASSED] 0x56B3 (DG2)
[12:17:35] [PASSED] 0x5696 (DG2)
[12:17:35] [PASSED] 0x5697 (DG2)
[12:17:35] [PASSED] 0xB69 (PVC)
[12:17:35] [PASSED] 0xB6E (PVC)
[12:17:35] [PASSED] 0xBD4 (PVC)
[12:17:35] [PASSED] 0xBD5 (PVC)
[12:17:35] [PASSED] 0xBD6 (PVC)
[12:17:35] [PASSED] 0xBD7 (PVC)
[12:17:35] [PASSED] 0xBD8 (PVC)
[12:17:35] [PASSED] 0xBD9 (PVC)
[12:17:35] [PASSED] 0xBDA (PVC)
[12:17:35] [PASSED] 0xBDB (PVC)
[12:17:35] [PASSED] 0xBE0 (PVC)
[12:17:35] [PASSED] 0xBE1 (PVC)
[12:17:35] [PASSED] 0xBE5 (PVC)
[12:17:35] [PASSED] 0x7D40 (METEORLAKE)
[12:17:35] [PASSED] 0x7D45 (METEORLAKE)
[12:17:35] [PASSED] 0x7D55 (METEORLAKE)
[12:17:35] [PASSED] 0x7D60 (METEORLAKE)
[12:17:35] [PASSED] 0x7DD5 (METEORLAKE)
[12:17:35] [PASSED] 0x6420 (LUNARLAKE)
[12:17:35] [PASSED] 0x64A0 (LUNARLAKE)
[12:17:35] [PASSED] 0x64B0 (LUNARLAKE)
[12:17:35] [PASSED] 0xE202 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE209 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE20B (BATTLEMAGE)
[12:17:35] [PASSED] 0xE20C (BATTLEMAGE)
[12:17:35] [PASSED] 0xE20D (BATTLEMAGE)
[12:17:35] [PASSED] 0xE210 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE211 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE212 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE216 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE220 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE221 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE222 (BATTLEMAGE)
[12:17:35] [PASSED] 0xE223 (BATTLEMAGE)
[12:17:35] [PASSED] 0xB080 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB081 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB082 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB083 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB084 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB085 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB086 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB087 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB08F (PANTHERLAKE)
[12:17:35] [PASSED] 0xB090 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB0A0 (PANTHERLAKE)
[12:17:35] [PASSED] 0xB0B0 (PANTHERLAKE)
[12:17:35] [PASSED] 0xFD80 (PANTHERLAKE)
[12:17:35] [PASSED] 0xFD81 (PANTHERLAKE)
[12:17:35] [PASSED] 0xD740 (NOVALAKE_S)
[12:17:35] [PASSED] 0xD741 (NOVALAKE_S)
[12:17:35] [PASSED] 0xD742 (NOVALAKE_S)
[12:17:35] [PASSED] 0xD743 (NOVALAKE_S)
[12:17:35] [PASSED] 0xD744 (NOVALAKE_S)
[12:17:35] [PASSED] 0xD745 (NOVALAKE_S)
[12:17:35] [PASSED] 0x674C (CRESCENTISLAND)
[12:17:35] [PASSED] 0x674D (CRESCENTISLAND)
[12:17:35] [PASSED] 0x674E (CRESCENTISLAND)
[12:17:35] [PASSED] 0x674F (CRESCENTISLAND)
[12:17:35] [PASSED] 0x6750 (CRESCENTISLAND)
[12:17:35] [PASSED] 0xD750 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD751 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD752 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD753 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD754 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD755 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD756 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD757 (NOVALAKE_P)
[12:17:35] [PASSED] 0xD75F (NOVALAKE_P)
[12:17:35] =============== [PASSED] check_platform_desc ===============
[12:17:35] ===================== [PASSED] xe_pci ======================
[12:17:35] ============= xe_rtp_tables_test (4 subtests) ==============
[12:17:35] ================== xe_rtp_table_gt_test ===================
[12:17:35] [PASSED] gt_was/14011060649
[12:17:35] [PASSED] gt_was/14011059788
[12:17:35] [PASSED] gt_was/14015795083
[12:17:35] [PASSED] gt_was/16021867713
[12:17:35] [PASSED] gt_was/14019449301
[12:17:35] [PASSED] gt_was/16028005424
[12:17:35] [PASSED] gt_was/14026578760
[12:17:35] [PASSED] gt_was/1409420604
[12:17:35] [PASSED] gt_was/1408615072
[12:17:35] [PASSED] gt_was/22010523718
[12:17:35] [PASSED] gt_was/14011006942
[12:17:35] [PASSED] gt_was/14014830051
[12:17:35] [PASSED] gt_was/18018781329
[12:17:35] [PASSED] gt_was/1509235366
[12:17:35] [PASSED] gt_was/18018781329
[12:17:35] [PASSED] gt_was/16016694945
[12:17:35] [PASSED] gt_was/14018575942
[12:17:35] [PASSED] gt_was/22016670082
[12:17:35] [PASSED] gt_was/22016670082
[12:17:35] [PASSED] gt_was/14017421178
[12:17:35] [PASSED] gt_was/16025250150
[12:17:35] [PASSED] gt_was/14021871409
[12:17:35] [PASSED] gt_was/16021865536
[12:17:35] [PASSED] gt_was/14021486841
[12:17:35] [PASSED] gt_was/14025160223
[12:17:35] [PASSED] gt_was/14026144927, 16029437861
[12:17:35] [PASSED] gt_was/14025635424
[12:17:35] [PASSED] gt_was/16028005424
[12:17:35] ============== [PASSED] xe_rtp_table_gt_test ===============
[12:17:35] ================== xe_rtp_table_gt_test ===================
[12:17:35] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[12:17:35] [PASSED] gt_tunings/Tuning: 32B Access Enable
[12:17:35] [PASSED] gt_tunings/Tuning: L3 cache
[12:17:35] [PASSED] gt_tunings/Tuning: L3 cache - media
[12:17:35] [PASSED] gt_tunings/Tuning: Compression Overfetch
[12:17:35] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[12:17:35] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[12:17:35] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[12:17:35] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[12:17:35] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[12:17:35] [PASSED] gt_tunings/Tuning: Stateless compression control
[12:17:35] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[12:17:35] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[12:17:35] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[12:17:35] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[12:17:35] ============== [PASSED] xe_rtp_table_gt_test ===============
[12:17:35] ================== xe_rtp_table_oob_test ==================
[12:17:35] [PASSED] oob_was/1607983814
[12:17:35] [PASSED] oob_was/16010904313
[12:17:35] [PASSED] oob_was/18022495364
[12:17:35] [PASSED] oob_was/22012773006
[12:17:35] [PASSED] oob_was/14014475959
[12:17:35] [PASSED] oob_was/22011391025
[12:17:35] [PASSED] oob_was/22012727170
[12:17:35] [PASSED] oob_was/22012727685
[12:17:35] [PASSED] oob_was/22016596838
[12:17:35] [PASSED] oob_was/18020744125
[12:17:35] [PASSED] oob_was/1409600907
[12:17:35] [PASSED] oob_was/22014953428
[12:17:35] [PASSED] oob_was/16017236439
[12:17:35] [PASSED] oob_was/14019821291
[12:17:35] [PASSED] oob_was/14015076503
[12:17:35] [PASSED] oob_was/14018913170
[12:17:35] [PASSED] oob_was/14018094691
[12:17:35] [PASSED] oob_was/18024947630
[12:17:35] [PASSED] oob_was/16022287689
[12:17:35] [PASSED] oob_was/13011645652
[12:17:35] [PASSED] oob_was/14022293748
[12:17:35] [PASSED] oob_was/22019794406
[12:17:35] [PASSED] oob_was/22019338487
[12:17:35] [PASSED] oob_was/16023588340
[12:17:35] [PASSED] oob_was/14019789679
[12:17:35] [PASSED] oob_was/14022866841
[12:17:35] [PASSED] oob_was/16021333562
[12:17:35] [PASSED] oob_was/14016712196
[12:17:35] [PASSED] oob_was/14015568240
[12:17:35] [PASSED] oob_was/18013179988
[12:17:35] [PASSED] oob_was/1508761755
[12:17:35] [PASSED] oob_was/16023105232
[12:17:35] [PASSED] oob_was/16026508708
[12:17:35] [PASSED] oob_was/14020001231
[12:17:35] [PASSED] oob_was/16023683509
[12:17:35] [PASSED] oob_was/14025515070
[12:17:35] [PASSED] oob_was/15015404425_disable
[12:17:35] [PASSED] oob_was/16026007364
[12:17:35] [PASSED] oob_was/14020316580
[12:17:35] [PASSED] oob_was/14025883347
[12:17:35] ============== [PASSED] xe_rtp_table_oob_test ==============
[12:17:35] ================ xe_rtp_table_dev_oob_test ================
[12:17:35] [PASSED] device_oob_was/22010954014
[12:17:35] [PASSED] device_oob_was/15015404425
[12:17:35] [PASSED] device_oob_was/22019338487_display
[12:17:35] [PASSED] device_oob_was/14022085890
[12:17:35] [PASSED] device_oob_was/14026539277
[12:17:35] [PASSED] device_oob_was/14026633728
[12:17:35] [PASSED] device_oob_was/14026746987
[12:17:35] [PASSED] device_oob_was/14026779378
[12:17:35] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[12:17:35] =============== [PASSED] xe_rtp_tables_test ================
[12:17:35] =================== xe_rtp (3 subtests) ====================
[12:17:35] =================== xe_rtp_rules_tests ====================
[12:17:35] [PASSED] no
[12:17:35] [PASSED] yes
[12:17:35] [PASSED] no-and-no
[12:17:35] [PASSED] no-and-yes
[12:17:35] [PASSED] yes-and-no
[12:17:35] [PASSED] yes-and-yes
[12:17:35] [PASSED] no-or-no
[12:17:35] [PASSED] no-or-yes
[12:17:35] [PASSED] yes-or-no
[12:17:35] [PASSED] yes-or-yes
[12:17:35] [PASSED] no-yes-or-yes-no
[12:17:35] [PASSED] no-yes-or-yes-yes
[12:17:35] [PASSED] yes-yes-or-no-yes
[12:17:35] [PASSED] yes-yes-or-yes-yes
[12:17:35] [PASSED] no-no-or-yes-or-no
[12:17:35] [PASSED] or
[12:17:35] [PASSED] or-yes
[12:17:35] [PASSED] or-no
[12:17:35] [PASSED] yes-or
[12:17:35] [PASSED] no-or
[12:17:35] [PASSED] no-or-or-yes
[12:17:35] [PASSED] yes-or-or-no
[12:17:35] [PASSED] no-or-or-no
[12:17:35] [PASSED] missing-context-engine-class
[12:17:35] [PASSED] missing-context-engine-class-or-yes
[12:17:35] [PASSED] missing-context-engine-class-or-or-yes
[12:17:35] =============== [PASSED] xe_rtp_rules_tests ================
[12:17:35] =============== xe_rtp_process_to_sr_tests ================
[12:17:35] [PASSED] coalesce-same-reg
[12:17:35] [PASSED] no-match-no-add
[12:17:35] [PASSED] two-regs-two-entries
[12:17:35] [PASSED] clr-one-set-other
[12:17:35] [PASSED] set-field
[12:17:35] [PASSED] conflict-duplicate
[12:17:35] [PASSED] conflict-not-disjoint
[12:17:35] [PASSED] conflict-reg-type
[12:17:35] [PASSED] bad-mcr-reg-forced-to-regular
[12:17:35] [PASSED] bad-regular-reg-forced-to-mcr
[12:17:35] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[12:17:35] ================== xe_rtp_process_tests ===================
[12:17:35] [PASSED] active1
[12:17:35] [PASSED] active2
[12:17:35] [PASSED] active-inactive
[12:17:35] [PASSED] inactive-active
[12:17:35] [PASSED] inactive-active-inactive
[12:17:35] [PASSED] inactive-inactive-inactive
[12:17:35] ============== [PASSED] xe_rtp_process_tests ===============
[12:17:35] ===================== [PASSED] xe_rtp ======================
[12:17:35] ==================== xe_wa (1 subtest) =====================
[12:17:35] ======================== xe_wa_gt =========================
[12:17:35] [PASSED] TIGERLAKE B0
[12:17:35] [PASSED] DG1 A0
[12:17:35] [PASSED] DG1 B0
[12:17:35] [PASSED] ALDERLAKE_S A0
[12:17:35] [PASSED] ALDERLAKE_S B0
[12:17:35] [PASSED] ALDERLAKE_S C0
[12:17:35] [PASSED] ALDERLAKE_S D0
[12:17:35] [PASSED] ALDERLAKE_P A0
[12:17:35] [PASSED] ALDERLAKE_P B0
[12:17:35] [PASSED] ALDERLAKE_P C0
[12:17:35] [PASSED] ALDERLAKE_S RPLS D0
[12:17:35] [PASSED] ALDERLAKE_P RPLU E0
[12:17:35] [PASSED] DG2 G10 C0
[12:17:35] [PASSED] DG2 G11 B1
[12:17:35] [PASSED] DG2 G12 A1
[12:17:35] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[12:17:35] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[12:17:35] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[12:17:35] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[12:17:35] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[12:17:35] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[12:17:35] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[12:17:35] ==================== [PASSED] xe_wa_gt =====================
[12:17:35] ====================== [PASSED] xe_wa ======================
[12:17:35] ============================================================
[12:17:35] Testing complete. Ran 715 tests: passed: 697, skipped: 18
[12:17:35] Elapsed time: 40.789s total, 7.372s configuring, 32.748s building, 0.645s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[12:17:35] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[12:17:37] 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
[12:18:18] Starting KUnit Kernel (1/1)...
[12:18:18] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[12:18:18] ============ drm_test_pick_cmdline (2 subtests) ============
[12:18:18] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[12:18:18] =============== drm_test_pick_cmdline_named ===============
[12:18:18] [PASSED] NTSC
[12:18:18] [PASSED] NTSC-J
[12:18:18] [PASSED] PAL
[12:18:18] [PASSED] PAL-M
[12:18:18] =========== [PASSED] drm_test_pick_cmdline_named ===========
[12:18:18] ============== [PASSED] drm_test_pick_cmdline ==============
[12:18:18] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[12:18:18] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[12:18:18] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[12:18:18] =========== drm_validate_clone_mode (2 subtests) ===========
[12:18:18] ============== drm_test_check_in_clone_mode ===============
[12:18:18] [PASSED] in_clone_mode
[12:18:18] [PASSED] not_in_clone_mode
[12:18:18] ========== [PASSED] drm_test_check_in_clone_mode ===========
[12:18:18] =============== drm_test_check_valid_clones ===============
[12:18:18] [PASSED] not_in_clone_mode
[12:18:18] [PASSED] valid_clone
[12:18:18] [PASSED] invalid_clone
[12:18:18] =========== [PASSED] drm_test_check_valid_clones ===========
[12:18:18] ============= [PASSED] drm_validate_clone_mode =============
[12:18:18] ============= drm_validate_modeset (1 subtest) =============
[12:18:18] [PASSED] drm_test_check_connector_changed_modeset
[12:18:18] ============== [PASSED] drm_validate_modeset ===============
[12:18:18] ====== drm_test_bridge_get_current_state (2 subtests) ======
[12:18:18] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[12:18:18] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[12:18:18] ======== [PASSED] drm_test_bridge_get_current_state ========
[12:18:18] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[12:18:18] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[12:18:18] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[12:18:18] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[12:18:18] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[12:18:18] ============== drm_bridge_alloc (2 subtests) ===============
[12:18:18] [PASSED] drm_test_drm_bridge_alloc_basic
[12:18:18] [PASSED] drm_test_drm_bridge_alloc_get_put
[12:18:18] ================ [PASSED] drm_bridge_alloc =================
[12:18:18] ============= drm_cmdline_parser (40 subtests) =============
[12:18:18] [PASSED] drm_test_cmdline_force_d_only
[12:18:18] [PASSED] drm_test_cmdline_force_D_only_dvi
[12:18:18] [PASSED] drm_test_cmdline_force_D_only_hdmi
[12:18:18] [PASSED] drm_test_cmdline_force_D_only_not_digital
[12:18:18] [PASSED] drm_test_cmdline_force_e_only
[12:18:18] [PASSED] drm_test_cmdline_res
[12:18:18] [PASSED] drm_test_cmdline_res_vesa
[12:18:18] [PASSED] drm_test_cmdline_res_vesa_rblank
[12:18:18] [PASSED] drm_test_cmdline_res_rblank
[12:18:18] [PASSED] drm_test_cmdline_res_bpp
[12:18:18] [PASSED] drm_test_cmdline_res_refresh
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[12:18:18] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[12:18:18] [PASSED] drm_test_cmdline_res_margins_force_on
[12:18:18] [PASSED] drm_test_cmdline_res_vesa_margins
[12:18:18] [PASSED] drm_test_cmdline_name
[12:18:18] [PASSED] drm_test_cmdline_name_bpp
[12:18:18] [PASSED] drm_test_cmdline_name_option
[12:18:18] [PASSED] drm_test_cmdline_name_bpp_option
[12:18:18] [PASSED] drm_test_cmdline_rotate_0
[12:18:18] [PASSED] drm_test_cmdline_rotate_90
[12:18:18] [PASSED] drm_test_cmdline_rotate_180
[12:18:18] [PASSED] drm_test_cmdline_rotate_270
[12:18:18] [PASSED] drm_test_cmdline_hmirror
[12:18:18] [PASSED] drm_test_cmdline_vmirror
[12:18:18] [PASSED] drm_test_cmdline_margin_options
[12:18:18] [PASSED] drm_test_cmdline_multiple_options
[12:18:18] [PASSED] drm_test_cmdline_bpp_extra_and_option
[12:18:18] [PASSED] drm_test_cmdline_extra_and_option
[12:18:18] [PASSED] drm_test_cmdline_freestanding_options
[12:18:18] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[12:18:18] [PASSED] drm_test_cmdline_panel_orientation
[12:18:18] ================ drm_test_cmdline_invalid =================
[12:18:18] [PASSED] margin_only
[12:18:18] [PASSED] interlace_only
[12:18:18] [PASSED] res_missing_x
[12:18:18] [PASSED] res_missing_y
[12:18:18] [PASSED] res_bad_y
[12:18:18] [PASSED] res_missing_y_bpp
[12:18:18] [PASSED] res_bad_bpp
[12:18:18] [PASSED] res_bad_refresh
[12:18:18] [PASSED] res_bpp_refresh_force_on_off
[12:18:18] [PASSED] res_invalid_mode
[12:18:18] [PASSED] res_bpp_wrong_place_mode
[12:18:18] [PASSED] name_bpp_refresh
[12:18:18] [PASSED] name_refresh
[12:18:18] [PASSED] name_refresh_wrong_mode
[12:18:18] [PASSED] name_refresh_invalid_mode
[12:18:18] [PASSED] rotate_multiple
[12:18:18] [PASSED] rotate_invalid_val
[12:18:18] [PASSED] rotate_truncated
[12:18:18] [PASSED] invalid_option
[12:18:18] [PASSED] invalid_tv_option
[12:18:18] [PASSED] truncated_tv_option
[12:18:18] ============ [PASSED] drm_test_cmdline_invalid =============
[12:18:18] =============== drm_test_cmdline_tv_options ===============
[12:18:18] [PASSED] NTSC
[12:18:18] [PASSED] NTSC_443
[12:18:18] [PASSED] NTSC_J
[12:18:18] [PASSED] PAL
[12:18:18] [PASSED] PAL_M
[12:18:18] [PASSED] PAL_N
[12:18:18] [PASSED] SECAM
[12:18:18] [PASSED] MONO_525
[12:18:18] [PASSED] MONO_625
[12:18:18] =========== [PASSED] drm_test_cmdline_tv_options ===========
[12:18:18] =============== [PASSED] drm_cmdline_parser ================
[12:18:18] ========== drmm_connector_hdmi_init (20 subtests) ==========
[12:18:18] [PASSED] drm_test_connector_hdmi_init_valid
[12:18:18] [PASSED] drm_test_connector_hdmi_init_bpc_8
[12:18:18] [PASSED] drm_test_connector_hdmi_init_bpc_10
[12:18:18] [PASSED] drm_test_connector_hdmi_init_bpc_12
[12:18:18] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[12:18:18] [PASSED] drm_test_connector_hdmi_init_bpc_null
[12:18:18] [PASSED] drm_test_connector_hdmi_init_formats_empty
[12:18:18] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[12:18:18] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[12:18:18] [PASSED] supported_formats=0x9 yuv420_allowed=1
[12:18:18] [PASSED] supported_formats=0x9 yuv420_allowed=0
[12:18:18] [PASSED] supported_formats=0x5 yuv420_allowed=1
[12:18:18] [PASSED] supported_formats=0x5 yuv420_allowed=0
[12:18:18] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[12:18:18] [PASSED] drm_test_connector_hdmi_init_null_ddc
[12:18:18] [PASSED] drm_test_connector_hdmi_init_null_product
[12:18:18] [PASSED] drm_test_connector_hdmi_init_null_vendor
[12:18:18] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[12:18:18] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[12:18:18] [PASSED] drm_test_connector_hdmi_init_product_valid
[12:18:18] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[12:18:18] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[12:18:18] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[12:18:18] ========= drm_test_connector_hdmi_init_type_valid =========
[12:18:18] [PASSED] HDMI-A
[12:18:18] [PASSED] HDMI-B
[12:18:18] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[12:18:18] ======== drm_test_connector_hdmi_init_type_invalid ========
[12:18:18] [PASSED] Unknown
[12:18:18] [PASSED] VGA
[12:18:18] [PASSED] DVI-I
[12:18:18] [PASSED] DVI-D
[12:18:18] [PASSED] DVI-A
[12:18:18] [PASSED] Composite
[12:18:18] [PASSED] SVIDEO
[12:18:18] [PASSED] LVDS
[12:18:18] [PASSED] Component
[12:18:18] [PASSED] DIN
[12:18:18] [PASSED] DP
[12:18:18] [PASSED] TV
[12:18:18] [PASSED] eDP
[12:18:18] [PASSED] Virtual
[12:18:18] [PASSED] DSI
[12:18:18] [PASSED] DPI
[12:18:18] [PASSED] Writeback
[12:18:18] [PASSED] SPI
[12:18:18] [PASSED] USB
[12:18:18] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[12:18:18] ============ [PASSED] drmm_connector_hdmi_init =============
[12:18:18] ============= drmm_connector_init (3 subtests) =============
[12:18:18] [PASSED] drm_test_drmm_connector_init
[12:18:18] [PASSED] drm_test_drmm_connector_init_null_ddc
[12:18:18] ========= drm_test_drmm_connector_init_type_valid =========
[12:18:18] [PASSED] Unknown
[12:18:18] [PASSED] VGA
[12:18:18] [PASSED] DVI-I
[12:18:18] [PASSED] DVI-D
[12:18:18] [PASSED] DVI-A
[12:18:18] [PASSED] Composite
[12:18:18] [PASSED] SVIDEO
[12:18:18] [PASSED] LVDS
[12:18:18] [PASSED] Component
[12:18:18] [PASSED] DIN
[12:18:18] [PASSED] DP
[12:18:18] [PASSED] HDMI-A
[12:18:18] [PASSED] HDMI-B
[12:18:18] [PASSED] TV
[12:18:18] [PASSED] eDP
[12:18:18] [PASSED] Virtual
[12:18:18] [PASSED] DSI
[12:18:18] [PASSED] DPI
[12:18:18] [PASSED] Writeback
[12:18:18] [PASSED] SPI
[12:18:18] [PASSED] USB
[12:18:18] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[12:18:18] =============== [PASSED] drmm_connector_init ===============
[12:18:18] ========= drm_connector_dynamic_init (6 subtests) ==========
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_init
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_init_properties
[12:18:18] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[12:18:18] [PASSED] Unknown
[12:18:18] [PASSED] VGA
[12:18:18] [PASSED] DVI-I
[12:18:18] [PASSED] DVI-D
[12:18:18] [PASSED] DVI-A
[12:18:18] [PASSED] Composite
[12:18:18] [PASSED] SVIDEO
[12:18:18] [PASSED] LVDS
[12:18:18] [PASSED] Component
[12:18:18] [PASSED] DIN
[12:18:18] [PASSED] DP
[12:18:18] [PASSED] HDMI-A
[12:18:18] [PASSED] HDMI-B
[12:18:18] [PASSED] TV
[12:18:18] [PASSED] eDP
[12:18:18] [PASSED] Virtual
[12:18:18] [PASSED] DSI
[12:18:18] [PASSED] DPI
[12:18:18] [PASSED] Writeback
[12:18:18] [PASSED] SPI
[12:18:18] [PASSED] USB
[12:18:18] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[12:18:18] ======== drm_test_drm_connector_dynamic_init_name =========
[12:18:18] [PASSED] Unknown
[12:18:18] [PASSED] VGA
[12:18:18] [PASSED] DVI-I
[12:18:18] [PASSED] DVI-D
[12:18:18] [PASSED] DVI-A
[12:18:18] [PASSED] Composite
[12:18:18] [PASSED] SVIDEO
[12:18:18] [PASSED] LVDS
[12:18:18] [PASSED] Component
[12:18:18] [PASSED] DIN
[12:18:18] [PASSED] DP
[12:18:18] [PASSED] HDMI-A
[12:18:18] [PASSED] HDMI-B
[12:18:18] [PASSED] TV
[12:18:18] [PASSED] eDP
[12:18:18] [PASSED] Virtual
[12:18:18] [PASSED] DSI
[12:18:18] [PASSED] DPI
[12:18:18] [PASSED] Writeback
[12:18:18] [PASSED] SPI
[12:18:18] [PASSED] USB
[12:18:18] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[12:18:18] =========== [PASSED] drm_connector_dynamic_init ============
[12:18:18] ==== drm_connector_dynamic_register_early (4 subtests) =====
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[12:18:18] ====== [PASSED] drm_connector_dynamic_register_early =======
[12:18:18] ======= drm_connector_dynamic_register (7 subtests) ========
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[12:18:18] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[12:18:18] ========= [PASSED] drm_connector_dynamic_register ==========
[12:18:18] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[12:18:18] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[12:18:18] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[12:18:18] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[12:18:18] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[12:18:18] ========== drm_test_get_tv_mode_from_name_valid ===========
[12:18:18] [PASSED] NTSC
[12:18:18] [PASSED] NTSC-443
[12:18:18] [PASSED] NTSC-J
[12:18:18] [PASSED] PAL
[12:18:18] [PASSED] PAL-M
[12:18:18] [PASSED] PAL-N
[12:18:18] [PASSED] SECAM
[12:18:18] [PASSED] Mono
[12:18:18] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[12:18:18] [PASSED] drm_test_get_tv_mode_from_name_truncated
[12:18:18] ============ [PASSED] drm_get_tv_mode_from_name ============
[12:18:18] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[12:18:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[12:18:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[12:18:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[12:18:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[12:18:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[12:18:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[12:18:18] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[12:18:18] [PASSED] VIC 96
[12:18:18] [PASSED] VIC 97
[12:18:18] [PASSED] VIC 101
[12:18:18] [PASSED] VIC 102
[12:18:18] [PASSED] VIC 106
[12:18:18] [PASSED] VIC 107
[12:18:18] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[12:18:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[12:18:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[12:18:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[12:18:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[12:18:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[12:18:18] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[12:18:18] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[12:18:18] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[12:18:18] [PASSED] Automatic
[12:18:18] [PASSED] Full
[12:18:18] [PASSED] Limited 16:235
[12:18:18] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[12:18:18] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[12:18:18] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[12:18:18] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[12:18:18] === drm_test_drm_hdmi_connector_get_output_format_name ====
[12:18:18] [PASSED] RGB
[12:18:18] [PASSED] YUV 4:2:0
[12:18:18] [PASSED] YUV 4:2:2
[12:18:18] [PASSED] YUV 4:4:4
[12:18:18] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[12:18:18] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[12:18:18] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[12:18:18] ============= drm_damage_helper (21 subtests) ==============
[12:18:18] [PASSED] drm_test_damage_iter_no_damage
[12:18:18] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[12:18:18] [PASSED] drm_test_damage_iter_no_damage_src_moved
[12:18:18] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[12:18:18] [PASSED] drm_test_damage_iter_no_damage_not_visible
[12:18:18] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[12:18:18] [PASSED] drm_test_damage_iter_no_damage_no_fb
[12:18:18] [PASSED] drm_test_damage_iter_simple_damage
[12:18:18] [PASSED] drm_test_damage_iter_single_damage
[12:18:18] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[12:18:18] [PASSED] drm_test_damage_iter_single_damage_outside_src
[12:18:18] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[12:18:18] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[12:18:18] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[12:18:18] [PASSED] drm_test_damage_iter_single_damage_src_moved
[12:18:18] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[12:18:18] [PASSED] drm_test_damage_iter_damage
[12:18:18] [PASSED] drm_test_damage_iter_damage_one_intersect
[12:18:18] [PASSED] drm_test_damage_iter_damage_one_outside
[12:18:18] [PASSED] drm_test_damage_iter_damage_src_moved
[12:18:18] [PASSED] drm_test_damage_iter_damage_not_visible
[12:18:18] ================ [PASSED] drm_damage_helper ================
[12:18:18] ============== drm_dp_mst_helper (3 subtests) ==============
[12:18:18] ============== drm_test_dp_mst_calc_pbn_mode ==============
[12:18:18] [PASSED] Clock 154000 BPP 30 DSC disabled
[12:18:18] [PASSED] Clock 234000 BPP 30 DSC disabled
[12:18:18] [PASSED] Clock 297000 BPP 24 DSC disabled
[12:18:18] [PASSED] Clock 332880 BPP 24 DSC enabled
[12:18:18] [PASSED] Clock 324540 BPP 24 DSC enabled
[12:18:18] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[12:18:18] ============== drm_test_dp_mst_calc_pbn_div ===============
[12:18:18] [PASSED] Link rate 2000000 lane count 4
[12:18:18] [PASSED] Link rate 2000000 lane count 2
[12:18:18] [PASSED] Link rate 2000000 lane count 1
[12:18:18] [PASSED] Link rate 1350000 lane count 4
[12:18:18] [PASSED] Link rate 1350000 lane count 2
[12:18:18] [PASSED] Link rate 1350000 lane count 1
[12:18:18] [PASSED] Link rate 1000000 lane count 4
[12:18:18] [PASSED] Link rate 1000000 lane count 2
[12:18:18] [PASSED] Link rate 1000000 lane count 1
[12:18:18] [PASSED] Link rate 810000 lane count 4
[12:18:18] [PASSED] Link rate 810000 lane count 2
[12:18:18] [PASSED] Link rate 810000 lane count 1
[12:18:18] [PASSED] Link rate 540000 lane count 4
[12:18:18] [PASSED] Link rate 540000 lane count 2
[12:18:18] [PASSED] Link rate 540000 lane count 1
[12:18:18] [PASSED] Link rate 270000 lane count 4
[12:18:18] [PASSED] Link rate 270000 lane count 2
[12:18:18] [PASSED] Link rate 270000 lane count 1
[12:18:18] [PASSED] Link rate 162000 lane count 4
[12:18:18] [PASSED] Link rate 162000 lane count 2
[12:18:18] [PASSED] Link rate 162000 lane count 1
[12:18:18] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[12:18:18] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[12:18:18] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[12:18:18] [PASSED] DP_POWER_UP_PHY with port number
[12:18:18] [PASSED] DP_POWER_DOWN_PHY with port number
[12:18:18] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[12:18:18] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[12:18:18] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[12:18:18] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[12:18:18] [PASSED] DP_QUERY_PAYLOAD with port number
[12:18:18] [PASSED] DP_QUERY_PAYLOAD with VCPI
[12:18:18] [PASSED] DP_REMOTE_DPCD_READ with port number
[12:18:18] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[12:18:18] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[12:18:18] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[12:18:18] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[12:18:18] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[12:18:18] [PASSED] DP_REMOTE_I2C_READ with port number
[12:18:18] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[12:18:18] [PASSED] DP_REMOTE_I2C_READ with transactions array
[12:18:18] [PASSED] DP_REMOTE_I2C_WRITE with port number
[12:18:18] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[12:18:18] [PASSED] DP_REMOTE_I2C_WRITE with data array
[12:18:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[12:18:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[12:18:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[12:18:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[12:18:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[12:18:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[12:18:18] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[12:18:18] ================ [PASSED] drm_dp_mst_helper ================
[12:18:18] ================== drm_exec (7 subtests) ===================
[12:18:18] [PASSED] sanitycheck
[12:18:18] [PASSED] test_lock
[12:18:18] [PASSED] test_lock_unlock
[12:18:18] [PASSED] test_duplicates
[12:18:18] [PASSED] test_prepare
[12:18:18] [PASSED] test_prepare_array
[12:18:18] [PASSED] test_multiple_loops
[12:18:18] ==================== [PASSED] drm_exec =====================
[12:18:18] =========== drm_format_helper_test (17 subtests) ===========
[12:18:18] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[12:18:18] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[12:18:18] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[12:18:18] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[12:18:18] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[12:18:18] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[12:18:18] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[12:18:18] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[12:18:18] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[12:18:18] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[12:18:18] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[12:18:18] ============== drm_test_fb_xrgb8888_to_mono ===============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[12:18:18] ==================== drm_test_fb_swab =====================
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ================ [PASSED] drm_test_fb_swab =================
[12:18:18] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[12:18:18] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[12:18:18] [PASSED] single_pixel_source_buffer
[12:18:18] [PASSED] single_pixel_clip_rectangle
[12:18:18] [PASSED] well_known_colors
[12:18:18] [PASSED] destination_pitch
[12:18:18] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[12:18:18] ================= drm_test_fb_clip_offset =================
[12:18:18] [PASSED] pass through
[12:18:18] [PASSED] horizontal offset
[12:18:18] [PASSED] vertical offset
[12:18:18] [PASSED] horizontal and vertical offset
[12:18:18] [PASSED] horizontal offset (custom pitch)
[12:18:18] [PASSED] vertical offset (custom pitch)
[12:18:18] [PASSED] horizontal and vertical offset (custom pitch)
[12:18:18] ============= [PASSED] drm_test_fb_clip_offset =============
[12:18:18] =================== drm_test_fb_memcpy ====================
[12:18:18] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[12:18:18] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[12:18:18] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[12:18:18] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[12:18:18] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[12:18:18] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[12:18:18] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[12:18:18] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[12:18:18] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[12:18:18] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[12:18:18] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[12:18:18] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[12:18:18] =============== [PASSED] drm_test_fb_memcpy ================
[12:18:18] ============= [PASSED] drm_format_helper_test ==============
[12:18:18] ================= drm_format (18 subtests) =================
[12:18:18] [PASSED] drm_test_format_block_width_invalid
[12:18:18] [PASSED] drm_test_format_block_width_one_plane
[12:18:18] [PASSED] drm_test_format_block_width_two_plane
[12:18:18] [PASSED] drm_test_format_block_width_three_plane
[12:18:18] [PASSED] drm_test_format_block_width_tiled
[12:18:18] [PASSED] drm_test_format_block_height_invalid
[12:18:18] [PASSED] drm_test_format_block_height_one_plane
[12:18:18] [PASSED] drm_test_format_block_height_two_plane
[12:18:18] [PASSED] drm_test_format_block_height_three_plane
[12:18:18] [PASSED] drm_test_format_block_height_tiled
[12:18:18] [PASSED] drm_test_format_min_pitch_invalid
[12:18:18] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[12:18:18] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[12:18:18] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[12:18:18] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[12:18:18] [PASSED] drm_test_format_min_pitch_two_plane
[12:18:18] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[12:18:18] [PASSED] drm_test_format_min_pitch_tiled
[12:18:18] =================== [PASSED] drm_format ====================
[12:18:18] ============== drm_framebuffer (10 subtests) ===============
[12:18:18] ========== drm_test_framebuffer_check_src_coords ==========
[12:18:18] [PASSED] Success: source fits into fb
[12:18:18] [PASSED] Fail: overflowing fb with x-axis coordinate
[12:18:18] [PASSED] Fail: overflowing fb with y-axis coordinate
[12:18:18] [PASSED] Fail: overflowing fb with source width
[12:18:18] [PASSED] Fail: overflowing fb with source height
[12:18:18] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[12:18:18] [PASSED] drm_test_framebuffer_cleanup
[12:18:18] =============== drm_test_framebuffer_create ===============
[12:18:18] [PASSED] ABGR8888 normal sizes
[12:18:18] [PASSED] ABGR8888 max sizes
[12:18:18] [PASSED] ABGR8888 pitch greater than min required
[12:18:18] [PASSED] ABGR8888 pitch less than min required
[12:18:18] [PASSED] ABGR8888 Invalid width
[12:18:18] [PASSED] ABGR8888 Invalid buffer handle
[12:18:18] [PASSED] No pixel format
[12:18:18] [PASSED] ABGR8888 Width 0
[12:18:18] [PASSED] ABGR8888 Height 0
[12:18:18] [PASSED] ABGR8888 Out of bound height * pitch combination
[12:18:18] [PASSED] ABGR8888 Large buffer offset
[12:18:18] [PASSED] ABGR8888 Buffer offset for inexistent plane
[12:18:18] [PASSED] ABGR8888 Invalid flag
[12:18:18] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[12:18:18] [PASSED] ABGR8888 Valid buffer modifier
[12:18:18] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[12:18:18] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[12:18:18] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[12:18:18] [PASSED] NV12 Normal sizes
[12:18:18] [PASSED] NV12 Max sizes
[12:18:18] [PASSED] NV12 Invalid pitch
[12:18:18] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[12:18:18] [PASSED] NV12 different modifier per-plane
[12:18:18] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[12:18:18] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[12:18:18] [PASSED] NV12 Modifier for inexistent plane
[12:18:18] [PASSED] NV12 Handle for inexistent plane
[12:18:18] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[12:18:18] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[12:18:18] [PASSED] YVU420 Normal sizes
[12:18:18] [PASSED] YVU420 Max sizes
[12:18:18] [PASSED] YVU420 Invalid pitch
[12:18:18] [PASSED] YVU420 Different pitches
[12:18:18] [PASSED] YVU420 Different buffer offsets/pitches
[12:18:18] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[12:18:18] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[12:18:18] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[12:18:18] [PASSED] YVU420 Valid modifier
[12:18:18] [PASSED] YVU420 Different modifiers per plane
[12:18:18] [PASSED] YVU420 Modifier for inexistent plane
[12:18:18] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[12:18:18] [PASSED] X0L2 Normal sizes
[12:18:18] [PASSED] X0L2 Max sizes
[12:18:18] [PASSED] X0L2 Invalid pitch
[12:18:18] [PASSED] X0L2 Pitch greater than minimum required
[12:18:18] [PASSED] X0L2 Handle for inexistent plane
[12:18:18] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[12:18:18] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[12:18:18] [PASSED] X0L2 Valid modifier
[12:18:18] [PASSED] X0L2 Modifier for inexistent plane
[12:18:18] =========== [PASSED] drm_test_framebuffer_create ===========
[12:18:18] [PASSED] drm_test_framebuffer_free
[12:18:18] [PASSED] drm_test_framebuffer_init
[12:18:18] [PASSED] drm_test_framebuffer_init_bad_format
[12:18:18] [PASSED] drm_test_framebuffer_init_dev_mismatch
[12:18:18] [PASSED] drm_test_framebuffer_lookup
[12:18:18] [PASSED] drm_test_framebuffer_lookup_inexistent
[12:18:18] [PASSED] drm_test_framebuffer_modifiers_not_supported
[12:18:18] ================= [PASSED] drm_framebuffer =================
[12:18:18] ================ drm_gem_shmem (8 subtests) ================
[12:18:18] [PASSED] drm_gem_shmem_test_obj_create
[12:18:18] [PASSED] drm_gem_shmem_test_obj_create_private
[12:18:18] [PASSED] drm_gem_shmem_test_pin_pages
[12:18:18] [PASSED] drm_gem_shmem_test_vmap
[12:18:18] [PASSED] drm_gem_shmem_test_get_sg_table
[12:18:18] [PASSED] drm_gem_shmem_test_get_pages_sgt
[12:18:18] [PASSED] drm_gem_shmem_test_madvise
[12:18:18] [PASSED] drm_gem_shmem_test_purge
[12:18:18] ================== [PASSED] drm_gem_shmem ==================
[12:18:18] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[12:18:18] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[12:18:18] [PASSED] Automatic
[12:18:18] [PASSED] Full
[12:18:18] [PASSED] Limited 16:235
[12:18:18] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[12:18:18] [PASSED] drm_test_check_disable_connector
[12:18:18] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[12:18:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[12:18:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[12:18:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[12:18:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[12:18:18] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[12:18:18] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[12:18:18] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[12:18:18] [PASSED] drm_test_check_output_bpc_dvi
[12:18:18] [PASSED] drm_test_check_output_bpc_format_vic_1
[12:18:18] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[12:18:18] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[12:18:18] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[12:18:18] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[12:18:18] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[12:18:18] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[12:18:18] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[12:18:18] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[12:18:18] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[12:18:18] [PASSED] drm_test_check_broadcast_rgb_value
[12:18:18] [PASSED] drm_test_check_bpc_8_value
[12:18:18] [PASSED] drm_test_check_bpc_10_value
[12:18:18] [PASSED] drm_test_check_bpc_12_value
[12:18:18] [PASSED] drm_test_check_format_value
[12:18:18] [PASSED] drm_test_check_tmds_char_value
[12:18:18] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[12:18:18] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[12:18:18] [PASSED] drm_test_check_mode_valid
[12:18:18] [PASSED] drm_test_check_mode_valid_reject
[12:18:18] [PASSED] drm_test_check_mode_valid_reject_rate
[12:18:18] [PASSED] drm_test_check_mode_valid_reject_max_clock
[12:18:18] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[12:18:18] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[12:18:18] [PASSED] drm_test_check_infoframes
[12:18:18] [PASSED] drm_test_check_reject_avi_infoframe
[12:18:18] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[12:18:18] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[12:18:18] [PASSED] drm_test_check_reject_audio_infoframe
[12:18:18] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[12:18:18] ================= drm_managed (2 subtests) =================
[12:18:18] [PASSED] drm_test_managed_release_action
[12:18:18] [PASSED] drm_test_managed_run_action
[12:18:18] =================== [PASSED] drm_managed ===================
[12:18:18] =================== drm_mm (6 subtests) ====================
[12:18:18] [PASSED] drm_test_mm_init
[12:18:18] [PASSED] drm_test_mm_debug
[12:18:18] [PASSED] drm_test_mm_align32
[12:18:18] [PASSED] drm_test_mm_align64
[12:18:18] [PASSED] drm_test_mm_lowest
[12:18:18] [PASSED] drm_test_mm_highest
[12:18:18] ===================== [PASSED] drm_mm ======================
[12:18:18] ============= drm_modes_analog_tv (5 subtests) =============
[12:18:18] [PASSED] drm_test_modes_analog_tv_mono_576i
[12:18:18] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[12:18:18] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[12:18:18] [PASSED] drm_test_modes_analog_tv_pal_576i
[12:18:18] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[12:18:18] =============== [PASSED] drm_modes_analog_tv ===============
[12:18:18] ============== drm_plane_helper (2 subtests) ===============
[12:18:18] =============== drm_test_check_plane_state ================
[12:18:18] [PASSED] clipping_simple
[12:18:18] [PASSED] clipping_rotate_reflect
[12:18:18] [PASSED] positioning_simple
[12:18:18] [PASSED] upscaling
[12:18:18] [PASSED] downscaling
[12:18:18] [PASSED] rounding1
[12:18:18] [PASSED] rounding2
[12:18:18] [PASSED] rounding3
[12:18:18] [PASSED] rounding4
[12:18:18] =========== [PASSED] drm_test_check_plane_state ============
[12:18:18] =========== drm_test_check_invalid_plane_state ============
[12:18:18] [PASSED] positioning_invalid
[12:18:18] [PASSED] upscaling_invalid
[12:18:18] [PASSED] downscaling_invalid
[12:18:18] ======= [PASSED] drm_test_check_invalid_plane_state ========
[12:18:18] ================ [PASSED] drm_plane_helper =================
[12:18:18] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[12:18:18] ====== drm_test_connector_helper_tv_get_modes_check =======
[12:18:18] [PASSED] None
[12:18:18] [PASSED] PAL
[12:18:18] [PASSED] NTSC
[12:18:18] [PASSED] Both, NTSC Default
[12:18:18] [PASSED] Both, PAL Default
[12:18:18] [PASSED] Both, NTSC Default, with PAL on command-line
[12:18:18] [PASSED] Both, PAL Default, with NTSC on command-line
[12:18:18] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[12:18:18] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[12:18:18] ================== drm_rect (9 subtests) ===================
[12:18:18] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[12:18:18] [PASSED] drm_test_rect_clip_scaled_not_clipped
[12:18:18] [PASSED] drm_test_rect_clip_scaled_clipped
[12:18:18] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[12:18:18] ================= drm_test_rect_intersect =================
[12:18:18] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[12:18:18] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[12:18:18] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[12:18:18] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[12:18:18] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[12:18:18] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[12:18:18] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[12:18:18] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[12:18:18] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[12:18:18] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[12:18:18] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[12:18:18] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[12:18:18] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[12:18:18] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[12:18:18] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[12:18:18] ============= [PASSED] drm_test_rect_intersect =============
[12:18:18] ================ drm_test_rect_calc_hscale ================
[12:18:18] [PASSED] normal use
[12:18:18] [PASSED] out of max range
[12:18:18] [PASSED] out of min range
[12:18:18] [PASSED] zero dst
[12:18:18] [PASSED] negative src
[12:18:18] [PASSED] negative dst
[12:18:18] ============ [PASSED] drm_test_rect_calc_hscale ============
[12:18:18] ================ drm_test_rect_calc_vscale ================
[12:18:18] [PASSED] normal use
[12:18:18] [PASSED] out of max range
[12:18:18] [PASSED] out of min range
[12:18:18] [PASSED] zero dst
[12:18:18] [PASSED] negative src
[12:18:18] [PASSED] negative dst
[12:18:18] ============ [PASSED] drm_test_rect_calc_vscale ============
[12:18:18] ================== drm_test_rect_rotate ===================
[12:18:18] [PASSED] reflect-x
[12:18:18] [PASSED] reflect-y
[12:18:18] [PASSED] rotate-0
[12:18:18] [PASSED] rotate-90
[12:18:18] [PASSED] rotate-180
[12:18:18] [PASSED] rotate-270
[12:18:18] ============== [PASSED] drm_test_rect_rotate ===============
[12:18:18] ================ drm_test_rect_rotate_inv =================
[12:18:18] [PASSED] reflect-x
[12:18:18] [PASSED] reflect-y
[12:18:18] [PASSED] rotate-0
[12:18:18] [PASSED] rotate-90
[12:18:18] [PASSED] rotate-180
[12:18:18] [PASSED] rotate-270
[12:18:18] ============ [PASSED] drm_test_rect_rotate_inv =============
[12:18:18] ==================== [PASSED] drm_rect =====================
[12:18:18] ============ drm_sysfb_modeset_test (1 subtest) ============
[12:18:18] ============ drm_test_sysfb_build_fourcc_list =============
[12:18:18] [PASSED] no native formats
[12:18:18] [PASSED] XRGB8888 as native format
[12:18:18] [PASSED] remove duplicates
[12:18:18] [PASSED] convert alpha formats
[12:18:18] [PASSED] random formats
[12:18:18] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[12:18:18] ============= [PASSED] drm_sysfb_modeset_test ==============
[12:18:18] ================== drm_fixp (2 subtests) ===================
[12:18:18] [PASSED] drm_test_int2fixp
[12:18:18] [PASSED] drm_test_sm2fixp
[12:18:18] ==================== [PASSED] drm_fixp =====================
[12:18:18] ============================================================
[12:18:18] Testing complete. Ran 621 tests: passed: 621
[12:18:18] Elapsed time: 42.706s total, 1.734s configuring, 40.752s building, 0.195s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[12:18:18] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[12:18:21] 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
[12:18:37] Starting KUnit Kernel (1/1)...
[12:18:37] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[12:18:38] ================= ttm_device (5 subtests) ==================
[12:18:38] [PASSED] ttm_device_init_basic
[12:18:38] [PASSED] ttm_device_init_multiple
[12:18:38] [PASSED] ttm_device_fini_basic
[12:18:38] [PASSED] ttm_device_init_no_vma_man
[12:18:38] ================== ttm_device_init_pools ==================
[12:18:38] [PASSED] No DMA allocations, no DMA32 required
[12:18:38] [PASSED] DMA allocations, DMA32 required
[12:18:38] [PASSED] No DMA allocations, DMA32 required
[12:18:38] [PASSED] DMA allocations, no DMA32 required
[12:18:38] ============== [PASSED] ttm_device_init_pools ==============
[12:18:38] =================== [PASSED] ttm_device ====================
[12:18:38] ================== ttm_pool (8 subtests) ===================
[12:18:38] ================== ttm_pool_alloc_basic ===================
[12:18:38] [PASSED] One page
[12:18:38] [PASSED] More than one page
[12:18:38] [PASSED] Above the allocation limit
[12:18:38] [PASSED] One page, with coherent DMA mappings enabled
[12:18:38] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[12:18:38] ============== [PASSED] ttm_pool_alloc_basic ===============
[12:18:38] ============== ttm_pool_alloc_basic_dma_addr ==============
[12:18:38] [PASSED] One page
[12:18:38] [PASSED] More than one page
[12:18:38] [PASSED] Above the allocation limit
[12:18:38] [PASSED] One page, with coherent DMA mappings enabled
[12:18:38] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[12:18:38] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[12:18:38] [PASSED] ttm_pool_alloc_order_caching_match
[12:18:38] [PASSED] ttm_pool_alloc_caching_mismatch
[12:18:38] [PASSED] ttm_pool_alloc_order_mismatch
[12:18:38] [PASSED] ttm_pool_free_dma_alloc
[12:18:38] [PASSED] ttm_pool_free_no_dma_alloc
[12:18:38] [PASSED] ttm_pool_fini_basic
[12:18:38] ==================== [PASSED] ttm_pool =====================
[12:18:38] ================ ttm_resource (8 subtests) =================
[12:18:38] ================= ttm_resource_init_basic =================
[12:18:38] [PASSED] Init resource in TTM_PL_SYSTEM
[12:18:38] [PASSED] Init resource in TTM_PL_VRAM
[12:18:38] [PASSED] Init resource in a private placement
[12:18:38] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[12:18:38] ============= [PASSED] ttm_resource_init_basic =============
[12:18:38] [PASSED] ttm_resource_init_pinned
[12:18:38] [PASSED] ttm_resource_fini_basic
[12:18:38] [PASSED] ttm_resource_manager_init_basic
[12:18:38] [PASSED] ttm_resource_manager_usage_basic
[12:18:38] [PASSED] ttm_resource_manager_set_used_basic
[12:18:38] [PASSED] ttm_sys_man_alloc_basic
[12:18:38] [PASSED] ttm_sys_man_free_basic
[12:18:38] ================== [PASSED] ttm_resource ===================
[12:18:38] =================== ttm_tt (15 subtests) ===================
[12:18:38] ==================== ttm_tt_init_basic ====================
[12:18:38] [PASSED] Page-aligned size
[12:18:38] [PASSED] Extra pages requested
[12:18:38] ================ [PASSED] ttm_tt_init_basic ================
[12:18:38] [PASSED] ttm_tt_init_misaligned
[12:18:38] [PASSED] ttm_tt_fini_basic
[12:18:38] [PASSED] ttm_tt_fini_sg
[12:18:38] [PASSED] ttm_tt_fini_shmem
[12:18:38] [PASSED] ttm_tt_create_basic
[12:18:38] [PASSED] ttm_tt_create_invalid_bo_type
[12:18:38] [PASSED] ttm_tt_create_ttm_exists
[12:18:38] [PASSED] ttm_tt_create_failed
[12:18:38] [PASSED] ttm_tt_destroy_basic
[12:18:38] [PASSED] ttm_tt_populate_null_ttm
[12:18:38] [PASSED] ttm_tt_populate_populated_ttm
[12:18:38] [PASSED] ttm_tt_unpopulate_basic
[12:18:38] [PASSED] ttm_tt_unpopulate_empty_ttm
[12:18:38] [PASSED] ttm_tt_swapin_basic
[12:18:38] ===================== [PASSED] ttm_tt ======================
[12:18:38] =================== ttm_bo (14 subtests) ===================
[12:18:38] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[12:18:38] [PASSED] Cannot be interrupted and sleeps
[12:18:38] [PASSED] Cannot be interrupted, locks straight away
[12:18:38] [PASSED] Can be interrupted, sleeps
[12:18:38] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[12:18:38] [PASSED] ttm_bo_reserve_locked_no_sleep
[12:18:38] [PASSED] ttm_bo_reserve_no_wait_ticket
[12:18:38] [PASSED] ttm_bo_reserve_double_resv
[12:18:38] [PASSED] ttm_bo_reserve_interrupted
[12:18:38] [PASSED] ttm_bo_reserve_deadlock
[12:18:38] [PASSED] ttm_bo_unreserve_basic
[12:18:38] [PASSED] ttm_bo_unreserve_pinned
[12:18:38] [PASSED] ttm_bo_unreserve_bulk
[12:18:38] [PASSED] ttm_bo_fini_basic
[12:18:38] [PASSED] ttm_bo_fini_shared_resv
[12:18:38] [PASSED] ttm_bo_pin_basic
[12:18:38] [PASSED] ttm_bo_pin_unpin_resource
[12:18:38] [PASSED] ttm_bo_multiple_pin_one_unpin
[12:18:38] ===================== [PASSED] ttm_bo ======================
[12:18:38] ============== ttm_bo_validate (22 subtests) ===============
[12:18:38] ============== ttm_bo_init_reserved_sys_man ===============
[12:18:38] [PASSED] Buffer object for userspace
[12:18:38] [PASSED] Kernel buffer object
[12:18:38] [PASSED] Shared buffer object
[12:18:38] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[12:18:38] ============== ttm_bo_init_reserved_mock_man ==============
[12:18:38] [PASSED] Buffer object for userspace
[12:18:38] [PASSED] Kernel buffer object
[12:18:38] [PASSED] Shared buffer object
[12:18:38] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[12:18:38] [PASSED] ttm_bo_init_reserved_resv
[12:18:38] ================== ttm_bo_validate_basic ==================
[12:18:38] [PASSED] Buffer object for userspace
[12:18:38] [PASSED] Kernel buffer object
[12:18:38] [PASSED] Shared buffer object
[12:18:38] ============== [PASSED] ttm_bo_validate_basic ==============
[12:18:38] [PASSED] ttm_bo_validate_invalid_placement
[12:18:38] ============= ttm_bo_validate_same_placement ==============
[12:18:38] [PASSED] System manager
[12:18:38] [PASSED] VRAM manager
[12:18:38] ========= [PASSED] ttm_bo_validate_same_placement ==========
[12:18:38] [PASSED] ttm_bo_validate_failed_alloc
[12:18:38] [PASSED] ttm_bo_validate_pinned
[12:18:38] [PASSED] ttm_bo_validate_busy_placement
[12:18:38] ================ ttm_bo_validate_multihop =================
[12:18:38] [PASSED] Buffer object for userspace
[12:18:38] [PASSED] Kernel buffer object
[12:18:38] [PASSED] Shared buffer object
[12:18:38] ============ [PASSED] ttm_bo_validate_multihop =============
[12:18:38] ========== ttm_bo_validate_no_placement_signaled ==========
[12:18:38] [PASSED] Buffer object in system domain, no page vector
[12:18:38] [PASSED] Buffer object in system domain with an existing page vector
[12:18:38] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[12:18:38] ======== ttm_bo_validate_no_placement_not_signaled ========
[12:18:38] [PASSED] Buffer object for userspace
[12:18:38] [PASSED] Kernel buffer object
[12:18:38] [PASSED] Shared buffer object
[12:18:38] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[12:18:38] [PASSED] ttm_bo_validate_move_fence_signaled
[12:18:38] ========= ttm_bo_validate_move_fence_not_signaled =========
[12:18:38] [PASSED] Waits for GPU
[12:18:38] [PASSED] Tries to lock straight away
[12:18:38] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[12:18:38] [PASSED] ttm_bo_validate_swapout
[12:18:38] [PASSED] ttm_bo_validate_happy_evict
[12:18:38] [PASSED] ttm_bo_validate_all_pinned_evict
[12:18:38] [PASSED] ttm_bo_validate_allowed_only_evict
[12:18:38] [PASSED] ttm_bo_validate_deleted_evict
[12:18:38] [PASSED] ttm_bo_validate_busy_domain_evict
[12:18:38] [PASSED] ttm_bo_validate_evict_gutting
[12:18:38] [PASSED] ttm_bo_validate_recrusive_evict
[12:18:38] ================= [PASSED] ttm_bo_validate =================
[12:18:38] ============================================================
[12:18:38] Testing complete. Ran 102 tests: passed: 102
[12:18:38] Elapsed time: 19.362s total, 2.728s configuring, 16.365s building, 0.227s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 8+ messages in thread* ✓ Xe.CI.BAT: success for drm/xe/tests: Add drm_exec locking benchmark kunit test
2026-06-05 11:26 [RFC PATCH 0/3] Use a dma_resv wound-wait transaction API for drm_exec Thomas Hellström
` (4 preceding siblings ...)
2026-06-05 12:18 ` ✓ CI.KUnit: success " Patchwork
@ 2026-06-05 13:13 ` Patchwork
2026-06-05 23:49 ` ✓ Xe.CI.FULL: " Patchwork
6 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2026-06-05 13:13 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 878 bytes --]
== Series Details ==
Series: drm/xe/tests: Add drm_exec locking benchmark kunit test
URL : https://patchwork.freedesktop.org/series/167950/
State : success
== Summary ==
CI Bug Log - changes from xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c_BAT -> xe-pw-167950v1_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (13 -> 13)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* Linux: xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c -> xe-pw-167950v1
IGT_8949: 8949
xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c: 6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c
xe-pw-167950v1: 167950v1
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/index.html
[-- Attachment #2: Type: text/html, Size: 1426 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread* ✓ Xe.CI.FULL: success for drm/xe/tests: Add drm_exec locking benchmark kunit test
2026-06-05 11:26 [RFC PATCH 0/3] Use a dma_resv wound-wait transaction API for drm_exec Thomas Hellström
` (5 preceding siblings ...)
2026-06-05 13:13 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-06-05 23:49 ` Patchwork
6 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2026-06-05 23:49 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 9803 bytes --]
== Series Details ==
Series: drm/xe/tests: Add drm_exec locking benchmark kunit test
URL : https://patchwork.freedesktop.org/series/167950/
State : success
== Summary ==
CI Bug Log - changes from xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c_FULL -> xe-pw-167950v1_FULL
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (2 -> 2)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in xe-pw-167950v1_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_cursor_legacy@flip-vs-cursor-legacy:
- shard-bmg: [PASS][1] -> [FAIL][2] ([Intel XE#7809])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-3/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-4/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
* igt@kms_flip@flip-vs-expired-vblank@b-edp1:
- shard-lnl: [PASS][3] -> [FAIL][4] ([Intel XE#301])
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html
* igt@kms_hdr@static-toggle@pipe-a-hdmi-a-3-xrgb16161616f:
- shard-bmg: [PASS][5] -> [SKIP][6] ([Intel XE#7915]) +3 other tests skip
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-6/igt@kms_hdr@static-toggle@pipe-a-hdmi-a-3-xrgb16161616f.html
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-1/igt@kms_hdr@static-toggle@pipe-a-hdmi-a-3-xrgb16161616f.html
* igt@kms_vrr@flipline:
- shard-lnl: [PASS][7] -> [FAIL][8] ([Intel XE#4227] / [Intel XE#7397]) +1 other test fail
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-lnl-2/igt@kms_vrr@flipline.html
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-lnl-6/igt@kms_vrr@flipline.html
* igt@xe_exec_compute_mode@twice-bindexecqueue-userptr-invalidate-race:
- shard-bmg: NOTRUN -> [ABORT][9] ([Intel XE#8007])
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-1/igt@xe_exec_compute_mode@twice-bindexecqueue-userptr-invalidate-race.html
* igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-huge-nomemset:
- shard-bmg: [PASS][10] -> [FAIL][11] ([Intel XE#8058])
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-1/igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-huge-nomemset.html
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-7/igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-huge-nomemset.html
* igt@xe_pat@pt-caching-update-pat-and-pte:
- shard-bmg: [PASS][12] -> [ABORT][13] ([Intel XE#7893])
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-6/igt@xe_pat@pt-caching-update-pat-and-pte.html
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-7/igt@xe_pat@pt-caching-update-pat-and-pte.html
#### Possible fixes ####
* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-bmg: [INCOMPLETE][14] ([Intel XE#7084] / [Intel XE#8150]) -> [PASS][15] +1 other test pass
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-5/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-10/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
* igt@kms_flip@flip-vs-expired-vblank@a-edp1:
- shard-lnl: [FAIL][16] ([Intel XE#301]) -> [PASS][17]
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html
* igt@kms_flip@flip-vs-expired-vblank@c-edp1:
- shard-lnl: [FAIL][18] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][19]
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
* igt@kms_hdr@invalid-metadata-sizes@pipe-a-hdmi-a-3-xrgb16161616f:
- shard-bmg: [SKIP][20] ([Intel XE#7915]) -> [PASS][21] +1 other test pass
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-8/igt@kms_hdr@invalid-metadata-sizes@pipe-a-hdmi-a-3-xrgb16161616f.html
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-10/igt@kms_hdr@invalid-metadata-sizes@pipe-a-hdmi-a-3-xrgb16161616f.html
* igt@xe_exec_reset@long-spin-reuse-many-preempt-threads:
- shard-bmg: [FAIL][22] ([Intel XE#7850]) -> [PASS][23] +1 other test pass
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-8/igt@xe_exec_reset@long-spin-reuse-many-preempt-threads.html
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-1/igt@xe_exec_reset@long-spin-reuse-many-preempt-threads.html
* igt@xe_survivability@runtime-survivability:
- shard-bmg: [DMESG-WARN][24] ([Intel XE#6627] / [Intel XE#7419]) -> [PASS][25]
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-10/igt@xe_survivability@runtime-survivability.html
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-3/igt@xe_survivability@runtime-survivability.html
* igt@xe_wedged@wedged-mode-toggle:
- shard-bmg: [ABORT][26] ([Intel XE#8007]) -> [PASS][27]
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-6/igt@xe_wedged@wedged-mode-toggle.html
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-1/igt@xe_wedged@wedged-mode-toggle.html
#### Warnings ####
* igt@kms_flip@flip-vs-expired-vblank:
- shard-lnl: [FAIL][28] ([Intel XE#301] / [Intel XE#3149]) -> [FAIL][29] ([Intel XE#301])
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank.html
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-lnl-1/igt@kms_flip@flip-vs-expired-vblank.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-bmg: [SKIP][30] ([Intel XE#2426] / [Intel XE#5848]) -> [FAIL][31] ([Intel XE#1729] / [Intel XE#7424])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-7/igt@kms_tiled_display@basic-test-pattern.html
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-5/igt@kms_tiled_display@basic-test-pattern.html
* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-bmg: [SKIP][32] ([Intel XE#2509] / [Intel XE#7437]) -> [SKIP][33] ([Intel XE#2426] / [Intel XE#5848])
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c/shard-bmg-4/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
[Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
[Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
[Intel XE#4227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4227
[Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
[Intel XE#6627]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6627
[Intel XE#7084]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7084
[Intel XE#7397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7397
[Intel XE#7419]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7419
[Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424
[Intel XE#7437]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7437
[Intel XE#7809]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7809
[Intel XE#7850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7850
[Intel XE#7893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7893
[Intel XE#7915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7915
[Intel XE#8007]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8007
[Intel XE#8058]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8058
[Intel XE#8150]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8150
Build changes
-------------
* Linux: xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c -> xe-pw-167950v1
IGT_8949: 8949
xe-5209-6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c: 6be5b7e4d84efd8d8d3fbf91fcacbcb6a0df055c
xe-pw-167950v1: 167950v1
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-167950v1/index.html
[-- Attachment #2: Type: text/html, Size: 11337 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread