intel-xe.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree
@ 2025-08-28 10:56 Arunpravin Paneer Selvam
  2025-08-28 10:56 ` [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees Arunpravin Paneer Selvam
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Arunpravin Paneer Selvam @ 2025-08-28 10:56 UTC (permalink / raw)
  To: christian.koenig, matthew.auld, dri-devel, amd-gfx, intel-gfx,
	intel-xe
  Cc: alexander.deucher, Arunpravin Paneer Selvam

Replace the freelist (O(n)) used for free block management with a
red-black tree, providing more efficient O(log n) search, insert,
and delete operations. This improves scalability and performance
when managing large numbers of free blocks per order (e.g., hundreds
or thousands).

In the VK-CTS memory stress subtest, the buddy manager merges
fragmented memory and inserts freed blocks into the freelist. Since
freelist insertion is O(n), this becomes a bottleneck as fragmentation
increases. Benchmarking shows list_insert_sorted() consumes ~52.69% CPU
with the freelist, compared to just 0.03% with the RB tree
(rbtree_insert.isra.0), despite performing the same sorted insert.

This also improves performance in heavily fragmented workloads,
such as games or graphics tests that stress memory.

v3(Matthew):
  - Remove RB_EMPTY_NODE check in force_merge function.
  - Rename rb for loop macros to have less generic names and move to
    .c file.
  - Make the rb node rb and link field as union.

Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
---
 drivers/gpu/drm/drm_buddy.c | 177 +++++++++++++++++++++++++-----------
 include/drm/drm_buddy.h     |   9 +-
 2 files changed, 131 insertions(+), 55 deletions(-)

diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
index a94061f373de..01ae984340cc 100644
--- a/drivers/gpu/drm/drm_buddy.c
+++ b/drivers/gpu/drm/drm_buddy.c
@@ -14,6 +14,41 @@
 
 static struct kmem_cache *slab_blocks;
 
+/*
+ * for_each_rb_free_block() - iterate over an RB tree in order
+ * @pos:	the struct type * to use as a loop cursor
+ * @root:	pointer to struct rb_root to iterate
+ * @member:	name of the rb_node field within the struct
+ */
+#define for_each_rb_free_block(pos, root, member) \
+	for (pos = rb_entry_safe(rb_first(root), typeof(*pos), member); \
+	     pos; \
+	     pos = rb_entry_safe(rb_next(&(pos)->member), typeof(*pos), member))
+
+/*
+ * for_each_rb_free_block_reverse() - iterate over an RB tree in reverse order
+ * @pos:	the struct type * to use as a loop cursor
+ * @root:	pointer to struct rb_root to iterate
+ * @member:	name of the rb_node field within the struct
+ */
+#define for_each_rb_free_block_reverse(pos, root, member) \
+	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member); \
+	     pos; \
+	     pos = rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member))
+
+/**
+ * for_each_rb_free_block_reverse_safe() - safely iterate over an RB tree in reverse order
+ * @pos:	the struct type * to use as a loop cursor.
+ * @n:		another struct type * to use as temporary storage.
+ * @root:	pointer to struct rb_root to iterate.
+ * @member:	name of the rb_node field within the struct.
+ */
+#define for_each_rb_free_block_reverse_safe(pos, n, root, member) \
+	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member), \
+	     n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL; \
+	     pos; \
+	     pos = n, n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL)
+
 static struct drm_buddy_block *drm_block_alloc(struct drm_buddy *mm,
 					       struct drm_buddy_block *parent,
 					       unsigned int order,
@@ -31,6 +66,8 @@ static struct drm_buddy_block *drm_block_alloc(struct drm_buddy *mm,
 	block->header |= order;
 	block->parent = parent;
 
+	RB_CLEAR_NODE(&block->rb);
+
 	BUG_ON(block->header & DRM_BUDDY_HEADER_UNUSED);
 	return block;
 }
@@ -41,23 +78,53 @@ static void drm_block_free(struct drm_buddy *mm,
 	kmem_cache_free(slab_blocks, block);
 }
 
-static void list_insert_sorted(struct drm_buddy *mm,
-			       struct drm_buddy_block *block)
+static void rbtree_insert(struct drm_buddy *mm,
+			  struct drm_buddy_block *block)
 {
+	struct rb_root *root = &mm->free_tree[drm_buddy_block_order(block)];
+	struct rb_node **link = &root->rb_node;
+	struct rb_node *parent = NULL;
 	struct drm_buddy_block *node;
-	struct list_head *head;
+	u64 offset;
+
+	offset = drm_buddy_block_offset(block);
 
-	head = &mm->free_list[drm_buddy_block_order(block)];
-	if (list_empty(head)) {
-		list_add(&block->link, head);
-		return;
+	while (*link) {
+		parent = *link;
+		node = rb_entry(parent, struct drm_buddy_block, rb);
+
+		if (offset < drm_buddy_block_offset(node))
+			link = &parent->rb_left;
+		else
+			link = &parent->rb_right;
 	}
 
-	list_for_each_entry(node, head, link)
-		if (drm_buddy_block_offset(block) < drm_buddy_block_offset(node))
-			break;
+	rb_link_node(&block->rb, parent, link);
+	rb_insert_color(&block->rb, root);
+}
 
-	__list_add(&block->link, node->link.prev, &node->link);
+static void rbtree_remove(struct drm_buddy *mm,
+			  struct drm_buddy_block *block)
+{
+	struct rb_root *root;
+
+	root = &mm->free_tree[drm_buddy_block_order(block)];
+	rb_erase(&block->rb, root);
+
+	RB_CLEAR_NODE(&block->rb);
+}
+
+static inline struct drm_buddy_block *
+rbtree_last_entry(struct drm_buddy *mm, unsigned int order)
+{
+	struct rb_node *node = rb_last(&mm->free_tree[order]);
+
+	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
+}
+
+static bool rbtree_is_empty(struct drm_buddy *mm, unsigned int order)
+{
+	return RB_EMPTY_ROOT(&mm->free_tree[order]);
 }
 
 static void clear_reset(struct drm_buddy_block *block)
@@ -70,12 +137,13 @@ static void mark_cleared(struct drm_buddy_block *block)
 	block->header |= DRM_BUDDY_HEADER_CLEAR;
 }
 
-static void mark_allocated(struct drm_buddy_block *block)
+static void mark_allocated(struct drm_buddy *mm,
+			   struct drm_buddy_block *block)
 {
 	block->header &= ~DRM_BUDDY_HEADER_STATE;
 	block->header |= DRM_BUDDY_ALLOCATED;
 
-	list_del(&block->link);
+	rbtree_remove(mm, block);
 }
 
 static void mark_free(struct drm_buddy *mm,
@@ -84,15 +152,16 @@ static void mark_free(struct drm_buddy *mm,
 	block->header &= ~DRM_BUDDY_HEADER_STATE;
 	block->header |= DRM_BUDDY_FREE;
 
-	list_insert_sorted(mm, block);
+	rbtree_insert(mm, block);
 }
 
-static void mark_split(struct drm_buddy_block *block)
+static void mark_split(struct drm_buddy *mm,
+		       struct drm_buddy_block *block)
 {
 	block->header &= ~DRM_BUDDY_HEADER_STATE;
 	block->header |= DRM_BUDDY_SPLIT;
 
-	list_del(&block->link);
+	rbtree_remove(mm, block);
 }
 
 static inline bool overlaps(u64 s1, u64 e1, u64 s2, u64 e2)
@@ -148,7 +217,7 @@ static unsigned int __drm_buddy_free(struct drm_buddy *mm,
 				mark_cleared(parent);
 		}
 
-		list_del(&buddy->link);
+		rbtree_remove(mm, buddy);
 		if (force_merge && drm_buddy_block_is_clear(buddy))
 			mm->clear_avail -= drm_buddy_block_size(mm, buddy);
 
@@ -179,9 +248,11 @@ static int __force_merge(struct drm_buddy *mm,
 		return -EINVAL;
 
 	for (i = min_order - 1; i >= 0; i--) {
-		struct drm_buddy_block *block, *prev;
+		struct drm_buddy_block *block, *prev_block, *first_block;
 
-		list_for_each_entry_safe_reverse(block, prev, &mm->free_list[i], link) {
+		first_block = rb_entry(rb_first(&mm->free_tree[i]), struct drm_buddy_block, rb);
+
+		for_each_rb_free_block_reverse_safe(block, prev_block, &mm->free_tree[i], rb) {
 			struct drm_buddy_block *buddy;
 			u64 block_start, block_end;
 
@@ -206,10 +277,14 @@ static int __force_merge(struct drm_buddy *mm,
 			 * block in the next iteration as we would free the
 			 * buddy block as part of the free function.
 			 */
-			if (prev == buddy)
-				prev = list_prev_entry(prev, link);
+			if (prev_block && prev_block == buddy) {
+				if (prev_block != first_block)
+					prev_block = rb_entry(rb_prev(&prev_block->rb),
+							      struct drm_buddy_block,
+							      rb);
+			}
 
-			list_del(&block->link);
+			rbtree_remove(mm, block);
 			if (drm_buddy_block_is_clear(block))
 				mm->clear_avail -= drm_buddy_block_size(mm, block);
 
@@ -258,14 +333,14 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
 
 	BUG_ON(mm->max_order > DRM_BUDDY_MAX_ORDER);
 
-	mm->free_list = kmalloc_array(mm->max_order + 1,
-				      sizeof(struct list_head),
+	mm->free_tree = kmalloc_array(mm->max_order + 1,
+				      sizeof(struct rb_root),
 				      GFP_KERNEL);
-	if (!mm->free_list)
+	if (!mm->free_tree)
 		return -ENOMEM;
 
 	for (i = 0; i <= mm->max_order; ++i)
-		INIT_LIST_HEAD(&mm->free_list[i]);
+		mm->free_tree[i] = RB_ROOT;
 
 	mm->n_roots = hweight64(size);
 
@@ -273,7 +348,7 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
 				  sizeof(struct drm_buddy_block *),
 				  GFP_KERNEL);
 	if (!mm->roots)
-		goto out_free_list;
+		goto out_free_tree;
 
 	offset = 0;
 	i = 0;
@@ -312,8 +387,8 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
 	while (i--)
 		drm_block_free(mm, mm->roots[i]);
 	kfree(mm->roots);
-out_free_list:
-	kfree(mm->free_list);
+out_free_tree:
+	kfree(mm->free_tree);
 	return -ENOMEM;
 }
 EXPORT_SYMBOL(drm_buddy_init);
@@ -323,7 +398,7 @@ EXPORT_SYMBOL(drm_buddy_init);
  *
  * @mm: DRM buddy manager to free
  *
- * Cleanup memory manager resources and the freelist
+ * Cleanup memory manager resources and the freetree
  */
 void drm_buddy_fini(struct drm_buddy *mm)
 {
@@ -350,7 +425,7 @@ void drm_buddy_fini(struct drm_buddy *mm)
 	WARN_ON(mm->avail != mm->size);
 
 	kfree(mm->roots);
-	kfree(mm->free_list);
+	kfree(mm->free_tree);
 }
 EXPORT_SYMBOL(drm_buddy_fini);
 
@@ -383,7 +458,7 @@ static int split_block(struct drm_buddy *mm,
 		clear_reset(block);
 	}
 
-	mark_split(block);
+	mark_split(mm, block);
 
 	return 0;
 }
@@ -412,7 +487,7 @@ EXPORT_SYMBOL(drm_get_buddy);
  * @is_clear: blocks clear state
  *
  * Reset the clear state based on @is_clear value for each block
- * in the freelist.
+ * in the freetree.
  */
 void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
 {
@@ -433,7 +508,7 @@ void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
 	for (i = 0; i <= mm->max_order; ++i) {
 		struct drm_buddy_block *block;
 
-		list_for_each_entry_reverse(block, &mm->free_list[i], link) {
+		for_each_rb_free_block_reverse(block, &mm->free_tree[i], rb) {
 			if (is_clear != drm_buddy_block_is_clear(block)) {
 				if (is_clear) {
 					mark_cleared(block);
@@ -641,7 +716,7 @@ get_maxblock(struct drm_buddy *mm, unsigned int order,
 	for (i = order; i <= mm->max_order; ++i) {
 		struct drm_buddy_block *tmp_block;
 
-		list_for_each_entry_reverse(tmp_block, &mm->free_list[i], link) {
+		for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[i], rb) {
 			if (block_incompatible(tmp_block, flags))
 				continue;
 
@@ -667,7 +742,7 @@ get_maxblock(struct drm_buddy *mm, unsigned int order,
 }
 
 static struct drm_buddy_block *
-alloc_from_freelist(struct drm_buddy *mm,
+alloc_from_freetree(struct drm_buddy *mm,
 		    unsigned int order,
 		    unsigned long flags)
 {
@@ -684,7 +759,7 @@ alloc_from_freelist(struct drm_buddy *mm,
 		for (tmp = order; tmp <= mm->max_order; ++tmp) {
 			struct drm_buddy_block *tmp_block;
 
-			list_for_each_entry_reverse(tmp_block, &mm->free_list[tmp], link) {
+			for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[tmp], rb) {
 				if (block_incompatible(tmp_block, flags))
 					continue;
 
@@ -700,10 +775,8 @@ alloc_from_freelist(struct drm_buddy *mm,
 	if (!block) {
 		/* Fallback method */
 		for (tmp = order; tmp <= mm->max_order; ++tmp) {
-			if (!list_empty(&mm->free_list[tmp])) {
-				block = list_last_entry(&mm->free_list[tmp],
-							struct drm_buddy_block,
-							link);
+			if (!rbtree_is_empty(mm, tmp)) {
+				block = rbtree_last_entry(mm, tmp);
 				if (block)
 					break;
 			}
@@ -771,7 +844,7 @@ static int __alloc_range(struct drm_buddy *mm,
 
 		if (contains(start, end, block_start, block_end)) {
 			if (drm_buddy_block_is_free(block)) {
-				mark_allocated(block);
+				mark_allocated(mm, block);
 				total_allocated += drm_buddy_block_size(mm, block);
 				mm->avail -= drm_buddy_block_size(mm, block);
 				if (drm_buddy_block_is_clear(block))
@@ -849,7 +922,6 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
 {
 	u64 rhs_offset, lhs_offset, lhs_size, filled;
 	struct drm_buddy_block *block;
-	struct list_head *list;
 	LIST_HEAD(blocks_lhs);
 	unsigned long pages;
 	unsigned int order;
@@ -862,11 +934,10 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
 	if (order == 0)
 		return -ENOSPC;
 
-	list = &mm->free_list[order];
-	if (list_empty(list))
+	if (rbtree_is_empty(mm, order))
 		return -ENOSPC;
 
-	list_for_each_entry_reverse(block, list, link) {
+	for_each_rb_free_block_reverse(block, &mm->free_tree[order], rb) {
 		/* Allocate blocks traversing RHS */
 		rhs_offset = drm_buddy_block_offset(block);
 		err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
@@ -976,7 +1047,7 @@ int drm_buddy_block_trim(struct drm_buddy *mm,
 	list_add(&block->tmp_link, &dfs);
 	err =  __alloc_range(mm, &dfs, new_start, new_size, blocks, NULL);
 	if (err) {
-		mark_allocated(block);
+		mark_allocated(mm, block);
 		mm->avail -= drm_buddy_block_size(mm, block);
 		if (drm_buddy_block_is_clear(block))
 			mm->clear_avail -= drm_buddy_block_size(mm, block);
@@ -999,8 +1070,8 @@ __drm_buddy_alloc_blocks(struct drm_buddy *mm,
 		return  __drm_buddy_alloc_range_bias(mm, start, end,
 						     order, flags);
 	else
-		/* Allocate from freelist */
-		return alloc_from_freelist(mm, order, flags);
+		/* Allocate from freetree */
+		return alloc_from_freetree(mm, order, flags);
 }
 
 /**
@@ -1017,8 +1088,8 @@ __drm_buddy_alloc_blocks(struct drm_buddy *mm,
  * alloc_range_bias() called on range limitations, which traverses
  * the tree and returns the desired block.
  *
- * alloc_from_freelist() called when *no* range restrictions
- * are enforced, which picks the block from the freelist.
+ * alloc_from_freetree() called when *no* range restrictions
+ * are enforced, which picks the block from the freetree.
  *
  * Returns:
  * 0 on success, error code on failure.
@@ -1120,7 +1191,7 @@ int drm_buddy_alloc_blocks(struct drm_buddy *mm,
 			}
 		} while (1);
 
-		mark_allocated(block);
+		mark_allocated(mm, block);
 		mm->avail -= drm_buddy_block_size(mm, block);
 		if (drm_buddy_block_is_clear(block))
 			mm->clear_avail -= drm_buddy_block_size(mm, block);
@@ -1204,7 +1275,7 @@ void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
 		struct drm_buddy_block *block;
 		u64 count = 0, free;
 
-		list_for_each_entry(block, &mm->free_list[order], link) {
+		for_each_rb_free_block(block, &mm->free_tree[order], rb) {
 			BUG_ON(!drm_buddy_block_is_free(block));
 			count++;
 		}
diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h
index 513837632b7d..091823592034 100644
--- a/include/drm/drm_buddy.h
+++ b/include/drm/drm_buddy.h
@@ -10,6 +10,7 @@
 #include <linux/list.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include <linux/rbtree.h>
 
 #include <drm/drm_print.h>
 
@@ -53,7 +54,11 @@ struct drm_buddy_block {
 	 * a list, if so desired. As soon as the block is freed with
 	 * drm_buddy_free* ownership is given back to the mm.
 	 */
-	struct list_head link;
+	union {
+		struct rb_node rb;
+		struct list_head link;
+	};
+
 	struct list_head tmp_link;
 };
 
@@ -68,7 +73,7 @@ struct drm_buddy_block {
  */
 struct drm_buddy {
 	/* Maintain a free list for each order. */
-	struct list_head *free_list;
+	struct rb_root *free_tree;
 
 	/*
 	 * Maintain explicit binary tree(s) to track the allocation of the

base-commit: f4c75f975cf50fa2e1fd96c5aafe5aa62e55fbe4
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees
  2025-08-28 10:56 [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Arunpravin Paneer Selvam
@ 2025-08-28 10:56 ` Arunpravin Paneer Selvam
  2025-08-28 11:13   ` Jani Nikula
  2025-08-28 11:08 ` [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Jani Nikula
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 9+ messages in thread
From: Arunpravin Paneer Selvam @ 2025-08-28 10:56 UTC (permalink / raw)
  To: christian.koenig, matthew.auld, dri-devel, amd-gfx, intel-gfx,
	intel-xe
  Cc: alexander.deucher, Arunpravin Paneer Selvam

Maintain two separate RB trees per order - one for clear (zeroed) blocks
and another for dirty (uncleared) blocks. This separation improves
code clarity and makes it more obvious which tree is being searched
during allocation. It also improves scalability and efficiency when
searching for a specific type of block, avoiding unnecessary checks
and making the allocator more predictable under fragmentation.

The changes have been validated using the existing drm_buddy_test
KUnit test cases, along with selected graphics workloads,
to ensure correctness and avoid regressions.

v2: Missed adding the suggested-by tag. Added it in v2.

v3(Matthew):
  - Remove the double underscores from the internal functions.
  - Rename the internal functions to have less generic names.
  - Fix the error handling code.
  - Pass tree argument for the tree macro.
  - Use the existing dirty/free bit instead of new tree field.
  - Make free_trees[] instead of clear_tree and dirty_tree for
    more cleaner approach.

v4:
  - A bug was reported by Intel CI and it is fixed by
    Matthew Auld.
  - Replace the get_root function with
    &mm->free_trees[tree][order] (Matthew)
  - Remove the unnecessary rbtree_is_empty() check (Matthew)
  - Remove the unnecessary get_tree_for_flags() function.
  - Rename get_tree_for_block() name with get_block_tree() for more
    clarity.

Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
Suggested-by: Matthew Auld <matthew.auld@intel.com>
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4260
---
 drivers/gpu/drm/drm_buddy.c | 322 +++++++++++++++++++++---------------
 include/drm/drm_buddy.h     |   8 +-
 2 files changed, 192 insertions(+), 138 deletions(-)

diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
index 01ae984340cc..06e90020177f 100644
--- a/drivers/gpu/drm/drm_buddy.c
+++ b/drivers/gpu/drm/drm_buddy.c
@@ -14,6 +14,9 @@
 
 static struct kmem_cache *slab_blocks;
 
+#define for_each_free_tree(tree) \
+	for ((tree) = CLEAR_TREE; (tree) < MAX_FREE_TREES; (tree)++)
+
 /*
  * for_each_rb_free_block() - iterate over an RB tree in order
  * @pos:	the struct type * to use as a loop cursor
@@ -78,22 +81,60 @@ static void drm_block_free(struct drm_buddy *mm,
 	kmem_cache_free(slab_blocks, block);
 }
 
+static inline enum free_tree
+get_block_tree(struct drm_buddy_block *block)
+{
+	return drm_buddy_block_is_clear(block) ? CLEAR_TREE : DIRTY_TREE;
+}
+
+static inline struct drm_buddy_block *
+rbtree_get_free_block(struct rb_node *node)
+{
+	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
+}
+
+static inline struct drm_buddy_block *
+rbtree_prev_free_block(struct rb_node *node)
+{
+	return rbtree_get_free_block(rb_prev(node));
+}
+
+static inline struct drm_buddy_block *
+rbtree_first_free_block(struct rb_root *root)
+{
+	return rbtree_get_free_block(rb_first(root));
+}
+
+static inline struct drm_buddy_block *
+rbtree_last_free_block(struct rb_root *root)
+{
+	return rbtree_get_free_block(rb_last(root));
+}
+
+static inline bool rbtree_is_empty(struct rb_root *root)
+{
+	return RB_EMPTY_ROOT(root);
+}
+
 static void rbtree_insert(struct drm_buddy *mm,
-			  struct drm_buddy_block *block)
+			  struct drm_buddy_block *block,
+			  enum free_tree tree)
 {
-	struct rb_root *root = &mm->free_tree[drm_buddy_block_order(block)];
-	struct rb_node **link = &root->rb_node;
-	struct rb_node *parent = NULL;
+	struct rb_node **link, *parent = NULL;
 	struct drm_buddy_block *node;
-	u64 offset;
+	struct rb_root *root;
+	unsigned int order;
+
+	order = drm_buddy_block_order(block);
 
-	offset = drm_buddy_block_offset(block);
+	root = &mm->free_trees[tree][order];
+	link = &root->rb_node;
 
 	while (*link) {
 		parent = *link;
-		node = rb_entry(parent, struct drm_buddy_block, rb);
+		node = rbtree_get_free_block(parent);
 
-		if (offset < drm_buddy_block_offset(node))
+		if (drm_buddy_block_offset(block) < drm_buddy_block_offset(node))
 			link = &parent->rb_left;
 		else
 			link = &parent->rb_right;
@@ -106,27 +147,17 @@ static void rbtree_insert(struct drm_buddy *mm,
 static void rbtree_remove(struct drm_buddy *mm,
 			  struct drm_buddy_block *block)
 {
+	unsigned int order = drm_buddy_block_order(block);
 	struct rb_root *root;
+	enum free_tree tree;
 
-	root = &mm->free_tree[drm_buddy_block_order(block)];
-	rb_erase(&block->rb, root);
+	tree = get_block_tree(block);
+	root = &mm->free_trees[tree][order];
 
+	rb_erase(&block->rb, root);
 	RB_CLEAR_NODE(&block->rb);
 }
 
-static inline struct drm_buddy_block *
-rbtree_last_entry(struct drm_buddy *mm, unsigned int order)
-{
-	struct rb_node *node = rb_last(&mm->free_tree[order]);
-
-	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
-}
-
-static bool rbtree_is_empty(struct drm_buddy *mm, unsigned int order)
-{
-	return RB_EMPTY_ROOT(&mm->free_tree[order]);
-}
-
 static void clear_reset(struct drm_buddy_block *block)
 {
 	block->header &= ~DRM_BUDDY_HEADER_CLEAR;
@@ -149,10 +180,13 @@ static void mark_allocated(struct drm_buddy *mm,
 static void mark_free(struct drm_buddy *mm,
 		      struct drm_buddy_block *block)
 {
+	enum free_tree tree;
+
 	block->header &= ~DRM_BUDDY_HEADER_STATE;
 	block->header |= DRM_BUDDY_FREE;
 
-	rbtree_insert(mm, block);
+	tree = get_block_tree(block);
+	rbtree_insert(mm, block, tree);
 }
 
 static void mark_split(struct drm_buddy *mm,
@@ -238,6 +272,7 @@ static int __force_merge(struct drm_buddy *mm,
 			 u64 end,
 			 unsigned int min_order)
 {
+	enum free_tree tree;
 	unsigned int order;
 	int i;
 
@@ -247,50 +282,49 @@ static int __force_merge(struct drm_buddy *mm,
 	if (min_order > mm->max_order)
 		return -EINVAL;
 
-	for (i = min_order - 1; i >= 0; i--) {
-		struct drm_buddy_block *block, *prev_block, *first_block;
+	for_each_free_tree(tree) {
+		for (i = min_order - 1; i >= 0; i--) {
+			struct rb_root *root = &mm->free_trees[tree][i];
+			struct drm_buddy_block *block, *prev_block;
 
-		first_block = rb_entry(rb_first(&mm->free_tree[i]), struct drm_buddy_block, rb);
+			for_each_rb_free_block_reverse_safe(block, prev_block, root, rb) {
+				struct drm_buddy_block *buddy;
+				u64 block_start, block_end;
 
-		for_each_rb_free_block_reverse_safe(block, prev_block, &mm->free_tree[i], rb) {
-			struct drm_buddy_block *buddy;
-			u64 block_start, block_end;
-
-			if (!block->parent)
-				continue;
+				if (!block->parent)
+					continue;
 
-			block_start = drm_buddy_block_offset(block);
-			block_end = block_start + drm_buddy_block_size(mm, block) - 1;
+				block_start = drm_buddy_block_offset(block);
+				block_end = block_start + drm_buddy_block_size(mm, block) - 1;
 
-			if (!contains(start, end, block_start, block_end))
-				continue;
+				if (!contains(start, end, block_start, block_end))
+					continue;
 
-			buddy = __get_buddy(block);
-			if (!drm_buddy_block_is_free(buddy))
-				continue;
+				buddy = __get_buddy(block);
+				if (!drm_buddy_block_is_free(buddy))
+					continue;
 
-			WARN_ON(drm_buddy_block_is_clear(block) ==
-				drm_buddy_block_is_clear(buddy));
+				WARN_ON(drm_buddy_block_is_clear(block) ==
+					drm_buddy_block_is_clear(buddy));
 
-			/*
-			 * If the prev block is same as buddy, don't access the
-			 * block in the next iteration as we would free the
-			 * buddy block as part of the free function.
-			 */
-			if (prev_block && prev_block == buddy) {
-				if (prev_block != first_block)
-					prev_block = rb_entry(rb_prev(&prev_block->rb),
-							      struct drm_buddy_block,
-							      rb);
-			}
+				/*
+				 * If the prev block is same as buddy, don't access the
+				 * block in the next iteration as we would free the
+				 * buddy block as part of the free function.
+				 */
+				if (prev_block && prev_block == buddy) {
+					if (prev_block != rbtree_first_free_block(root))
+						prev_block = rbtree_prev_free_block(&prev_block->rb);
+				}
 
-			rbtree_remove(mm, block);
-			if (drm_buddy_block_is_clear(block))
-				mm->clear_avail -= drm_buddy_block_size(mm, block);
+				rbtree_remove(mm, block);
+				if (drm_buddy_block_is_clear(block))
+					mm->clear_avail -= drm_buddy_block_size(mm, block);
 
-			order = __drm_buddy_free(mm, block, true);
-			if (order >= min_order)
-				return 0;
+				order = __drm_buddy_free(mm, block, true);
+				if (order >= min_order)
+					return 0;
+			}
 		}
 	}
 
@@ -311,7 +345,7 @@ static int __force_merge(struct drm_buddy *mm,
  */
 int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
 {
-	unsigned int i;
+	unsigned int i, j;
 	u64 offset;
 
 	if (size < chunk_size)
@@ -333,14 +367,16 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
 
 	BUG_ON(mm->max_order > DRM_BUDDY_MAX_ORDER);
 
-	mm->free_tree = kmalloc_array(mm->max_order + 1,
-				      sizeof(struct rb_root),
-				      GFP_KERNEL);
-	if (!mm->free_tree)
-		return -ENOMEM;
+	for (i = 0; i < MAX_FREE_TREES; i++) {
+		mm->free_trees[i] = kmalloc_array(mm->max_order + 1,
+						  sizeof(struct rb_root),
+						  GFP_KERNEL);
+		if (!mm->free_trees[i])
+			goto out_free_tree;
 
-	for (i = 0; i <= mm->max_order; ++i)
-		mm->free_tree[i] = RB_ROOT;
+		for (j = 0; j <= mm->max_order; ++j)
+			mm->free_trees[i][j] = RB_ROOT;
+	}
 
 	mm->n_roots = hweight64(size);
 
@@ -388,7 +424,8 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
 		drm_block_free(mm, mm->roots[i]);
 	kfree(mm->roots);
 out_free_tree:
-	kfree(mm->free_tree);
+	while (i--)
+		kfree(mm->free_trees[i]);
 	return -ENOMEM;
 }
 EXPORT_SYMBOL(drm_buddy_init);
@@ -424,8 +461,9 @@ void drm_buddy_fini(struct drm_buddy *mm)
 
 	WARN_ON(mm->avail != mm->size);
 
+	for (i = 0; i < MAX_FREE_TREES; i++)
+		kfree(mm->free_trees[i]);
 	kfree(mm->roots);
-	kfree(mm->free_tree);
 }
 EXPORT_SYMBOL(drm_buddy_fini);
 
@@ -449,8 +487,7 @@ static int split_block(struct drm_buddy *mm,
 		return -ENOMEM;
 	}
 
-	mark_free(mm, block->left);
-	mark_free(mm, block->right);
+	mark_split(mm, block);
 
 	if (drm_buddy_block_is_clear(block)) {
 		mark_cleared(block->left);
@@ -458,7 +495,8 @@ static int split_block(struct drm_buddy *mm,
 		clear_reset(block);
 	}
 
-	mark_split(mm, block);
+	mark_free(mm, block->left);
+	mark_free(mm, block->right);
 
 	return 0;
 }
@@ -491,6 +529,7 @@ EXPORT_SYMBOL(drm_get_buddy);
  */
 void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
 {
+	enum free_tree src_tree, dst_tree;
 	u64 root_size, size, start;
 	unsigned int order;
 	int i;
@@ -505,19 +544,24 @@ void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
 		size -= root_size;
 	}
 
+	src_tree = is_clear ? DIRTY_TREE : CLEAR_TREE;
+	dst_tree = is_clear ? CLEAR_TREE : DIRTY_TREE;
+
 	for (i = 0; i <= mm->max_order; ++i) {
+		struct rb_root *root = &mm->free_trees[src_tree][i];
 		struct drm_buddy_block *block;
 
-		for_each_rb_free_block_reverse(block, &mm->free_tree[i], rb) {
-			if (is_clear != drm_buddy_block_is_clear(block)) {
-				if (is_clear) {
-					mark_cleared(block);
-					mm->clear_avail += drm_buddy_block_size(mm, block);
-				} else {
-					clear_reset(block);
-					mm->clear_avail -= drm_buddy_block_size(mm, block);
-				}
+		for_each_rb_free_block_reverse(block, root, rb) {
+			rbtree_remove(mm, block);
+			if (is_clear) {
+				mark_cleared(block);
+				mm->clear_avail += drm_buddy_block_size(mm, block);
+			} else {
+				clear_reset(block);
+				mm->clear_avail -= drm_buddy_block_size(mm, block);
 			}
+
+			rbtree_insert(mm, block, dst_tree);
 		}
 	}
 }
@@ -707,23 +751,17 @@ __drm_buddy_alloc_range_bias(struct drm_buddy *mm,
 }
 
 static struct drm_buddy_block *
-get_maxblock(struct drm_buddy *mm, unsigned int order,
-	     unsigned long flags)
+get_maxblock(struct drm_buddy *mm,
+	     unsigned int order,
+	     enum free_tree tree)
 {
 	struct drm_buddy_block *max_block = NULL, *block = NULL;
+	struct rb_root *root;
 	unsigned int i;
 
 	for (i = order; i <= mm->max_order; ++i) {
-		struct drm_buddy_block *tmp_block;
-
-		for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[i], rb) {
-			if (block_incompatible(tmp_block, flags))
-				continue;
-
-			block = tmp_block;
-			break;
-		}
-
+		root = &mm->free_trees[tree][i];
+		block = rbtree_last_free_block(root);
 		if (!block)
 			continue;
 
@@ -747,39 +785,37 @@ alloc_from_freetree(struct drm_buddy *mm,
 		    unsigned long flags)
 {
 	struct drm_buddy_block *block = NULL;
+	struct rb_root *root;
+	enum free_tree tree;
 	unsigned int tmp;
 	int err;
 
+	tree = (flags & DRM_BUDDY_CLEAR_ALLOCATION) ? CLEAR_TREE : DIRTY_TREE;
+
 	if (flags & DRM_BUDDY_TOPDOWN_ALLOCATION) {
-		block = get_maxblock(mm, order, flags);
+		block = get_maxblock(mm, order, tree);
 		if (block)
 			/* Store the obtained block order */
 			tmp = drm_buddy_block_order(block);
 	} else {
 		for (tmp = order; tmp <= mm->max_order; ++tmp) {
-			struct drm_buddy_block *tmp_block;
-
-			for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[tmp], rb) {
-				if (block_incompatible(tmp_block, flags))
-					continue;
-
-				block = tmp_block;
-				break;
-			}
-
+			/* Get RB tree root for this order and tree */
+			root = &mm->free_trees[tree][tmp];
+			block = rbtree_last_free_block(root);
 			if (block)
 				break;
 		}
 	}
 
 	if (!block) {
-		/* Fallback method */
+		/* Try allocating from the other tree */
+		tree = (tree == CLEAR_TREE) ? DIRTY_TREE : CLEAR_TREE;
+
 		for (tmp = order; tmp <= mm->max_order; ++tmp) {
-			if (!rbtree_is_empty(mm, tmp)) {
-				block = rbtree_last_entry(mm, tmp);
-				if (block)
-					break;
-			}
+			root = &mm->free_trees[tree][tmp];
+			block = rbtree_last_free_block(root);
+			if (block)
+				break;
 		}
 
 		if (!block)
@@ -923,6 +959,7 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
 	u64 rhs_offset, lhs_offset, lhs_size, filled;
 	struct drm_buddy_block *block;
 	LIST_HEAD(blocks_lhs);
+	enum free_tree tree;
 	unsigned long pages;
 	unsigned int order;
 	u64 modify_size;
@@ -934,34 +971,39 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
 	if (order == 0)
 		return -ENOSPC;
 
-	if (rbtree_is_empty(mm, order))
+	if (rbtree_is_empty(&mm->free_trees[CLEAR_TREE][order]) &&
+	    rbtree_is_empty(&mm->free_trees[DIRTY_TREE][order]))
 		return -ENOSPC;
 
-	for_each_rb_free_block_reverse(block, &mm->free_tree[order], rb) {
-		/* Allocate blocks traversing RHS */
-		rhs_offset = drm_buddy_block_offset(block);
-		err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
-					       &filled, blocks);
-		if (!err || err != -ENOSPC)
-			return err;
-
-		lhs_size = max((size - filled), min_block_size);
-		if (!IS_ALIGNED(lhs_size, min_block_size))
-			lhs_size = round_up(lhs_size, min_block_size);
-
-		/* Allocate blocks traversing LHS */
-		lhs_offset = drm_buddy_block_offset(block) - lhs_size;
-		err =  __drm_buddy_alloc_range(mm, lhs_offset, lhs_size,
-					       NULL, &blocks_lhs);
-		if (!err) {
-			list_splice(&blocks_lhs, blocks);
-			return 0;
-		} else if (err != -ENOSPC) {
+	for_each_free_tree(tree) {
+		struct rb_root *root = &mm->free_trees[tree][order];
+
+		for_each_rb_free_block_reverse(block, root, rb) {
+			/* Allocate blocks traversing RHS */
+			rhs_offset = drm_buddy_block_offset(block);
+			err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
+						       &filled, blocks);
+			if (!err || err != -ENOSPC)
+				return err;
+
+			lhs_size = max((size - filled), min_block_size);
+			if (!IS_ALIGNED(lhs_size, min_block_size))
+				lhs_size = round_up(lhs_size, min_block_size);
+
+			/* Allocate blocks traversing LHS */
+			lhs_offset = drm_buddy_block_offset(block) - lhs_size;
+			err =  __drm_buddy_alloc_range(mm, lhs_offset, lhs_size,
+						       NULL, &blocks_lhs);
+			if (!err) {
+				list_splice(&blocks_lhs, blocks);
+				return 0;
+			} else if (err != -ENOSPC) {
+				drm_buddy_free_list_internal(mm, blocks);
+				return err;
+			}
+			/* Free blocks for the next iteration */
 			drm_buddy_free_list_internal(mm, blocks);
-			return err;
 		}
-		/* Free blocks for the next iteration */
-		drm_buddy_free_list_internal(mm, blocks);
 	}
 
 	return -ENOSPC;
@@ -1266,6 +1308,7 @@ EXPORT_SYMBOL(drm_buddy_block_print);
  */
 void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
 {
+	enum free_tree tree;
 	int order;
 
 	drm_printf(p, "chunk_size: %lluKiB, total: %lluMiB, free: %lluMiB, clear_free: %lluMiB\n",
@@ -1273,11 +1316,16 @@ void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
 
 	for (order = mm->max_order; order >= 0; order--) {
 		struct drm_buddy_block *block;
+		struct rb_root *root;
 		u64 count = 0, free;
 
-		for_each_rb_free_block(block, &mm->free_tree[order], rb) {
-			BUG_ON(!drm_buddy_block_is_free(block));
-			count++;
+		for_each_free_tree(tree) {
+			root = &mm->free_trees[tree][order];
+
+			for_each_rb_free_block(block, root, rb) {
+				BUG_ON(!drm_buddy_block_is_free(block));
+				count++;
+			}
 		}
 
 		drm_printf(p, "order-%2d ", order);
diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h
index 091823592034..2fc1cc7b78bf 100644
--- a/include/drm/drm_buddy.h
+++ b/include/drm/drm_buddy.h
@@ -14,6 +14,12 @@
 
 #include <drm/drm_print.h>
 
+enum free_tree {
+	CLEAR_TREE = 0,
+	DIRTY_TREE,
+	MAX_FREE_TREES,
+};
+
 #define range_overflows(start, size, max) ({ \
 	typeof(start) start__ = (start); \
 	typeof(size) size__ = (size); \
@@ -73,7 +79,7 @@ struct drm_buddy_block {
  */
 struct drm_buddy {
 	/* Maintain a free list for each order. */
-	struct rb_root *free_tree;
+	struct rb_root *free_trees[MAX_FREE_TREES];
 
 	/*
 	 * Maintain explicit binary tree(s) to track the allocation of the
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree
  2025-08-28 10:56 [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Arunpravin Paneer Selvam
  2025-08-28 10:56 ` [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees Arunpravin Paneer Selvam
@ 2025-08-28 11:08 ` Jani Nikula
  2025-08-28 13:47 ` ✗ CI.checkpatch: warning for series starting with [v4,1/2] " Patchwork
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Jani Nikula @ 2025-08-28 11:08 UTC (permalink / raw)
  To: Arunpravin Paneer Selvam, christian.koenig, matthew.auld,
	dri-devel, amd-gfx, intel-gfx, intel-xe
  Cc: alexander.deucher, Arunpravin Paneer Selvam

On Thu, 28 Aug 2025, Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> wrote:
> Replace the freelist (O(n)) used for free block management with a
> red-black tree, providing more efficient O(log n) search, insert,
> and delete operations. This improves scalability and performance
> when managing large numbers of free blocks per order (e.g., hundreds
> or thousands).
>
> In the VK-CTS memory stress subtest, the buddy manager merges
> fragmented memory and inserts freed blocks into the freelist. Since
> freelist insertion is O(n), this becomes a bottleneck as fragmentation
> increases. Benchmarking shows list_insert_sorted() consumes ~52.69% CPU
> with the freelist, compared to just 0.03% with the RB tree
> (rbtree_insert.isra.0), despite performing the same sorted insert.
>
> This also improves performance in heavily fragmented workloads,
> such as games or graphics tests that stress memory.
>
> v3(Matthew):
>   - Remove RB_EMPTY_NODE check in force_merge function.
>   - Rename rb for loop macros to have less generic names and move to
>     .c file.
>   - Make the rb node rb and link field as union.
>
> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
> ---
>  drivers/gpu/drm/drm_buddy.c | 177 +++++++++++++++++++++++++-----------
>  include/drm/drm_buddy.h     |   9 +-
>  2 files changed, 131 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
> index a94061f373de..01ae984340cc 100644
> --- a/drivers/gpu/drm/drm_buddy.c
> +++ b/drivers/gpu/drm/drm_buddy.c
> @@ -14,6 +14,41 @@
>  
>  static struct kmem_cache *slab_blocks;
>  
> +/*

If you're making them kernel-doc comments, this should be "/**".

> + * for_each_rb_free_block() - iterate over an RB tree in order
> + * @pos:	the struct type * to use as a loop cursor
> + * @root:	pointer to struct rb_root to iterate
> + * @member:	name of the rb_node field within the struct
> + */
> +#define for_each_rb_free_block(pos, root, member) \
> +	for (pos = rb_entry_safe(rb_first(root), typeof(*pos), member); \
> +	     pos; \
> +	     pos = rb_entry_safe(rb_next(&(pos)->member), typeof(*pos), member))
> +
> +/*
> + * for_each_rb_free_block_reverse() - iterate over an RB tree in reverse order
> + * @pos:	the struct type * to use as a loop cursor
> + * @root:	pointer to struct rb_root to iterate
> + * @member:	name of the rb_node field within the struct
> + */
> +#define for_each_rb_free_block_reverse(pos, root, member) \
> +	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member); \
> +	     pos; \
> +	     pos = rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member))
> +
> +/**
> + * for_each_rb_free_block_reverse_safe() - safely iterate over an RB tree in reverse order
> + * @pos:	the struct type * to use as a loop cursor.
> + * @n:		another struct type * to use as temporary storage.
> + * @root:	pointer to struct rb_root to iterate.
> + * @member:	name of the rb_node field within the struct.
> + */
> +#define for_each_rb_free_block_reverse_safe(pos, n, root, member) \
> +	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member), \
> +	     n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL; \
> +	     pos; \
> +	     pos = n, n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL)
> +

The macro args need a bunch of parens around them to ensure correct
precedence.

But more importantly, why are these macros being added here instead of
rbtree.h? This just creates technical debt.

>  static struct drm_buddy_block *drm_block_alloc(struct drm_buddy *mm,
>  					       struct drm_buddy_block *parent,
>  					       unsigned int order,
> @@ -31,6 +66,8 @@ static struct drm_buddy_block *drm_block_alloc(struct drm_buddy *mm,
>  	block->header |= order;
>  	block->parent = parent;
>  
> +	RB_CLEAR_NODE(&block->rb);
> +
>  	BUG_ON(block->header & DRM_BUDDY_HEADER_UNUSED);
>  	return block;
>  }
> @@ -41,23 +78,53 @@ static void drm_block_free(struct drm_buddy *mm,
>  	kmem_cache_free(slab_blocks, block);
>  }
>  
> -static void list_insert_sorted(struct drm_buddy *mm,
> -			       struct drm_buddy_block *block)
> +static void rbtree_insert(struct drm_buddy *mm,
> +			  struct drm_buddy_block *block)
>  {
> +	struct rb_root *root = &mm->free_tree[drm_buddy_block_order(block)];
> +	struct rb_node **link = &root->rb_node;
> +	struct rb_node *parent = NULL;
>  	struct drm_buddy_block *node;
> -	struct list_head *head;
> +	u64 offset;
> +
> +	offset = drm_buddy_block_offset(block);
>  
> -	head = &mm->free_list[drm_buddy_block_order(block)];
> -	if (list_empty(head)) {
> -		list_add(&block->link, head);
> -		return;
> +	while (*link) {
> +		parent = *link;
> +		node = rb_entry(parent, struct drm_buddy_block, rb);
> +
> +		if (offset < drm_buddy_block_offset(node))
> +			link = &parent->rb_left;
> +		else
> +			link = &parent->rb_right;
>  	}
>  
> -	list_for_each_entry(node, head, link)
> -		if (drm_buddy_block_offset(block) < drm_buddy_block_offset(node))
> -			break;
> +	rb_link_node(&block->rb, parent, link);
> +	rb_insert_color(&block->rb, root);
> +}
>  
> -	__list_add(&block->link, node->link.prev, &node->link);
> +static void rbtree_remove(struct drm_buddy *mm,
> +			  struct drm_buddy_block *block)
> +{
> +	struct rb_root *root;
> +
> +	root = &mm->free_tree[drm_buddy_block_order(block)];
> +	rb_erase(&block->rb, root);
> +
> +	RB_CLEAR_NODE(&block->rb);
> +}
> +
> +static inline struct drm_buddy_block *
> +rbtree_last_entry(struct drm_buddy *mm, unsigned int order)
> +{
> +	struct rb_node *node = rb_last(&mm->free_tree[order]);
> +
> +	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
> +}
> +
> +static bool rbtree_is_empty(struct drm_buddy *mm, unsigned int order)
> +{
> +	return RB_EMPTY_ROOT(&mm->free_tree[order]);
>  }
>  
>  static void clear_reset(struct drm_buddy_block *block)
> @@ -70,12 +137,13 @@ static void mark_cleared(struct drm_buddy_block *block)
>  	block->header |= DRM_BUDDY_HEADER_CLEAR;
>  }
>  
> -static void mark_allocated(struct drm_buddy_block *block)
> +static void mark_allocated(struct drm_buddy *mm,
> +			   struct drm_buddy_block *block)
>  {
>  	block->header &= ~DRM_BUDDY_HEADER_STATE;
>  	block->header |= DRM_BUDDY_ALLOCATED;
>  
> -	list_del(&block->link);
> +	rbtree_remove(mm, block);
>  }
>  
>  static void mark_free(struct drm_buddy *mm,
> @@ -84,15 +152,16 @@ static void mark_free(struct drm_buddy *mm,
>  	block->header &= ~DRM_BUDDY_HEADER_STATE;
>  	block->header |= DRM_BUDDY_FREE;
>  
> -	list_insert_sorted(mm, block);
> +	rbtree_insert(mm, block);
>  }
>  
> -static void mark_split(struct drm_buddy_block *block)
> +static void mark_split(struct drm_buddy *mm,
> +		       struct drm_buddy_block *block)
>  {
>  	block->header &= ~DRM_BUDDY_HEADER_STATE;
>  	block->header |= DRM_BUDDY_SPLIT;
>  
> -	list_del(&block->link);
> +	rbtree_remove(mm, block);
>  }
>  
>  static inline bool overlaps(u64 s1, u64 e1, u64 s2, u64 e2)
> @@ -148,7 +217,7 @@ static unsigned int __drm_buddy_free(struct drm_buddy *mm,
>  				mark_cleared(parent);
>  		}
>  
> -		list_del(&buddy->link);
> +		rbtree_remove(mm, buddy);
>  		if (force_merge && drm_buddy_block_is_clear(buddy))
>  			mm->clear_avail -= drm_buddy_block_size(mm, buddy);
>  
> @@ -179,9 +248,11 @@ static int __force_merge(struct drm_buddy *mm,
>  		return -EINVAL;
>  
>  	for (i = min_order - 1; i >= 0; i--) {
> -		struct drm_buddy_block *block, *prev;
> +		struct drm_buddy_block *block, *prev_block, *first_block;
>  
> -		list_for_each_entry_safe_reverse(block, prev, &mm->free_list[i], link) {
> +		first_block = rb_entry(rb_first(&mm->free_tree[i]), struct drm_buddy_block, rb);
> +
> +		for_each_rb_free_block_reverse_safe(block, prev_block, &mm->free_tree[i], rb) {
>  			struct drm_buddy_block *buddy;
>  			u64 block_start, block_end;
>  
> @@ -206,10 +277,14 @@ static int __force_merge(struct drm_buddy *mm,
>  			 * block in the next iteration as we would free the
>  			 * buddy block as part of the free function.
>  			 */
> -			if (prev == buddy)
> -				prev = list_prev_entry(prev, link);
> +			if (prev_block && prev_block == buddy) {
> +				if (prev_block != first_block)
> +					prev_block = rb_entry(rb_prev(&prev_block->rb),
> +							      struct drm_buddy_block,
> +							      rb);
> +			}
>  
> -			list_del(&block->link);
> +			rbtree_remove(mm, block);
>  			if (drm_buddy_block_is_clear(block))
>  				mm->clear_avail -= drm_buddy_block_size(mm, block);
>  
> @@ -258,14 +333,14 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>  
>  	BUG_ON(mm->max_order > DRM_BUDDY_MAX_ORDER);
>  
> -	mm->free_list = kmalloc_array(mm->max_order + 1,
> -				      sizeof(struct list_head),
> +	mm->free_tree = kmalloc_array(mm->max_order + 1,
> +				      sizeof(struct rb_root),
>  				      GFP_KERNEL);
> -	if (!mm->free_list)
> +	if (!mm->free_tree)
>  		return -ENOMEM;
>  
>  	for (i = 0; i <= mm->max_order; ++i)
> -		INIT_LIST_HEAD(&mm->free_list[i]);
> +		mm->free_tree[i] = RB_ROOT;
>  
>  	mm->n_roots = hweight64(size);
>  
> @@ -273,7 +348,7 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>  				  sizeof(struct drm_buddy_block *),
>  				  GFP_KERNEL);
>  	if (!mm->roots)
> -		goto out_free_list;
> +		goto out_free_tree;
>  
>  	offset = 0;
>  	i = 0;
> @@ -312,8 +387,8 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>  	while (i--)
>  		drm_block_free(mm, mm->roots[i]);
>  	kfree(mm->roots);
> -out_free_list:
> -	kfree(mm->free_list);
> +out_free_tree:
> +	kfree(mm->free_tree);
>  	return -ENOMEM;
>  }
>  EXPORT_SYMBOL(drm_buddy_init);
> @@ -323,7 +398,7 @@ EXPORT_SYMBOL(drm_buddy_init);
>   *
>   * @mm: DRM buddy manager to free
>   *
> - * Cleanup memory manager resources and the freelist
> + * Cleanup memory manager resources and the freetree
>   */
>  void drm_buddy_fini(struct drm_buddy *mm)
>  {
> @@ -350,7 +425,7 @@ void drm_buddy_fini(struct drm_buddy *mm)
>  	WARN_ON(mm->avail != mm->size);
>  
>  	kfree(mm->roots);
> -	kfree(mm->free_list);
> +	kfree(mm->free_tree);
>  }
>  EXPORT_SYMBOL(drm_buddy_fini);
>  
> @@ -383,7 +458,7 @@ static int split_block(struct drm_buddy *mm,
>  		clear_reset(block);
>  	}
>  
> -	mark_split(block);
> +	mark_split(mm, block);
>  
>  	return 0;
>  }
> @@ -412,7 +487,7 @@ EXPORT_SYMBOL(drm_get_buddy);
>   * @is_clear: blocks clear state
>   *
>   * Reset the clear state based on @is_clear value for each block
> - * in the freelist.
> + * in the freetree.
>   */
>  void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
>  {
> @@ -433,7 +508,7 @@ void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
>  	for (i = 0; i <= mm->max_order; ++i) {
>  		struct drm_buddy_block *block;
>  
> -		list_for_each_entry_reverse(block, &mm->free_list[i], link) {
> +		for_each_rb_free_block_reverse(block, &mm->free_tree[i], rb) {
>  			if (is_clear != drm_buddy_block_is_clear(block)) {
>  				if (is_clear) {
>  					mark_cleared(block);
> @@ -641,7 +716,7 @@ get_maxblock(struct drm_buddy *mm, unsigned int order,
>  	for (i = order; i <= mm->max_order; ++i) {
>  		struct drm_buddy_block *tmp_block;
>  
> -		list_for_each_entry_reverse(tmp_block, &mm->free_list[i], link) {
> +		for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[i], rb) {
>  			if (block_incompatible(tmp_block, flags))
>  				continue;
>  
> @@ -667,7 +742,7 @@ get_maxblock(struct drm_buddy *mm, unsigned int order,
>  }
>  
>  static struct drm_buddy_block *
> -alloc_from_freelist(struct drm_buddy *mm,
> +alloc_from_freetree(struct drm_buddy *mm,
>  		    unsigned int order,
>  		    unsigned long flags)
>  {
> @@ -684,7 +759,7 @@ alloc_from_freelist(struct drm_buddy *mm,
>  		for (tmp = order; tmp <= mm->max_order; ++tmp) {
>  			struct drm_buddy_block *tmp_block;
>  
> -			list_for_each_entry_reverse(tmp_block, &mm->free_list[tmp], link) {
> +			for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[tmp], rb) {
>  				if (block_incompatible(tmp_block, flags))
>  					continue;
>  
> @@ -700,10 +775,8 @@ alloc_from_freelist(struct drm_buddy *mm,
>  	if (!block) {
>  		/* Fallback method */
>  		for (tmp = order; tmp <= mm->max_order; ++tmp) {
> -			if (!list_empty(&mm->free_list[tmp])) {
> -				block = list_last_entry(&mm->free_list[tmp],
> -							struct drm_buddy_block,
> -							link);
> +			if (!rbtree_is_empty(mm, tmp)) {
> +				block = rbtree_last_entry(mm, tmp);
>  				if (block)
>  					break;
>  			}
> @@ -771,7 +844,7 @@ static int __alloc_range(struct drm_buddy *mm,
>  
>  		if (contains(start, end, block_start, block_end)) {
>  			if (drm_buddy_block_is_free(block)) {
> -				mark_allocated(block);
> +				mark_allocated(mm, block);
>  				total_allocated += drm_buddy_block_size(mm, block);
>  				mm->avail -= drm_buddy_block_size(mm, block);
>  				if (drm_buddy_block_is_clear(block))
> @@ -849,7 +922,6 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
>  {
>  	u64 rhs_offset, lhs_offset, lhs_size, filled;
>  	struct drm_buddy_block *block;
> -	struct list_head *list;
>  	LIST_HEAD(blocks_lhs);
>  	unsigned long pages;
>  	unsigned int order;
> @@ -862,11 +934,10 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
>  	if (order == 0)
>  		return -ENOSPC;
>  
> -	list = &mm->free_list[order];
> -	if (list_empty(list))
> +	if (rbtree_is_empty(mm, order))
>  		return -ENOSPC;
>  
> -	list_for_each_entry_reverse(block, list, link) {
> +	for_each_rb_free_block_reverse(block, &mm->free_tree[order], rb) {
>  		/* Allocate blocks traversing RHS */
>  		rhs_offset = drm_buddy_block_offset(block);
>  		err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
> @@ -976,7 +1047,7 @@ int drm_buddy_block_trim(struct drm_buddy *mm,
>  	list_add(&block->tmp_link, &dfs);
>  	err =  __alloc_range(mm, &dfs, new_start, new_size, blocks, NULL);
>  	if (err) {
> -		mark_allocated(block);
> +		mark_allocated(mm, block);
>  		mm->avail -= drm_buddy_block_size(mm, block);
>  		if (drm_buddy_block_is_clear(block))
>  			mm->clear_avail -= drm_buddy_block_size(mm, block);
> @@ -999,8 +1070,8 @@ __drm_buddy_alloc_blocks(struct drm_buddy *mm,
>  		return  __drm_buddy_alloc_range_bias(mm, start, end,
>  						     order, flags);
>  	else
> -		/* Allocate from freelist */
> -		return alloc_from_freelist(mm, order, flags);
> +		/* Allocate from freetree */
> +		return alloc_from_freetree(mm, order, flags);
>  }
>  
>  /**
> @@ -1017,8 +1088,8 @@ __drm_buddy_alloc_blocks(struct drm_buddy *mm,
>   * alloc_range_bias() called on range limitations, which traverses
>   * the tree and returns the desired block.
>   *
> - * alloc_from_freelist() called when *no* range restrictions
> - * are enforced, which picks the block from the freelist.
> + * alloc_from_freetree() called when *no* range restrictions
> + * are enforced, which picks the block from the freetree.
>   *
>   * Returns:
>   * 0 on success, error code on failure.
> @@ -1120,7 +1191,7 @@ int drm_buddy_alloc_blocks(struct drm_buddy *mm,
>  			}
>  		} while (1);
>  
> -		mark_allocated(block);
> +		mark_allocated(mm, block);
>  		mm->avail -= drm_buddy_block_size(mm, block);
>  		if (drm_buddy_block_is_clear(block))
>  			mm->clear_avail -= drm_buddy_block_size(mm, block);
> @@ -1204,7 +1275,7 @@ void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
>  		struct drm_buddy_block *block;
>  		u64 count = 0, free;
>  
> -		list_for_each_entry(block, &mm->free_list[order], link) {
> +		for_each_rb_free_block(block, &mm->free_tree[order], rb) {
>  			BUG_ON(!drm_buddy_block_is_free(block));
>  			count++;
>  		}
> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h
> index 513837632b7d..091823592034 100644
> --- a/include/drm/drm_buddy.h
> +++ b/include/drm/drm_buddy.h
> @@ -10,6 +10,7 @@
>  #include <linux/list.h>
>  #include <linux/slab.h>
>  #include <linux/sched.h>
> +#include <linux/rbtree.h>
>  
>  #include <drm/drm_print.h>
>  
> @@ -53,7 +54,11 @@ struct drm_buddy_block {
>  	 * a list, if so desired. As soon as the block is freed with
>  	 * drm_buddy_free* ownership is given back to the mm.
>  	 */
> -	struct list_head link;
> +	union {
> +		struct rb_node rb;
> +		struct list_head link;
> +	};
> +
>  	struct list_head tmp_link;
>  };
>  
> @@ -68,7 +73,7 @@ struct drm_buddy_block {
>   */
>  struct drm_buddy {
>  	/* Maintain a free list for each order. */
> -	struct list_head *free_list;
> +	struct rb_root *free_tree;
>  
>  	/*
>  	 * Maintain explicit binary tree(s) to track the allocation of the
>
> base-commit: f4c75f975cf50fa2e1fd96c5aafe5aa62e55fbe4

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees
  2025-08-28 10:56 ` [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees Arunpravin Paneer Selvam
@ 2025-08-28 11:13   ` Jani Nikula
  2025-09-01 19:03     ` Arunpravin Paneer Selvam
  0 siblings, 1 reply; 9+ messages in thread
From: Jani Nikula @ 2025-08-28 11:13 UTC (permalink / raw)
  To: Arunpravin Paneer Selvam, christian.koenig, matthew.auld,
	dri-devel, amd-gfx, intel-gfx, intel-xe
  Cc: alexander.deucher, Arunpravin Paneer Selvam

On Thu, 28 Aug 2025, Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> wrote:
> Maintain two separate RB trees per order - one for clear (zeroed) blocks
> and another for dirty (uncleared) blocks. This separation improves
> code clarity and makes it more obvious which tree is being searched
> during allocation. It also improves scalability and efficiency when
> searching for a specific type of block, avoiding unnecessary checks
> and making the allocator more predictable under fragmentation.
>
> The changes have been validated using the existing drm_buddy_test
> KUnit test cases, along with selected graphics workloads,
> to ensure correctness and avoid regressions.
>
> v2: Missed adding the suggested-by tag. Added it in v2.
>
> v3(Matthew):
>   - Remove the double underscores from the internal functions.
>   - Rename the internal functions to have less generic names.
>   - Fix the error handling code.
>   - Pass tree argument for the tree macro.
>   - Use the existing dirty/free bit instead of new tree field.
>   - Make free_trees[] instead of clear_tree and dirty_tree for
>     more cleaner approach.
>
> v4:
>   - A bug was reported by Intel CI and it is fixed by
>     Matthew Auld.
>   - Replace the get_root function with
>     &mm->free_trees[tree][order] (Matthew)
>   - Remove the unnecessary rbtree_is_empty() check (Matthew)
>   - Remove the unnecessary get_tree_for_flags() function.
>   - Rename get_tree_for_block() name with get_block_tree() for more
>     clarity.
>
> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
> Suggested-by: Matthew Auld <matthew.auld@intel.com>
> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4260
> ---
>  drivers/gpu/drm/drm_buddy.c | 322 +++++++++++++++++++++---------------
>  include/drm/drm_buddy.h     |   8 +-
>  2 files changed, 192 insertions(+), 138 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
> index 01ae984340cc..06e90020177f 100644
> --- a/drivers/gpu/drm/drm_buddy.c
> +++ b/drivers/gpu/drm/drm_buddy.c
> @@ -14,6 +14,9 @@
>  
>  static struct kmem_cache *slab_blocks;
>  
> +#define for_each_free_tree(tree) \
> +	for ((tree) = CLEAR_TREE; (tree) < MAX_FREE_TREES; (tree)++)

IMO better to just use 0 and ARRAY_SIZE() for the limits, here and
everywhere. It's just that there's no connection between the enum and
how its used anyway.

> +
>  /*
>   * for_each_rb_free_block() - iterate over an RB tree in order
>   * @pos:	the struct type * to use as a loop cursor
> @@ -78,22 +81,60 @@ static void drm_block_free(struct drm_buddy *mm,
>  	kmem_cache_free(slab_blocks, block);
>  }
>  
> +static inline enum free_tree

Please don't use static inline in .c files. Just let the compiler do
what it deems best.

> +get_block_tree(struct drm_buddy_block *block)
> +{
> +	return drm_buddy_block_is_clear(block) ? CLEAR_TREE : DIRTY_TREE;
> +}
> +
> +static inline struct drm_buddy_block *
> +rbtree_get_free_block(struct rb_node *node)
> +{
> +	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
> +}
> +
> +static inline struct drm_buddy_block *
> +rbtree_prev_free_block(struct rb_node *node)
> +{
> +	return rbtree_get_free_block(rb_prev(node));
> +}
> +
> +static inline struct drm_buddy_block *
> +rbtree_first_free_block(struct rb_root *root)
> +{
> +	return rbtree_get_free_block(rb_first(root));
> +}
> +
> +static inline struct drm_buddy_block *
> +rbtree_last_free_block(struct rb_root *root)
> +{
> +	return rbtree_get_free_block(rb_last(root));
> +}
> +
> +static inline bool rbtree_is_empty(struct rb_root *root)
> +{
> +	return RB_EMPTY_ROOT(root);
> +}
> +
>  static void rbtree_insert(struct drm_buddy *mm,
> -			  struct drm_buddy_block *block)
> +			  struct drm_buddy_block *block,
> +			  enum free_tree tree)
>  {
> -	struct rb_root *root = &mm->free_tree[drm_buddy_block_order(block)];
> -	struct rb_node **link = &root->rb_node;
> -	struct rb_node *parent = NULL;
> +	struct rb_node **link, *parent = NULL;
>  	struct drm_buddy_block *node;
> -	u64 offset;
> +	struct rb_root *root;
> +	unsigned int order;
> +
> +	order = drm_buddy_block_order(block);
>  
> -	offset = drm_buddy_block_offset(block);
> +	root = &mm->free_trees[tree][order];
> +	link = &root->rb_node;
>  
>  	while (*link) {
>  		parent = *link;
> -		node = rb_entry(parent, struct drm_buddy_block, rb);
> +		node = rbtree_get_free_block(parent);
>  
> -		if (offset < drm_buddy_block_offset(node))
> +		if (drm_buddy_block_offset(block) < drm_buddy_block_offset(node))
>  			link = &parent->rb_left;
>  		else
>  			link = &parent->rb_right;
> @@ -106,27 +147,17 @@ static void rbtree_insert(struct drm_buddy *mm,
>  static void rbtree_remove(struct drm_buddy *mm,
>  			  struct drm_buddy_block *block)
>  {
> +	unsigned int order = drm_buddy_block_order(block);
>  	struct rb_root *root;
> +	enum free_tree tree;
>  
> -	root = &mm->free_tree[drm_buddy_block_order(block)];
> -	rb_erase(&block->rb, root);
> +	tree = get_block_tree(block);
> +	root = &mm->free_trees[tree][order];
>  
> +	rb_erase(&block->rb, root);
>  	RB_CLEAR_NODE(&block->rb);
>  }
>  
> -static inline struct drm_buddy_block *
> -rbtree_last_entry(struct drm_buddy *mm, unsigned int order)
> -{
> -	struct rb_node *node = rb_last(&mm->free_tree[order]);
> -
> -	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
> -}
> -
> -static bool rbtree_is_empty(struct drm_buddy *mm, unsigned int order)
> -{
> -	return RB_EMPTY_ROOT(&mm->free_tree[order]);
> -}
> -
>  static void clear_reset(struct drm_buddy_block *block)
>  {
>  	block->header &= ~DRM_BUDDY_HEADER_CLEAR;
> @@ -149,10 +180,13 @@ static void mark_allocated(struct drm_buddy *mm,
>  static void mark_free(struct drm_buddy *mm,
>  		      struct drm_buddy_block *block)
>  {
> +	enum free_tree tree;
> +
>  	block->header &= ~DRM_BUDDY_HEADER_STATE;
>  	block->header |= DRM_BUDDY_FREE;
>  
> -	rbtree_insert(mm, block);
> +	tree = get_block_tree(block);
> +	rbtree_insert(mm, block, tree);
>  }
>  
>  static void mark_split(struct drm_buddy *mm,
> @@ -238,6 +272,7 @@ static int __force_merge(struct drm_buddy *mm,
>  			 u64 end,
>  			 unsigned int min_order)
>  {
> +	enum free_tree tree;
>  	unsigned int order;
>  	int i;
>  
> @@ -247,50 +282,49 @@ static int __force_merge(struct drm_buddy *mm,
>  	if (min_order > mm->max_order)
>  		return -EINVAL;
>  
> -	for (i = min_order - 1; i >= 0; i--) {
> -		struct drm_buddy_block *block, *prev_block, *first_block;
> +	for_each_free_tree(tree) {
> +		for (i = min_order - 1; i >= 0; i--) {
> +			struct rb_root *root = &mm->free_trees[tree][i];
> +			struct drm_buddy_block *block, *prev_block;
>  
> -		first_block = rb_entry(rb_first(&mm->free_tree[i]), struct drm_buddy_block, rb);
> +			for_each_rb_free_block_reverse_safe(block, prev_block, root, rb) {
> +				struct drm_buddy_block *buddy;
> +				u64 block_start, block_end;
>  
> -		for_each_rb_free_block_reverse_safe(block, prev_block, &mm->free_tree[i], rb) {
> -			struct drm_buddy_block *buddy;
> -			u64 block_start, block_end;
> -
> -			if (!block->parent)
> -				continue;
> +				if (!block->parent)
> +					continue;
>  
> -			block_start = drm_buddy_block_offset(block);
> -			block_end = block_start + drm_buddy_block_size(mm, block) - 1;
> +				block_start = drm_buddy_block_offset(block);
> +				block_end = block_start + drm_buddy_block_size(mm, block) - 1;
>  
> -			if (!contains(start, end, block_start, block_end))
> -				continue;
> +				if (!contains(start, end, block_start, block_end))
> +					continue;
>  
> -			buddy = __get_buddy(block);
> -			if (!drm_buddy_block_is_free(buddy))
> -				continue;
> +				buddy = __get_buddy(block);
> +				if (!drm_buddy_block_is_free(buddy))
> +					continue;
>  
> -			WARN_ON(drm_buddy_block_is_clear(block) ==
> -				drm_buddy_block_is_clear(buddy));
> +				WARN_ON(drm_buddy_block_is_clear(block) ==
> +					drm_buddy_block_is_clear(buddy));
>  
> -			/*
> -			 * If the prev block is same as buddy, don't access the
> -			 * block in the next iteration as we would free the
> -			 * buddy block as part of the free function.
> -			 */
> -			if (prev_block && prev_block == buddy) {
> -				if (prev_block != first_block)
> -					prev_block = rb_entry(rb_prev(&prev_block->rb),
> -							      struct drm_buddy_block,
> -							      rb);
> -			}
> +				/*
> +				 * If the prev block is same as buddy, don't access the
> +				 * block in the next iteration as we would free the
> +				 * buddy block as part of the free function.
> +				 */
> +				if (prev_block && prev_block == buddy) {
> +					if (prev_block != rbtree_first_free_block(root))
> +						prev_block = rbtree_prev_free_block(&prev_block->rb);
> +				}
>  
> -			rbtree_remove(mm, block);
> -			if (drm_buddy_block_is_clear(block))
> -				mm->clear_avail -= drm_buddy_block_size(mm, block);
> +				rbtree_remove(mm, block);
> +				if (drm_buddy_block_is_clear(block))
> +					mm->clear_avail -= drm_buddy_block_size(mm, block);
>  
> -			order = __drm_buddy_free(mm, block, true);
> -			if (order >= min_order)
> -				return 0;
> +				order = __drm_buddy_free(mm, block, true);
> +				if (order >= min_order)
> +					return 0;
> +			}
>  		}
>  	}
>  
> @@ -311,7 +345,7 @@ static int __force_merge(struct drm_buddy *mm,
>   */
>  int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>  {
> -	unsigned int i;
> +	unsigned int i, j;
>  	u64 offset;
>  
>  	if (size < chunk_size)
> @@ -333,14 +367,16 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>  
>  	BUG_ON(mm->max_order > DRM_BUDDY_MAX_ORDER);
>  
> -	mm->free_tree = kmalloc_array(mm->max_order + 1,
> -				      sizeof(struct rb_root),
> -				      GFP_KERNEL);
> -	if (!mm->free_tree)
> -		return -ENOMEM;
> +	for (i = 0; i < MAX_FREE_TREES; i++) {
> +		mm->free_trees[i] = kmalloc_array(mm->max_order + 1,
> +						  sizeof(struct rb_root),
> +						  GFP_KERNEL);
> +		if (!mm->free_trees[i])
> +			goto out_free_tree;
>  
> -	for (i = 0; i <= mm->max_order; ++i)
> -		mm->free_tree[i] = RB_ROOT;
> +		for (j = 0; j <= mm->max_order; ++j)
> +			mm->free_trees[i][j] = RB_ROOT;
> +	}
>  
>  	mm->n_roots = hweight64(size);
>  
> @@ -388,7 +424,8 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>  		drm_block_free(mm, mm->roots[i]);
>  	kfree(mm->roots);
>  out_free_tree:
> -	kfree(mm->free_tree);
> +	while (i--)
> +		kfree(mm->free_trees[i]);
>  	return -ENOMEM;
>  }
>  EXPORT_SYMBOL(drm_buddy_init);
> @@ -424,8 +461,9 @@ void drm_buddy_fini(struct drm_buddy *mm)
>  
>  	WARN_ON(mm->avail != mm->size);
>  
> +	for (i = 0; i < MAX_FREE_TREES; i++)
> +		kfree(mm->free_trees[i]);
>  	kfree(mm->roots);
> -	kfree(mm->free_tree);
>  }
>  EXPORT_SYMBOL(drm_buddy_fini);
>  
> @@ -449,8 +487,7 @@ static int split_block(struct drm_buddy *mm,
>  		return -ENOMEM;
>  	}
>  
> -	mark_free(mm, block->left);
> -	mark_free(mm, block->right);
> +	mark_split(mm, block);
>  
>  	if (drm_buddy_block_is_clear(block)) {
>  		mark_cleared(block->left);
> @@ -458,7 +495,8 @@ static int split_block(struct drm_buddy *mm,
>  		clear_reset(block);
>  	}
>  
> -	mark_split(mm, block);
> +	mark_free(mm, block->left);
> +	mark_free(mm, block->right);
>  
>  	return 0;
>  }
> @@ -491,6 +529,7 @@ EXPORT_SYMBOL(drm_get_buddy);
>   */
>  void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
>  {
> +	enum free_tree src_tree, dst_tree;
>  	u64 root_size, size, start;
>  	unsigned int order;
>  	int i;
> @@ -505,19 +544,24 @@ void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
>  		size -= root_size;
>  	}
>  
> +	src_tree = is_clear ? DIRTY_TREE : CLEAR_TREE;
> +	dst_tree = is_clear ? CLEAR_TREE : DIRTY_TREE;
> +
>  	for (i = 0; i <= mm->max_order; ++i) {
> +		struct rb_root *root = &mm->free_trees[src_tree][i];
>  		struct drm_buddy_block *block;
>  
> -		for_each_rb_free_block_reverse(block, &mm->free_tree[i], rb) {
> -			if (is_clear != drm_buddy_block_is_clear(block)) {
> -				if (is_clear) {
> -					mark_cleared(block);
> -					mm->clear_avail += drm_buddy_block_size(mm, block);
> -				} else {
> -					clear_reset(block);
> -					mm->clear_avail -= drm_buddy_block_size(mm, block);
> -				}
> +		for_each_rb_free_block_reverse(block, root, rb) {
> +			rbtree_remove(mm, block);
> +			if (is_clear) {
> +				mark_cleared(block);
> +				mm->clear_avail += drm_buddy_block_size(mm, block);
> +			} else {
> +				clear_reset(block);
> +				mm->clear_avail -= drm_buddy_block_size(mm, block);
>  			}
> +
> +			rbtree_insert(mm, block, dst_tree);
>  		}
>  	}
>  }
> @@ -707,23 +751,17 @@ __drm_buddy_alloc_range_bias(struct drm_buddy *mm,
>  }
>  
>  static struct drm_buddy_block *
> -get_maxblock(struct drm_buddy *mm, unsigned int order,
> -	     unsigned long flags)
> +get_maxblock(struct drm_buddy *mm,
> +	     unsigned int order,
> +	     enum free_tree tree)
>  {
>  	struct drm_buddy_block *max_block = NULL, *block = NULL;
> +	struct rb_root *root;
>  	unsigned int i;
>  
>  	for (i = order; i <= mm->max_order; ++i) {
> -		struct drm_buddy_block *tmp_block;
> -
> -		for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[i], rb) {
> -			if (block_incompatible(tmp_block, flags))
> -				continue;
> -
> -			block = tmp_block;
> -			break;
> -		}
> -
> +		root = &mm->free_trees[tree][i];
> +		block = rbtree_last_free_block(root);
>  		if (!block)
>  			continue;
>  
> @@ -747,39 +785,37 @@ alloc_from_freetree(struct drm_buddy *mm,
>  		    unsigned long flags)
>  {
>  	struct drm_buddy_block *block = NULL;
> +	struct rb_root *root;
> +	enum free_tree tree;
>  	unsigned int tmp;
>  	int err;
>  
> +	tree = (flags & DRM_BUDDY_CLEAR_ALLOCATION) ? CLEAR_TREE : DIRTY_TREE;
> +
>  	if (flags & DRM_BUDDY_TOPDOWN_ALLOCATION) {
> -		block = get_maxblock(mm, order, flags);
> +		block = get_maxblock(mm, order, tree);
>  		if (block)
>  			/* Store the obtained block order */
>  			tmp = drm_buddy_block_order(block);
>  	} else {
>  		for (tmp = order; tmp <= mm->max_order; ++tmp) {
> -			struct drm_buddy_block *tmp_block;
> -
> -			for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[tmp], rb) {
> -				if (block_incompatible(tmp_block, flags))
> -					continue;
> -
> -				block = tmp_block;
> -				break;
> -			}
> -
> +			/* Get RB tree root for this order and tree */
> +			root = &mm->free_trees[tree][tmp];
> +			block = rbtree_last_free_block(root);
>  			if (block)
>  				break;
>  		}
>  	}
>  
>  	if (!block) {
> -		/* Fallback method */
> +		/* Try allocating from the other tree */
> +		tree = (tree == CLEAR_TREE) ? DIRTY_TREE : CLEAR_TREE;
> +
>  		for (tmp = order; tmp <= mm->max_order; ++tmp) {
> -			if (!rbtree_is_empty(mm, tmp)) {
> -				block = rbtree_last_entry(mm, tmp);
> -				if (block)
> -					break;
> -			}
> +			root = &mm->free_trees[tree][tmp];
> +			block = rbtree_last_free_block(root);
> +			if (block)
> +				break;
>  		}
>  
>  		if (!block)
> @@ -923,6 +959,7 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
>  	u64 rhs_offset, lhs_offset, lhs_size, filled;
>  	struct drm_buddy_block *block;
>  	LIST_HEAD(blocks_lhs);
> +	enum free_tree tree;
>  	unsigned long pages;
>  	unsigned int order;
>  	u64 modify_size;
> @@ -934,34 +971,39 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
>  	if (order == 0)
>  		return -ENOSPC;
>  
> -	if (rbtree_is_empty(mm, order))
> +	if (rbtree_is_empty(&mm->free_trees[CLEAR_TREE][order]) &&
> +	    rbtree_is_empty(&mm->free_trees[DIRTY_TREE][order]))
>  		return -ENOSPC;
>  
> -	for_each_rb_free_block_reverse(block, &mm->free_tree[order], rb) {
> -		/* Allocate blocks traversing RHS */
> -		rhs_offset = drm_buddy_block_offset(block);
> -		err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
> -					       &filled, blocks);
> -		if (!err || err != -ENOSPC)
> -			return err;
> -
> -		lhs_size = max((size - filled), min_block_size);
> -		if (!IS_ALIGNED(lhs_size, min_block_size))
> -			lhs_size = round_up(lhs_size, min_block_size);
> -
> -		/* Allocate blocks traversing LHS */
> -		lhs_offset = drm_buddy_block_offset(block) - lhs_size;
> -		err =  __drm_buddy_alloc_range(mm, lhs_offset, lhs_size,
> -					       NULL, &blocks_lhs);
> -		if (!err) {
> -			list_splice(&blocks_lhs, blocks);
> -			return 0;
> -		} else if (err != -ENOSPC) {
> +	for_each_free_tree(tree) {
> +		struct rb_root *root = &mm->free_trees[tree][order];
> +
> +		for_each_rb_free_block_reverse(block, root, rb) {
> +			/* Allocate blocks traversing RHS */
> +			rhs_offset = drm_buddy_block_offset(block);
> +			err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
> +						       &filled, blocks);
> +			if (!err || err != -ENOSPC)
> +				return err;
> +
> +			lhs_size = max((size - filled), min_block_size);
> +			if (!IS_ALIGNED(lhs_size, min_block_size))
> +				lhs_size = round_up(lhs_size, min_block_size);
> +
> +			/* Allocate blocks traversing LHS */
> +			lhs_offset = drm_buddy_block_offset(block) - lhs_size;
> +			err =  __drm_buddy_alloc_range(mm, lhs_offset, lhs_size,
> +						       NULL, &blocks_lhs);
> +			if (!err) {
> +				list_splice(&blocks_lhs, blocks);
> +				return 0;
> +			} else if (err != -ENOSPC) {
> +				drm_buddy_free_list_internal(mm, blocks);
> +				return err;
> +			}
> +			/* Free blocks for the next iteration */
>  			drm_buddy_free_list_internal(mm, blocks);
> -			return err;
>  		}
> -		/* Free blocks for the next iteration */
> -		drm_buddy_free_list_internal(mm, blocks);
>  	}
>  
>  	return -ENOSPC;
> @@ -1266,6 +1308,7 @@ EXPORT_SYMBOL(drm_buddy_block_print);
>   */
>  void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
>  {
> +	enum free_tree tree;
>  	int order;
>  
>  	drm_printf(p, "chunk_size: %lluKiB, total: %lluMiB, free: %lluMiB, clear_free: %lluMiB\n",
> @@ -1273,11 +1316,16 @@ void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
>  
>  	for (order = mm->max_order; order >= 0; order--) {
>  		struct drm_buddy_block *block;
> +		struct rb_root *root;
>  		u64 count = 0, free;
>  
> -		for_each_rb_free_block(block, &mm->free_tree[order], rb) {
> -			BUG_ON(!drm_buddy_block_is_free(block));
> -			count++;
> +		for_each_free_tree(tree) {
> +			root = &mm->free_trees[tree][order];
> +
> +			for_each_rb_free_block(block, root, rb) {
> +				BUG_ON(!drm_buddy_block_is_free(block));
> +				count++;
> +			}
>  		}
>  
>  		drm_printf(p, "order-%2d ", order);
> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h
> index 091823592034..2fc1cc7b78bf 100644
> --- a/include/drm/drm_buddy.h
> +++ b/include/drm/drm_buddy.h
> @@ -14,6 +14,12 @@
>  
>  #include <drm/drm_print.h>
>  
> +enum free_tree {
> +	CLEAR_TREE = 0,
> +	DIRTY_TREE,
> +	MAX_FREE_TREES,

Those are quite generic enum and enumerator names for a very specific
header and usage.

And really this whole enum should be an implementation detail.

> +};
> +
>  #define range_overflows(start, size, max) ({ \
>  	typeof(start) start__ = (start); \
>  	typeof(size) size__ = (size); \
> @@ -73,7 +79,7 @@ struct drm_buddy_block {
>   */
>  struct drm_buddy {
>  	/* Maintain a free list for each order. */
> -	struct rb_root *free_tree;
> +	struct rb_root *free_trees[MAX_FREE_TREES];
>  
>  	/*
>  	 * Maintain explicit binary tree(s) to track the allocation of the

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* ✗ CI.checkpatch: warning for series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
  2025-08-28 10:56 [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Arunpravin Paneer Selvam
  2025-08-28 10:56 ` [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees Arunpravin Paneer Selvam
  2025-08-28 11:08 ` [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Jani Nikula
@ 2025-08-28 13:47 ` Patchwork
  2025-08-28 13:48 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2025-08-28 13:47 UTC (permalink / raw)
  To: Arunpravin Paneer Selvam; +Cc: intel-xe

== Series Details ==

Series: series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
URL   : https://patchwork.freedesktop.org/series/153624/
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
e0fa7d6ad11ac6dc8dfa757164e518968a98b897
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 88af2bca93bbcdb11e859fe160b805832d6c70dd
Author: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
Date:   Thu Aug 28 16:26:46 2025 +0530

    drm/buddy: Separate clear and dirty free block trees
    
    Maintain two separate RB trees per order - one for clear (zeroed) blocks
    and another for dirty (uncleared) blocks. This separation improves
    code clarity and makes it more obvious which tree is being searched
    during allocation. It also improves scalability and efficiency when
    searching for a specific type of block, avoiding unnecessary checks
    and making the allocator more predictable under fragmentation.
    
    The changes have been validated using the existing drm_buddy_test
    KUnit test cases, along with selected graphics workloads,
    to ensure correctness and avoid regressions.
    
    v2: Missed adding the suggested-by tag. Added it in v2.
    
    v3(Matthew):
      - Remove the double underscores from the internal functions.
      - Rename the internal functions to have less generic names.
      - Fix the error handling code.
      - Pass tree argument for the tree macro.
      - Use the existing dirty/free bit instead of new tree field.
      - Make free_trees[] instead of clear_tree and dirty_tree for
        more cleaner approach.
    
    v4:
      - A bug was reported by Intel CI and it is fixed by
        Matthew Auld.
      - Replace the get_root function with
        &mm->free_trees[tree][order] (Matthew)
      - Remove the unnecessary rbtree_is_empty() check (Matthew)
      - Remove the unnecessary get_tree_for_flags() function.
      - Rename get_tree_for_block() name with get_block_tree() for more
        clarity.
    
    Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
    Suggested-by: Matthew Auld <matthew.auld@intel.com>
    Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4260
+ /mt/dim checkpatch 12bdbc7687846f438afff8bfdc89873b3cd95945 drm-intel
e9fbdd14c6f2 drm/buddy: Optimize free block management with RB tree
-:44: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'pos' - possible side-effects?
#44: FILE: drivers/gpu/drm/drm_buddy.c:23:
+#define for_each_rb_free_block(pos, root, member) \
+	for (pos = rb_entry_safe(rb_first(root), typeof(*pos), member); \
+	     pos; \
+	     pos = rb_entry_safe(rb_next(&(pos)->member), typeof(*pos), member))

-:44: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'member' - possible side-effects?
#44: FILE: drivers/gpu/drm/drm_buddy.c:23:
+#define for_each_rb_free_block(pos, root, member) \
+	for (pos = rb_entry_safe(rb_first(root), typeof(*pos), member); \
+	     pos; \
+	     pos = rb_entry_safe(rb_next(&(pos)->member), typeof(*pos), member))

-:55: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'pos' - possible side-effects?
#55: FILE: drivers/gpu/drm/drm_buddy.c:34:
+#define for_each_rb_free_block_reverse(pos, root, member) \
+	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member); \
+	     pos; \
+	     pos = rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member))

-:55: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'member' - possible side-effects?
#55: FILE: drivers/gpu/drm/drm_buddy.c:34:
+#define for_each_rb_free_block_reverse(pos, root, member) \
+	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member); \
+	     pos; \
+	     pos = rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member))

-:67: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'pos' - possible side-effects?
#67: FILE: drivers/gpu/drm/drm_buddy.c:46:
+#define for_each_rb_free_block_reverse_safe(pos, n, root, member) \
+	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member), \
+	     n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL; \
+	     pos; \
+	     pos = n, n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL)

-:67: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'n' - possible side-effects?
#67: FILE: drivers/gpu/drm/drm_buddy.c:46:
+#define for_each_rb_free_block_reverse_safe(pos, n, root, member) \
+	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member), \
+	     n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL; \
+	     pos; \
+	     pos = n, n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL)

-:67: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'member' - possible side-effects?
#67: FILE: drivers/gpu/drm/drm_buddy.c:46:
+#define for_each_rb_free_block_reverse_safe(pos, n, root, member) \
+	for (pos = rb_entry_safe(rb_last(root), typeof(*pos), member), \
+	     n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL; \
+	     pos; \
+	     pos = n, n = pos ? rb_entry_safe(rb_prev(&(pos)->member), typeof(*pos), member) : NULL)

total: 0 errors, 0 warnings, 7 checks, 396 lines checked
88af2bca93bb drm/buddy: Separate clear and dirty free block trees
-:50: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'tree' - possible side-effects?
#50: FILE: drivers/gpu/drm/drm_buddy.c:17:
+#define for_each_free_tree(tree) \
+	for ((tree) = CLEAR_TREE; (tree) < MAX_FREE_TREES; (tree)++)

-:246: WARNING:LONG_LINE: line length of 101 exceeds 100 columns
#246: FILE: drivers/gpu/drm/drm_buddy.c:317:
+						prev_block = rbtree_prev_free_block(&prev_block->rb);

-:561: WARNING:AVOID_BUG: Do not crash the kernel unless it is absolutely unavoidable--use WARN_ON_ONCE() plus recovery code (if feasible) instead of BUG() or variants
#561: FILE: drivers/gpu/drm/drm_buddy.c:1326:
+				BUG_ON(!drm_buddy_block_is_free(block));

total: 0 errors, 2 warnings, 1 checks, 521 lines checked



^ permalink raw reply	[flat|nested] 9+ messages in thread

* ✓ CI.KUnit: success for series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
  2025-08-28 10:56 [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Arunpravin Paneer Selvam
                   ` (2 preceding siblings ...)
  2025-08-28 13:47 ` ✗ CI.checkpatch: warning for series starting with [v4,1/2] " Patchwork
@ 2025-08-28 13:48 ` Patchwork
  2025-08-28 14:27 ` ✓ Xe.CI.BAT: " Patchwork
  2025-08-28 17:36 ` ✓ Xe.CI.Full: " Patchwork
  5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2025-08-28 13:48 UTC (permalink / raw)
  To: Arunpravin Paneer Selvam; +Cc: intel-xe

== Series Details ==

Series: series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
URL   : https://patchwork.freedesktop.org/series/153624/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[13:47:19] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:47:23] 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
[13:47:52] Starting KUnit Kernel (1/1)...
[13:47:52] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:47:52] ================== guc_buf (11 subtests) ===================
[13:47:52] [PASSED] test_smallest
[13:47:52] [PASSED] test_largest
[13:47:52] [PASSED] test_granular
[13:47:52] [PASSED] test_unique
[13:47:52] [PASSED] test_overlap
[13:47:52] [PASSED] test_reusable
[13:47:52] [PASSED] test_too_big
[13:47:52] [PASSED] test_flush
[13:47:52] [PASSED] test_lookup
[13:47:52] [PASSED] test_data
[13:47:52] [PASSED] test_class
[13:47:52] ===================== [PASSED] guc_buf =====================
[13:47:52] =================== guc_dbm (7 subtests) ===================
[13:47:52] [PASSED] test_empty
[13:47:52] [PASSED] test_default
[13:47:52] ======================== test_size  ========================
[13:47:52] [PASSED] 4
[13:47:52] [PASSED] 8
[13:47:52] [PASSED] 32
[13:47:52] [PASSED] 256
[13:47:52] ==================== [PASSED] test_size ====================
[13:47:52] ======================= test_reuse  ========================
[13:47:52] [PASSED] 4
[13:47:52] [PASSED] 8
[13:47:52] [PASSED] 32
[13:47:52] [PASSED] 256
[13:47:52] =================== [PASSED] test_reuse ====================
[13:47:52] =================== test_range_overlap  ====================
[13:47:52] [PASSED] 4
[13:47:52] [PASSED] 8
[13:47:52] [PASSED] 32
[13:47:52] [PASSED] 256
[13:47:52] =============== [PASSED] test_range_overlap ================
[13:47:52] =================== test_range_compact  ====================
[13:47:52] [PASSED] 4
[13:47:52] [PASSED] 8
[13:47:52] [PASSED] 32
[13:47:52] [PASSED] 256
[13:47:52] =============== [PASSED] test_range_compact ================
[13:47:52] ==================== test_range_spare  =====================
[13:47:52] [PASSED] 4
[13:47:52] [PASSED] 8
[13:47:52] [PASSED] 32
[13:47:52] [PASSED] 256
[13:47:52] ================ [PASSED] test_range_spare =================
[13:47:52] ===================== [PASSED] guc_dbm =====================
[13:47:52] =================== guc_idm (6 subtests) ===================
[13:47:52] [PASSED] bad_init
[13:47:52] [PASSED] no_init
[13:47:52] [PASSED] init_fini
[13:47:52] [PASSED] check_used
[13:47:52] [PASSED] check_quota
[13:47:52] [PASSED] check_all
[13:47:52] ===================== [PASSED] guc_idm =====================
[13:47:52] ================== no_relay (3 subtests) ===================
[13:47:52] [PASSED] xe_drops_guc2pf_if_not_ready
[13:47:52] [PASSED] xe_drops_guc2vf_if_not_ready
[13:47:52] [PASSED] xe_rejects_send_if_not_ready
[13:47:52] ==================== [PASSED] no_relay =====================
[13:47:52] ================== pf_relay (14 subtests) ==================
[13:47:52] [PASSED] pf_rejects_guc2pf_too_short
[13:47:52] [PASSED] pf_rejects_guc2pf_too_long
[13:47:52] [PASSED] pf_rejects_guc2pf_no_payload
[13:47:52] [PASSED] pf_fails_no_payload
[13:47:52] [PASSED] pf_fails_bad_origin
[13:47:52] [PASSED] pf_fails_bad_type
[13:47:52] [PASSED] pf_txn_reports_error
[13:47:52] [PASSED] pf_txn_sends_pf2guc
[13:47:52] [PASSED] pf_sends_pf2guc
[13:47:52] [SKIPPED] pf_loopback_nop
[13:47:52] [SKIPPED] pf_loopback_echo
[13:47:52] [SKIPPED] pf_loopback_fail
[13:47:52] [SKIPPED] pf_loopback_busy
[13:47:52] [SKIPPED] pf_loopback_retry
[13:47:52] ==================== [PASSED] pf_relay =====================
[13:47:52] ================== vf_relay (3 subtests) ===================
[13:47:52] [PASSED] vf_rejects_guc2vf_too_short
[13:47:52] [PASSED] vf_rejects_guc2vf_too_long
[13:47:52] [PASSED] vf_rejects_guc2vf_no_payload
[13:47:52] ==================== [PASSED] vf_relay =====================
[13:47:52] ===================== lmtt (1 subtest) =====================
[13:47:52] ======================== test_ops  =========================
[13:47:52] [PASSED] 2-level
[13:47:52] [PASSED] multi-level
[13:47:52] ==================== [PASSED] test_ops =====================
[13:47:52] ====================== [PASSED] lmtt =======================
[13:47:52] ================= pf_service (11 subtests) =================
[13:47:52] [PASSED] pf_negotiate_any
[13:47:52] [PASSED] pf_negotiate_base_match
[13:47:52] [PASSED] pf_negotiate_base_newer
[13:47:52] [PASSED] pf_negotiate_base_next
[13:47:52] [SKIPPED] pf_negotiate_base_older
[13:47:52] [PASSED] pf_negotiate_base_prev
[13:47:52] [PASSED] pf_negotiate_latest_match
[13:47:52] [PASSED] pf_negotiate_latest_newer
[13:47:52] [PASSED] pf_negotiate_latest_next
[13:47:52] [SKIPPED] pf_negotiate_latest_older
[13:47:52] [SKIPPED] pf_negotiate_latest_prev
[13:47:53] =================== [PASSED] pf_service ====================
[13:47:53] =================== xe_mocs (2 subtests) ===================
[13:47:53] ================ xe_live_mocs_kernel_kunit  ================
[13:47:53] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[13:47:53] ================ xe_live_mocs_reset_kunit  =================
[13:47:53] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[13:47:53] ==================== [SKIPPED] xe_mocs =====================
[13:47:53] ================= xe_migrate (2 subtests) ==================
[13:47:53] ================= xe_migrate_sanity_kunit  =================
[13:47:53] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[13:47:53] ================== xe_validate_ccs_kunit  ==================
[13:47:53] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[13:47:53] =================== [SKIPPED] xe_migrate ===================
[13:47:53] ================== xe_dma_buf (1 subtest) ==================
[13:47:53] ==================== xe_dma_buf_kunit  =====================
[13:47:53] ================ [SKIPPED] xe_dma_buf_kunit ================
[13:47:53] =================== [SKIPPED] xe_dma_buf ===================
[13:47:53] ================= xe_bo_shrink (1 subtest) =================
[13:47:53] =================== xe_bo_shrink_kunit  ====================
[13:47:53] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[13:47:53] ================== [SKIPPED] xe_bo_shrink ==================
[13:47:53] ==================== xe_bo (2 subtests) ====================
[13:47:53] ================== xe_ccs_migrate_kunit  ===================
[13:47:53] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[13:47:53] ==================== xe_bo_evict_kunit  ====================
[13:47:53] =============== [SKIPPED] xe_bo_evict_kunit ================
[13:47:53] ===================== [SKIPPED] xe_bo ======================
[13:47:53] ==================== args (11 subtests) ====================
[13:47:53] [PASSED] count_args_test
[13:47:53] [PASSED] call_args_example
[13:47:53] [PASSED] call_args_test
[13:47:53] [PASSED] drop_first_arg_example
[13:47:53] [PASSED] drop_first_arg_test
[13:47:53] [PASSED] first_arg_example
[13:47:53] [PASSED] first_arg_test
[13:47:53] [PASSED] last_arg_example
[13:47:53] [PASSED] last_arg_test
[13:47:53] [PASSED] pick_arg_example
[13:47:53] [PASSED] sep_comma_example
[13:47:53] ====================== [PASSED] args =======================
[13:47:53] =================== xe_pci (3 subtests) ====================
[13:47:53] ==================== check_graphics_ip  ====================
[13:47:53] [PASSED] 12.70 Xe_LPG
[13:47:53] [PASSED] 12.71 Xe_LPG
[13:47:53] [PASSED] 12.74 Xe_LPG+
[13:47:53] [PASSED] 20.01 Xe2_HPG
[13:47:53] [PASSED] 20.02 Xe2_HPG
[13:47:53] [PASSED] 20.04 Xe2_LPG
[13:47:53] [PASSED] 30.00 Xe3_LPG
[13:47:53] [PASSED] 30.01 Xe3_LPG
[13:47:53] [PASSED] 30.03 Xe3_LPG
[13:47:53] ================ [PASSED] check_graphics_ip ================
[13:47:53] ===================== check_media_ip  ======================
[13:47:53] [PASSED] 13.00 Xe_LPM+
[13:47:53] [PASSED] 13.01 Xe2_HPM
[13:47:53] [PASSED] 20.00 Xe2_LPM
[13:47:53] [PASSED] 30.00 Xe3_LPM
[13:47:53] [PASSED] 30.02 Xe3_LPM
[13:47:53] ================= [PASSED] check_media_ip ==================
[13:47:53] ================= check_platform_gt_count  =================
[13:47:53] [PASSED] 0x9A60 (TIGERLAKE)
[13:47:53] [PASSED] 0x9A68 (TIGERLAKE)
[13:47:53] [PASSED] 0x9A70 (TIGERLAKE)
[13:47:53] [PASSED] 0x9A40 (TIGERLAKE)
[13:47:53] [PASSED] 0x9A49 (TIGERLAKE)
[13:47:53] [PASSED] 0x9A59 (TIGERLAKE)
[13:47:53] [PASSED] 0x9A78 (TIGERLAKE)
[13:47:53] [PASSED] 0x9AC0 (TIGERLAKE)
[13:47:53] [PASSED] 0x9AC9 (TIGERLAKE)
[13:47:53] [PASSED] 0x9AD9 (TIGERLAKE)
[13:47:53] [PASSED] 0x9AF8 (TIGERLAKE)
[13:47:53] [PASSED] 0x4C80 (ROCKETLAKE)
[13:47:53] [PASSED] 0x4C8A (ROCKETLAKE)
[13:47:53] [PASSED] 0x4C8B (ROCKETLAKE)
[13:47:53] [PASSED] 0x4C8C (ROCKETLAKE)
[13:47:53] [PASSED] 0x4C90 (ROCKETLAKE)
[13:47:53] [PASSED] 0x4C9A (ROCKETLAKE)
[13:47:53] [PASSED] 0x4680 (ALDERLAKE_S)
[13:47:53] [PASSED] 0x4682 (ALDERLAKE_S)
[13:47:53] [PASSED] 0x4688 (ALDERLAKE_S)
[13:47:53] [PASSED] 0x468A (ALDERLAKE_S)
[13:47:53] [PASSED] 0x468B (ALDERLAKE_S)
[13:47:53] [PASSED] 0x4690 (ALDERLAKE_S)
[13:47:53] [PASSED] 0x4692 (ALDERLAKE_S)
[13:47:53] [PASSED] 0x4693 (ALDERLAKE_S)
[13:47:53] [PASSED] 0x46A0 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46A1 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46A2 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46A3 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46A6 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46A8 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46AA (ALDERLAKE_P)
[13:47:53] [PASSED] 0x462A (ALDERLAKE_P)
[13:47:53] [PASSED] 0x4626 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x4628 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46B0 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46B1 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46B2 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46B3 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46C0 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46C1 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46C2 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46C3 (ALDERLAKE_P)
[13:47:53] [PASSED] 0x46D0 (ALDERLAKE_N)
[13:47:53] [PASSED] 0x46D1 (ALDERLAKE_N)
[13:47:53] [PASSED] 0x46D2 (ALDERLAKE_N)
[13:47:53] [PASSED] 0x46D3 (ALDERLAKE_N)
[13:47:53] [PASSED] 0x46D4 (ALDERLAKE_N)
[13:47:53] [PASSED] 0xA721 (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7A1 (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7A9 (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7AC (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7AD (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA720 (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7A0 (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7A8 (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7AA (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA7AB (ALDERLAKE_P)
[13:47:53] [PASSED] 0xA780 (ALDERLAKE_S)
[13:47:53] [PASSED] 0xA781 (ALDERLAKE_S)
[13:47:53] [PASSED] 0xA782 (ALDERLAKE_S)
[13:47:53] [PASSED] 0xA783 (ALDERLAKE_S)
[13:47:53] [PASSED] 0xA788 (ALDERLAKE_S)
[13:47:53] [PASSED] 0xA789 (ALDERLAKE_S)
[13:47:53] [PASSED] 0xA78A (ALDERLAKE_S)
[13:47:53] [PASSED] 0xA78B (ALDERLAKE_S)
[13:47:53] [PASSED] 0x4905 (DG1)
[13:47:53] [PASSED] 0x4906 (DG1)
[13:47:53] [PASSED] 0x4907 (DG1)
[13:47:53] [PASSED] 0x4908 (DG1)
[13:47:53] [PASSED] 0x4909 (DG1)
[13:47:53] [PASSED] 0x56C0 (DG2)
[13:47:53] [PASSED] 0x56C2 (DG2)
[13:47:53] [PASSED] 0x56C1 (DG2)
[13:47:53] [PASSED] 0x7D51 (METEORLAKE)
[13:47:53] [PASSED] 0x7DD1 (METEORLAKE)
[13:47:53] [PASSED] 0x7D41 (METEORLAKE)
[13:47:53] [PASSED] 0x7D67 (METEORLAKE)
[13:47:53] [PASSED] 0xB640 (METEORLAKE)
[13:47:53] [PASSED] 0x56A0 (DG2)
[13:47:53] [PASSED] 0x56A1 (DG2)
[13:47:53] [PASSED] 0x56A2 (DG2)
[13:47:53] [PASSED] 0x56BE (DG2)
[13:47:53] [PASSED] 0x56BF (DG2)
[13:47:53] [PASSED] 0x5690 (DG2)
[13:47:53] [PASSED] 0x5691 (DG2)
[13:47:53] [PASSED] 0x5692 (DG2)
[13:47:53] [PASSED] 0x56A5 (DG2)
[13:47:53] [PASSED] 0x56A6 (DG2)
[13:47:53] [PASSED] 0x56B0 (DG2)
[13:47:53] [PASSED] 0x56B1 (DG2)
[13:47:53] [PASSED] 0x56BA (DG2)
[13:47:53] [PASSED] 0x56BB (DG2)
[13:47:53] [PASSED] 0x56BC (DG2)
[13:47:53] [PASSED] 0x56BD (DG2)
[13:47:53] [PASSED] 0x5693 (DG2)
[13:47:53] [PASSED] 0x5694 (DG2)
[13:47:53] [PASSED] 0x5695 (DG2)
[13:47:53] [PASSED] 0x56A3 (DG2)
[13:47:53] [PASSED] 0x56A4 (DG2)
[13:47:53] [PASSED] 0x56B2 (DG2)
[13:47:53] [PASSED] 0x56B3 (DG2)
[13:47:53] [PASSED] 0x5696 (DG2)
[13:47:53] [PASSED] 0x5697 (DG2)
[13:47:53] [PASSED] 0xB69 (PVC)
[13:47:53] [PASSED] 0xB6E (PVC)
[13:47:53] [PASSED] 0xBD4 (PVC)
[13:47:53] [PASSED] 0xBD5 (PVC)
[13:47:53] [PASSED] 0xBD6 (PVC)
[13:47:53] [PASSED] 0xBD7 (PVC)
[13:47:53] [PASSED] 0xBD8 (PVC)
[13:47:53] [PASSED] 0xBD9 (PVC)
[13:47:53] [PASSED] 0xBDA (PVC)
[13:47:53] [PASSED] 0xBDB (PVC)
[13:47:53] [PASSED] 0xBE0 (PVC)
[13:47:53] [PASSED] 0xBE1 (PVC)
[13:47:53] [PASSED] 0xBE5 (PVC)
[13:47:53] [PASSED] 0x7D40 (METEORLAKE)
[13:47:53] [PASSED] 0x7D45 (METEORLAKE)
[13:47:53] [PASSED] 0x7D55 (METEORLAKE)
[13:47:53] [PASSED] 0x7D60 (METEORLAKE)
[13:47:53] [PASSED] 0x7DD5 (METEORLAKE)
[13:47:53] [PASSED] 0x6420 (LUNARLAKE)
[13:47:53] [PASSED] 0x64A0 (LUNARLAKE)
[13:47:53] [PASSED] 0x64B0 (LUNARLAKE)
[13:47:53] [PASSED] 0xE202 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE209 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE20B (BATTLEMAGE)
[13:47:53] [PASSED] 0xE20C (BATTLEMAGE)
[13:47:53] [PASSED] 0xE20D (BATTLEMAGE)
[13:47:53] [PASSED] 0xE210 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE211 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE212 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE216 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE220 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE221 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE222 (BATTLEMAGE)
[13:47:53] [PASSED] 0xE223 (BATTLEMAGE)
[13:47:53] [PASSED] 0xB080 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB081 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB082 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB083 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB084 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB085 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB086 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB087 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB08F (PANTHERLAKE)
[13:47:53] [PASSED] 0xB090 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB0A0 (PANTHERLAKE)
[13:47:53] [PASSED] 0xB0B0 (PANTHERLAKE)
[13:47:53] [PASSED] 0xFD80 (PANTHERLAKE)
[13:47:53] [PASSED] 0xFD81 (PANTHERLAKE)
[13:47:53] ============= [PASSED] check_platform_gt_count =============
[13:47:53] ===================== [PASSED] xe_pci ======================
[13:47:53] =================== xe_rtp (2 subtests) ====================
[13:47:53] =============== xe_rtp_process_to_sr_tests  ================
[13:47:53] [PASSED] coalesce-same-reg
[13:47:53] [PASSED] no-match-no-add
[13:47:53] [PASSED] match-or
[13:47:53] [PASSED] match-or-xfail
[13:47:53] [PASSED] no-match-no-add-multiple-rules
[13:47:53] [PASSED] two-regs-two-entries
[13:47:53] [PASSED] clr-one-set-other
[13:47:53] [PASSED] set-field
[13:47:53] [PASSED] conflict-duplicate
[13:47:53] [PASSED] conflict-not-disjoint
[13:47:53] [PASSED] conflict-reg-type
[13:47:53] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[13:47:53] ================== xe_rtp_process_tests  ===================
[13:47:53] [PASSED] active1
[13:47:53] [PASSED] active2
[13:47:53] [PASSED] active-inactive
[13:47:53] [PASSED] inactive-active
[13:47:53] [PASSED] inactive-1st_or_active-inactive
[13:47:53] [PASSED] inactive-2nd_or_active-inactive
[13:47:53] [PASSED] inactive-last_or_active-inactive
[13:47:53] [PASSED] inactive-no_or_active-inactive
[13:47:53] ============== [PASSED] xe_rtp_process_tests ===============
[13:47:53] ===================== [PASSED] xe_rtp ======================
[13:47:53] ==================== xe_wa (1 subtest) =====================
[13:47:53] ======================== xe_wa_gt  =========================
[13:47:53] [PASSED] TIGERLAKE (B0)
[13:47:53] [PASSED] DG1 (A0)
[13:47:53] [PASSED] DG1 (B0)
[13:47:53] [PASSED] ALDERLAKE_S (A0)
[13:47:53] [PASSED] ALDERLAKE_S (B0)
[13:47:53] [PASSED] ALDERLAKE_S (C0)
[13:47:53] [PASSED] ALDERLAKE_S (D0)
[13:47:53] [PASSED] ALDERLAKE_P (A0)
[13:47:53] [PASSED] ALDERLAKE_P (B0)
[13:47:53] [PASSED] ALDERLAKE_P (C0)
[13:47:53] [PASSED] ALDERLAKE_S_RPLS (D0)
[13:47:53] [PASSED] ALDERLAKE_P_RPLU (E0)
[13:47:53] [PASSED] DG2_G10 (C0)
[13:47:53] [PASSED] DG2_G11 (B1)
[13:47:53] [PASSED] DG2_G12 (A1)
[13:47:53] [PASSED] METEORLAKE (g:A0, m:A0)
[13:47:53] [PASSED] METEORLAKE (g:A0, m:A0)
[13:47:53] [PASSED] METEORLAKE (g:A0, m:A0)
[13:47:53] [PASSED] LUNARLAKE (g:A0, m:A0)
[13:47:53] [PASSED] LUNARLAKE (g:B0, m:A0)
stty: 'standard input': Inappropriate ioctl for device
[13:47:53] [PASSED] BATTLEMAGE (g:A0, m:A1)
[13:47:53] [PASSED] PANTHERLAKE (g:A0, m:A0)
[13:47:53] ==================== [PASSED] xe_wa_gt =====================
[13:47:53] ====================== [PASSED] xe_wa ======================
[13:47:53] ============================================================
[13:47:53] Testing complete. Ran 298 tests: passed: 282, skipped: 16
[13:47:53] Elapsed time: 33.334s total, 4.200s configuring, 28.768s building, 0.324s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[13:47:53] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:47:54] 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
[13:48:18] Starting KUnit Kernel (1/1)...
[13:48:18] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:48:18] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[13:48:18] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[13:48:18] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[13:48:18] =========== drm_validate_clone_mode (2 subtests) ===========
[13:48:18] ============== drm_test_check_in_clone_mode  ===============
[13:48:18] [PASSED] in_clone_mode
[13:48:18] [PASSED] not_in_clone_mode
[13:48:18] ========== [PASSED] drm_test_check_in_clone_mode ===========
[13:48:18] =============== drm_test_check_valid_clones  ===============
[13:48:18] [PASSED] not_in_clone_mode
[13:48:18] [PASSED] valid_clone
[13:48:18] [PASSED] invalid_clone
[13:48:18] =========== [PASSED] drm_test_check_valid_clones ===========
[13:48:18] ============= [PASSED] drm_validate_clone_mode =============
[13:48:18] ============= drm_validate_modeset (1 subtest) =============
[13:48:18] [PASSED] drm_test_check_connector_changed_modeset
[13:48:18] ============== [PASSED] drm_validate_modeset ===============
[13:48:18] ====== drm_test_bridge_get_current_state (2 subtests) ======
[13:48:18] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[13:48:18] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[13:48:18] ======== [PASSED] drm_test_bridge_get_current_state ========
[13:48:18] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[13:48:18] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[13:48:18] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[13:48:18] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[13:48:18] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[13:48:18] ============== drm_bridge_alloc (2 subtests) ===============
[13:48:18] [PASSED] drm_test_drm_bridge_alloc_basic
[13:48:18] [PASSED] drm_test_drm_bridge_alloc_get_put
[13:48:18] ================ [PASSED] drm_bridge_alloc =================
[13:48:18] ================== drm_buddy (7 subtests) ==================
[13:48:18] [PASSED] drm_test_buddy_alloc_limit
[13:48:18] [PASSED] drm_test_buddy_alloc_optimistic
[13:48:18] [PASSED] drm_test_buddy_alloc_pessimistic
[13:48:18] [PASSED] drm_test_buddy_alloc_pathological
[13:48:18] [PASSED] drm_test_buddy_alloc_contiguous
[13:48:18] [PASSED] drm_test_buddy_alloc_clear
[13:48:18] [PASSED] drm_test_buddy_alloc_range_bias
[13:48:18] ==================== [PASSED] drm_buddy ====================
[13:48:18] ============= drm_cmdline_parser (40 subtests) =============
[13:48:18] [PASSED] drm_test_cmdline_force_d_only
[13:48:18] [PASSED] drm_test_cmdline_force_D_only_dvi
[13:48:18] [PASSED] drm_test_cmdline_force_D_only_hdmi
[13:48:18] [PASSED] drm_test_cmdline_force_D_only_not_digital
[13:48:18] [PASSED] drm_test_cmdline_force_e_only
[13:48:18] [PASSED] drm_test_cmdline_res
[13:48:18] [PASSED] drm_test_cmdline_res_vesa
[13:48:18] [PASSED] drm_test_cmdline_res_vesa_rblank
[13:48:18] [PASSED] drm_test_cmdline_res_rblank
[13:48:18] [PASSED] drm_test_cmdline_res_bpp
[13:48:18] [PASSED] drm_test_cmdline_res_refresh
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[13:48:18] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[13:48:18] [PASSED] drm_test_cmdline_res_margins_force_on
[13:48:18] [PASSED] drm_test_cmdline_res_vesa_margins
[13:48:18] [PASSED] drm_test_cmdline_name
[13:48:18] [PASSED] drm_test_cmdline_name_bpp
[13:48:18] [PASSED] drm_test_cmdline_name_option
[13:48:18] [PASSED] drm_test_cmdline_name_bpp_option
[13:48:18] [PASSED] drm_test_cmdline_rotate_0
[13:48:18] [PASSED] drm_test_cmdline_rotate_90
[13:48:18] [PASSED] drm_test_cmdline_rotate_180
[13:48:18] [PASSED] drm_test_cmdline_rotate_270
[13:48:18] [PASSED] drm_test_cmdline_hmirror
[13:48:18] [PASSED] drm_test_cmdline_vmirror
[13:48:18] [PASSED] drm_test_cmdline_margin_options
[13:48:18] [PASSED] drm_test_cmdline_multiple_options
[13:48:18] [PASSED] drm_test_cmdline_bpp_extra_and_option
[13:48:18] [PASSED] drm_test_cmdline_extra_and_option
[13:48:18] [PASSED] drm_test_cmdline_freestanding_options
[13:48:18] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[13:48:18] [PASSED] drm_test_cmdline_panel_orientation
[13:48:18] ================ drm_test_cmdline_invalid  =================
[13:48:18] [PASSED] margin_only
[13:48:18] [PASSED] interlace_only
[13:48:18] [PASSED] res_missing_x
[13:48:18] [PASSED] res_missing_y
[13:48:18] [PASSED] res_bad_y
[13:48:18] [PASSED] res_missing_y_bpp
[13:48:18] [PASSED] res_bad_bpp
[13:48:18] [PASSED] res_bad_refresh
[13:48:18] [PASSED] res_bpp_refresh_force_on_off
[13:48:18] [PASSED] res_invalid_mode
[13:48:18] [PASSED] res_bpp_wrong_place_mode
[13:48:18] [PASSED] name_bpp_refresh
[13:48:18] [PASSED] name_refresh
[13:48:18] [PASSED] name_refresh_wrong_mode
[13:48:18] [PASSED] name_refresh_invalid_mode
[13:48:18] [PASSED] rotate_multiple
[13:48:18] [PASSED] rotate_invalid_val
[13:48:18] [PASSED] rotate_truncated
[13:48:18] [PASSED] invalid_option
[13:48:18] [PASSED] invalid_tv_option
[13:48:18] [PASSED] truncated_tv_option
[13:48:18] ============ [PASSED] drm_test_cmdline_invalid =============
[13:48:18] =============== drm_test_cmdline_tv_options  ===============
[13:48:18] [PASSED] NTSC
[13:48:18] [PASSED] NTSC_443
[13:48:18] [PASSED] NTSC_J
[13:48:18] [PASSED] PAL
[13:48:18] [PASSED] PAL_M
[13:48:18] [PASSED] PAL_N
[13:48:18] [PASSED] SECAM
[13:48:18] [PASSED] MONO_525
[13:48:18] [PASSED] MONO_625
[13:48:18] =========== [PASSED] drm_test_cmdline_tv_options ===========
[13:48:18] =============== [PASSED] drm_cmdline_parser ================
[13:48:18] ========== drmm_connector_hdmi_init (20 subtests) ==========
[13:48:18] [PASSED] drm_test_connector_hdmi_init_valid
[13:48:18] [PASSED] drm_test_connector_hdmi_init_bpc_8
[13:48:18] [PASSED] drm_test_connector_hdmi_init_bpc_10
[13:48:18] [PASSED] drm_test_connector_hdmi_init_bpc_12
[13:48:18] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[13:48:18] [PASSED] drm_test_connector_hdmi_init_bpc_null
[13:48:18] [PASSED] drm_test_connector_hdmi_init_formats_empty
[13:48:18] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[13:48:18] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[13:48:18] [PASSED] supported_formats=0x9 yuv420_allowed=1
[13:48:18] [PASSED] supported_formats=0x9 yuv420_allowed=0
[13:48:18] [PASSED] supported_formats=0x3 yuv420_allowed=1
[13:48:18] [PASSED] supported_formats=0x3 yuv420_allowed=0
[13:48:18] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[13:48:18] [PASSED] drm_test_connector_hdmi_init_null_ddc
[13:48:18] [PASSED] drm_test_connector_hdmi_init_null_product
[13:48:18] [PASSED] drm_test_connector_hdmi_init_null_vendor
[13:48:18] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[13:48:18] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[13:48:18] [PASSED] drm_test_connector_hdmi_init_product_valid
[13:48:18] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[13:48:18] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[13:48:18] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[13:48:18] ========= drm_test_connector_hdmi_init_type_valid  =========
[13:48:18] [PASSED] HDMI-A
[13:48:18] [PASSED] HDMI-B
[13:48:18] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[13:48:18] ======== drm_test_connector_hdmi_init_type_invalid  ========
[13:48:18] [PASSED] Unknown
[13:48:18] [PASSED] VGA
[13:48:18] [PASSED] DVI-I
[13:48:18] [PASSED] DVI-D
[13:48:18] [PASSED] DVI-A
[13:48:18] [PASSED] Composite
[13:48:18] [PASSED] SVIDEO
[13:48:18] [PASSED] LVDS
[13:48:18] [PASSED] Component
[13:48:18] [PASSED] DIN
[13:48:18] [PASSED] DP
[13:48:18] [PASSED] TV
[13:48:18] [PASSED] eDP
[13:48:18] [PASSED] Virtual
[13:48:18] [PASSED] DSI
[13:48:18] [PASSED] DPI
[13:48:18] [PASSED] Writeback
[13:48:18] [PASSED] SPI
[13:48:18] [PASSED] USB
[13:48:18] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[13:48:18] ============ [PASSED] drmm_connector_hdmi_init =============
[13:48:18] ============= drmm_connector_init (3 subtests) =============
[13:48:18] [PASSED] drm_test_drmm_connector_init
[13:48:18] [PASSED] drm_test_drmm_connector_init_null_ddc
[13:48:18] ========= drm_test_drmm_connector_init_type_valid  =========
[13:48:18] [PASSED] Unknown
[13:48:18] [PASSED] VGA
[13:48:18] [PASSED] DVI-I
[13:48:18] [PASSED] DVI-D
[13:48:18] [PASSED] DVI-A
[13:48:18] [PASSED] Composite
[13:48:18] [PASSED] SVIDEO
[13:48:18] [PASSED] LVDS
[13:48:18] [PASSED] Component
[13:48:18] [PASSED] DIN
[13:48:18] [PASSED] DP
[13:48:18] [PASSED] HDMI-A
[13:48:18] [PASSED] HDMI-B
[13:48:18] [PASSED] TV
[13:48:18] [PASSED] eDP
[13:48:18] [PASSED] Virtual
[13:48:18] [PASSED] DSI
[13:48:18] [PASSED] DPI
[13:48:18] [PASSED] Writeback
[13:48:18] [PASSED] SPI
[13:48:18] [PASSED] USB
[13:48:18] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[13:48:18] =============== [PASSED] drmm_connector_init ===============
[13:48:18] ========= drm_connector_dynamic_init (6 subtests) ==========
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_init
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_init_properties
[13:48:18] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[13:48:18] [PASSED] Unknown
[13:48:18] [PASSED] VGA
[13:48:18] [PASSED] DVI-I
[13:48:18] [PASSED] DVI-D
[13:48:18] [PASSED] DVI-A
[13:48:18] [PASSED] Composite
[13:48:18] [PASSED] SVIDEO
[13:48:18] [PASSED] LVDS
[13:48:18] [PASSED] Component
[13:48:18] [PASSED] DIN
[13:48:18] [PASSED] DP
[13:48:18] [PASSED] HDMI-A
[13:48:18] [PASSED] HDMI-B
[13:48:18] [PASSED] TV
[13:48:18] [PASSED] eDP
[13:48:18] [PASSED] Virtual
[13:48:18] [PASSED] DSI
[13:48:18] [PASSED] DPI
[13:48:18] [PASSED] Writeback
[13:48:18] [PASSED] SPI
[13:48:18] [PASSED] USB
[13:48:18] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[13:48:18] ======== drm_test_drm_connector_dynamic_init_name  =========
[13:48:18] [PASSED] Unknown
[13:48:18] [PASSED] VGA
[13:48:18] [PASSED] DVI-I
[13:48:18] [PASSED] DVI-D
[13:48:18] [PASSED] DVI-A
[13:48:18] [PASSED] Composite
[13:48:18] [PASSED] SVIDEO
[13:48:18] [PASSED] LVDS
[13:48:18] [PASSED] Component
[13:48:18] [PASSED] DIN
[13:48:18] [PASSED] DP
[13:48:18] [PASSED] HDMI-A
[13:48:18] [PASSED] HDMI-B
[13:48:18] [PASSED] TV
[13:48:18] [PASSED] eDP
[13:48:18] [PASSED] Virtual
[13:48:18] [PASSED] DSI
[13:48:18] [PASSED] DPI
[13:48:18] [PASSED] Writeback
[13:48:18] [PASSED] SPI
[13:48:18] [PASSED] USB
[13:48:18] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[13:48:18] =========== [PASSED] drm_connector_dynamic_init ============
[13:48:18] ==== drm_connector_dynamic_register_early (4 subtests) =====
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[13:48:18] ====== [PASSED] drm_connector_dynamic_register_early =======
[13:48:18] ======= drm_connector_dynamic_register (7 subtests) ========
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[13:48:18] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[13:48:18] ========= [PASSED] drm_connector_dynamic_register ==========
[13:48:18] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[13:48:18] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[13:48:18] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[13:48:18] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[13:48:18] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[13:48:18] ========== drm_test_get_tv_mode_from_name_valid  ===========
[13:48:18] [PASSED] NTSC
[13:48:18] [PASSED] NTSC-443
[13:48:18] [PASSED] NTSC-J
[13:48:18] [PASSED] PAL
[13:48:18] [PASSED] PAL-M
[13:48:18] [PASSED] PAL-N
[13:48:18] [PASSED] SECAM
[13:48:18] [PASSED] Mono
[13:48:18] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[13:48:18] [PASSED] drm_test_get_tv_mode_from_name_truncated
[13:48:18] ============ [PASSED] drm_get_tv_mode_from_name ============
[13:48:18] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[13:48:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[13:48:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[13:48:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[13:48:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[13:48:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[13:48:18] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[13:48:18] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[13:48:18] [PASSED] VIC 96
[13:48:18] [PASSED] VIC 97
[13:48:18] [PASSED] VIC 101
[13:48:18] [PASSED] VIC 102
[13:48:18] [PASSED] VIC 106
[13:48:18] [PASSED] VIC 107
[13:48:18] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[13:48:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[13:48:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[13:48:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[13:48:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[13:48:18] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[13:48:18] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[13:48:18] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[13:48:18] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[13:48:18] [PASSED] Automatic
[13:48:18] [PASSED] Full
[13:48:18] [PASSED] Limited 16:235
[13:48:18] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[13:48:18] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[13:48:18] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[13:48:18] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[13:48:18] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[13:48:18] [PASSED] RGB
[13:48:18] [PASSED] YUV 4:2:0
[13:48:18] [PASSED] YUV 4:2:2
[13:48:18] [PASSED] YUV 4:4:4
[13:48:18] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[13:48:18] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[13:48:18] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[13:48:18] ============= drm_damage_helper (21 subtests) ==============
[13:48:18] [PASSED] drm_test_damage_iter_no_damage
[13:48:18] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[13:48:18] [PASSED] drm_test_damage_iter_no_damage_src_moved
[13:48:18] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[13:48:18] [PASSED] drm_test_damage_iter_no_damage_not_visible
[13:48:18] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[13:48:18] [PASSED] drm_test_damage_iter_no_damage_no_fb
[13:48:18] [PASSED] drm_test_damage_iter_simple_damage
[13:48:18] [PASSED] drm_test_damage_iter_single_damage
[13:48:18] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[13:48:18] [PASSED] drm_test_damage_iter_single_damage_outside_src
[13:48:18] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[13:48:18] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[13:48:18] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[13:48:18] [PASSED] drm_test_damage_iter_single_damage_src_moved
[13:48:18] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[13:48:18] [PASSED] drm_test_damage_iter_damage
[13:48:18] [PASSED] drm_test_damage_iter_damage_one_intersect
[13:48:18] [PASSED] drm_test_damage_iter_damage_one_outside
[13:48:18] [PASSED] drm_test_damage_iter_damage_src_moved
[13:48:18] [PASSED] drm_test_damage_iter_damage_not_visible
[13:48:18] ================ [PASSED] drm_damage_helper ================
[13:48:18] ============== drm_dp_mst_helper (3 subtests) ==============
[13:48:18] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[13:48:18] [PASSED] Clock 154000 BPP 30 DSC disabled
[13:48:18] [PASSED] Clock 234000 BPP 30 DSC disabled
[13:48:18] [PASSED] Clock 297000 BPP 24 DSC disabled
[13:48:18] [PASSED] Clock 332880 BPP 24 DSC enabled
[13:48:18] [PASSED] Clock 324540 BPP 24 DSC enabled
[13:48:18] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[13:48:18] ============== drm_test_dp_mst_calc_pbn_div  ===============
[13:48:18] [PASSED] Link rate 2000000 lane count 4
[13:48:18] [PASSED] Link rate 2000000 lane count 2
[13:48:18] [PASSED] Link rate 2000000 lane count 1
[13:48:18] [PASSED] Link rate 1350000 lane count 4
[13:48:18] [PASSED] Link rate 1350000 lane count 2
[13:48:18] [PASSED] Link rate 1350000 lane count 1
[13:48:18] [PASSED] Link rate 1000000 lane count 4
[13:48:18] [PASSED] Link rate 1000000 lane count 2
[13:48:18] [PASSED] Link rate 1000000 lane count 1
[13:48:18] [PASSED] Link rate 810000 lane count 4
[13:48:18] [PASSED] Link rate 810000 lane count 2
[13:48:18] [PASSED] Link rate 810000 lane count 1
[13:48:18] [PASSED] Link rate 540000 lane count 4
[13:48:18] [PASSED] Link rate 540000 lane count 2
[13:48:18] [PASSED] Link rate 540000 lane count 1
[13:48:18] [PASSED] Link rate 270000 lane count 4
[13:48:18] [PASSED] Link rate 270000 lane count 2
[13:48:18] [PASSED] Link rate 270000 lane count 1
[13:48:18] [PASSED] Link rate 162000 lane count 4
[13:48:18] [PASSED] Link rate 162000 lane count 2
[13:48:18] [PASSED] Link rate 162000 lane count 1
[13:48:18] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[13:48:18] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[13:48:18] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[13:48:18] [PASSED] DP_POWER_UP_PHY with port number
[13:48:18] [PASSED] DP_POWER_DOWN_PHY with port number
[13:48:18] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[13:48:18] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[13:48:18] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[13:48:18] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[13:48:18] [PASSED] DP_QUERY_PAYLOAD with port number
[13:48:18] [PASSED] DP_QUERY_PAYLOAD with VCPI
[13:48:18] [PASSED] DP_REMOTE_DPCD_READ with port number
[13:48:18] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[13:48:18] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[13:48:18] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[13:48:18] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[13:48:18] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[13:48:18] [PASSED] DP_REMOTE_I2C_READ with port number
[13:48:18] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[13:48:18] [PASSED] DP_REMOTE_I2C_READ with transactions array
[13:48:18] [PASSED] DP_REMOTE_I2C_WRITE with port number
[13:48:18] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[13:48:18] [PASSED] DP_REMOTE_I2C_WRITE with data array
[13:48:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[13:48:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[13:48:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[13:48:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[13:48:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[13:48:18] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[13:48:18] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[13:48:18] ================ [PASSED] drm_dp_mst_helper ================
[13:48:18] ================== drm_exec (7 subtests) ===================
[13:48:18] [PASSED] sanitycheck
[13:48:18] [PASSED] test_lock
[13:48:18] [PASSED] test_lock_unlock
[13:48:18] [PASSED] test_duplicates
[13:48:18] [PASSED] test_prepare
[13:48:18] [PASSED] test_prepare_array
[13:48:18] [PASSED] test_multiple_loops
[13:48:18] ==================== [PASSED] drm_exec =====================
[13:48:18] =========== drm_format_helper_test (17 subtests) ===========
[13:48:18] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[13:48:18] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[13:48:18] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[13:48:18] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[13:48:18] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[13:48:18] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[13:48:18] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[13:48:18] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[13:48:18] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[13:48:18] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[13:48:18] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[13:48:18] ============== drm_test_fb_xrgb8888_to_mono  ===============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[13:48:18] ==================== drm_test_fb_swab  =====================
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ================ [PASSED] drm_test_fb_swab =================
[13:48:18] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[13:48:18] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[13:48:18] [PASSED] single_pixel_source_buffer
[13:48:18] [PASSED] single_pixel_clip_rectangle
[13:48:18] [PASSED] well_known_colors
[13:48:18] [PASSED] destination_pitch
[13:48:18] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[13:48:18] ================= drm_test_fb_clip_offset  =================
[13:48:18] [PASSED] pass through
[13:48:18] [PASSED] horizontal offset
[13:48:18] [PASSED] vertical offset
[13:48:18] [PASSED] horizontal and vertical offset
[13:48:18] [PASSED] horizontal offset (custom pitch)
[13:48:18] [PASSED] vertical offset (custom pitch)
[13:48:18] [PASSED] horizontal and vertical offset (custom pitch)
[13:48:18] ============= [PASSED] drm_test_fb_clip_offset =============
[13:48:18] =================== drm_test_fb_memcpy  ====================
[13:48:18] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[13:48:18] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[13:48:18] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[13:48:18] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[13:48:18] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[13:48:18] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[13:48:18] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[13:48:18] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[13:48:18] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[13:48:18] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[13:48:18] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[13:48:18] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[13:48:18] =============== [PASSED] drm_test_fb_memcpy ================
[13:48:18] ============= [PASSED] drm_format_helper_test ==============
[13:48:18] ================= drm_format (18 subtests) =================
[13:48:18] [PASSED] drm_test_format_block_width_invalid
[13:48:18] [PASSED] drm_test_format_block_width_one_plane
[13:48:18] [PASSED] drm_test_format_block_width_two_plane
[13:48:18] [PASSED] drm_test_format_block_width_three_plane
[13:48:18] [PASSED] drm_test_format_block_width_tiled
[13:48:18] [PASSED] drm_test_format_block_height_invalid
[13:48:18] [PASSED] drm_test_format_block_height_one_plane
[13:48:18] [PASSED] drm_test_format_block_height_two_plane
[13:48:18] [PASSED] drm_test_format_block_height_three_plane
[13:48:18] [PASSED] drm_test_format_block_height_tiled
[13:48:18] [PASSED] drm_test_format_min_pitch_invalid
[13:48:18] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[13:48:18] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[13:48:18] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[13:48:18] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[13:48:18] [PASSED] drm_test_format_min_pitch_two_plane
[13:48:18] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[13:48:18] [PASSED] drm_test_format_min_pitch_tiled
[13:48:18] =================== [PASSED] drm_format ====================
[13:48:18] ============== drm_framebuffer (10 subtests) ===============
[13:48:18] ========== drm_test_framebuffer_check_src_coords  ==========
[13:48:18] [PASSED] Success: source fits into fb
[13:48:18] [PASSED] Fail: overflowing fb with x-axis coordinate
[13:48:18] [PASSED] Fail: overflowing fb with y-axis coordinate
[13:48:18] [PASSED] Fail: overflowing fb with source width
[13:48:18] [PASSED] Fail: overflowing fb with source height
[13:48:18] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[13:48:18] [PASSED] drm_test_framebuffer_cleanup
[13:48:18] =============== drm_test_framebuffer_create  ===============
[13:48:18] [PASSED] ABGR8888 normal sizes
[13:48:18] [PASSED] ABGR8888 max sizes
[13:48:18] [PASSED] ABGR8888 pitch greater than min required
[13:48:18] [PASSED] ABGR8888 pitch less than min required
[13:48:18] [PASSED] ABGR8888 Invalid width
[13:48:18] [PASSED] ABGR8888 Invalid buffer handle
[13:48:18] [PASSED] No pixel format
[13:48:18] [PASSED] ABGR8888 Width 0
[13:48:18] [PASSED] ABGR8888 Height 0
[13:48:18] [PASSED] ABGR8888 Out of bound height * pitch combination
[13:48:18] [PASSED] ABGR8888 Large buffer offset
[13:48:18] [PASSED] ABGR8888 Buffer offset for inexistent plane
[13:48:18] [PASSED] ABGR8888 Invalid flag
[13:48:18] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[13:48:18] [PASSED] ABGR8888 Valid buffer modifier
[13:48:18] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[13:48:18] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[13:48:18] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[13:48:18] [PASSED] NV12 Normal sizes
[13:48:18] [PASSED] NV12 Max sizes
[13:48:18] [PASSED] NV12 Invalid pitch
[13:48:18] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[13:48:18] [PASSED] NV12 different  modifier per-plane
[13:48:18] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[13:48:18] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[13:48:18] [PASSED] NV12 Modifier for inexistent plane
[13:48:18] [PASSED] NV12 Handle for inexistent plane
[13:48:18] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[13:48:18] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[13:48:18] [PASSED] YVU420 Normal sizes
[13:48:18] [PASSED] YVU420 Max sizes
[13:48:18] [PASSED] YVU420 Invalid pitch
[13:48:18] [PASSED] YVU420 Different pitches
[13:48:18] [PASSED] YVU420 Different buffer offsets/pitches
[13:48:18] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[13:48:18] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[13:48:18] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[13:48:18] [PASSED] YVU420 Valid modifier
[13:48:18] [PASSED] YVU420 Different modifiers per plane
[13:48:18] [PASSED] YVU420 Modifier for inexistent plane
[13:48:18] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[13:48:18] [PASSED] X0L2 Normal sizes
[13:48:18] [PASSED] X0L2 Max sizes
[13:48:18] [PASSED] X0L2 Invalid pitch
[13:48:18] [PASSED] X0L2 Pitch greater than minimum required
[13:48:18] [PASSED] X0L2 Handle for inexistent plane
[13:48:18] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[13:48:18] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[13:48:18] [PASSED] X0L2 Valid modifier
[13:48:18] [PASSED] X0L2 Modifier for inexistent plane
[13:48:18] =========== [PASSED] drm_test_framebuffer_create ===========
[13:48:18] [PASSED] drm_test_framebuffer_free
[13:48:18] [PASSED] drm_test_framebuffer_init
[13:48:18] [PASSED] drm_test_framebuffer_init_bad_format
[13:48:18] [PASSED] drm_test_framebuffer_init_dev_mismatch
[13:48:18] [PASSED] drm_test_framebuffer_lookup
[13:48:18] [PASSED] drm_test_framebuffer_lookup_inexistent
[13:48:18] [PASSED] drm_test_framebuffer_modifiers_not_supported
[13:48:18] ================= [PASSED] drm_framebuffer =================
[13:48:18] ================ drm_gem_shmem (8 subtests) ================
[13:48:18] [PASSED] drm_gem_shmem_test_obj_create
[13:48:18] [PASSED] drm_gem_shmem_test_obj_create_private
[13:48:18] [PASSED] drm_gem_shmem_test_pin_pages
[13:48:18] [PASSED] drm_gem_shmem_test_vmap
[13:48:18] [PASSED] drm_gem_shmem_test_get_pages_sgt
[13:48:18] [PASSED] drm_gem_shmem_test_get_sg_table
[13:48:18] [PASSED] drm_gem_shmem_test_madvise
[13:48:18] [PASSED] drm_gem_shmem_test_purge
[13:48:18] ================== [PASSED] drm_gem_shmem ==================
[13:48:18] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[13:48:18] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[13:48:18] [PASSED] Automatic
[13:48:18] [PASSED] Full
[13:48:18] [PASSED] Limited 16:235
[13:48:18] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[13:48:18] [PASSED] drm_test_check_disable_connector
[13:48:18] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[13:48:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[13:48:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[13:48:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[13:48:18] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[13:48:18] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[13:48:18] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[13:48:18] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[13:48:18] [PASSED] drm_test_check_output_bpc_dvi
[13:48:18] [PASSED] drm_test_check_output_bpc_format_vic_1
[13:48:18] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[13:48:18] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[13:48:18] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[13:48:18] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[13:48:18] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[13:48:18] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[13:48:18] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[13:48:18] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[13:48:18] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[13:48:18] [PASSED] drm_test_check_broadcast_rgb_value
[13:48:18] [PASSED] drm_test_check_bpc_8_value
[13:48:18] [PASSED] drm_test_check_bpc_10_value
[13:48:18] [PASSED] drm_test_check_bpc_12_value
[13:48:18] [PASSED] drm_test_check_format_value
[13:48:18] [PASSED] drm_test_check_tmds_char_value
[13:48:18] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[13:48:18] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[13:48:18] [PASSED] drm_test_check_mode_valid
[13:48:18] [PASSED] drm_test_check_mode_valid_reject
[13:48:18] [PASSED] drm_test_check_mode_valid_reject_rate
[13:48:18] [PASSED] drm_test_check_mode_valid_reject_max_clock
[13:48:18] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[13:48:18] ================= drm_managed (2 subtests) =================
[13:48:18] [PASSED] drm_test_managed_release_action
[13:48:18] [PASSED] drm_test_managed_run_action
[13:48:18] =================== [PASSED] drm_managed ===================
[13:48:18] =================== drm_mm (6 subtests) ====================
[13:48:18] [PASSED] drm_test_mm_init
[13:48:18] [PASSED] drm_test_mm_debug
[13:48:18] [PASSED] drm_test_mm_align32
[13:48:18] [PASSED] drm_test_mm_align64
[13:48:18] [PASSED] drm_test_mm_lowest
[13:48:18] [PASSED] drm_test_mm_highest
[13:48:18] ===================== [PASSED] drm_mm ======================
[13:48:18] ============= drm_modes_analog_tv (5 subtests) =============
[13:48:18] [PASSED] drm_test_modes_analog_tv_mono_576i
[13:48:18] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[13:48:18] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[13:48:18] [PASSED] drm_test_modes_analog_tv_pal_576i
[13:48:18] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[13:48:18] =============== [PASSED] drm_modes_analog_tv ===============
[13:48:18] ============== drm_plane_helper (2 subtests) ===============
[13:48:18] =============== drm_test_check_plane_state  ================
[13:48:18] [PASSED] clipping_simple
[13:48:18] [PASSED] clipping_rotate_reflect
[13:48:18] [PASSED] positioning_simple
[13:48:18] [PASSED] upscaling
[13:48:18] [PASSED] downscaling
[13:48:18] [PASSED] rounding1
[13:48:18] [PASSED] rounding2
[13:48:18] [PASSED] rounding3
[13:48:18] [PASSED] rounding4
[13:48:18] =========== [PASSED] drm_test_check_plane_state ============
[13:48:18] =========== drm_test_check_invalid_plane_state  ============
[13:48:18] [PASSED] positioning_invalid
[13:48:18] [PASSED] upscaling_invalid
[13:48:18] [PASSED] downscaling_invalid
[13:48:18] ======= [PASSED] drm_test_check_invalid_plane_state ========
[13:48:18] ================ [PASSED] drm_plane_helper =================
[13:48:18] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[13:48:18] ====== drm_test_connector_helper_tv_get_modes_check  =======
[13:48:18] [PASSED] None
[13:48:18] [PASSED] PAL
[13:48:18] [PASSED] NTSC
[13:48:18] [PASSED] Both, NTSC Default
[13:48:18] [PASSED] Both, PAL Default
[13:48:18] [PASSED] Both, NTSC Default, with PAL on command-line
[13:48:18] [PASSED] Both, PAL Default, with NTSC on command-line
[13:48:18] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[13:48:18] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[13:48:18] ================== drm_rect (9 subtests) ===================
[13:48:18] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[13:48:18] [PASSED] drm_test_rect_clip_scaled_not_clipped
[13:48:18] [PASSED] drm_test_rect_clip_scaled_clipped
[13:48:18] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[13:48:18] ================= drm_test_rect_intersect  =================
[13:48:18] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[13:48:18] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[13:48:18] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[13:48:18] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[13:48:18] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[13:48:18] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[13:48:18] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[13:48:18] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[13:48:18] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[13:48:18] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[13:48:18] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[13:48:18] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[13:48:18] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[13:48:18] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[13:48:18] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[13:48:18] ============= [PASSED] drm_test_rect_intersect =============
[13:48:18] ================ drm_test_rect_calc_hscale  ================
[13:48:18] [PASSED] normal use
[13:48:18] [PASSED] out of max range
[13:48:18] [PASSED] out of min range
[13:48:18] [PASSED] zero dst
[13:48:18] [PASSED] negative src
[13:48:18] [PASSED] negative dst
[13:48:18] ============ [PASSED] drm_test_rect_calc_hscale ============
[13:48:18] ================ drm_test_rect_calc_vscale  ================
[13:48:18] [PASSED] normal use
[13:48:18] [PASSED] out of max range
[13:48:18] [PASSED] out of min range
[13:48:18] [PASSED] zero dst
[13:48:18] [PASSED] negative src
[13:48:18] [PASSED] negative dst
[13:48:18] ============ [PASSED] drm_test_rect_calc_vscale ============
[13:48:18] ================== drm_test_rect_rotate  ===================
[13:48:18] [PASSED] reflect-x
[13:48:18] [PASSED] reflect-y
[13:48:18] [PASSED] rotate-0
[13:48:18] [PASSED] rotate-90
[13:48:18] [PASSED] rotate-180
[13:48:18] [PASSED] rotate-270
stty: 'standard input': Inappropriate ioctl for device
[13:48:18] ============== [PASSED] drm_test_rect_rotate ===============
[13:48:18] ================ drm_test_rect_rotate_inv  =================
[13:48:18] [PASSED] reflect-x
[13:48:18] [PASSED] reflect-y
[13:48:18] [PASSED] rotate-0
[13:48:18] [PASSED] rotate-90
[13:48:18] [PASSED] rotate-180
[13:48:18] [PASSED] rotate-270
[13:48:18] ============ [PASSED] drm_test_rect_rotate_inv =============
[13:48:18] ==================== [PASSED] drm_rect =====================
[13:48:18] ============ drm_sysfb_modeset_test (1 subtest) ============
[13:48:18] ============ drm_test_sysfb_build_fourcc_list  =============
[13:48:18] [PASSED] no native formats
[13:48:18] [PASSED] XRGB8888 as native format
[13:48:18] [PASSED] remove duplicates
[13:48:18] [PASSED] convert alpha formats
[13:48:18] [PASSED] random formats
[13:48:18] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[13:48:18] ============= [PASSED] drm_sysfb_modeset_test ==============
[13:48:18] ============================================================
[13:48:18] Testing complete. Ran 616 tests: passed: 616
[13:48:18] Elapsed time: 25.014s total, 1.768s configuring, 23.076s building, 0.169s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[13:48:18] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:48:20] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:48:28] Starting KUnit Kernel (1/1)...
[13:48:28] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:48:28] ================= ttm_device (5 subtests) ==================
[13:48:28] [PASSED] ttm_device_init_basic
[13:48:28] [PASSED] ttm_device_init_multiple
[13:48:28] [PASSED] ttm_device_fini_basic
[13:48:28] [PASSED] ttm_device_init_no_vma_man
[13:48:28] ================== ttm_device_init_pools  ==================
[13:48:28] [PASSED] No DMA allocations, no DMA32 required
[13:48:28] [PASSED] DMA allocations, DMA32 required
[13:48:28] [PASSED] No DMA allocations, DMA32 required
[13:48:28] [PASSED] DMA allocations, no DMA32 required
[13:48:28] ============== [PASSED] ttm_device_init_pools ==============
[13:48:28] =================== [PASSED] ttm_device ====================
[13:48:28] ================== ttm_pool (8 subtests) ===================
[13:48:28] ================== ttm_pool_alloc_basic  ===================
[13:48:28] [PASSED] One page
[13:48:28] [PASSED] More than one page
[13:48:28] [PASSED] Above the allocation limit
[13:48:28] [PASSED] One page, with coherent DMA mappings enabled
[13:48:28] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:48:28] ============== [PASSED] ttm_pool_alloc_basic ===============
[13:48:28] ============== ttm_pool_alloc_basic_dma_addr  ==============
[13:48:28] [PASSED] One page
[13:48:28] [PASSED] More than one page
[13:48:28] [PASSED] Above the allocation limit
[13:48:28] [PASSED] One page, with coherent DMA mappings enabled
[13:48:28] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:48:28] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[13:48:28] [PASSED] ttm_pool_alloc_order_caching_match
[13:48:28] [PASSED] ttm_pool_alloc_caching_mismatch
[13:48:28] [PASSED] ttm_pool_alloc_order_mismatch
[13:48:28] [PASSED] ttm_pool_free_dma_alloc
[13:48:28] [PASSED] ttm_pool_free_no_dma_alloc
[13:48:28] [PASSED] ttm_pool_fini_basic
[13:48:28] ==================== [PASSED] ttm_pool =====================
[13:48:28] ================ ttm_resource (8 subtests) =================
[13:48:28] ================= ttm_resource_init_basic  =================
[13:48:28] [PASSED] Init resource in TTM_PL_SYSTEM
[13:48:28] [PASSED] Init resource in TTM_PL_VRAM
[13:48:28] [PASSED] Init resource in a private placement
[13:48:28] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[13:48:28] ============= [PASSED] ttm_resource_init_basic =============
[13:48:28] [PASSED] ttm_resource_init_pinned
[13:48:28] [PASSED] ttm_resource_fini_basic
[13:48:28] [PASSED] ttm_resource_manager_init_basic
[13:48:28] [PASSED] ttm_resource_manager_usage_basic
[13:48:28] [PASSED] ttm_resource_manager_set_used_basic
[13:48:28] [PASSED] ttm_sys_man_alloc_basic
[13:48:28] [PASSED] ttm_sys_man_free_basic
[13:48:28] ================== [PASSED] ttm_resource ===================
[13:48:28] =================== ttm_tt (15 subtests) ===================
[13:48:28] ==================== ttm_tt_init_basic  ====================
[13:48:28] [PASSED] Page-aligned size
[13:48:28] [PASSED] Extra pages requested
[13:48:28] ================ [PASSED] ttm_tt_init_basic ================
[13:48:28] [PASSED] ttm_tt_init_misaligned
[13:48:28] [PASSED] ttm_tt_fini_basic
[13:48:28] [PASSED] ttm_tt_fini_sg
[13:48:28] [PASSED] ttm_tt_fini_shmem
[13:48:28] [PASSED] ttm_tt_create_basic
[13:48:28] [PASSED] ttm_tt_create_invalid_bo_type
[13:48:28] [PASSED] ttm_tt_create_ttm_exists
[13:48:28] [PASSED] ttm_tt_create_failed
[13:48:28] [PASSED] ttm_tt_destroy_basic
[13:48:28] [PASSED] ttm_tt_populate_null_ttm
[13:48:28] [PASSED] ttm_tt_populate_populated_ttm
[13:48:28] [PASSED] ttm_tt_unpopulate_basic
[13:48:28] [PASSED] ttm_tt_unpopulate_empty_ttm
[13:48:28] [PASSED] ttm_tt_swapin_basic
[13:48:28] ===================== [PASSED] ttm_tt ======================
[13:48:28] =================== ttm_bo (14 subtests) ===================
[13:48:28] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[13:48:28] [PASSED] Cannot be interrupted and sleeps
[13:48:28] [PASSED] Cannot be interrupted, locks straight away
[13:48:28] [PASSED] Can be interrupted, sleeps
[13:48:28] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[13:48:28] [PASSED] ttm_bo_reserve_locked_no_sleep
[13:48:28] [PASSED] ttm_bo_reserve_no_wait_ticket
[13:48:28] [PASSED] ttm_bo_reserve_double_resv
[13:48:28] [PASSED] ttm_bo_reserve_interrupted
[13:48:28] [PASSED] ttm_bo_reserve_deadlock
[13:48:28] [PASSED] ttm_bo_unreserve_basic
[13:48:28] [PASSED] ttm_bo_unreserve_pinned
[13:48:28] [PASSED] ttm_bo_unreserve_bulk
[13:48:28] [PASSED] ttm_bo_put_basic
[13:48:28] [PASSED] ttm_bo_put_shared_resv
[13:48:28] [PASSED] ttm_bo_pin_basic
[13:48:28] [PASSED] ttm_bo_pin_unpin_resource
[13:48:28] [PASSED] ttm_bo_multiple_pin_one_unpin
[13:48:28] ===================== [PASSED] ttm_bo ======================
[13:48:28] ============== ttm_bo_validate (21 subtests) ===============
[13:48:28] ============== ttm_bo_init_reserved_sys_man  ===============
[13:48:28] [PASSED] Buffer object for userspace
[13:48:28] [PASSED] Kernel buffer object
[13:48:28] [PASSED] Shared buffer object
[13:48:28] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[13:48:28] ============== ttm_bo_init_reserved_mock_man  ==============
[13:48:28] [PASSED] Buffer object for userspace
[13:48:28] [PASSED] Kernel buffer object
[13:48:28] [PASSED] Shared buffer object
[13:48:28] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[13:48:28] [PASSED] ttm_bo_init_reserved_resv
[13:48:28] ================== ttm_bo_validate_basic  ==================
[13:48:28] [PASSED] Buffer object for userspace
[13:48:28] [PASSED] Kernel buffer object
[13:48:28] [PASSED] Shared buffer object
[13:48:28] ============== [PASSED] ttm_bo_validate_basic ==============
[13:48:28] [PASSED] ttm_bo_validate_invalid_placement
[13:48:28] ============= ttm_bo_validate_same_placement  ==============
[13:48:28] [PASSED] System manager
[13:48:28] [PASSED] VRAM manager
[13:48:28] ========= [PASSED] ttm_bo_validate_same_placement ==========
[13:48:28] [PASSED] ttm_bo_validate_failed_alloc
[13:48:28] [PASSED] ttm_bo_validate_pinned
[13:48:28] [PASSED] ttm_bo_validate_busy_placement
[13:48:28] ================ ttm_bo_validate_multihop  =================
[13:48:28] [PASSED] Buffer object for userspace
[13:48:28] [PASSED] Kernel buffer object
[13:48:28] [PASSED] Shared buffer object
[13:48:28] ============ [PASSED] ttm_bo_validate_multihop =============
[13:48:28] ========== ttm_bo_validate_no_placement_signaled  ==========
[13:48:28] [PASSED] Buffer object in system domain, no page vector
[13:48:28] [PASSED] Buffer object in system domain with an existing page vector
[13:48:28] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[13:48:28] ======== ttm_bo_validate_no_placement_not_signaled  ========
[13:48:28] [PASSED] Buffer object for userspace
[13:48:28] [PASSED] Kernel buffer object
[13:48:28] [PASSED] Shared buffer object
[13:48:28] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[13:48:28] [PASSED] ttm_bo_validate_move_fence_signaled
[13:48:28] ========= ttm_bo_validate_move_fence_not_signaled  =========
[13:48:28] [PASSED] Waits for GPU
[13:48:28] [PASSED] Tries to lock straight away
[13:48:28] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[13:48:28] [PASSED] ttm_bo_validate_happy_evict
[13:48:28] [PASSED] ttm_bo_validate_all_pinned_evict
[13:48:28] [PASSED] ttm_bo_validate_allowed_only_evict
[13:48:28] [PASSED] ttm_bo_validate_deleted_evict
[13:48:28] [PASSED] ttm_bo_validate_busy_domain_evict
[13:48:28] [PASSED] ttm_bo_validate_evict_gutting
[13:48:28] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[13:48:28] ================= [PASSED] ttm_bo_validate =================
[13:48:28] ============================================================
[13:48:28] Testing complete. Ran 101 tests: passed: 101
[13:48:28] Elapsed time: 9.960s total, 1.764s configuring, 7.980s building, 0.182s running

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



^ permalink raw reply	[flat|nested] 9+ messages in thread

* ✓ Xe.CI.BAT: success for series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
  2025-08-28 10:56 [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Arunpravin Paneer Selvam
                   ` (3 preceding siblings ...)
  2025-08-28 13:48 ` ✓ CI.KUnit: success " Patchwork
@ 2025-08-28 14:27 ` Patchwork
  2025-08-28 17:36 ` ✓ Xe.CI.Full: " Patchwork
  5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2025-08-28 14:27 UTC (permalink / raw)
  To: Arunpravin Paneer Selvam; +Cc: intel-xe

[-- Attachment #1: Type: text/plain, Size: 1737 bytes --]

== Series Details ==

Series: series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
URL   : https://patchwork.freedesktop.org/series/153624/
State : success

== Summary ==

CI Bug Log - changes from xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819_BAT -> xe-pw-153624v1_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (11 -> 11)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in xe-pw-153624v1_BAT that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_flip@basic-plain-flip@c-edp1:
    - bat-adlp-7:         [PASS][1] -> [DMESG-WARN][2] ([Intel XE#4543]) +1 other test dmesg-warn
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/bat-adlp-7/igt@kms_flip@basic-plain-flip@c-edp1.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/bat-adlp-7/igt@kms_flip@basic-plain-flip@c-edp1.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#5783]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5783


Build changes
-------------

  * Linux: xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819 -> xe-pw-153624v1

  IGT_8512: 8512
  xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819: e14eaf2708df74f5cd094ae20c05fd897757f819
  xe-pw-153624v1: 153624v1

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/index.html

[-- Attachment #2: Type: text/html, Size: 2236 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* ✓ Xe.CI.Full: success for series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
  2025-08-28 10:56 [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Arunpravin Paneer Selvam
                   ` (4 preceding siblings ...)
  2025-08-28 14:27 ` ✓ Xe.CI.BAT: " Patchwork
@ 2025-08-28 17:36 ` Patchwork
  5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2025-08-28 17:36 UTC (permalink / raw)
  To: Arunpravin Paneer Selvam; +Cc: intel-xe

[-- Attachment #1: Type: text/plain, Size: 81284 bytes --]

== Series Details ==

Series: series starting with [v4,1/2] drm/buddy: Optimize free block management with RB tree
URL   : https://patchwork.freedesktop.org/series/153624/
State : success

== Summary ==

CI Bug Log - changes from xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819_FULL -> xe-pw-153624v1_FULL
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (4 -> 4)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in xe-pw-153624v1_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_addfb_basic@invalid-get-prop-any:
    - shard-dg2-set2:     NOTRUN -> [SKIP][1] ([Intel XE#4208] / [i915#2575]) +4 other tests skip
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_addfb_basic@invalid-get-prop-any.html

  * igt@kms_atomic@plane-invalid-params-fence:
    - shard-dg2-set2:     [PASS][2] -> [SKIP][3] ([Intel XE#4208] / [i915#2575]) +40 other tests skip
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_atomic@plane-invalid-params-fence.html
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_atomic@plane-invalid-params-fence.html

  * igt@kms_atomic_transition@plane-all-modeset-transition:
    - shard-lnl:          NOTRUN -> [SKIP][4] ([Intel XE#3279])
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_atomic_transition@plane-all-modeset-transition.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
    - shard-adlp:         NOTRUN -> [SKIP][5] ([Intel XE#1124])
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
    - shard-lnl:          NOTRUN -> [SKIP][6] ([Intel XE#3658])
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@linear-16bpp-rotate-270:
    - shard-bmg:          NOTRUN -> [SKIP][7] ([Intel XE#2327]) +1 other test skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_big_fb@linear-16bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-180:
    - shard-adlp:         NOTRUN -> [DMESG-FAIL][8] ([Intel XE#4543])
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@kms_big_fb@x-tiled-64bpp-rotate-180.html

  * igt@kms_big_fb@y-tiled-8bpp-rotate-90:
    - shard-adlp:         NOTRUN -> [SKIP][9] ([Intel XE#316])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@kms_big_fb@y-tiled-8bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-bmg:          NOTRUN -> [SKIP][10] ([Intel XE#1124]) +4 other tests skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
    - shard-dg2-set2:     NOTRUN -> [SKIP][11] ([Intel XE#1124]) +3 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-addfb:
    - shard-dg2-set2:     NOTRUN -> [SKIP][12] ([Intel XE#619])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_big_fb@yf-tiled-addfb.html

  * igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
    - shard-bmg:          NOTRUN -> [SKIP][13] ([Intel XE#607])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
    - shard-lnl:          NOTRUN -> [SKIP][14] ([Intel XE#1124]) +1 other test skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html

  * igt@kms_bw@linear-tiling-3-displays-3840x2160p:
    - shard-bmg:          NOTRUN -> [SKIP][15] ([Intel XE#367])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html

  * igt@kms_ccs@bad-aux-stride-y-tiled-gen12-mc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][16] ([Intel XE#2887]) +3 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_ccs@bad-aux-stride-y-tiled-gen12-mc-ccs.html

  * igt@kms_ccs@bad-aux-stride-y-tiled-gen12-mc-ccs@pipe-c-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [SKIP][17] ([Intel XE#787]) +62 other tests skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_ccs@bad-aux-stride-y-tiled-gen12-mc-ccs@pipe-c-hdmi-a-6.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][18] ([Intel XE#2652] / [Intel XE#787]) +8 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs:
    - shard-dg2-set2:     [PASS][19] -> [SKIP][20] ([Intel XE#2351] / [Intel XE#4208]) +4 other tests skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs.html
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs:
    - shard-dg2-set2:     [PASS][21] -> [INCOMPLETE][22] ([Intel XE#3862])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-466/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-432/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-2:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][23] ([Intel XE#3862])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-432/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-2.html

  * igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-rc-ccs@pipe-d-dp-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][24] ([Intel XE#455] / [Intel XE#787]) +12 other tests skip
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-432/igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-rc-ccs@pipe-d-dp-2.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     [PASS][25] -> [DMESG-WARN][26] ([Intel XE#1727] / [Intel XE#3113]) +1 other test dmesg-warn
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
    - shard-dg2-set2:     [PASS][27] -> [INCOMPLETE][28] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-dp-4:
    - shard-dg2-set2:     [PASS][29] -> [INCOMPLETE][30] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4522])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-dp-4.html
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-dp-4.html

  * igt@kms_ccs@random-ccs-data-y-tiled-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][31] ([Intel XE#2887]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_ccs@random-ccs-data-y-tiled-ccs.html

  * igt@kms_cdclk@mode-transition:
    - shard-bmg:          NOTRUN -> [SKIP][32] ([Intel XE#2724])
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-5/igt@kms_cdclk@mode-transition.html

  * igt@kms_chamelium_color@ctm-blue-to-red:
    - shard-dg2-set2:     NOTRUN -> [SKIP][33] ([Intel XE#306])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_chamelium_color@ctm-blue-to-red.html

  * igt@kms_chamelium_edid@dp-edid-stress-resolution-4k:
    - shard-bmg:          NOTRUN -> [SKIP][34] ([Intel XE#2252]) +1 other test skip
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-5/igt@kms_chamelium_edid@dp-edid-stress-resolution-4k.html

  * igt@kms_chamelium_edid@hdmi-mode-timings:
    - shard-dg2-set2:     NOTRUN -> [SKIP][35] ([Intel XE#373]) +2 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_chamelium_edid@hdmi-mode-timings.html

  * igt@kms_chamelium_frames@vga-frame-dump:
    - shard-adlp:         NOTRUN -> [SKIP][36] ([Intel XE#373]) +1 other test skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@kms_chamelium_frames@vga-frame-dump.html
    - shard-lnl:          NOTRUN -> [SKIP][37] ([Intel XE#373]) +1 other test skip
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_chamelium_frames@vga-frame-dump.html

  * igt@kms_content_protection@lic-type-0@pipe-a-dp-4:
    - shard-dg2-set2:     NOTRUN -> [FAIL][38] ([Intel XE#3304])
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_content_protection@lic-type-0@pipe-a-dp-4.html

  * igt@kms_cursor_crc@cursor-onscreen-512x170:
    - shard-bmg:          NOTRUN -> [SKIP][39] ([Intel XE#2321])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_cursor_crc@cursor-onscreen-512x170.html

  * igt@kms_cursor_crc@cursor-random-max-size:
    - shard-bmg:          NOTRUN -> [SKIP][40] ([Intel XE#2320])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_cursor_crc@cursor-random-max-size.html

  * igt@kms_cursor_crc@cursor-sliding-32x32:
    - shard-lnl:          NOTRUN -> [SKIP][41] ([Intel XE#1424])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_cursor_crc@cursor-sliding-32x32.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#309])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html

  * igt@kms_cursor_legacy@flip-vs-cursor-legacy:
    - shard-bmg:          [PASS][43] -> [FAIL][44] ([Intel XE#5299])
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-2/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-2/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-3:
    - shard-bmg:          NOTRUN -> [SKIP][45] ([Intel XE#1340])
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-3.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [SKIP][46] ([Intel XE#4494] / [i915#3804])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-6.html

  * igt@kms_dp_link_training@non-uhbr-mst:
    - shard-lnl:          NOTRUN -> [SKIP][47] ([Intel XE#4354])
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_dp_link_training@non-uhbr-mst.html

  * igt@kms_flip@2x-absolute-wf_vblank:
    - shard-bmg:          [PASS][48] -> [SKIP][49] ([Intel XE#2316]) +1 other test skip
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-1/igt@kms_flip@2x-absolute-wf_vblank.html
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-6/igt@kms_flip@2x-absolute-wf_vblank.html

  * igt@kms_flip@basic-plain-flip@d-hdmi-a1:
    - shard-adlp:         [PASS][50] -> [DMESG-WARN][51] ([Intel XE#4543]) +1 other test dmesg-warn
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-adlp-4/igt@kms_flip@basic-plain-flip@d-hdmi-a1.html
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@kms_flip@basic-plain-flip@d-hdmi-a1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling:
    - shard-lnl:          NOTRUN -> [SKIP][52] ([Intel XE#1401] / [Intel XE#1745])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][53] ([Intel XE#1401])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y:
    - shard-adlp:         [PASS][54] -> [DMESG-FAIL][55] ([Intel XE#4543]) +2 other tests dmesg-fail
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-adlp-8/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y.html
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-c-hdmi-a-1-y-to-y.html

  * igt@kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][56] ([Intel XE#2311]) +9 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-1p-offscren-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][57] ([Intel XE#5390]) +2 other tests skip
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-plflip-blt:
    - shard-adlp:         NOTRUN -> [SKIP][58] ([Intel XE#656]) +2 other tests skip
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-plflip-blt:
    - shard-lnl:          NOTRUN -> [SKIP][59] ([Intel XE#656]) +3 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-tiling-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][60] ([Intel XE#651]) +7 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_frontbuffer_tracking@fbcdrrs-tiling-4.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][61] ([Intel XE#2313]) +10 other tests skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][62] ([Intel XE#2351] / [Intel XE#4208]) +1 other test skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_frontbuffer_tracking@psr-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][63] ([Intel XE#653]) +7 other tests skip
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt.html

  * igt@kms_hdr@invalid-hdr:
    - shard-dg2-set2:     [PASS][64] -> [SKIP][65] ([Intel XE#455])
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-463/igt@kms_hdr@invalid-hdr.html
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-435/igt@kms_hdr@invalid-hdr.html

  * igt@kms_invalid_mode@bad-vsync-start:
    - shard-adlp:         [PASS][66] -> [DMESG-WARN][67] ([Intel XE#2953] / [Intel XE#4173]) +5 other tests dmesg-warn
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-adlp-8/igt@kms_invalid_mode@bad-vsync-start.html
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-6/igt@kms_invalid_mode@bad-vsync-start.html

  * igt@kms_joiner@basic-ultra-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][68] ([Intel XE#2927])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_joiner@basic-ultra-joiner.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][69] ([Intel XE#2927])
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_joiner@basic-ultra-joiner.html

  * igt@kms_pipe_stress@stress-xrgb8888-ytiled:
    - shard-dg2-set2:     NOTRUN -> [SKIP][70] ([Intel XE#4359])
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_pipe_stress@stress-xrgb8888-ytiled.html

  * igt@kms_plane_lowres@tiling-y:
    - shard-lnl:          NOTRUN -> [SKIP][71] ([Intel XE#599])
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_plane_lowres@tiling-y.html

  * igt@kms_plane_multiple@tiling-y:
    - shard-bmg:          NOTRUN -> [SKIP][72] ([Intel XE#5020])
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_plane_multiple@tiling-y.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a:
    - shard-bmg:          NOTRUN -> [SKIP][73] ([Intel XE#2763]) +4 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-5/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-adlp:         [PASS][74] -> [FAIL][75] ([Intel XE#718])
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-adlp-8/igt@kms_pm_dc@dc6-dpms.html
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-6/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_rpm@dpms-lpsp:
    - shard-bmg:          NOTRUN -> [SKIP][76] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#836])
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_pm_rpm@dpms-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][77] ([Intel XE#1406] / [Intel XE#1489]) +1 other test skip
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf.html

  * igt@kms_psr2_sf@pr-overlay-plane-move-continuous-exceed-fully-sf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][78] ([Intel XE#1406] / [Intel XE#4208])
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_psr2_sf@pr-overlay-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area-big-fb:
    - shard-bmg:          NOTRUN -> [SKIP][79] ([Intel XE#1406] / [Intel XE#1489]) +2 other tests skip
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area-big-fb.html

  * igt@kms_psr@fbc-pr-sprite-blt:
    - shard-lnl:          NOTRUN -> [SKIP][80] ([Intel XE#1406])
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@kms_psr@fbc-pr-sprite-blt.html

  * igt@kms_psr@fbc-psr2-sprite-blt:
    - shard-bmg:          NOTRUN -> [SKIP][81] ([Intel XE#1406] / [Intel XE#2234] / [Intel XE#2850]) +3 other tests skip
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@kms_psr@fbc-psr2-sprite-blt.html

  * igt@kms_psr@pr-sprite-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][82] ([Intel XE#1406] / [Intel XE#2351] / [Intel XE#4208])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_psr@pr-sprite-render.html

  * igt@kms_psr@psr-dpms:
    - shard-dg2-set2:     NOTRUN -> [SKIP][83] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +3 other tests skip
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_psr@psr-dpms.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-270:
    - shard-bmg:          NOTRUN -> [SKIP][84] ([Intel XE#3414] / [Intel XE#3904])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_rotation_crc@primary-y-tiled-reflect-x-270.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][85] ([Intel XE#3414])
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_rotation_crc@primary-y-tiled-reflect-x-270.html

  * igt@kms_vrr@flipline:
    - shard-dg2-set2:     NOTRUN -> [SKIP][86] ([Intel XE#455]) +1 other test skip
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_vrr@flipline.html
    - shard-bmg:          NOTRUN -> [SKIP][87] ([Intel XE#1499])
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_vrr@flipline.html

  * igt@xe_eu_stall@unprivileged-access:
    - shard-dg2-set2:     NOTRUN -> [SKIP][88] ([Intel XE#5626])
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_eu_stall@unprivileged-access.html

  * igt@xe_eudebug@discovery-empty:
    - shard-bmg:          NOTRUN -> [SKIP][89] ([Intel XE#4837]) +2 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@xe_eudebug@discovery-empty.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr-invalidate:
    - shard-adlp:         NOTRUN -> [SKIP][90] ([Intel XE#1392] / [Intel XE#5575])
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-userptr-invalidate.html

  * igt@xe_exec_basic@multigpu-once-bindexecqueue-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][91] ([Intel XE#1392]) +1 other test skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@xe_exec_basic@multigpu-once-bindexecqueue-rebind.html

  * igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race:
    - shard-dg2-set2:     [PASS][92] -> [SKIP][93] ([Intel XE#1392]) +4 other tests skip
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-463/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race.html
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-432/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate-race.html

  * igt@xe_exec_basic@multigpu-once-null-defer-mmap:
    - shard-bmg:          NOTRUN -> [SKIP][94] ([Intel XE#2322]) +2 other tests skip
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@xe_exec_basic@multigpu-once-null-defer-mmap.html

  * igt@xe_exec_fault_mode@once-bindexecqueue-rebind:
    - shard-dg2-set2:     NOTRUN -> [SKIP][95] ([Intel XE#4208]) +30 other tests skip
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_exec_fault_mode@once-bindexecqueue-rebind.html

  * igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-rebind-prefetch:
    - shard-dg2-set2:     NOTRUN -> [SKIP][96] ([Intel XE#288]) +6 other tests skip
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-rebind-prefetch.html

  * igt@xe_exec_sip_eudebug@breakpoint-waitsip:
    - shard-dg2-set2:     NOTRUN -> [SKIP][97] ([Intel XE#4837]) +2 other tests skip
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_exec_sip_eudebug@breakpoint-waitsip.html

  * igt@xe_exec_system_allocator@many-free:
    - shard-adlp:         NOTRUN -> [SKIP][98] ([Intel XE#4915]) +6 other tests skip
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-1/igt@xe_exec_system_allocator@many-free.html

  * igt@xe_exec_system_allocator@threads-many-large-execqueues-malloc-mlock-nomemset:
    - shard-dg2-set2:     NOTRUN -> [SKIP][99] ([Intel XE#4915]) +67 other tests skip
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_exec_system_allocator@threads-many-large-execqueues-malloc-mlock-nomemset.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-mmap-new-huge-nomemset:
    - shard-lnl:          NOTRUN -> [SKIP][100] ([Intel XE#4943]) +1 other test skip
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-lnl-1/igt@xe_exec_system_allocator@threads-shared-vm-many-mmap-new-huge-nomemset.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-free-huge:
    - shard-bmg:          NOTRUN -> [SKIP][101] ([Intel XE#4943]) +2 other tests skip
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@xe_exec_system_allocator@threads-shared-vm-many-stride-mmap-free-huge.html

  * igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit:
    - shard-dg2-set2:     NOTRUN -> [SKIP][102] ([Intel XE#2229])
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html

  * igt@xe_oa@syncs-userptr-wait:
    - shard-dg2-set2:     NOTRUN -> [SKIP][103] ([Intel XE#3573])
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_oa@syncs-userptr-wait.html

  * igt@xe_pm@d3cold-basic:
    - shard-bmg:          NOTRUN -> [SKIP][104] ([Intel XE#2284])
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-5/igt@xe_pm@d3cold-basic.html

  * igt@xe_pm@s2idle-exec-after:
    - shard-dg2-set2:     [PASS][105] -> [SKIP][106] ([Intel XE#4208]) +80 other tests skip
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_pm@s2idle-exec-after.html
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_pm@s2idle-exec-after.html

  * igt@xe_pmu@fn-engine-activity-sched-if-idle:
    - shard-dg2-set2:     NOTRUN -> [SKIP][107] ([Intel XE#4650])
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_pmu@fn-engine-activity-sched-if-idle.html

  * igt@xe_pmu@gt-frequency:
    - shard-dg2-set2:     [PASS][108] -> [FAIL][109] ([Intel XE#5166]) +1 other test fail
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-463/igt@xe_pmu@gt-frequency.html
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-435/igt@xe_pmu@gt-frequency.html

  * igt@xe_pxp@pxp-stale-bo-exec-post-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][110] ([Intel XE#4733]) +1 other test skip
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-3/igt@xe_pxp@pxp-stale-bo-exec-post-suspend.html

  * igt@xe_pxp@pxp-stale-queue-post-termination-irq:
    - shard-dg2-set2:     NOTRUN -> [SKIP][111] ([Intel XE#4733])
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_pxp@pxp-stale-queue-post-termination-irq.html

  * igt@xe_query@multigpu-query-invalid-size:
    - shard-bmg:          NOTRUN -> [SKIP][112] ([Intel XE#944])
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-5/igt@xe_query@multigpu-query-invalid-size.html

  * igt@xe_render_copy@render-stress-2-copies:
    - shard-dg2-set2:     NOTRUN -> [SKIP][113] ([Intel XE#4814])
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@xe_render_copy@render-stress-2-copies.html

  
#### Possible fixes ####

  * igt@fbdev@eof:
    - shard-dg2-set2:     [SKIP][114] ([Intel XE#2134]) -> [PASS][115]
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@fbdev@eof.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@fbdev@eof.html

  * igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p:
    - shard-bmg:          [SKIP][116] ([Intel XE#2314] / [Intel XE#2894]) -> [PASS][117]
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc:
    - shard-dg2-set2:     [SKIP][118] ([Intel XE#2351] / [Intel XE#4208]) -> [PASS][119]
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc.html
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_flip@2x-plain-flip-interruptible:
    - shard-bmg:          [SKIP][120] ([Intel XE#2316]) -> [PASS][121] +3 other tests pass
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-6/igt@kms_flip@2x-plain-flip-interruptible.html
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-7/igt@kms_flip@2x-plain-flip-interruptible.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank@c-hdmi-a1:
    - shard-adlp:         [DMESG-WARN][122] ([Intel XE#4543]) -> [PASS][123] +5 other tests pass
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-adlp-1/igt@kms_flip@flip-vs-blocking-wf-vblank@c-hdmi-a1.html
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-3/igt@kms_flip@flip-vs-blocking-wf-vblank@c-hdmi-a1.html

  * igt@kms_flip@flip-vs-suspend@d-dp4:
    - shard-dg2-set2:     [INCOMPLETE][124] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][125] +1 other test pass
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-436/igt@kms_flip@flip-vs-suspend@d-dp4.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-433/igt@kms_flip@flip-vs-suspend@d-dp4.html

  * igt@kms_flip@nonblocking-read:
    - shard-dg2-set2:     [SKIP][126] ([Intel XE#4208] / [i915#2575]) -> [PASS][127] +38 other tests pass
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_flip@nonblocking-read.html
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_flip@nonblocking-read.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling@pipe-a-valid-mode:
    - shard-adlp:         [DMESG-WARN][128] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][129] +3 other tests pass
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-adlp-1/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling@pipe-a-valid-mode.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-3/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-y-to-y:
    - shard-adlp:         [DMESG-FAIL][130] ([Intel XE#4543]) -> [PASS][131] +1 other test pass
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-adlp-8/igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-y-to-y.html
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-adlp-6/igt@kms_flip_tiling@flip-change-tiling@pipe-b-hdmi-a-1-y-to-y.html

  * igt@xe_exec_system_allocator@many-execqueues-mmap-remap-dontunmap-eocheck:
    - shard-bmg:          [FAIL][132] -> [PASS][133]
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-1/igt@xe_exec_system_allocator@many-execqueues-mmap-remap-dontunmap-eocheck.html
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@xe_exec_system_allocator@many-execqueues-mmap-remap-dontunmap-eocheck.html

  * {igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-malloc-prefetch}:
    - shard-bmg:          [INCOMPLETE][134] -> [PASS][135]
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-5/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-malloc-prefetch.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-5/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-malloc-prefetch.html

  * igt@xe_live_ktest@xe_bo:
    - shard-dg2-set2:     [SKIP][136] ([Intel XE#2229] / [Intel XE#455]) -> [PASS][137] +1 other test pass
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_live_ktest@xe_bo.html
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_live_ktest@xe_bo.html

  * igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit:
    - shard-dg2-set2:     [SKIP][138] ([Intel XE#2229]) -> [PASS][139]
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html

  * igt@xe_pmu@engine-activity-idle:
    - shard-bmg:          [DMESG-WARN][140] ([Intel XE#5213]) -> [PASS][141] +1 other test pass
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-1/igt@xe_pmu@engine-activity-idle.html
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@xe_pmu@engine-activity-idle.html

  * igt@xe_vm@invalid-extensions:
    - shard-dg2-set2:     [SKIP][142] ([Intel XE#4208]) -> [PASS][143] +68 other tests pass
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_vm@invalid-extensions.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@xe_vm@invalid-extensions.html

  
#### Warnings ####

  * igt@kms_big_fb@x-tiled-16bpp-rotate-270:
    - shard-dg2-set2:     [SKIP][144] ([Intel XE#4208]) -> [SKIP][145] ([Intel XE#316]) +2 other tests skip
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_big_fb@x-tiled-16bpp-rotate-270.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_big_fb@x-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-270:
    - shard-dg2-set2:     [SKIP][146] ([Intel XE#316]) -> [SKIP][147] ([Intel XE#4208])
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_big_fb@x-tiled-64bpp-rotate-270.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_big_fb@x-tiled-64bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-dg2-set2:     [SKIP][148] ([Intel XE#1124]) -> [SKIP][149] ([Intel XE#2351] / [Intel XE#4208]) +1 other test skip
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
    - shard-dg2-set2:     [SKIP][150] ([Intel XE#4208]) -> [SKIP][151] ([Intel XE#607])
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0:
    - shard-dg2-set2:     [SKIP][152] ([Intel XE#1124]) -> [SKIP][153] ([Intel XE#4208]) +3 other tests skip
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0.html
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - shard-dg2-set2:     [SKIP][154] ([Intel XE#4208]) -> [SKIP][155] ([Intel XE#1124]) +1 other test skip
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p:
    - shard-dg2-set2:     [SKIP][156] ([Intel XE#2191]) -> [SKIP][157] ([Intel XE#4208] / [i915#2575]) +1 other test skip
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p.html

  * igt@kms_bw@linear-tiling-2-displays-3840x2160p:
    - shard-dg2-set2:     [SKIP][158] ([Intel XE#367]) -> [SKIP][159] ([Intel XE#4208] / [i915#2575])
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_bw@linear-tiling-2-displays-3840x2160p.html
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_bw@linear-tiling-2-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-3-displays-3840x2160p:
    - shard-dg2-set2:     [SKIP][160] ([Intel XE#4208] / [i915#2575]) -> [SKIP][161] ([Intel XE#367]) +1 other test skip
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs:
    - shard-dg2-set2:     [SKIP][162] ([Intel XE#4208]) -> [SKIP][163] ([Intel XE#2907]) +1 other test skip
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs:
    - shard-dg2-set2:     [SKIP][164] ([Intel XE#2907]) -> [SKIP][165] ([Intel XE#4208]) +1 other test skip
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html

  * igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs:
    - shard-dg2-set2:     [SKIP][166] ([Intel XE#455] / [Intel XE#787]) -> [SKIP][167] ([Intel XE#4208]) +3 other tests skip
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs.html
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_ccs@crc-primary-rotation-180-y-tiled-gen12-rc-ccs.html

  * igt@kms_ccs@missing-ccs-buffer-yf-tiled-ccs:
    - shard-dg2-set2:     [SKIP][168] ([Intel XE#2351] / [Intel XE#4208]) -> [SKIP][169] ([Intel XE#455] / [Intel XE#787]) +1 other test skip
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_ccs@missing-ccs-buffer-yf-tiled-ccs.html
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_ccs@missing-ccs-buffer-yf-tiled-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
    - shard-dg2-set2:     [INCOMPLETE][170] ([Intel XE#1727] / [Intel XE#3113]) -> [SKIP][171] ([Intel XE#4208])
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_cdclk@mode-transition-all-outputs:
    - shard-dg2-set2:     [SKIP][172] ([Intel XE#2351] / [Intel XE#4208]) -> [SKIP][173] ([Intel XE#4418])
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_cdclk@mode-transition-all-outputs.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_cdclk@mode-transition-all-outputs.html

  * igt@kms_chamelium_color@ctm-red-to-blue:
    - shard-dg2-set2:     [SKIP][174] ([Intel XE#306]) -> [SKIP][175] ([Intel XE#4208] / [i915#2575]) +1 other test skip
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_chamelium_color@ctm-red-to-blue.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_chamelium_color@ctm-red-to-blue.html

  * igt@kms_chamelium_edid@vga-edid-read:
    - shard-dg2-set2:     [SKIP][176] ([Intel XE#373]) -> [SKIP][177] ([Intel XE#4208] / [i915#2575]) +2 other tests skip
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_chamelium_edid@vga-edid-read.html
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_chamelium_edid@vga-edid-read.html

  * igt@kms_chamelium_hpd@vga-hpd-without-ddc:
    - shard-dg2-set2:     [SKIP][178] ([Intel XE#4208] / [i915#2575]) -> [SKIP][179] ([Intel XE#373]) +2 other tests skip
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_chamelium_hpd@vga-hpd-without-ddc.html
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_chamelium_hpd@vga-hpd-without-ddc.html

  * igt@kms_content_protection@lic-type-0:
    - shard-dg2-set2:     [SKIP][180] ([Intel XE#4208] / [i915#2575]) -> [FAIL][181] ([Intel XE#1178])
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_content_protection@lic-type-0.html
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_content_protection@lic-type-0.html

  * igt@kms_cursor_crc@cursor-onscreen-512x170:
    - shard-dg2-set2:     [SKIP][182] ([Intel XE#4208] / [i915#2575]) -> [SKIP][183] ([Intel XE#308])
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_cursor_crc@cursor-onscreen-512x170.html
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_cursor_crc@cursor-onscreen-512x170.html

  * igt@kms_dp_link_training@uhbr-mst:
    - shard-dg2-set2:     [SKIP][184] ([Intel XE#4356]) -> [SKIP][185] ([Intel XE#4208])
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_dp_link_training@uhbr-mst.html
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_dp_link_training@uhbr-mst.html

  * igt@kms_feature_discovery@psr2:
    - shard-dg2-set2:     [SKIP][186] ([Intel XE#1135]) -> [SKIP][187] ([Intel XE#4208] / [i915#2575])
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_feature_discovery@psr2.html
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_feature_discovery@psr2.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling:
    - shard-dg2-set2:     [SKIP][188] ([Intel XE#455]) -> [SKIP][189] ([Intel XE#2351] / [Intel XE#4208])
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling.html
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling:
    - shard-dg2-set2:     [SKIP][190] ([Intel XE#455]) -> [SKIP][191] ([Intel XE#4208])
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling.html
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling.html

  * igt@kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-blt:
    - shard-dg2-set2:     [SKIP][192] ([Intel XE#4208]) -> [SKIP][193] ([Intel XE#651]) +9 other tests skip
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-blt.html
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-render:
    - shard-bmg:          [SKIP][194] ([Intel XE#2312]) -> [SKIP][195] ([Intel XE#2311]) +6 other tests skip
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-render.html
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-7/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][196] ([Intel XE#2311]) -> [SKIP][197] ([Intel XE#2312]) +3 other tests skip
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt.html
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-blt:
    - shard-dg2-set2:     [SKIP][198] ([Intel XE#651]) -> [SKIP][199] ([Intel XE#2351] / [Intel XE#4208]) +1 other test skip
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-blt.html
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-render:
    - shard-dg2-set2:     [SKIP][200] ([Intel XE#651]) -> [SKIP][201] ([Intel XE#4208]) +8 other tests skip
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-render.html
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][202] ([Intel XE#5390]) -> [SKIP][203] ([Intel XE#2312]) +1 other test skip
   [202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html
   [203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][204] ([Intel XE#2312]) -> [SKIP][205] ([Intel XE#5390]) +4 other tests skip
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc:
    - shard-dg2-set2:     [SKIP][206] ([Intel XE#2351] / [Intel XE#4208]) -> [SKIP][207] ([Intel XE#651]) +2 other tests skip
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt:
    - shard-dg2-set2:     [SKIP][208] ([Intel XE#653]) -> [SKIP][209] ([Intel XE#4208]) +6 other tests skip
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt.html
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt:
    - shard-bmg:          [SKIP][210] ([Intel XE#2313]) -> [SKIP][211] ([Intel XE#2312]) +2 other tests skip
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt.html
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-render:
    - shard-bmg:          [SKIP][212] ([Intel XE#2312]) -> [SKIP][213] ([Intel XE#2313]) +9 other tests skip
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-render.html
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-msflip-blt:
    - shard-dg2-set2:     [SKIP][214] ([Intel XE#653]) -> [SKIP][215] ([Intel XE#2351] / [Intel XE#4208]) +4 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-msflip-blt.html
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-dg2-set2:     [SKIP][216] ([Intel XE#2351] / [Intel XE#4208]) -> [SKIP][217] ([Intel XE#653]) +4 other tests skip
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-mmap-wc.html
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-slowdraw:
    - shard-dg2-set2:     [SKIP][218] ([Intel XE#4208]) -> [SKIP][219] ([Intel XE#653]) +7 other tests skip
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_frontbuffer_tracking@psr-slowdraw.html
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_frontbuffer_tracking@psr-slowdraw.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][220] ([Intel XE#3374] / [Intel XE#3544]) -> [SKIP][221] ([Intel XE#3544])
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-2/igt@kms_hdr@brightness-with-hdr.html
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-1/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-dg2-set2:     [SKIP][222] ([Intel XE#4208]) -> [SKIP][223] ([Intel XE#4298])
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_joiner@basic-max-non-joiner.html
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_plane_multiple@tiling-y:
    - shard-dg2-set2:     [SKIP][224] ([Intel XE#4208] / [i915#2575]) -> [SKIP][225] ([Intel XE#5020])
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_plane_multiple@tiling-y.html
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_plane_multiple@tiling-y.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-dg2-set2:     [SKIP][226] ([Intel XE#1129]) -> [SKIP][227] ([Intel XE#4208])
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_pm_dc@dc5-psr.html
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_dc@deep-pkgc:
    - shard-dg2-set2:     [SKIP][228] ([Intel XE#908]) -> [SKIP][229] ([Intel XE#4208])
   [228]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_pm_dc@deep-pkgc.html
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_pm_dc@deep-pkgc.html

  * igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area:
    - shard-dg2-set2:     [SKIP][230] ([Intel XE#1406] / [Intel XE#1489]) -> [SKIP][231] ([Intel XE#1406] / [Intel XE#4208]) +1 other test skip
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area.html
   [231]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_psr2_sf@pr-overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area-big-fb:
    - shard-dg2-set2:     [SKIP][232] ([Intel XE#1406] / [Intel XE#4208]) -> [SKIP][233] ([Intel XE#1406] / [Intel XE#1489]) +1 other test skip
   [232]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area-big-fb.html
   [233]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area-big-fb.html

  * igt@kms_psr@fbc-pr-cursor-plane-move:
    - shard-dg2-set2:     [SKIP][234] ([Intel XE#1406] / [Intel XE#4208]) -> [SKIP][235] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +2 other tests skip
   [234]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_psr@fbc-pr-cursor-plane-move.html
   [235]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_psr@fbc-pr-cursor-plane-move.html

  * igt@kms_psr@fbc-pr-sprite-render:
    - shard-dg2-set2:     [SKIP][236] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) -> [SKIP][237] ([Intel XE#1406] / [Intel XE#2351] / [Intel XE#4208]) +2 other tests skip
   [236]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_psr@fbc-pr-sprite-render.html
   [237]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_psr@fbc-pr-sprite-render.html

  * igt@kms_psr@fbc-psr-cursor-plane-onoff:
    - shard-dg2-set2:     [SKIP][238] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) -> [SKIP][239] ([Intel XE#1406] / [Intel XE#4208]) +2 other tests skip
   [238]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_psr@fbc-psr-cursor-plane-onoff.html
   [239]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_psr@fbc-psr-cursor-plane-onoff.html

  * igt@kms_psr@fbc-psr2-sprite-blt:
    - shard-dg2-set2:     [SKIP][240] ([Intel XE#1406] / [Intel XE#2351] / [Intel XE#4208]) -> [SKIP][241] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +1 other test skip
   [240]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_psr@fbc-psr2-sprite-blt.html
   [241]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_psr@fbc-psr2-sprite-blt.html

  * igt@kms_scaling_modes@scaling-mode-full-aspect:
    - shard-dg2-set2:     [SKIP][242] ([Intel XE#4208] / [i915#2575]) -> [SKIP][243] ([Intel XE#455]) +1 other test skip
   [242]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_scaling_modes@scaling-mode-full-aspect.html
   [243]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@kms_scaling_modes@scaling-mode-full-aspect.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-dg2-set2:     [FAIL][244] ([Intel XE#1729]) -> [SKIP][245] ([Intel XE#4208] / [i915#2575])
   [244]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@kms_tiled_display@basic-test-pattern.html
   [245]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_tv_load_detect@load-detect:
    - shard-dg2-set2:     [SKIP][246] ([Intel XE#4208] / [i915#2575]) -> [SKIP][247] ([Intel XE#330])
   [246]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@kms_tv_load_detect@load-detect.html
   [247]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@kms_tv_load_detect@load-detect.html

  * igt@kms_vrr@flip-basic-fastset:
    - shard-dg2-set2:     [SKIP][248] ([Intel XE#455]) -> [SKIP][249] ([Intel XE#4208] / [i915#2575]) +4 other tests skip
   [248]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@kms_vrr@flip-basic-fastset.html
   [249]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@kms_vrr@flip-basic-fastset.html

  * igt@sriov_basic@enable-vfs-autoprobe-off:
    - shard-dg2-set2:     [SKIP][250] ([Intel XE#4208] / [i915#2575]) -> [SKIP][251] ([Intel XE#1091] / [Intel XE#2849])
   [250]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@sriov_basic@enable-vfs-autoprobe-off.html
   [251]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@sriov_basic@enable-vfs-autoprobe-off.html

  * igt@xe_compute_preempt@compute-preempt:
    - shard-dg2-set2:     [SKIP][252] ([Intel XE#1280] / [Intel XE#455]) -> [SKIP][253] ([Intel XE#4208])
   [252]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@xe_compute_preempt@compute-preempt.html
   [253]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_compute_preempt@compute-preempt.html

  * igt@xe_copy_basic@mem-copy-linear-0x3fff:
    - shard-dg2-set2:     [SKIP][254] ([Intel XE#1123]) -> [SKIP][255] ([Intel XE#4208])
   [254]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_copy_basic@mem-copy-linear-0x3fff.html
   [255]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_copy_basic@mem-copy-linear-0x3fff.html

  * igt@xe_copy_basic@mem-set-linear-0x3fff:
    - shard-dg2-set2:     [SKIP][256] ([Intel XE#1126]) -> [SKIP][257] ([Intel XE#4208])
   [256]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@xe_copy_basic@mem-set-linear-0x3fff.html
   [257]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_copy_basic@mem-set-linear-0x3fff.html

  * igt@xe_eu_stall@blocking-read:
    - shard-dg2-set2:     [SKIP][258] ([Intel XE#4208]) -> [SKIP][259] ([Intel XE#5626])
   [258]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_eu_stall@blocking-read.html
   [259]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_eu_stall@blocking-read.html

  * igt@xe_eudebug@vm-bind-clear-faultable:
    - shard-dg2-set2:     [SKIP][260] ([Intel XE#4837]) -> [SKIP][261] ([Intel XE#4208]) +5 other tests skip
   [260]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_eudebug@vm-bind-clear-faultable.html
   [261]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_eudebug@vm-bind-clear-faultable.html

  * igt@xe_eudebug_online@preempt-breakpoint:
    - shard-dg2-set2:     [SKIP][262] ([Intel XE#4208]) -> [SKIP][263] ([Intel XE#4837]) +7 other tests skip
   [262]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_eudebug_online@preempt-breakpoint.html
   [263]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@xe_eudebug_online@preempt-breakpoint.html

  * igt@xe_exec_basic@multigpu-once-null-defer-bind:
    - shard-dg2-set2:     [SKIP][264] ([Intel XE#1392]) -> [SKIP][265] ([Intel XE#4208]) +1 other test skip
   [264]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@xe_exec_basic@multigpu-once-null-defer-bind.html
   [265]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_exec_basic@multigpu-once-null-defer-bind.html

  * igt@xe_exec_fault_mode@once-rebind-imm:
    - shard-dg2-set2:     [SKIP][266] ([Intel XE#4208]) -> [SKIP][267] ([Intel XE#288]) +8 other tests skip
   [266]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_exec_fault_mode@once-rebind-imm.html
   [267]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@xe_exec_fault_mode@once-rebind-imm.html

  * igt@xe_exec_fault_mode@once-userptr-rebind:
    - shard-dg2-set2:     [SKIP][268] ([Intel XE#288]) -> [SKIP][269] ([Intel XE#4208]) +8 other tests skip
   [268]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@xe_exec_fault_mode@once-userptr-rebind.html
   [269]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_exec_fault_mode@once-userptr-rebind.html

  * igt@xe_exec_reset@parallel-gt-reset:
    - shard-bmg:          [DMESG-WARN][270] ([Intel XE#3876]) -> [DMESG-WARN][271] ([Intel XE#3876] / [Intel XE#5213])
   [270]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-bmg-1/igt@xe_exec_reset@parallel-gt-reset.html
   [271]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-bmg-4/igt@xe_exec_reset@parallel-gt-reset.html

  * igt@xe_exec_system_allocator@process-many-execqueues-free-race:
    - shard-dg2-set2:     [SKIP][272] ([Intel XE#4208]) -> [SKIP][273] ([Intel XE#4915]) +93 other tests skip
   [272]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_exec_system_allocator@process-many-execqueues-free-race.html
   [273]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@xe_exec_system_allocator@process-many-execqueues-free-race.html

  * igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-shared-nomemset:
    - shard-dg2-set2:     [SKIP][274] ([Intel XE#4915]) -> [SKIP][275] ([Intel XE#4208]) +108 other tests skip
   [274]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-shared-nomemset.html
   [275]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_exec_system_allocator@threads-shared-vm-many-execqueues-mmap-shared-nomemset.html

  * igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv:
    - shard-dg2-set2:     [DMESG-WARN][276] -> [DMESG-WARN][277] ([Intel XE#5893])
   [276]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html
   [277]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_fault_injection@probe-fail-guc-xe_guc_mmio_send_recv.html

  * igt@xe_huc_copy@huc_copy:
    - shard-dg2-set2:     [SKIP][278] ([Intel XE#255]) -> [SKIP][279] ([Intel XE#4208])
   [278]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@xe_huc_copy@huc_copy.html
   [279]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_huc_copy@huc_copy.html

  * igt@xe_oa@invalid-oa-metric-set-id:
    - shard-dg2-set2:     [SKIP][280] ([Intel XE#4208]) -> [SKIP][281] ([Intel XE#3573]) +2 other tests skip
   [280]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_oa@invalid-oa-metric-set-id.html
   [281]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_oa@invalid-oa-metric-set-id.html

  * igt@xe_oa@oa-unit-exclusive-stream-sample-oa:
    - shard-dg2-set2:     [SKIP][282] ([Intel XE#3573]) -> [SKIP][283] ([Intel XE#4208]) +3 other tests skip
   [282]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_oa@oa-unit-exclusive-stream-sample-oa.html
   [283]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_oa@oa-unit-exclusive-stream-sample-oa.html

  * igt@xe_pat@display-vs-wb-transient:
    - shard-dg2-set2:     [SKIP][284] ([Intel XE#4208]) -> [SKIP][285] ([Intel XE#1337])
   [284]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_pat@display-vs-wb-transient.html
   [285]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_pat@display-vs-wb-transient.html

  * igt@xe_pm@d3cold-i2c:
    - shard-dg2-set2:     [SKIP][286] ([Intel XE#5694]) -> [SKIP][287] ([Intel XE#4208])
   [286]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-432/igt@xe_pm@d3cold-i2c.html
   [287]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_pm@d3cold-i2c.html

  * igt@xe_pxp@pxp-stale-bo-exec-post-suspend:
    - shard-dg2-set2:     [SKIP][288] ([Intel XE#4208]) -> [SKIP][289] ([Intel XE#4733]) +1 other test skip
   [288]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_pxp@pxp-stale-bo-exec-post-suspend.html
   [289]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_pxp@pxp-stale-bo-exec-post-suspend.html

  * igt@xe_query@multigpu-query-oa-units:
    - shard-dg2-set2:     [SKIP][290] ([Intel XE#944]) -> [SKIP][291] ([Intel XE#4208]) +1 other test skip
   [290]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_query@multigpu-query-oa-units.html
   [291]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_query@multigpu-query-oa-units.html

  * igt@xe_query@multigpu-query-uc-fw-version-huc:
    - shard-dg2-set2:     [SKIP][292] ([Intel XE#4208]) -> [SKIP][293] ([Intel XE#944])
   [292]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_query@multigpu-query-uc-fw-version-huc.html
   [293]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@xe_query@multigpu-query-uc-fw-version-huc.html

  * igt@xe_render_copy@render-stress-1-copies:
    - shard-dg2-set2:     [SKIP][294] ([Intel XE#4208]) -> [SKIP][295] ([Intel XE#4814])
   [294]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_render_copy@render-stress-1-copies.html
   [295]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-466/igt@xe_render_copy@render-stress-1-copies.html

  * igt@xe_sriov_auto_provisioning@selfconfig-reprovision-increase-numvfs:
    - shard-dg2-set2:     [SKIP][296] ([Intel XE#4130]) -> [SKIP][297] ([Intel XE#4208]) +1 other test skip
   [296]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-435/igt@xe_sriov_auto_provisioning@selfconfig-reprovision-increase-numvfs.html
   [297]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-434/igt@xe_sriov_auto_provisioning@selfconfig-reprovision-increase-numvfs.html

  * igt@xe_sriov_flr@flr-each-isolation:
    - shard-dg2-set2:     [SKIP][298] ([Intel XE#4208]) -> [SKIP][299] ([Intel XE#3342])
   [298]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819/shard-dg2-434/igt@xe_sriov_flr@flr-each-isolation.html
   [299]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/shard-dg2-463/igt@xe_sriov_flr@flr-each-isolation.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [Intel XE#1091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1091
  [Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
  [Intel XE#1129]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1129
  [Intel XE#1135]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1135
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1280]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1280
  [Intel XE#1337]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1337
  [Intel XE#1340]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1340
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1401]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1401
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2134]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2134
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2351
  [Intel XE#255]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/255
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
  [Intel XE#2724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2724
  [Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
  [Intel XE#2849]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2849
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2927
  [Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
  [Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#3279]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3279
  [Intel XE#330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/330
  [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
  [Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
  [Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#3862]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3862
  [Intel XE#3876]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3876
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
  [Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
  [Intel XE#4208]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4208
  [Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
  [Intel XE#4298]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4298
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
  [Intel XE#4356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4356
  [Intel XE#4359]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4359
  [Intel XE#4418]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4418
  [Intel XE#4494]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4494
  [Intel XE#4522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4522
  [Intel XE#4543]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4543
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4650]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4650
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#5020]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5020
  [Intel XE#5166]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5166
  [Intel XE#5213]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5213
  [Intel XE#5299]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5299
  [Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
  [Intel XE#5503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5503
  [Intel XE#5575]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5575
  [Intel XE#5626]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5626
  [Intel XE#5694]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5694
  [Intel XE#5890]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5890
  [Intel XE#5893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5893
  [Intel XE#599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/599
  [Intel XE#607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/607
  [Intel XE#619]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/619
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/718
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
  [Intel XE#908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/908
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [i915#2575]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2575
  [i915#3804]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3804


Build changes
-------------

  * Linux: xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819 -> xe-pw-153624v1

  IGT_8512: 8512
  xe-3628-e14eaf2708df74f5cd094ae20c05fd897757f819: e14eaf2708df74f5cd094ae20c05fd897757f819
  xe-pw-153624v1: 153624v1

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-153624v1/index.html

[-- Attachment #2: Type: text/html, Size: 102214 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees
  2025-08-28 11:13   ` Jani Nikula
@ 2025-09-01 19:03     ` Arunpravin Paneer Selvam
  0 siblings, 0 replies; 9+ messages in thread
From: Arunpravin Paneer Selvam @ 2025-09-01 19:03 UTC (permalink / raw)
  To: Jani Nikula, christian.koenig, matthew.auld, dri-devel, amd-gfx,
	intel-gfx, intel-xe
  Cc: alexander.deucher

Hi Jani,

On 8/28/2025 4:43 PM, Jani Nikula wrote:
> On Thu, 28 Aug 2025, Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> wrote:
>> Maintain two separate RB trees per order - one for clear (zeroed) blocks
>> and another for dirty (uncleared) blocks. This separation improves
>> code clarity and makes it more obvious which tree is being searched
>> during allocation. It also improves scalability and efficiency when
>> searching for a specific type of block, avoiding unnecessary checks
>> and making the allocator more predictable under fragmentation.
>>
>> The changes have been validated using the existing drm_buddy_test
>> KUnit test cases, along with selected graphics workloads,
>> to ensure correctness and avoid regressions.
>>
>> v2: Missed adding the suggested-by tag. Added it in v2.
>>
>> v3(Matthew):
>>    - Remove the double underscores from the internal functions.
>>    - Rename the internal functions to have less generic names.
>>    - Fix the error handling code.
>>    - Pass tree argument for the tree macro.
>>    - Use the existing dirty/free bit instead of new tree field.
>>    - Make free_trees[] instead of clear_tree and dirty_tree for
>>      more cleaner approach.
>>
>> v4:
>>    - A bug was reported by Intel CI and it is fixed by
>>      Matthew Auld.
>>    - Replace the get_root function with
>>      &mm->free_trees[tree][order] (Matthew)
>>    - Remove the unnecessary rbtree_is_empty() check (Matthew)
>>    - Remove the unnecessary get_tree_for_flags() function.
>>    - Rename get_tree_for_block() name with get_block_tree() for more
>>      clarity.
>>
>> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
>> Suggested-by: Matthew Auld <matthew.auld@intel.com>
>> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4260
>> ---
>>   drivers/gpu/drm/drm_buddy.c | 322 +++++++++++++++++++++---------------
>>   include/drm/drm_buddy.h     |   8 +-
>>   2 files changed, 192 insertions(+), 138 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
>> index 01ae984340cc..06e90020177f 100644
>> --- a/drivers/gpu/drm/drm_buddy.c
>> +++ b/drivers/gpu/drm/drm_buddy.c
>> @@ -14,6 +14,9 @@
>>   
>>   static struct kmem_cache *slab_blocks;
>>   
>> +#define for_each_free_tree(tree) \
>> +	for ((tree) = CLEAR_TREE; (tree) < MAX_FREE_TREES; (tree)++)
> IMO better to just use 0 and ARRAY_SIZE() for the limits, here and
> everywhere. It's just that there's no connection between the enum and
> how its used anyway.

I moved the enum free_tree in the .h file to .c file and changed the

struct rb_root *free_trees[MAX_FREE_TREES] to struct rb_root 
**free_trees. Since now

the array is a dynamic one, we can't use the ARRAY_SIZE(). Please check 
the v5 version.

Thanks,

Arun.

>
>> +
>>   /*
>>    * for_each_rb_free_block() - iterate over an RB tree in order
>>    * @pos:	the struct type * to use as a loop cursor
>> @@ -78,22 +81,60 @@ static void drm_block_free(struct drm_buddy *mm,
>>   	kmem_cache_free(slab_blocks, block);
>>   }
>>   
>> +static inline enum free_tree
> Please don't use static inline in .c files. Just let the compiler do
> what it deems best.
>
>> +get_block_tree(struct drm_buddy_block *block)
>> +{
>> +	return drm_buddy_block_is_clear(block) ? CLEAR_TREE : DIRTY_TREE;
>> +}
>> +
>> +static inline struct drm_buddy_block *
>> +rbtree_get_free_block(struct rb_node *node)
>> +{
>> +	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
>> +}
>> +
>> +static inline struct drm_buddy_block *
>> +rbtree_prev_free_block(struct rb_node *node)
>> +{
>> +	return rbtree_get_free_block(rb_prev(node));
>> +}
>> +
>> +static inline struct drm_buddy_block *
>> +rbtree_first_free_block(struct rb_root *root)
>> +{
>> +	return rbtree_get_free_block(rb_first(root));
>> +}
>> +
>> +static inline struct drm_buddy_block *
>> +rbtree_last_free_block(struct rb_root *root)
>> +{
>> +	return rbtree_get_free_block(rb_last(root));
>> +}
>> +
>> +static inline bool rbtree_is_empty(struct rb_root *root)
>> +{
>> +	return RB_EMPTY_ROOT(root);
>> +}
>> +
>>   static void rbtree_insert(struct drm_buddy *mm,
>> -			  struct drm_buddy_block *block)
>> +			  struct drm_buddy_block *block,
>> +			  enum free_tree tree)
>>   {
>> -	struct rb_root *root = &mm->free_tree[drm_buddy_block_order(block)];
>> -	struct rb_node **link = &root->rb_node;
>> -	struct rb_node *parent = NULL;
>> +	struct rb_node **link, *parent = NULL;
>>   	struct drm_buddy_block *node;
>> -	u64 offset;
>> +	struct rb_root *root;
>> +	unsigned int order;
>> +
>> +	order = drm_buddy_block_order(block);
>>   
>> -	offset = drm_buddy_block_offset(block);
>> +	root = &mm->free_trees[tree][order];
>> +	link = &root->rb_node;
>>   
>>   	while (*link) {
>>   		parent = *link;
>> -		node = rb_entry(parent, struct drm_buddy_block, rb);
>> +		node = rbtree_get_free_block(parent);
>>   
>> -		if (offset < drm_buddy_block_offset(node))
>> +		if (drm_buddy_block_offset(block) < drm_buddy_block_offset(node))
>>   			link = &parent->rb_left;
>>   		else
>>   			link = &parent->rb_right;
>> @@ -106,27 +147,17 @@ static void rbtree_insert(struct drm_buddy *mm,
>>   static void rbtree_remove(struct drm_buddy *mm,
>>   			  struct drm_buddy_block *block)
>>   {
>> +	unsigned int order = drm_buddy_block_order(block);
>>   	struct rb_root *root;
>> +	enum free_tree tree;
>>   
>> -	root = &mm->free_tree[drm_buddy_block_order(block)];
>> -	rb_erase(&block->rb, root);
>> +	tree = get_block_tree(block);
>> +	root = &mm->free_trees[tree][order];
>>   
>> +	rb_erase(&block->rb, root);
>>   	RB_CLEAR_NODE(&block->rb);
>>   }
>>   
>> -static inline struct drm_buddy_block *
>> -rbtree_last_entry(struct drm_buddy *mm, unsigned int order)
>> -{
>> -	struct rb_node *node = rb_last(&mm->free_tree[order]);
>> -
>> -	return node ? rb_entry(node, struct drm_buddy_block, rb) : NULL;
>> -}
>> -
>> -static bool rbtree_is_empty(struct drm_buddy *mm, unsigned int order)
>> -{
>> -	return RB_EMPTY_ROOT(&mm->free_tree[order]);
>> -}
>> -
>>   static void clear_reset(struct drm_buddy_block *block)
>>   {
>>   	block->header &= ~DRM_BUDDY_HEADER_CLEAR;
>> @@ -149,10 +180,13 @@ static void mark_allocated(struct drm_buddy *mm,
>>   static void mark_free(struct drm_buddy *mm,
>>   		      struct drm_buddy_block *block)
>>   {
>> +	enum free_tree tree;
>> +
>>   	block->header &= ~DRM_BUDDY_HEADER_STATE;
>>   	block->header |= DRM_BUDDY_FREE;
>>   
>> -	rbtree_insert(mm, block);
>> +	tree = get_block_tree(block);
>> +	rbtree_insert(mm, block, tree);
>>   }
>>   
>>   static void mark_split(struct drm_buddy *mm,
>> @@ -238,6 +272,7 @@ static int __force_merge(struct drm_buddy *mm,
>>   			 u64 end,
>>   			 unsigned int min_order)
>>   {
>> +	enum free_tree tree;
>>   	unsigned int order;
>>   	int i;
>>   
>> @@ -247,50 +282,49 @@ static int __force_merge(struct drm_buddy *mm,
>>   	if (min_order > mm->max_order)
>>   		return -EINVAL;
>>   
>> -	for (i = min_order - 1; i >= 0; i--) {
>> -		struct drm_buddy_block *block, *prev_block, *first_block;
>> +	for_each_free_tree(tree) {
>> +		for (i = min_order - 1; i >= 0; i--) {
>> +			struct rb_root *root = &mm->free_trees[tree][i];
>> +			struct drm_buddy_block *block, *prev_block;
>>   
>> -		first_block = rb_entry(rb_first(&mm->free_tree[i]), struct drm_buddy_block, rb);
>> +			for_each_rb_free_block_reverse_safe(block, prev_block, root, rb) {
>> +				struct drm_buddy_block *buddy;
>> +				u64 block_start, block_end;
>>   
>> -		for_each_rb_free_block_reverse_safe(block, prev_block, &mm->free_tree[i], rb) {
>> -			struct drm_buddy_block *buddy;
>> -			u64 block_start, block_end;
>> -
>> -			if (!block->parent)
>> -				continue;
>> +				if (!block->parent)
>> +					continue;
>>   
>> -			block_start = drm_buddy_block_offset(block);
>> -			block_end = block_start + drm_buddy_block_size(mm, block) - 1;
>> +				block_start = drm_buddy_block_offset(block);
>> +				block_end = block_start + drm_buddy_block_size(mm, block) - 1;
>>   
>> -			if (!contains(start, end, block_start, block_end))
>> -				continue;
>> +				if (!contains(start, end, block_start, block_end))
>> +					continue;
>>   
>> -			buddy = __get_buddy(block);
>> -			if (!drm_buddy_block_is_free(buddy))
>> -				continue;
>> +				buddy = __get_buddy(block);
>> +				if (!drm_buddy_block_is_free(buddy))
>> +					continue;
>>   
>> -			WARN_ON(drm_buddy_block_is_clear(block) ==
>> -				drm_buddy_block_is_clear(buddy));
>> +				WARN_ON(drm_buddy_block_is_clear(block) ==
>> +					drm_buddy_block_is_clear(buddy));
>>   
>> -			/*
>> -			 * If the prev block is same as buddy, don't access the
>> -			 * block in the next iteration as we would free the
>> -			 * buddy block as part of the free function.
>> -			 */
>> -			if (prev_block && prev_block == buddy) {
>> -				if (prev_block != first_block)
>> -					prev_block = rb_entry(rb_prev(&prev_block->rb),
>> -							      struct drm_buddy_block,
>> -							      rb);
>> -			}
>> +				/*
>> +				 * If the prev block is same as buddy, don't access the
>> +				 * block in the next iteration as we would free the
>> +				 * buddy block as part of the free function.
>> +				 */
>> +				if (prev_block && prev_block == buddy) {
>> +					if (prev_block != rbtree_first_free_block(root))
>> +						prev_block = rbtree_prev_free_block(&prev_block->rb);
>> +				}
>>   
>> -			rbtree_remove(mm, block);
>> -			if (drm_buddy_block_is_clear(block))
>> -				mm->clear_avail -= drm_buddy_block_size(mm, block);
>> +				rbtree_remove(mm, block);
>> +				if (drm_buddy_block_is_clear(block))
>> +					mm->clear_avail -= drm_buddy_block_size(mm, block);
>>   
>> -			order = __drm_buddy_free(mm, block, true);
>> -			if (order >= min_order)
>> -				return 0;
>> +				order = __drm_buddy_free(mm, block, true);
>> +				if (order >= min_order)
>> +					return 0;
>> +			}
>>   		}
>>   	}
>>   
>> @@ -311,7 +345,7 @@ static int __force_merge(struct drm_buddy *mm,
>>    */
>>   int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>>   {
>> -	unsigned int i;
>> +	unsigned int i, j;
>>   	u64 offset;
>>   
>>   	if (size < chunk_size)
>> @@ -333,14 +367,16 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>>   
>>   	BUG_ON(mm->max_order > DRM_BUDDY_MAX_ORDER);
>>   
>> -	mm->free_tree = kmalloc_array(mm->max_order + 1,
>> -				      sizeof(struct rb_root),
>> -				      GFP_KERNEL);
>> -	if (!mm->free_tree)
>> -		return -ENOMEM;
>> +	for (i = 0; i < MAX_FREE_TREES; i++) {
>> +		mm->free_trees[i] = kmalloc_array(mm->max_order + 1,
>> +						  sizeof(struct rb_root),
>> +						  GFP_KERNEL);
>> +		if (!mm->free_trees[i])
>> +			goto out_free_tree;
>>   
>> -	for (i = 0; i <= mm->max_order; ++i)
>> -		mm->free_tree[i] = RB_ROOT;
>> +		for (j = 0; j <= mm->max_order; ++j)
>> +			mm->free_trees[i][j] = RB_ROOT;
>> +	}
>>   
>>   	mm->n_roots = hweight64(size);
>>   
>> @@ -388,7 +424,8 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
>>   		drm_block_free(mm, mm->roots[i]);
>>   	kfree(mm->roots);
>>   out_free_tree:
>> -	kfree(mm->free_tree);
>> +	while (i--)
>> +		kfree(mm->free_trees[i]);
>>   	return -ENOMEM;
>>   }
>>   EXPORT_SYMBOL(drm_buddy_init);
>> @@ -424,8 +461,9 @@ void drm_buddy_fini(struct drm_buddy *mm)
>>   
>>   	WARN_ON(mm->avail != mm->size);
>>   
>> +	for (i = 0; i < MAX_FREE_TREES; i++)
>> +		kfree(mm->free_trees[i]);
>>   	kfree(mm->roots);
>> -	kfree(mm->free_tree);
>>   }
>>   EXPORT_SYMBOL(drm_buddy_fini);
>>   
>> @@ -449,8 +487,7 @@ static int split_block(struct drm_buddy *mm,
>>   		return -ENOMEM;
>>   	}
>>   
>> -	mark_free(mm, block->left);
>> -	mark_free(mm, block->right);
>> +	mark_split(mm, block);
>>   
>>   	if (drm_buddy_block_is_clear(block)) {
>>   		mark_cleared(block->left);
>> @@ -458,7 +495,8 @@ static int split_block(struct drm_buddy *mm,
>>   		clear_reset(block);
>>   	}
>>   
>> -	mark_split(mm, block);
>> +	mark_free(mm, block->left);
>> +	mark_free(mm, block->right);
>>   
>>   	return 0;
>>   }
>> @@ -491,6 +529,7 @@ EXPORT_SYMBOL(drm_get_buddy);
>>    */
>>   void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
>>   {
>> +	enum free_tree src_tree, dst_tree;
>>   	u64 root_size, size, start;
>>   	unsigned int order;
>>   	int i;
>> @@ -505,19 +544,24 @@ void drm_buddy_reset_clear(struct drm_buddy *mm, bool is_clear)
>>   		size -= root_size;
>>   	}
>>   
>> +	src_tree = is_clear ? DIRTY_TREE : CLEAR_TREE;
>> +	dst_tree = is_clear ? CLEAR_TREE : DIRTY_TREE;
>> +
>>   	for (i = 0; i <= mm->max_order; ++i) {
>> +		struct rb_root *root = &mm->free_trees[src_tree][i];
>>   		struct drm_buddy_block *block;
>>   
>> -		for_each_rb_free_block_reverse(block, &mm->free_tree[i], rb) {
>> -			if (is_clear != drm_buddy_block_is_clear(block)) {
>> -				if (is_clear) {
>> -					mark_cleared(block);
>> -					mm->clear_avail += drm_buddy_block_size(mm, block);
>> -				} else {
>> -					clear_reset(block);
>> -					mm->clear_avail -= drm_buddy_block_size(mm, block);
>> -				}
>> +		for_each_rb_free_block_reverse(block, root, rb) {
>> +			rbtree_remove(mm, block);
>> +			if (is_clear) {
>> +				mark_cleared(block);
>> +				mm->clear_avail += drm_buddy_block_size(mm, block);
>> +			} else {
>> +				clear_reset(block);
>> +				mm->clear_avail -= drm_buddy_block_size(mm, block);
>>   			}
>> +
>> +			rbtree_insert(mm, block, dst_tree);
>>   		}
>>   	}
>>   }
>> @@ -707,23 +751,17 @@ __drm_buddy_alloc_range_bias(struct drm_buddy *mm,
>>   }
>>   
>>   static struct drm_buddy_block *
>> -get_maxblock(struct drm_buddy *mm, unsigned int order,
>> -	     unsigned long flags)
>> +get_maxblock(struct drm_buddy *mm,
>> +	     unsigned int order,
>> +	     enum free_tree tree)
>>   {
>>   	struct drm_buddy_block *max_block = NULL, *block = NULL;
>> +	struct rb_root *root;
>>   	unsigned int i;
>>   
>>   	for (i = order; i <= mm->max_order; ++i) {
>> -		struct drm_buddy_block *tmp_block;
>> -
>> -		for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[i], rb) {
>> -			if (block_incompatible(tmp_block, flags))
>> -				continue;
>> -
>> -			block = tmp_block;
>> -			break;
>> -		}
>> -
>> +		root = &mm->free_trees[tree][i];
>> +		block = rbtree_last_free_block(root);
>>   		if (!block)
>>   			continue;
>>   
>> @@ -747,39 +785,37 @@ alloc_from_freetree(struct drm_buddy *mm,
>>   		    unsigned long flags)
>>   {
>>   	struct drm_buddy_block *block = NULL;
>> +	struct rb_root *root;
>> +	enum free_tree tree;
>>   	unsigned int tmp;
>>   	int err;
>>   
>> +	tree = (flags & DRM_BUDDY_CLEAR_ALLOCATION) ? CLEAR_TREE : DIRTY_TREE;
>> +
>>   	if (flags & DRM_BUDDY_TOPDOWN_ALLOCATION) {
>> -		block = get_maxblock(mm, order, flags);
>> +		block = get_maxblock(mm, order, tree);
>>   		if (block)
>>   			/* Store the obtained block order */
>>   			tmp = drm_buddy_block_order(block);
>>   	} else {
>>   		for (tmp = order; tmp <= mm->max_order; ++tmp) {
>> -			struct drm_buddy_block *tmp_block;
>> -
>> -			for_each_rb_free_block_reverse(tmp_block, &mm->free_tree[tmp], rb) {
>> -				if (block_incompatible(tmp_block, flags))
>> -					continue;
>> -
>> -				block = tmp_block;
>> -				break;
>> -			}
>> -
>> +			/* Get RB tree root for this order and tree */
>> +			root = &mm->free_trees[tree][tmp];
>> +			block = rbtree_last_free_block(root);
>>   			if (block)
>>   				break;
>>   		}
>>   	}
>>   
>>   	if (!block) {
>> -		/* Fallback method */
>> +		/* Try allocating from the other tree */
>> +		tree = (tree == CLEAR_TREE) ? DIRTY_TREE : CLEAR_TREE;
>> +
>>   		for (tmp = order; tmp <= mm->max_order; ++tmp) {
>> -			if (!rbtree_is_empty(mm, tmp)) {
>> -				block = rbtree_last_entry(mm, tmp);
>> -				if (block)
>> -					break;
>> -			}
>> +			root = &mm->free_trees[tree][tmp];
>> +			block = rbtree_last_free_block(root);
>> +			if (block)
>> +				break;
>>   		}
>>   
>>   		if (!block)
>> @@ -923,6 +959,7 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
>>   	u64 rhs_offset, lhs_offset, lhs_size, filled;
>>   	struct drm_buddy_block *block;
>>   	LIST_HEAD(blocks_lhs);
>> +	enum free_tree tree;
>>   	unsigned long pages;
>>   	unsigned int order;
>>   	u64 modify_size;
>> @@ -934,34 +971,39 @@ static int __alloc_contig_try_harder(struct drm_buddy *mm,
>>   	if (order == 0)
>>   		return -ENOSPC;
>>   
>> -	if (rbtree_is_empty(mm, order))
>> +	if (rbtree_is_empty(&mm->free_trees[CLEAR_TREE][order]) &&
>> +	    rbtree_is_empty(&mm->free_trees[DIRTY_TREE][order]))
>>   		return -ENOSPC;
>>   
>> -	for_each_rb_free_block_reverse(block, &mm->free_tree[order], rb) {
>> -		/* Allocate blocks traversing RHS */
>> -		rhs_offset = drm_buddy_block_offset(block);
>> -		err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
>> -					       &filled, blocks);
>> -		if (!err || err != -ENOSPC)
>> -			return err;
>> -
>> -		lhs_size = max((size - filled), min_block_size);
>> -		if (!IS_ALIGNED(lhs_size, min_block_size))
>> -			lhs_size = round_up(lhs_size, min_block_size);
>> -
>> -		/* Allocate blocks traversing LHS */
>> -		lhs_offset = drm_buddy_block_offset(block) - lhs_size;
>> -		err =  __drm_buddy_alloc_range(mm, lhs_offset, lhs_size,
>> -					       NULL, &blocks_lhs);
>> -		if (!err) {
>> -			list_splice(&blocks_lhs, blocks);
>> -			return 0;
>> -		} else if (err != -ENOSPC) {
>> +	for_each_free_tree(tree) {
>> +		struct rb_root *root = &mm->free_trees[tree][order];
>> +
>> +		for_each_rb_free_block_reverse(block, root, rb) {
>> +			/* Allocate blocks traversing RHS */
>> +			rhs_offset = drm_buddy_block_offset(block);
>> +			err =  __drm_buddy_alloc_range(mm, rhs_offset, size,
>> +						       &filled, blocks);
>> +			if (!err || err != -ENOSPC)
>> +				return err;
>> +
>> +			lhs_size = max((size - filled), min_block_size);
>> +			if (!IS_ALIGNED(lhs_size, min_block_size))
>> +				lhs_size = round_up(lhs_size, min_block_size);
>> +
>> +			/* Allocate blocks traversing LHS */
>> +			lhs_offset = drm_buddy_block_offset(block) - lhs_size;
>> +			err =  __drm_buddy_alloc_range(mm, lhs_offset, lhs_size,
>> +						       NULL, &blocks_lhs);
>> +			if (!err) {
>> +				list_splice(&blocks_lhs, blocks);
>> +				return 0;
>> +			} else if (err != -ENOSPC) {
>> +				drm_buddy_free_list_internal(mm, blocks);
>> +				return err;
>> +			}
>> +			/* Free blocks for the next iteration */
>>   			drm_buddy_free_list_internal(mm, blocks);
>> -			return err;
>>   		}
>> -		/* Free blocks for the next iteration */
>> -		drm_buddy_free_list_internal(mm, blocks);
>>   	}
>>   
>>   	return -ENOSPC;
>> @@ -1266,6 +1308,7 @@ EXPORT_SYMBOL(drm_buddy_block_print);
>>    */
>>   void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
>>   {
>> +	enum free_tree tree;
>>   	int order;
>>   
>>   	drm_printf(p, "chunk_size: %lluKiB, total: %lluMiB, free: %lluMiB, clear_free: %lluMiB\n",
>> @@ -1273,11 +1316,16 @@ void drm_buddy_print(struct drm_buddy *mm, struct drm_printer *p)
>>   
>>   	for (order = mm->max_order; order >= 0; order--) {
>>   		struct drm_buddy_block *block;
>> +		struct rb_root *root;
>>   		u64 count = 0, free;
>>   
>> -		for_each_rb_free_block(block, &mm->free_tree[order], rb) {
>> -			BUG_ON(!drm_buddy_block_is_free(block));
>> -			count++;
>> +		for_each_free_tree(tree) {
>> +			root = &mm->free_trees[tree][order];
>> +
>> +			for_each_rb_free_block(block, root, rb) {
>> +				BUG_ON(!drm_buddy_block_is_free(block));
>> +				count++;
>> +			}
>>   		}
>>   
>>   		drm_printf(p, "order-%2d ", order);
>> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h
>> index 091823592034..2fc1cc7b78bf 100644
>> --- a/include/drm/drm_buddy.h
>> +++ b/include/drm/drm_buddy.h
>> @@ -14,6 +14,12 @@
>>   
>>   #include <drm/drm_print.h>
>>   
>> +enum free_tree {
>> +	CLEAR_TREE = 0,
>> +	DIRTY_TREE,
>> +	MAX_FREE_TREES,
> Those are quite generic enum and enumerator names for a very specific
> header and usage.
>
> And really this whole enum should be an implementation detail.
>
>> +};
>> +
>>   #define range_overflows(start, size, max) ({ \
>>   	typeof(start) start__ = (start); \
>>   	typeof(size) size__ = (size); \
>> @@ -73,7 +79,7 @@ struct drm_buddy_block {
>>    */
>>   struct drm_buddy {
>>   	/* Maintain a free list for each order. */
>> -	struct rb_root *free_tree;
>> +	struct rb_root *free_trees[MAX_FREE_TREES];
>>   
>>   	/*
>>   	 * Maintain explicit binary tree(s) to track the allocation of the

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-09-01 19:04 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-28 10:56 [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Arunpravin Paneer Selvam
2025-08-28 10:56 ` [PATCH v4 2/2] drm/buddy: Separate clear and dirty free block trees Arunpravin Paneer Selvam
2025-08-28 11:13   ` Jani Nikula
2025-09-01 19:03     ` Arunpravin Paneer Selvam
2025-08-28 11:08 ` [PATCH v4 1/2] drm/buddy: Optimize free block management with RB tree Jani Nikula
2025-08-28 13:47 ` ✗ CI.checkpatch: warning for series starting with [v4,1/2] " Patchwork
2025-08-28 13:48 ` ✓ CI.KUnit: success " Patchwork
2025-08-28 14:27 ` ✓ Xe.CI.BAT: " Patchwork
2025-08-28 17:36 ` ✓ Xe.CI.Full: " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).