* [PATCH 1/4] drm/ttm: Don't mark backed-up shmem folios accessed
2026-11-04 20:13 [PATCH 0/4] drm/ttm, drm/xe: Support partially backed-up ttm_tts Thomas Hellström
@ 2026-11-04 20:13 ` Thomas Hellström
2026-11-04 20:13 ` [PATCH 2/4] drm/xe/bo: Pass page and tt counts to the shrinker account helpers Thomas Hellström
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Thomas Hellström @ 2026-11-04 20:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Natalie Vock, Arun Pravin, Matthew Auld,
Matthew Brost, Niranjana Vishwanathapura, dri-devel
ttm_backup_backup_folio() unconditionally called folio_mark_accessed()
on the freshly populated shmem folio before copying the BO's data into
it. This path is only reached from a shrinker, i.e. precisely when the
system has already decided it needs memory back, and the whole point
of backing a page up into shmem is to let core mm reclaim it through
the normal swap/writeback path instead of keeping it pinned as TTM
memory.
Marking the folio accessed works against that: it sets the referenced
bit / promotes the folio on the LRU, so a later reclaim scan gives it
a second chance (or skips it) instead of reclaiming it on sight. This
is actively counter-productive even when the writeback backup flag is
set to synchronously flush the folio's content via shmem_write_folio():
writeback only clears the dirty bit, it does not free the page, so an
accessed folio just sits there, clean and resident, protected from the
very reclaim pass it was written back for.
Drop the folio_mark_accessed() call so these folios decay through
normal LRU aging and become immediate reclaim candidates once written
back (or once picked up by the system's own asynchronous laundering),
instead of being artificially kept warm.
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/ttm/ttm_backup.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/gpu/drm/ttm/ttm_backup.c b/drivers/gpu/drm/ttm/ttm_backup.c
index 0c2d53a13b2a..9589067ad8cf 100644
--- a/drivers/gpu/drm/ttm/ttm_backup.c
+++ b/drivers/gpu/drm/ttm/ttm_backup.c
@@ -149,7 +149,6 @@ ttm_backup_backup_folio(struct file *backup, struct folio *folio,
to_nr = min_t(int, nr_pages - i,
folio_next_index(to_folio) - (idx + i));
- folio_mark_accessed(to_folio);
folio_lock(to_folio);
folio_mark_dirty(to_folio);
--
2.56.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH 2/4] drm/xe/bo: Pass page and tt counts to the shrinker account helpers
2026-11-04 20:13 [PATCH 0/4] drm/ttm, drm/xe: Support partially backed-up ttm_tts Thomas Hellström
2026-11-04 20:13 ` [PATCH 1/4] drm/ttm: Don't mark backed-up shmem folios accessed Thomas Hellström
@ 2026-11-04 20:13 ` Thomas Hellström
2026-11-04 20:13 ` [PATCH 3/4] drm/ttm, drm/xe: Introduce TTM_TT_FLAG_PARTIAL for partially backed-up tts Thomas Hellström
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Thomas Hellström @ 2026-11-04 20:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Natalie Vock, Arun Pravin, Matthew Auld,
Matthew Brost, Niranjana Vishwanathapura, dri-devel
xe_ttm_tt_account_add() and xe_ttm_tt_account_subtract() always
account tt->num_pages and a single populated tt. Partial backup
support will need to account a subset of a tt's pages, and to keep
a partially backed-up tt counted as populated.
Add explicit page and tt count parameters. All callers pass
tt->num_pages and 1, so there is no functional change.
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/xe/tests/xe_bo.c | 6 ++++--
drivers/gpu/drm/xe/xe_bo.c | 28 ++++++++++++++++------------
2 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c b/drivers/gpu/drm/xe/tests/xe_bo.c
index 6a17e13d58cf..472d5577e0fe 100644
--- a/drivers/gpu/drm/xe/tests/xe_bo.c
+++ b/drivers/gpu/drm/xe/tests/xe_bo.c
@@ -736,9 +736,11 @@ static int shrink_test_run_device(struct xe_device *xe)
* other way around, they may not be subject to swapping...
*/
if (alloced < purgeable) {
- xe_ttm_tt_account_subtract(xe, &xe_tt->ttm);
+ xe_ttm_tt_account_subtract(xe, &xe_tt->ttm,
+ xe_tt->ttm.num_pages, 1);
xe_tt->purgeable = true;
- xe_ttm_tt_account_add(xe, &xe_tt->ttm);
+ xe_ttm_tt_account_add(xe, &xe_tt->ttm,
+ xe_tt->ttm.num_pages, 1);
bo->ttm.priority = 0;
spin_lock(&bo->ttm.bdev->lru_lock);
ttm_bo_move_to_lru_tail(&bo->ttm);
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 42a6aa1a2e4a..2afee1a6de66 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -452,24 +452,26 @@ struct sg_table *xe_bo_sg(struct xe_bo *bo)
* Account ttm pages against the device shrinker's shrinkable and
* purgeable counts.
*/
-static void xe_ttm_tt_account_add(struct xe_device *xe, struct ttm_tt *tt)
+static void xe_ttm_tt_account_add(struct xe_device *xe, struct ttm_tt *tt,
+ long num_pages, long tts)
{
struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
if (xe_tt->purgeable)
- xe_shrinker_mod_pages(xe->mem.shrinker, 0, tt->num_pages, 1);
+ xe_shrinker_mod_pages(xe->mem.shrinker, 0, num_pages, tts);
else
- xe_shrinker_mod_pages(xe->mem.shrinker, tt->num_pages, 0, 1);
+ xe_shrinker_mod_pages(xe->mem.shrinker, num_pages, 0, tts);
}
-static void xe_ttm_tt_account_subtract(struct xe_device *xe, struct ttm_tt *tt)
+static void xe_ttm_tt_account_subtract(struct xe_device *xe, struct ttm_tt *tt,
+ long num_pages, long tts)
{
struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
if (xe_tt->purgeable)
- xe_shrinker_mod_pages(xe->mem.shrinker, 0, -(long)tt->num_pages, -1);
+ xe_shrinker_mod_pages(xe->mem.shrinker, 0, -num_pages, -tts);
else
- xe_shrinker_mod_pages(xe->mem.shrinker, -(long)tt->num_pages, 0, -1);
+ xe_shrinker_mod_pages(xe->mem.shrinker, -num_pages, 0, -tts);
}
static bool xe_ttm_bo_is_imported(struct ttm_buffer_object *tbo)
@@ -503,7 +505,8 @@ static void xe_bo_account_pin(struct xe_bo *bo)
if (bo->ttm.pin_count == 1 && bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm) &&
!xe_ttm_bo_is_imported(&bo->ttm))
- xe_ttm_tt_account_subtract(xe, bo->ttm.ttm);
+ xe_ttm_tt_account_subtract(xe, bo->ttm.ttm,
+ bo->ttm.ttm->num_pages, 1);
}
/*
@@ -534,7 +537,8 @@ static void xe_bo_account_unpin(struct xe_bo *bo)
if (last_unpin && bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm) &&
!xe_ttm_bo_is_imported(&bo->ttm))
- xe_ttm_tt_account_add(xe, bo->ttm.ttm);
+ xe_ttm_tt_account_add(xe, bo->ttm.ttm, bo->ttm.ttm->num_pages,
+ 1);
}
/**
@@ -682,7 +686,7 @@ static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt,
return err;
xe_tt->purgeable = false;
- xe_ttm_tt_account_add(ttm_to_xe_device(ttm_dev), tt);
+ xe_ttm_tt_account_add(ttm_to_xe_device(ttm_dev), tt, tt->num_pages, 1);
update_global_total_pages(ttm_dev, tt->num_pages);
return 0;
@@ -699,7 +703,7 @@ static void xe_ttm_tt_unpopulate(struct ttm_device *ttm_dev, struct ttm_tt *tt)
xe_tt_unmap_sg(xe, tt);
ttm_pool_free(&ttm_dev->pool, tt);
- xe_ttm_tt_account_subtract(xe, tt);
+ xe_ttm_tt_account_subtract(xe, tt, tt->num_pages, 1);
update_global_total_pages(ttm_dev, -(long)tt->num_pages);
}
@@ -1391,7 +1395,7 @@ static long xe_bo_shrink_purge(struct ttm_operation_ctx *ctx,
.allow_move = false});
if (lret > 0) {
- xe_ttm_tt_account_subtract(xe, bo->ttm);
+ xe_ttm_tt_account_subtract(xe, bo->ttm, bo->ttm->num_pages, 1);
update_global_total_pages(bo->bdev, -(long)tt->num_pages);
}
@@ -1483,7 +1487,7 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
xe_pm_runtime_put(xe);
if (lret > 0) {
- xe_ttm_tt_account_subtract(xe, tt);
+ xe_ttm_tt_account_subtract(xe, tt, tt->num_pages, 1);
update_global_total_pages(bo->bdev, -(long)tt->num_pages);
}
--
2.56.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH 3/4] drm/ttm, drm/xe: Introduce TTM_TT_FLAG_PARTIAL for partially backed-up tts
2026-11-04 20:13 [PATCH 0/4] drm/ttm, drm/xe: Support partially backed-up ttm_tts Thomas Hellström
2026-11-04 20:13 ` [PATCH 1/4] drm/ttm: Don't mark backed-up shmem folios accessed Thomas Hellström
2026-11-04 20:13 ` [PATCH 2/4] drm/xe/bo: Pass page and tt counts to the shrinker account helpers Thomas Hellström
@ 2026-11-04 20:13 ` Thomas Hellström
2026-11-04 20:47 ` sashiko-bot
2026-11-04 20:13 ` [PATCH 4/4] drm/ttm, drm/xe: Gate reserve-dipping backup retries on may_writeback Thomas Hellström
` (2 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Thomas Hellström @ 2026-11-04 20:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Natalie Vock, Arun Pravin, Matthew Auld,
Matthew Brost, Niranjana Vishwanathapura, dri-devel
Backup failures can leave a ttm_tt partially backed up: some pages
swapped to shmem while others remain resident. Previously,
ttm_tt_backup() would set TTM_TT_FLAG_BACKED_UP regardless, which
made the resource unevictable and prevented the shrinker from
targeting it for continued backup.
Introduce TTM_TT_FLAG_PARTIAL to distinguish this state. A partial tt:
- Does NOT have PRIV_POPULATED set (it's not fully populated)
- Does NOT have BACKED_UP set (it's not fully backed up)
- Stays on the normal LRU (not unevictable)
- Can be targeted by the shrinker for continued backup
- Must be restored (not plain-allocated) when repopulating
On re-entry, ttm_pool_backup() skips already-backed-up handles and
the caching/DMA setup that was done on the first pass.
Track the number of still-resident pages in ttm_tt::remaining_pages.
ttm_pool_restore_abort() recounts them, since an aborted restore may
leave more pages resident than before. xe accounts shrinker pages of
a partial tt by remaining_pages: shrinking subtracts the change in
remaining_pages rather than tt->num_pages, repopulating adds back only
the pages that were subtracted, and destroying a partial tt subtracts
the pages still resident. A tt stays counted as populated by the
shrinker while it has accounted pages.
If restoring a fully backed-up tt fails after making pages resident,
mark it partial and return the bo to the evictable LRU, so that the
shrinker can reclaim those pages.
xe must treat a partial tt as holding data when moving the bo, so that
moves out of system memory restore it rather than discarding it.
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/ttm/ttm_bo.c | 5 +-
drivers/gpu/drm/ttm/ttm_bo_util.c | 6 +-
drivers/gpu/drm/ttm/ttm_pool.c | 128 ++++++++++++++++++++++--
drivers/gpu/drm/ttm/ttm_pool_internal.h | 2 +
drivers/gpu/drm/ttm/ttm_tt.c | 36 ++++++-
drivers/gpu/drm/xe/xe_bo.c | 82 +++++++++++----
include/drm/ttm/ttm_tt.h | 45 +++++++--
7 files changed, 261 insertions(+), 43 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 53c68e29ebc2..3c2f4297e20a 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1524,9 +1524,8 @@ int ttm_bo_populate(struct ttm_buffer_object *bo,
swapped = ttm_tt_is_swapped(tt);
ret = ttm_tt_populate(bdev, tt, ctx);
- if (ret)
- return ret;
+ /* A failed restore may leave the tt partial, hence evictable. */
if (swapped && !ttm_tt_is_swapped(tt) && !bo->pin_count &&
bo->resource) {
spin_lock(&bdev->lru_lock);
@@ -1535,7 +1534,7 @@ int ttm_bo_populate(struct ttm_buffer_object *bo,
spin_unlock(&bdev->lru_lock);
}
- return 0;
+ return ret;
}
EXPORT_SYMBOL(ttm_bo_populate);
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index f9458a4d5a09..975dea33075f 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -1124,7 +1124,7 @@ long ttm_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
{.purge = flags.purge,
.writeback = flags.writeback});
- if (lret > 0) {
+ if (lret > 0 && !ttm_tt_is_partial(bo->ttm)) {
spin_lock(&bdev->lru_lock);
ttm_resource_del_bulk_move_unevictable(bo->resource, bo);
ttm_resource_move_to_lru_tail(bo->resource);
@@ -1151,7 +1151,9 @@ EXPORT_SYMBOL(ttm_bo_shrink);
*/
bool ttm_bo_shrink_suitable(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx)
{
- return bo->ttm && ttm_tt_is_populated(bo->ttm) && !bo->pin_count &&
+ return bo->ttm &&
+ (ttm_tt_is_populated(bo->ttm) || ttm_tt_is_partial(bo->ttm)) &&
+ !bo->pin_count &&
(!ctx->no_wait_gpu ||
dma_resv_test_signaled(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP));
}
diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
index 1bf37023fed6..8f05257e4f54 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -628,7 +628,8 @@ static int ttm_pool_restore_commit(struct ttm_pool_tt_restore *restore,
* using clever logic, but ATM we don't care, as
* we prioritize releasing memory ASAP. Note that
* here, the old retained page is always write-back
- * cached.
+ * cached and not DMA-mapped. The commit below
+ * installs the new page and its DMA address.
*/
ttm_pool_split_for_swap(restore->pool, p);
copy_highpage(restore->alloced_page + i, p);
@@ -895,7 +896,7 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
{
struct ttm_pool_alloc_state alloc;
- if (WARN_ON(ttm_tt_is_backed_up(tt)))
+ if (WARN_ON(ttm_tt_is_backed_up(tt) || ttm_tt_is_partial(tt)))
return -EINVAL;
ttm_pool_alloc_state_init(tt, &alloc);
@@ -924,7 +925,7 @@ int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
struct ttm_pool_alloc_state alloc;
int ret;
- if (WARN_ON(!ttm_tt_is_backed_up(tt)))
+ if (WARN_ON(!ttm_tt_is_backed_up(tt) && !ttm_tt_is_partial(tt)))
return -EINVAL;
if (!restore) {
@@ -967,6 +968,23 @@ int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore);
}
+/**
+ * ttm_pool_restore_has_resident() - Whether an interrupted restore has
+ * made pages resident
+ * @tt: The struct ttm_tt.
+ *
+ * Return: true if an interrupted restore of @tt has committed or
+ * restored pages that would be kept on ttm_pool_restore_abort().
+ */
+bool ttm_pool_restore_has_resident(const struct ttm_tt *tt)
+{
+ const struct ttm_pool_tt_restore *restore = tt->restore;
+
+ return restore && (restore->alloced_pages ||
+ (ttm_pool_restore_valid(restore) &&
+ restore->restored_pages));
+}
+
/**
* ttm_pool_free - Free the backing pages from a ttm_tt object
*
@@ -1000,7 +1018,7 @@ void ttm_pool_drop_backed_up(struct ttm_tt *tt)
struct ttm_pool_tt_restore *restore;
pgoff_t start_page = 0;
- WARN_ON(!ttm_tt_is_backed_up(tt));
+ WARN_ON(!ttm_tt_is_backed_up(tt) && !ttm_tt_is_partial(tt));
restore = tt->restore;
@@ -1039,6 +1057,91 @@ void ttm_pool_drop_backed_up(struct ttm_tt *tt)
ttm_pool_free_range(NULL, tt, ttm_cached, start_page, tt->num_pages);
}
+/**
+ * ttm_pool_restore_abort() - Abort an ongoing restore of a partial tt
+ * @tt: The struct ttm_tt with an active restore.
+ *
+ * Abort a partially completed restore, leaving the tt in a consistent
+ * state for a subsequent backup. The uncommitted in-flight page is
+ * DMA-unmapped and split; restored sub-pages are kept, unused ones freed.
+ * Non-cached committed pages are converted to write-back so the
+ * partial-backup invariant (all resident pages are cached) is maintained.
+ * Committed pages are left DMA-mapped for the backup path to handle.
+ * Since restored pages are now resident, &ttm_tt.remaining_pages is
+ * updated to reflect the number of resident pages.
+ */
+static void ttm_pool_restore_abort(struct ttm_tt *tt)
+{
+ struct ttm_pool_tt_restore *restore = tt->restore;
+ pgoff_t i, nr, mid;
+
+ if (!restore)
+ return;
+
+ /* Handle the uncommitted in-flight page. */
+ if (ttm_pool_restore_valid(restore)) {
+ struct page *page = restore->alloced_page;
+
+ nr = 1UL << restore->order;
+
+ if (tt->dma_address)
+ ttm_pool_unmap(restore->pool, restore->first_dma, nr);
+
+#ifdef CONFIG_X86
+ if (restore->page_caching != ttm_cached && !PageHighMem(page))
+ set_pages_wb(page, nr);
+#endif
+ ttm_pool_split_for_swap(restore->pool, page);
+
+ for (i = 0; i < restore->restored_pages; i++)
+ restore->snapshot_alloc.pages[i] = page + i;
+
+ /*
+ * Clear stale DMA addresses for the in-flight sub-pages.
+ * These pages were never committed via
+ * ttm_pool_allocated_page_commit(), so tt->dma_address[]
+ * contains stale values that the backup path would
+ * incorrectly try to unmap. All @nr entries are stale,
+ * including restored ones: commit is all-or-nothing per
+ * compound, and the whole compound was unmapped above.
+ */
+ if (tt->dma_address) {
+ pgoff_t off = restore->snapshot_alloc.pages -
+ tt->pages;
+
+ memset(&tt->dma_address[off], 0,
+ nr * sizeof(*tt->dma_address));
+ }
+
+ for (i = restore->restored_pages; i < nr; i++)
+ __free_pages_gpu_account(page + i, 0, false);
+ }
+
+ /*
+ * Don't DMA-unmap committed restored pages here; their DMA
+ * addresses are in tt->dma_address[] and the backup path
+ * will unmap them.
+ */
+
+ /* Convert non-cached committed pages to write-back. */
+ mid = restore->snapshot_alloc.caching_divide - tt->pages;
+#ifdef CONFIG_X86
+ if (mid > 0 && tt->caching != ttm_cached)
+ set_pages_array_wb(tt->pages, mid);
+#endif
+
+ kfree(restore);
+ tt->restore = NULL;
+
+ for (i = 0, nr = 0; i < tt->num_pages; i++) {
+ struct page *p = tt->pages[i];
+
+ if (p && !ttm_backup_page_ptr_is_handle(p))
+ nr++;
+ }
+ tt->remaining_pages = nr;
+}
+
/**
* ttm_pool_backup() - Back up or purge a struct ttm_tt
* @pool: The pool used when allocating the struct ttm_tt.
@@ -1071,10 +1174,13 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
pgoff_t shrunken = 0;
pgoff_t i, j, num_pages, npages;
pgoff_t nr_backed;
+ bool partial = ttm_tt_is_partial(tt);
if (WARN_ON(ttm_tt_is_backed_up(tt)))
return -EINVAL;
+ ttm_pool_restore_abort(tt);
+
if ((!ttm_backup_bytes_avail() && !flags->purge) ||
ttm_pool_uses_dma_alloc(pool) || ttm_tt_is_backed_up(tt))
return -EBUSY;
@@ -1082,8 +1188,9 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
#ifdef CONFIG_X86
/* Anything returned to the system needs to be cached. Walk allocations
* skipping NULL pages and issue set_pages_array_wb() per contiguous run.
+ * Resident pages of a partial tt are already cached.
*/
- if (tt->caching != ttm_cached) {
+ if (!partial && tt->caching != ttm_cached) {
pgoff_t run_start = 0, run_count = 0;
for (i = 0; i < tt->num_pages; i += num_pages) {
@@ -1119,9 +1226,18 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
order = ttm_pool_page_order(pool, page);
num_pages = 1UL << order;
- if (tt->dma_address)
+ if (tt->dma_address && tt->dma_address[i]) {
ttm_pool_unmap(pool, tt->dma_address[i],
num_pages);
+ /*
+ * Don't unmap again on partial re-entry.
+ * Pages left resident are never re-mapped;
+ * restore copies them into newly mapped
+ * pages.
+ */
+ memset(&tt->dma_address[i], 0,
+ num_pages * sizeof(*tt->dma_address));
+ }
if (flags->purge) {
shrunken += num_pages;
page->private = 0;
diff --git a/drivers/gpu/drm/ttm/ttm_pool_internal.h b/drivers/gpu/drm/ttm/ttm_pool_internal.h
index cbb17a2129fe..3f4f70037c39 100644
--- a/drivers/gpu/drm/ttm/ttm_pool_internal.h
+++ b/drivers/gpu/drm/ttm/ttm_pool_internal.h
@@ -30,4 +30,6 @@ static inline unsigned int ttm_pool_beneficial_order(struct ttm_pool *pool)
*/
bool ttm_backup_fault_inject_folio(void);
+bool ttm_pool_restore_has_resident(const struct ttm_tt *tt);
+
#endif
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index b645a1818184..2b441bf41d92 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -188,7 +188,7 @@ void ttm_tt_fini(struct ttm_tt *ttm)
fput(ttm->swap_storage);
ttm->swap_storage = NULL;
- if (ttm_tt_is_backed_up(ttm))
+ if (ttm_tt_is_backed_up(ttm) || ttm_tt_is_partial(ttm))
ttm_pool_drop_backed_up(ttm);
if (ttm->backup) {
ttm_backup_fini(ttm->backup);
@@ -289,7 +289,18 @@ long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
ret = ttm_pool_backup(&bdev->pool, tt, &flags);
if (ret > 0) {
tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
- tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
+ if (ret >= tt->remaining_pages)
+ tt->remaining_pages = 0;
+ else
+ tt->remaining_pages -= ret;
+
+ if (tt->remaining_pages) {
+ tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
+ tt->page_flags |= TTM_TT_FLAG_PARTIAL;
+ } else {
+ tt->page_flags &= ~TTM_TT_FLAG_PARTIAL;
+ tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
+ }
}
return ret;
@@ -300,10 +311,20 @@ int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
{
int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt, ctx);
- if (ret)
+ if (ret) {
+ /*
+ * Let the shrinker reclaim pages made resident by the
+ * failed restore. remaining_pages is recounted on backup.
+ */
+ if (ttm_tt_is_backed_up(tt) &&
+ ttm_pool_restore_has_resident(tt)) {
+ tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
+ tt->page_flags |= TTM_TT_FLAG_PARTIAL;
+ }
return ret;
+ }
- tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
+ tt->page_flags &= ~(TTM_TT_FLAG_BACKED_UP | TTM_TT_FLAG_PARTIAL);
return 0;
}
@@ -404,7 +425,12 @@ int ttm_tt_populate(struct ttm_device *bdev,
goto error;
ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
- ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
+ ttm->page_flags &= ~(TTM_TT_FLAG_BACKED_UP | TTM_TT_FLAG_PARTIAL);
+ /*
+ * Only updated on success. If a restore fails, remaining_pages
+ * goes stale until ttm_pool_restore_abort() recounts it.
+ */
+ ttm->remaining_pages = ttm->num_pages;
if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) {
ret = ttm_tt_swapin(ttm);
if (unlikely(ret != 0)) {
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 2afee1a6de66..6907b683dee0 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -583,6 +583,26 @@ static void update_global_total_pages(struct ttm_device *ttm_dev,
#endif
}
+/*
+ * Account for the change in resident pages of @tt after a shrink or purge
+ * attempt. Note that the resident page count may also increase if a
+ * previously interrupted restore was aborted.
+ */
+static void xe_ttm_tt_account_shrunk(struct ttm_device *ttm_dev,
+ struct ttm_tt *tt, pgoff_t old_remaining)
+{
+ pgoff_t new_remaining = ttm_tt_remaining_pages(tt);
+ long shrunk = (long)old_remaining - (long)new_remaining;
+
+ if (!shrunk)
+ return;
+
+ /* A tt is counted in populated_tts while it has accounted pages. */
+ xe_ttm_tt_account_subtract(ttm_to_xe_device(ttm_dev), tt, shrunk,
+ !!old_remaining - !!new_remaining);
+ update_global_total_pages(ttm_dev, -shrunk);
+}
+
static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object *ttm_bo,
u32 page_flags)
{
@@ -676,20 +696,35 @@ static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt,
!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
return 0;
- if (ttm_tt_is_backed_up(tt) && !xe_tt->purgeable) {
+ /*
+ * A purgeable backed-up tt was purged and holds neither pages nor
+ * handles. Partial tts are never purgeable: madvise only marks
+ * populated tts purgeable, and the shrinker purges those fully.
+ */
+ if ((ttm_tt_is_backed_up(tt) || ttm_tt_is_partial(tt)) &&
+ !xe_tt->purgeable) {
+ pgoff_t remaining = ttm_tt_remaining_pages(tt);
+ long backed_up_pages = tt->num_pages - remaining;
+
err = ttm_tt_restore(ttm_dev, tt, ctx);
+ if (!err) {
+ xe_tt->purgeable = false;
+ xe_ttm_tt_account_add(ttm_to_xe_device(ttm_dev), tt,
+ backed_up_pages, !remaining);
+ update_global_total_pages(ttm_dev, backed_up_pages);
+ }
} else {
ttm_tt_clear_backed_up(tt);
err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx);
+ if (!err) {
+ xe_tt->purgeable = false;
+ xe_ttm_tt_account_add(ttm_to_xe_device(ttm_dev), tt,
+ tt->num_pages, 1);
+ update_global_total_pages(ttm_dev, tt->num_pages);
+ }
}
- if (err)
- return err;
- xe_tt->purgeable = false;
- xe_ttm_tt_account_add(ttm_to_xe_device(ttm_dev), tt, tt->num_pages, 1);
- update_global_total_pages(ttm_dev, tt->num_pages);
-
- return 0;
+ return err;
}
static void xe_ttm_tt_unpopulate(struct ttm_device *ttm_dev, struct ttm_tt *tt)
@@ -709,6 +744,15 @@ static void xe_ttm_tt_unpopulate(struct ttm_device *ttm_dev, struct ttm_tt *tt)
static void xe_ttm_tt_destroy(struct ttm_device *ttm_dev, struct ttm_tt *tt)
{
+ /* Resident pages of a partially backed-up tt are still accounted. */
+ if (ttm_tt_is_partial(tt)) {
+ long remaining = ttm_tt_remaining_pages(tt);
+
+ xe_ttm_tt_account_subtract(ttm_to_xe_device(ttm_dev), tt,
+ remaining, !!remaining);
+ update_global_total_pages(ttm_dev, -remaining);
+ }
+
ttm_tt_fini(tt);
kfree(tt);
}
@@ -1167,7 +1211,8 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
return ret;
}
- tt_has_data = ttm && (ttm_tt_is_populated(ttm) || ttm_tt_is_swapped(ttm));
+ tt_has_data = ttm && (ttm_tt_is_populated(ttm) || ttm_tt_is_swapped(ttm) ||
+ ttm_tt_is_partial(ttm));
move_lacks_source = !old_mem || (handle_system_ccs ? (!bo->ccs_cleared) :
(!mem_type_is_vram(old_mem_type) && !tt_has_data));
@@ -1369,7 +1414,7 @@ static long xe_bo_shrink_purge(struct ttm_operation_ctx *ctx,
unsigned long *scanned)
{
struct xe_device *xe = ttm_to_xe_device(bo->bdev);
- struct ttm_tt *tt = bo->ttm;
+ pgoff_t old_remaining;
long lret;
/* Fake move to system, without copying data. */
@@ -1388,16 +1433,14 @@ static long xe_bo_shrink_purge(struct ttm_operation_ctx *ctx,
ttm_bo_move_null(bo, new_resource);
}
- *scanned += bo->ttm->num_pages;
+ old_remaining = ttm_tt_remaining_pages(bo->ttm);
+ *scanned += old_remaining;
lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
{.purge = true,
.writeback = false,
.allow_move = false});
- if (lret > 0) {
- xe_ttm_tt_account_subtract(xe, bo->ttm, bo->ttm->num_pages, 1);
- update_global_total_pages(bo->bdev, -(long)tt->num_pages);
- }
+ xe_ttm_tt_account_shrunk(bo->bdev, bo->ttm, old_remaining);
return lret;
}
@@ -1448,6 +1491,7 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
struct ttm_place place = {.mem_type = bo->resource->mem_type};
struct xe_bo *xe_bo = ttm_to_xe_bo(bo);
struct xe_device *xe = ttm_to_xe_device(bo->bdev);
+ pgoff_t old_remaining;
bool needs_rpm;
long lret = 0L;
@@ -1478,7 +1522,8 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
if (needs_rpm && !xe_pm_runtime_get_if_active(xe))
goto out_unref;
- *scanned += tt->num_pages;
+ old_remaining = ttm_tt_remaining_pages(tt);
+ *scanned += old_remaining;
lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
{.purge = false,
.writeback = flags.writeback,
@@ -1486,10 +1531,7 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
if (needs_rpm)
xe_pm_runtime_put(xe);
- if (lret > 0) {
- xe_ttm_tt_account_subtract(xe, tt, tt->num_pages, 1);
- update_global_total_pages(bo->bdev, -(long)tt->num_pages);
- }
+ xe_ttm_tt_account_shrunk(bo->bdev, tt, old_remaining);
out_unref:
xe_bo_put(xe_bo);
diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
index 406437ad674b..c292a8f0583f 100644
--- a/include/drm/ttm/ttm_tt.h
+++ b/include/drm/ttm/ttm_tt.h
@@ -88,7 +88,13 @@ struct ttm_tt {
* used to assure pgprot always matches.
*
* TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set if the
- * struct ttm_tt has been (possibly partially) backed up.
+ * struct ttm_tt has been fully backed up.
+ *
+ * TTM_TT_FLAG_PARTIAL: TTM internal only. This is set if the
+ * struct ttm_tt has been partially backed up, meaning some pages
+ * have been swapped to the backup but some real pages remain.
+ * Unlike BACKED_UP, a partial tt stays on the normal LRU and
+ * can be targeted for continued backup.
*
* TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT USE. This is
* set by TTM after ttm_tt_populate() has successfully returned, and is
@@ -101,11 +107,14 @@ struct ttm_tt {
#define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
#define TTM_TT_FLAG_DECRYPTED BIT(4)
#define TTM_TT_FLAG_BACKED_UP BIT(5)
+#define TTM_TT_FLAG_PARTIAL BIT(6)
-#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
+#define TTM_TT_FLAG_PRIV_POPULATED BIT(7)
uint32_t page_flags;
/** @num_pages: Number of pages in the page array. */
uint32_t num_pages;
+ /** @remaining_pages: Number of resident (non-backed-up) pages. */
+ pgoff_t remaining_pages;
/** @sg: for SG objects via dma-buf. */
struct sg_table *sg;
/** @dma_address: The DMA (bus) addresses of the pages. */
@@ -157,10 +166,10 @@ static inline bool ttm_tt_is_swapped(const struct ttm_tt *tt)
}
/**
- * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
+ * ttm_tt_is_backed_up() - Whether the ttm_tt is fully backed up
* @tt: The struct ttm_tt.
*
- * Return: true if swapped or backed up, false otherwise.
+ * Return: true if fully backed up, false otherwise.
*/
static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
{
@@ -168,15 +177,37 @@ static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
}
/**
- * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up status
+ * ttm_tt_is_partial() - Whether the ttm_tt is partially backed up
+ * @tt: The struct ttm_tt.
+ *
+ * Return: true if partially backed up, false otherwise.
+ */
+static inline bool ttm_tt_is_partial(const struct ttm_tt *tt)
+{
+ return tt->page_flags & TTM_TT_FLAG_PARTIAL;
+}
+
+/**
+ * ttm_tt_remaining_pages() - Remaining non-backed-up pages
+ * @tt: The struct ttm_tt.
+ *
+ * Return: The number of pages that are still resident and not backed up.
+ */
+static inline pgoff_t ttm_tt_remaining_pages(const struct ttm_tt *tt)
+{
+ return tt->remaining_pages;
+}
+
+/**
+ * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up and partial status
* @tt: The struct ttm_tt.
*
- * Drivers can use this functionto clear the backed-up status,
+ * Drivers can use this function to clear the backed-up status,
* for example before destroying or re-validating a purged tt.
*/
static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
{
- tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
+ tt->page_flags &= ~(TTM_TT_FLAG_BACKED_UP | TTM_TT_FLAG_PARTIAL);
}
/**
--
2.56.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH 3/4] drm/ttm, drm/xe: Introduce TTM_TT_FLAG_PARTIAL for partially backed-up tts
2026-11-04 20:13 ` [PATCH 3/4] drm/ttm, drm/xe: Introduce TTM_TT_FLAG_PARTIAL for partially backed-up tts Thomas Hellström
@ 2026-11-04 20:47 ` sashiko-bot
0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-11-04 20:47 UTC (permalink / raw)
To: Thomas Hellström, intel-xe; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] drm/ttm: DMA mapping leak in ttm_pool_backup() on -EBUSY after restore abort
- [High] drm/ttm: ttm_tt_backup() leaves tt populated if backup fails at first page
- [Medium] drm/xe: stale remaining_pages and shrinker counts on failed ttm_tt_restore()
--
commit fc282ba9ab604d69dff7ad175cd51a0231a6c0b3
Author: Thomas Hellström <thomas.hellstrom@linux.intel.com>
drm/ttm, drm/xe: Introduce TTM_TT_FLAG_PARTIAL for partially backed-up tts
This commit introduces TTM_TT_FLAG_PARTIAL and ttm_tt::remaining_pages to
track partially backed-up ttm_tt objects so they stay on the normal LRU
and remain eligible for shrinker reclaim. It also adds
ttm_pool_restore_abort() to clean up interrupted restores before backup
and updates xe shrinker page accounting to track resident pages.
> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
> index 1bf37023fed66..8f05257e4f542 100644
> --- a/drivers/gpu/drm/ttm/ttm_pool.c
> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
[ ... ]
> @@ -1039,6 +1057,91 @@ void ttm_pool_drop_backed_up(struct ttm_tt *tt)
> ttm_pool_free_range(NULL, tt, ttm_cached, start_page, tt->num_pages);
> }
>
> +/**
> + * ttm_pool_restore_abort() - Abort an ongoing restore of a partial tt
> + * @tt: The struct ttm_tt with an active restore.
[ ... ]
> +static void ttm_pool_restore_abort(struct ttm_tt *tt)
> +{
> + struct ttm_pool_tt_restore *restore = tt->restore;
> + pgoff_t i, nr, mid;
[ ... ]
> + /*
> + * Don't DMA-unmap committed restored pages here; their DMA
> + * addresses are in tt->dma_address[] and the backup path
> + * will unmap them.
> + */
> +
> + /* Convert non-cached committed pages to write-back. */
> + mid = restore->snapshot_alloc.caching_divide - tt->pages;
> +#ifdef CONFIG_X86
> + if (mid > 0 && tt->caching != ttm_cached)
> + set_pages_array_wb(tt->pages, mid);
> +#endif
> +
> + kfree(restore);
> + tt->restore = NULL;
> +
> + for (i = 0, nr = 0; i < tt->num_pages; i++) {
> + struct page *p = tt->pages[i];
> +
> + if (p && !ttm_backup_page_ptr_is_handle(p))
> + nr++;
> + }
> + tt->remaining_pages = nr;
> +}
> +
> /**
> * ttm_pool_backup() - Back up or purge a struct ttm_tt
> * @pool: The pool used when allocating the struct ttm_tt.
> @@ -1071,10 +1174,13 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> pgoff_t shrunken = 0;
> pgoff_t i, j, num_pages, npages;
> pgoff_t nr_backed;
> + bool partial = ttm_tt_is_partial(tt);
>
> if (WARN_ON(ttm_tt_is_backed_up(tt)))
> return -EINVAL;
>
> + ttm_pool_restore_abort(tt);
> +
> if ((!ttm_backup_bytes_avail() && !flags->purge) ||
> ttm_pool_uses_dma_alloc(pool) || ttm_tt_is_backed_up(tt))
> return -EBUSY;
[Severity: High]
Can this leak DMA mappings for committed restored pages when
ttm_pool_backup() returns -EBUSY right after ttm_pool_restore_abort(tt)?
When a restore of a backed-up or partial ttm_tt (with tt->dma_address !=
NULL) fails after committing one or more pages via
ttm_pool_allocated_page_commit(), tt->pages[0 .. restore->alloced_pages - 1]
are populated and DMA-mapped in tt->dma_address[], and tt is marked
TTM_TT_FLAG_PARTIAL with tt->restore non-NULL.
When ttm_pool_backup() is later called by the shrinker, it calls
ttm_pool_restore_abort(tt), which intentionally leaves committed restored
pages DMA-mapped in tt->dma_address[] for the backup loop to unmap, and
frees tt->restore (setting tt->restore = NULL).
If ttm_pool_backup() then takes the early -EBUSY return (for example, when
swap space is exhausted so !ttm_backup_bytes_avail() && !flags->purge), the
DMA-unmap loop below is skipped. That leaves a partial tt with
tt->restore == NULL while tt->pages[0 .. alloced_pages - 1] remain
DMA-mapped:
- On teardown, ttm_tt_fini() -> ttm_pool_drop_backed_up() sees
tt->restore == NULL and calls:
ttm_pool_free_range(NULL, tt, ttm_cached, 0, tt->num_pages);
Because pool is NULL, ttm_pool_unmap_and_free() skips ttm_pool_unmap()
and frees the still-DMA-mapped pages back to the page allocator.
- On a subsequent restore, ttm_pool_restore_and_alloc() starts a fresh
restore at index 0, and ttm_pool_restore_commit() frees the retained
resident pages via __free_pages_gpu_account(p, 0, false) without
DMA-unmapping them and overwrites tt->dma_address[].
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> index b645a18181843..2b441bf41d927 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
[ ... ]
> @@ -289,7 +289,18 @@ long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> ret = ttm_pool_backup(&bdev->pool, tt, &flags);
> if (ret > 0) {
> tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
> - tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> + if (ret >= tt->remaining_pages)
> + tt->remaining_pages = 0;
> + else
> + tt->remaining_pages -= ret;
> +
> + if (tt->remaining_pages) {
> + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> + tt->page_flags |= TTM_TT_FLAG_PARTIAL;
> + } else {
> + tt->page_flags &= ~TTM_TT_FLAG_PARTIAL;
> + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> + }
> }
>
> return ret;
[Severity: High]
What happens if ttm_pool_backup() fails on the very first page after it has
already converted the pages to write-back and unmapped tt->dma_address[]?
In ttm_pool_backup(), for a populated tt (!partial), all pages are first
converted to write-back via set_pages_array_wb() (when tt->caching !=
ttm_cached), and all entries in tt->dma_address[] are DMA-unmapped via
ttm_pool_unmap() and zeroed via memset() before the folio backup loop
starts.
If ttm_backup_backup_folio() fails on the first page (i == 0) with
nr_backed == 0 (or fault injection truncates num_pages mid-compound on the
first compound page), ttm_pool_backup() breaks out of the loop with
shrunken == 0 and returns a negative error code (or 0).
Because ttm_tt_backup() only clears TTM_TT_FLAG_PRIV_POPULATED and sets
TTM_TT_FLAG_PARTIAL when ret > 0, the tt remains marked
TTM_TT_FLAG_PRIV_POPULATED (and not TTM_TT_FLAG_PARTIAL) even though its
DMA mappings have been unmapped and zeroed and its pages have been
converted to write-back:
- Subsequent ttm_bo_populate() / ttm_tt_populate() calls see
ttm_tt_is_populated(tt) == true and return 0 without restoring DMA
mappings or caching.
- A subsequent ttm_pool_backup() call sees !partial and calls
set_pages_array_wb() a second time on pages that are already WB.
- Subsequent ttm_tt_unpopulate() -> ttm_pool_free() calls ttm_pool_unmap()
on zeroed DMA addresses and returns the WB pages into the WC/UC pool via
ttm_pool_type_give().
> @@ -300,10 +311,20 @@ int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> {
> int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt, ctx);
>
> - if (ret)
> + if (ret) {
> + /*
> + * Let the shrinker reclaim pages made resident by the
> + * failed restore. remaining_pages is recounted on backup.
> + */
> + if (ttm_tt_is_backed_up(tt) &&
> + ttm_pool_restore_has_resident(tt)) {
> + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> + tt->page_flags |= TTM_TT_FLAG_PARTIAL;
> + }
> return ret;
> + }
>
> - tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> + tt->page_flags &= ~(TTM_TT_FLAG_BACKED_UP | TTM_TT_FLAG_PARTIAL);
>
> return 0;
> }
[ ... ]
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index 2afee1a6de668..6907b683dee07 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
[ ... ]
> @@ -676,20 +696,35 @@ static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt,
> !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
> return 0;
>
> - if (ttm_tt_is_backed_up(tt) && !xe_tt->purgeable) {
> + /*
> + * A purgeable backed-up tt was purged and holds neither pages nor
> + * handles. Partial tts are never purgeable: madvise only marks
> + * populated tts purgeable, and the shrinker purges those fully.
> + */
> + if ((ttm_tt_is_backed_up(tt) || ttm_tt_is_partial(tt)) &&
> + !xe_tt->purgeable) {
> + pgoff_t remaining = ttm_tt_remaining_pages(tt);
> + long backed_up_pages = tt->num_pages - remaining;
> +
> err = ttm_tt_restore(ttm_dev, tt, ctx);
> + if (!err) {
> + xe_tt->purgeable = false;
> + xe_ttm_tt_account_add(ttm_to_xe_device(ttm_dev), tt,
> + backed_up_pages, !remaining);
> + update_global_total_pages(ttm_dev, backed_up_pages);
> + }
> } else {
[ ... ]
> @@ -1478,7 +1522,8 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
> if (needs_rpm && !xe_pm_runtime_get_if_active(xe))
> goto out_unref;
>
> - *scanned += tt->num_pages;
> + old_remaining = ttm_tt_remaining_pages(tt);
> + *scanned += old_remaining;
> lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
> {.purge = false,
> .writeback = flags.writeback,
> @@ -1486,10 +1531,7 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
> if (needs_rpm)
> xe_pm_runtime_put(xe);
>
> - if (lret > 0) {
> - xe_ttm_tt_account_subtract(xe, tt, tt->num_pages, 1);
> - update_global_total_pages(bo->bdev, -(long)tt->num_pages);
> - }
> + xe_ttm_tt_account_shrunk(bo->bdev, tt, old_remaining);
[Severity: Medium]
When ttm_tt_restore() fails after making pages resident, doesn't leaving
tt->remaining_pages and the xe shrinker counters unupdated break shrinker
accounting and scanning?
When a fully backed-up tt (with tt->remaining_pages == 0 and 0 pages
accounted in xe->mem.shrinker) fails in ttm_tt_restore() after committing
or restoring pages, ttm_tt_restore() transitions it to TTM_TT_FLAG_PARTIAL,
but tt->remaining_pages stays 0 until ttm_pool_restore_abort() runs during
backup, and xe_ttm_tt_populate() skips xe_ttm_tt_account_add() because
err != 0:
1. Because the newly resident pages were never added via
xe_ttm_tt_account_add(), xe_shrinker_count() does not see them and can
return SHRINK_EMPTY if no other BOs are populated.
2. When xe_bo_shrink() (or xe_bo_shrink_purge()) runs on this BO, it reads
old_remaining = ttm_tt_remaining_pages(tt) (which is still 0) and does
*scanned += old_remaining before calling ttm_bo_shrink() ->
ttm_tt_backup() -> ttm_pool_backup() -> ttm_pool_restore_abort(). In
xe_shrinker_scan(), if nr_scanned remains 0 while freed > 0, it will
return SHRINK_STOP instead of freed:
drivers/gpu/drm/xe/xe_shrinker.c:xe_shrinker_scan() {
...
return nr_scanned ? freed : SHRINK_STOP;
}
3. If the BO is destroyed via xe_ttm_tt_destroy() after a failed restore
without an intervening backup attempt, or if a backup attempt in
xe_bo_shrink() aborts the restore and increases tt->remaining_pages from
0 to N (say, when only part of those N pages are backed up),
xe_ttm_tt_account_shrunk() and xe_ttm_tt_destroy() will subtract pages
that were never added in xe_ttm_tt_populate(), underflowing the shrinker
counters.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261104201331.2462-1-thomas.hellstrom@linux.intel.com?part=3
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 4/4] drm/ttm, drm/xe: Gate reserve-dipping backup retries on may_writeback
2026-11-04 20:13 [PATCH 0/4] drm/ttm, drm/xe: Support partially backed-up ttm_tts Thomas Hellström
` (2 preceding siblings ...)
2026-11-04 20:13 ` [PATCH 3/4] drm/ttm, drm/xe: Introduce TTM_TT_FLAG_PARTIAL for partially backed-up tts Thomas Hellström
@ 2026-11-04 20:13 ` Thomas Hellström
2026-11-04 20:41 ` sashiko-bot
2026-11-04 20:23 ` ✓ CI.KUnit: success for drm/ttm, drm/xe: Support partially backed-up ttm_tts Patchwork
2026-11-04 20:57 ` ✓ Xe.CI.BAT: " Patchwork
5 siblings, 1 reply; 9+ messages in thread
From: Thomas Hellström @ 2026-11-04 20:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Natalie Vock, Arun Pravin, Matthew Auld,
Matthew Brost, Niranjana Vishwanathapura, dri-devel
Backup of a page allocates the shmem destination folio with
__GFP_NOMEMALLOC for high-order pages, to avoid dipping into kernel
memory reserves, but order-0 pages were always backed up without it.
When a high-order allocation fails mid-compound, the compound is split
and the remaining subpages are individually retried at order 0 without
__GFP_NOMEMALLOC.
That retry happened unconditionally, regardless of whether the caller
wanted writeback or could tolerate blocking. Retrying without
writeback only grows dirty shmem rather than relieving the memory
pressure that caused the original failure, and the retry itself may
need to reclaim or block.
Back up all pages with __GFP_NOMEMALLOC first, and add two flags,
may_writeback and force_writeback, to struct ttm_backup_flags,
replacing the single writeback flag:
- may_writeback governs whether a failed backup allocation is retried
without __GFP_NOMEMALLOC, splitting a high-order page if needed.
When clear, the backup stops at the failure, keeping whatever
progress was already made and leaving the remainder resident for a
later retry.
- force_writeback replaces the old writeback flag and is honoured both
for the regular backup and for any retry, so a caller that allows the
retry can also choose to force it to actually complete and relieve
memory pressure instead of just relocating it.
Thread the two new flags all the way from the xe shrinker down through
xe_bo_shrink_flags and ttm_bo_shrink_flags to ttm_backup_flags.
xe_shrinker_walk() now takes an explicit allow_writeback
parameter (computed once from __GFP_IO and no_wait_gpu in
xe_shrinker_scan()) rather than carrying that gfp-context permission
inside the per-call flags, and uses it to decide, pass by pass, whether
the retry is allowed (may_writeback) and whether it should be
forced to completion (force_writeback).
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/ttm/ttm_bo_util.c | 3 +-
drivers/gpu/drm/ttm/ttm_pool.c | 47 +++++++++++++++++++++----------
drivers/gpu/drm/xe/xe_bo.c | 6 ++--
drivers/gpu/drm/xe/xe_bo.h | 9 ++++--
drivers/gpu/drm/xe/xe_shrinker.c | 39 ++++++++++++++++++++-----
include/drm/ttm/ttm_bo.h | 9 ++++--
include/drm/ttm/ttm_tt.h | 13 +++++++--
7 files changed, 93 insertions(+), 33 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 975dea33075f..21317c212c27 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -1122,7 +1122,8 @@ long ttm_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
lret = ttm_tt_backup(bdev, bo->ttm, (struct ttm_backup_flags)
{.purge = flags.purge,
- .writeback = flags.writeback});
+ .may_writeback = flags.may_writeback,
+ .force_writeback = flags.force_writeback});
if (lret > 0 && !ttm_tt_is_partial(bo->ttm)) {
spin_lock(&bdev->lru_lock);
diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
index 8f05257e4f54..87c1ac39af94 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -1158,7 +1158,10 @@ static void ttm_pool_restore_abort(struct ttm_tt *tt)
* If backup of a page fails for whatever reason, @ttm will still be
* partially backed up, retaining those pages for which backup fails.
* In that case, this function can be retried, possibly after freeing up
- * memory resources.
+ * memory resources. In particular, if allocating backup memory fails
+ * without dipping into kernel reserves, and @flags->may_writeback is not
+ * set, the backup stops at that point, also leaving @ttm partially backed
+ * up.
*
* Return: Number of pages actually backed up or freed, or negative
* error code on error.
@@ -1174,6 +1177,7 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
pgoff_t shrunken = 0;
pgoff_t i, j, num_pages, npages;
pgoff_t nr_backed;
+ bool dip_reserves;
bool partial = ttm_tt_is_partial(tt);
if (WARN_ON(ttm_tt_is_backed_up(tt)))
@@ -1256,7 +1260,9 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
else
gfp = GFP_HIGHUSER;
- alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN | __GFP_RETRY_MAYFAIL;
+ /* Don't dip into kernel reserves unless @flags->may_writeback is set. */
+ alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
+ __GFP_RETRY_MAYFAIL | __GFP_NOMEMALLOC;
num_pages = tt->num_pages;
@@ -1280,14 +1286,7 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
order = ttm_pool_page_order(pool, page);
npages = 1UL << order;
- /*
- * We don't allow dipping kernel reserves for high order backup
- */
- if (order)
- alloc_gfp |= __GFP_NOMEMALLOC;
- else
- alloc_gfp &= ~__GFP_NOMEMALLOC;
-
+ dip_reserves = false;
/*
* Back up the compound atomically at its native order. If
* fault injection truncated num_pages mid-compound, skip
@@ -1296,10 +1295,18 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
if (unlikely(i + npages > num_pages))
break;
+retry:
handle = ttm_backup_backup_folio(backup, page_folio(page),
- order, flags->writeback, i,
- gfp, alloc_gfp,
- &nr_backed);
+ order, flags->force_writeback, i,
+ gfp, dip_reserves ?
+ alloc_gfp & ~__GFP_NOMEMALLOC :
+ alloc_gfp, &nr_backed);
+ if (unlikely(handle == -ENOMEM && !nr_backed &&
+ flags->may_writeback && !dip_reserves)) {
+ dip_reserves = true;
+ goto retry;
+ }
+
/*
* Zero progress on this compound (whether order 0 or a
* high-order compound that failed before backing up even
@@ -1319,12 +1326,22 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
if (unlikely(nr_backed < npages)) {
/*
* Partial OOM backup: split the compound and free the
- * subpages whose content is now in shmem. Continue the
- * loop from the first un-backed order-0 page.
+ * subpages whose content is now in shmem.
*/
ttm_pool_split_for_swap(pool, page);
for (j = 0; j < nr_backed; j++)
__free_pages_gpu_account(page + j, 0, false);
+
+ if (!flags->may_writeback) {
+ /*
+ * Leave the remaining subpages as still
+ * unbacked order-0 pages; the caller may
+ * retry later.
+ */
+ break;
+ }
+
+ /* Continue the loop from the first un-backed order-0 page. */
npages = nr_backed;
continue;
}
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 6907b683dee0..614766eb4b8f 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -1437,7 +1437,6 @@ static long xe_bo_shrink_purge(struct ttm_operation_ctx *ctx,
*scanned += old_remaining;
lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
{.purge = true,
- .writeback = false,
.allow_move = false});
xe_ttm_tt_account_shrunk(bo->bdev, bo->ttm, old_remaining);
@@ -1526,8 +1525,9 @@ long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
*scanned += old_remaining;
lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
{.purge = false,
- .writeback = flags.writeback,
- .allow_move = true});
+ .allow_move = true,
+ .may_writeback = flags.may_writeback,
+ .force_writeback = flags.force_writeback});
if (needs_rpm)
xe_pm_runtime_put(xe);
diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index 77b3a02e9b8e..82cbb1f2d61d 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -616,11 +616,16 @@ static inline unsigned int xe_sg_segment_size(struct device *dev)
/**
* struct xe_bo_shrink_flags - flags governing the shrink behaviour.
* @purge: Only purging allowed. Don't shrink if bo not purgeable.
- * @writeback: Attempt to immediately move content to swap.
+ * @may_writeback: Allow retrying a failed backup allocation using kernel
+ * reserves. See struct ttm_backup_flags.
+ * @force_writeback: Attempt to immediately move content to swap, both
+ * for the regular backup and for any retry allowed by @may_writeback.
+ * See struct ttm_backup_flags.
*/
struct xe_bo_shrink_flags {
u32 purge : 1;
- u32 writeback : 1;
+ u32 may_writeback : 1;
+ u32 force_writeback : 1;
};
long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
index c86455ea08d1..c24f35cbc235 100644
--- a/drivers/gpu/drm/xe/xe_shrinker.c
+++ b/drivers/gpu/drm/xe/xe_shrinker.c
@@ -171,6 +171,7 @@ static int __xe_shrinker_walk(struct xe_shrinker *shrinker,
static int xe_shrinker_walk(struct xe_shrinker *shrinker,
struct ttm_operation_ctx *ctx,
const struct xe_bo_shrink_flags flags,
+ bool allow_writeback,
unsigned long to_scan, unsigned long *scanned,
unsigned long *freed)
{
@@ -179,7 +180,8 @@ static int xe_shrinker_walk(struct xe_shrinker *shrinker,
int ret;
swap(no_wait_gpu, ctx->no_wait_gpu);
- save_flags.writeback = false;
+ save_flags.may_writeback = false;
+ save_flags.force_writeback = false;
ret = __xe_shrinker_walk(shrinker, ctx, save_flags, to_scan, scanned,
freed);
swap(no_wait_gpu, ctx->no_wait_gpu);
@@ -187,15 +189,32 @@ static int xe_shrinker_walk(struct xe_shrinker *shrinker,
return ret;
if (!ctx->no_wait_gpu) {
+ /*
+ * Blocking is now tolerated: allow retrying a failed backup
+ * allocation using kernel reserves, but only if writeback is
+ * permitted at all in this gfp context (i.e. __GFP_IO is
+ * set); see @allow_writeback in xe_shrinker_scan().
+ */
+ save_flags.may_writeback = allow_writeback;
ret = __xe_shrinker_walk(shrinker, ctx, save_flags, to_scan, scanned,
freed);
if (ret || *scanned >= to_scan)
return ret;
}
- if (flags.writeback)
- ret = __xe_shrinker_walk(shrinker, ctx, flags, to_scan, scanned,
+ if (allow_writeback) {
+ struct xe_bo_shrink_flags wb_flags = flags;
+
+ /*
+ * Writeback explicitly allowed: also force writeback on any
+ * retry so it actually relieves memory pressure instead of
+ * just growing dirty shmem.
+ */
+ wb_flags.may_writeback = true;
+ wb_flags.force_writeback = true;
+ ret = __xe_shrinker_walk(shrinker, ctx, wb_flags, to_scan, scanned,
freed);
+ }
return ret;
}
@@ -297,7 +316,12 @@ static unsigned long xe_shrinker_scan_purgeable(struct shrinker *shrink,
.purge = true,
};
- xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan, &nr_scanned, &freed);
+ /*
+ * Purging never does backup/writeback, so there's nothing to
+ * force or gate on __GFP_IO here.
+ */
+ xe_shrinker_walk(shrinker, &ctx, shrink_flags, false,
+ nr_to_scan, &nr_scanned, &freed);
sc->nr_scanned = nr_scanned;
@@ -314,15 +338,16 @@ static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_con
unsigned long nr_to_scan = sc->nr_to_scan, nr_scanned = 0, freed = 0;
struct xe_bo_shrink_flags shrink_flags = {
.purge = false,
- /* Don't request writeback without __GFP_IO. */
- .writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
};
+ /* Don't allow writeback without __GFP_IO. */
+ bool allow_writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO);
bool runtime_pm;
/* Might need runtime PM to access backed-up or CCS-compressed data. */
runtime_pm = xe_shrinker_runtime_pm_get(shrinker);
- xe_shrinker_walk(shrinker, &ctx, shrink_flags, nr_to_scan, &nr_scanned, &freed);
+ xe_shrinker_walk(shrinker, &ctx, shrink_flags, allow_writeback,
+ nr_to_scan, &nr_scanned, &freed);
sc->nr_scanned = nr_scanned;
xe_shrinker_runtime_pm_put(shrinker, runtime_pm);
diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
index 32791c4db2a9..90b4a8aafac3 100644
--- a/include/drm/ttm/ttm_bo.h
+++ b/include/drm/ttm/ttm_bo.h
@@ -249,15 +249,20 @@ s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
/**
* struct ttm_bo_shrink_flags - flags to govern the bo shrinking behaviour
* @purge: Purge the content rather than backing it up.
- * @writeback: Attempt to immediately write content to swap space.
* @allow_move: Allow moving to system before shrinking. This is typically
* not desired for zombie- or ghost objects (with zombie object meaning
* objects with a zero gem object refcount)
+ * @may_writeback: Allow retrying a failed backup allocation using kernel
+ * reserves. See struct ttm_backup_flags.
+ * @force_writeback: Attempt to immediately write content to swap space,
+ * both for the regular backup and for any retry allowed by
+ * @may_writeback. See struct ttm_backup_flags.
*/
struct ttm_bo_shrink_flags {
u32 purge : 1;
- u32 writeback : 1;
u32 allow_move : 1;
+ u32 may_writeback : 1;
+ u32 force_writeback : 1;
};
long ttm_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
index c292a8f0583f..811b90f14d54 100644
--- a/include/drm/ttm/ttm_tt.h
+++ b/include/drm/ttm/ttm_tt.h
@@ -315,12 +315,19 @@ unsigned long ttm_tt_pages_limit(void);
/**
* struct ttm_backup_flags - Flags to govern backup behaviour.
* @purge: Free pages without backing up. Bypass pools.
- * @writeback: Attempt to copy contents directly to swap space, even
- * if that means blocking on writes to external memory.
+ * @may_writeback: If allocating backup memory fails without dipping into
+ * kernel reserves, allow retrying with reserves, splitting high-order
+ * pages if needed. If not set, stop the backup at that point, leaving
+ * the remainder resident, since the retry may need to block.
+ * @force_writeback: Attempt to copy contents directly to swap space,
+ * even if that means blocking on writes to external memory. This
+ * applies both to the regular backup and to any retry allowed by
+ * @may_writeback.
*/
struct ttm_backup_flags {
u32 purge : 1;
- u32 writeback : 1;
+ u32 may_writeback : 1;
+ u32 force_writeback : 1;
};
long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
--
2.56.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH 4/4] drm/ttm, drm/xe: Gate reserve-dipping backup retries on may_writeback
2026-11-04 20:13 ` [PATCH 4/4] drm/ttm, drm/xe: Gate reserve-dipping backup retries on may_writeback Thomas Hellström
@ 2026-11-04 20:41 ` sashiko-bot
0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-11-04 20:41 UTC (permalink / raw)
To: Thomas Hellström, intel-xe; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] drm/ttm: unsplit high-order retry drains reserves in ttm_pool_backup()
- [High] drm/xe: premature scan termination in xe_shrinker_walk() and xe_bo_shrink()
- [High] drm/ttm: corrupted caching and DMA state in ttm_pool_backup() on page-0 failure
--
commit 40d7831061e17e7b2e436a106ab6986d2645fa67
Author: Thomas Hellström <thomas.hellstrom@linux.intel.com>
drm/ttm, drm/xe: Gate reserve-dipping backup retries on may_writeback
This commit gates shmem backup retries that dip into kernel memory reserves on
a new may_writeback flag while separating direct swap writeback into
force_writeback, and threads both flags through TTM and the Xe shrinker.
> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
> index 8f05257e4f542..87c1ac39af94e 100644
> --- a/drivers/gpu/drm/ttm/ttm_pool.c
> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
[ ... ]
> @@ -1256,7 +1260,9 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> else
> gfp = GFP_HIGHUSER;
>
> - alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN | __GFP_RETRY_MAYFAIL;
> + /* Don't dip into kernel reserves unless @flags->may_writeback is set. */
> + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
> + __GFP_RETRY_MAYFAIL | __GFP_NOMEMALLOC;
[Severity: High]
When ttm_pool_backup() is called with flags->may_writeback set to false (such
as the initial pass of xe_shrinker_walk()), can an -ENOMEM failure on the
very first page leave tt with corrupted caching and DMA state?
Before entering the backup loop, ttm_pool_backup() converts all resident pages
of a non-partial tt with tt->caching != ttm_cached to write-back via
set_pages_array_wb(), and unmaps and zeroes all tt->dma_address[] entries:
drivers/gpu/drm/ttm/ttm_pool.c:ttm_pool_backup() {
if (!partial && tt->caching != ttm_cached) {
...
if (run_count)
set_pages_array_wb(&tt->pages[run_start], run_count);
}
...
if (tt->dma_address || flags->purge) {
...
if (tt->dma_address && tt->dma_address[i]) {
ttm_pool_unmap(pool, tt->dma_address[i],
num_pages);
memset(&tt->dma_address[i], 0,
num_pages * sizeof(*tt->dma_address));
}
}
}
Because alloc_gfp now includes __GFP_NOMEMALLOC for all page orders (including
order 0) and does not retry when flags->may_writeback is false,
shmem_read_folio_gfp() can fail with -ENOMEM on the first page (i == 0,
nr_backed == 0, shrunken == 0), causing ttm_pool_backup() to return -ENOMEM.
In ttm_tt_backup(), tt->page_flags is only updated when ret > 0:
drivers/gpu/drm/ttm/ttm_tt.c:ttm_tt_backup() {
ret = ttm_pool_backup(&bdev->pool, tt, &flags);
if (ret > 0) {
tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
...
if (tt->remaining_pages) {
tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
tt->page_flags |= TTM_TT_FLAG_PARTIAL;
}
...
}
}
With TTM_TT_FLAG_PRIV_POPULATED still set and TTM_TT_FLAG_PARTIAL clear, won't
subsequent calls to ttm_tt_populate() see ttm_tt_is_populated(tt) as true and
return 0 without restoring WC/UC caching or DMA mappings, while
ttm_tt_unpopulate() -> ttm_pool_free() returns the write-back pages directly
into the WC/UC page pool and calls ttm_pool_unmap() on the zeroed
tt->dma_address[] entries?
>
> num_pages = tt->num_pages;
>
> @@ -1280,14 +1286,7 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> order = ttm_pool_page_order(pool, page);
> npages = 1UL << order;
>
> - /*
> - * We don't allow dipping kernel reserves for high order backup
> - */
> - if (order)
> - alloc_gfp |= __GFP_NOMEMALLOC;
> - else
> - alloc_gfp &= ~__GFP_NOMEMALLOC;
> -
> + dip_reserves = false;
> /*
> * Back up the compound atomically at its native order. If
> * fault injection truncated num_pages mid-compound, skip
> @@ -1296,10 +1295,18 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> if (unlikely(i + npages > num_pages))
> break;
>
> +retry:
> handle = ttm_backup_backup_folio(backup, page_folio(page),
> - order, flags->writeback, i,
> - gfp, alloc_gfp,
> - &nr_backed);
> + order, flags->force_writeback, i,
> + gfp, dip_reserves ?
> + alloc_gfp & ~__GFP_NOMEMALLOC :
> + alloc_gfp, &nr_backed);
> + if (unlikely(handle == -ENOMEM && !nr_backed &&
> + flags->may_writeback && !dip_reserves)) {
> + dip_reserves = true;
> + goto retry;
> + }
[Severity: High]
If ttm_backup_backup_folio() fails with -ENOMEM on the first subpage
(!nr_backed) of a high-order compound page (order > 0), doesn't jumping
directly to retry re-invoke ttm_backup_backup_folio() at the full compound
order with __GFP_NOMEMALLOC cleared instead of splitting the compound into
order-0 pages first?
When system free memory is below normal zone watermarks during reclaim, the
initial __GFP_NOMEMALLOC allocation fails on subpage 0 with handle == -ENOMEM
and nr_backed == 0. Because ttm_pool_split_for_swap() is only called further
down when nr_backed > 0 and nr_backed < npages, retrying at the original
order forces ttm_backup_backup_folio() to allocate up to 1 << order shmem
pages from kernel memory reserves before returning to ttm_pool_backup() where
the source compound page can finally be freed.
Should this path split a high-order page via ttm_pool_split_for_swap(pool,
page) and reset order = 0 and npages = 1 before retrying with reserves, as
described in the struct ttm_backup_flags kerneldoc for may_writeback, so each
order-0 subpage is backed up and freed before allocating the next shmem page?
[ ... ]
> diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
> index c86455ea08d18..c24f35cbc2358 100644
> --- a/drivers/gpu/drm/xe/xe_shrinker.c
> +++ b/drivers/gpu/drm/xe/xe_shrinker.c
> @@ -171,6 +171,7 @@ static int __xe_shrinker_walk(struct xe_shrinker *shrinker,
> static int xe_shrinker_walk(struct xe_shrinker *shrinker,
> struct ttm_operation_ctx *ctx,
> const struct xe_bo_shrink_flags flags,
> + bool allow_writeback,
> unsigned long to_scan, unsigned long *scanned,
> unsigned long *freed)
> {
> @@ -179,7 +180,8 @@ static int xe_shrinker_walk(struct xe_shrinker *shrinker,
> int ret;
>
> swap(no_wait_gpu, ctx->no_wait_gpu);
> - save_flags.writeback = false;
> + save_flags.may_writeback = false;
> + save_flags.force_writeback = false;
> ret = __xe_shrinker_walk(shrinker, ctx, save_flags, to_scan, scanned,
> freed);
> swap(no_wait_gpu, ctx->no_wait_gpu);
> @@ -187,15 +189,32 @@ static int xe_shrinker_walk(struct xe_shrinker *shrinker,
> return ret;
>
> if (!ctx->no_wait_gpu) {
> + /*
> + * Blocking is now tolerated: allow retrying a failed backup
> + * allocation using kernel reserves, but only if writeback is
> + * permitted at all in this gfp context (i.e. __GFP_IO is
> + * set); see @allow_writeback in xe_shrinker_scan().
> + */
> + save_flags.may_writeback = allow_writeback;
> ret = __xe_shrinker_walk(shrinker, ctx, save_flags, to_scan, scanned,
> freed);
> if (ret || *scanned >= to_scan)
> return ret;
> }
>
> - if (flags.writeback)
> - ret = __xe_shrinker_walk(shrinker, ctx, flags, to_scan, scanned,
> + if (allow_writeback) {
> + struct xe_bo_shrink_flags wb_flags = flags;
> +
> + /*
> + * Writeback explicitly allowed: also force writeback on any
> + * retry so it actually relieves memory pressure instead of
> + * just growing dirty shmem.
> + */
> + wb_flags.may_writeback = true;
> + wb_flags.force_writeback = true;
> + ret = __xe_shrinker_walk(shrinker, ctx, wb_flags, to_scan, scanned,
> freed);
> + }
[Severity: High]
Can xe_shrinker_walk() terminate after the first pass with 0 freed pages when
__GFP_NOMEMALLOC shmem allocations fail under memory pressure, without ever
reaching the passes that set may_writeback or force_writeback?
In xe_bo_shrink(), *scanned is incremented by the full old_remaining page
count before calling ttm_bo_shrink():
drivers/gpu/drm/xe/xe_bo.c:xe_bo_shrink() {
old_remaining = ttm_tt_remaining_pages(tt);
*scanned += old_remaining;
lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
{.purge = false,
.allow_move = true,
.may_writeback = flags.may_writeback,
.force_writeback = flags.force_writeback});
}
During the first pass of xe_shrinker_walk() (where save_flags.may_writeback is
false), if shmem_read_folio_gfp() with __GFP_NOMEMALLOC fails with -ENOMEM on
an idle BO, ttm_pool_backup() stops without retrying and ttm_bo_shrink()
returns -EBUSY (or a partial count if it stopped mid-BO). In
__xe_shrinker_walk(), lret == -EBUSY continues to the next BO on the LRU
while keeping old_remaining added to *scanned. Once Pass 1 returns,
*scanned >= to_scan is satisfied and xe_shrinker_walk() returns immediately
without running Pass 2 or Pass 3.
Additionally, if Pass 1 visits fewer than to_scan pages in idle BOs and
reaches Pass 2 with allow_writeback set to true, Pass 2 runs with
save_flags.may_writeback = true and save_flags.force_writeback = false. Won't
Pass 2 dip into kernel memory reserves to grow dirty shmem without writeback
and satisfy *scanned >= to_scan before Pass 3 (where force_writeback = true)
can run?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261104201331.2462-1-thomas.hellstrom@linux.intel.com?part=4
^ permalink raw reply [flat|nested] 9+ messages in thread
* ✓ CI.KUnit: success for drm/ttm, drm/xe: Support partially backed-up ttm_tts
2026-11-04 20:13 [PATCH 0/4] drm/ttm, drm/xe: Support partially backed-up ttm_tts Thomas Hellström
` (3 preceding siblings ...)
2026-11-04 20:13 ` [PATCH 4/4] drm/ttm, drm/xe: Gate reserve-dipping backup retries on may_writeback Thomas Hellström
@ 2026-11-04 20:23 ` Patchwork
2026-11-04 20:57 ` ✓ Xe.CI.BAT: " Patchwork
5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2026-11-04 20:23 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: drm/ttm, drm/xe: Support partially backed-up ttm_tts
URL : https://patchwork.freedesktop.org/series/177782/
State : success
== Summary ==
+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[20:21:19] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:21:25] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[20:21:45] Starting KUnit Kernel (1/1)...
[20:21:45] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:21:45] ================= gpu_buddy (14 subtests) ==================
[20:21:45] [PASSED] gpu_test_buddy_alloc_limit
[20:21:45] [PASSED] gpu_test_buddy_alloc_optimistic
[20:21:45] [PASSED] gpu_test_buddy_alloc_pessimistic
[20:21:45] [PASSED] gpu_test_buddy_alloc_pathological
[20:21:45] [PASSED] gpu_test_buddy_alloc_contiguous
[20:21:45] [PASSED] gpu_test_buddy_alloc_clear
[20:21:45] [PASSED] gpu_test_buddy_alloc_range
[20:21:45] [PASSED] gpu_test_buddy_alloc_range_bias
[20:21:46] [PASSED] gpu_test_buddy_fragmentation_performance
[20:21:47] [PASSED] gpu_test_buddy_dirty_tracker_performance
[20:21:47] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[20:21:47] [PASSED] gpu_test_buddy_offset_aligned_allocation
[20:21:47] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[20:21:47] [PASSED] gpu_test_buddy_addr_to_block
[20:21:47] ==================== [PASSED] gpu_buddy ====================
[20:21:47] ============================================================
[20:21:47] Testing complete. Ran 14 tests: passed: 14
[20:21:47] Elapsed time: 27.365s total, 5.128s configuring, 20.369s building, 1.819s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[20:21:47] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:21:49] 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
../drivers/gpu/drm/ttm/ttm_pool.c: In function ‘ttm_pool_restore_abort’:
../drivers/gpu/drm/ttm/ttm_pool.c:1076:24: warning: variable ‘mid’ set but not used [-Wunused-but-set-variable]
1076 | pgoff_t i, nr, mid;
| ^~~
../drivers/gpu/drm/ttm/ttm_pool.c: In function ‘ttm_pool_backup’:
../drivers/gpu/drm/ttm/ttm_pool.c:1181:14: warning: unused variable ‘partial’ [-Wunused-variable]
1181 | bool partial = ttm_tt_is_partial(tt);
| ^~~~~~~
[20:22:27] Starting KUnit Kernel (1/1)...
[20:22:27] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:22:28] ================== guc_buf (11 subtests) ===================
[20:22:28] [PASSED] test_smallest
[20:22:28] [PASSED] test_largest
[20:22:28] [PASSED] test_granular
[20:22:28] [PASSED] test_unique
[20:22:28] [PASSED] test_overlap
[20:22:28] [PASSED] test_reusable
[20:22:28] [PASSED] test_too_big
[20:22:28] [PASSED] test_flush
[20:22:28] [PASSED] test_lookup
[20:22:28] [PASSED] test_data
[20:22:28] [PASSED] test_class
[20:22:28] ===================== [PASSED] guc_buf =====================
[20:22:28] =================== guc_dbm (7 subtests) ===================
[20:22:28] [PASSED] test_empty
[20:22:28] [PASSED] test_default
[20:22:28] ======================== test_size ========================
[20:22:28] [PASSED] 4
[20:22:28] [PASSED] 8
[20:22:28] [PASSED] 32
[20:22:28] [PASSED] 256
[20:22:28] ==================== [PASSED] test_size ====================
[20:22:28] ======================= test_reuse ========================
[20:22:28] [PASSED] 4
[20:22:28] [PASSED] 8
[20:22:28] [PASSED] 32
[20:22:28] [PASSED] 256
[20:22:28] =================== [PASSED] test_reuse ====================
[20:22:28] =================== test_range_overlap ====================
[20:22:28] [PASSED] 4
[20:22:28] [PASSED] 8
[20:22:28] [PASSED] 32
[20:22:28] [PASSED] 256
[20:22:28] =============== [PASSED] test_range_overlap ================
[20:22:28] =================== test_range_compact ====================
[20:22:28] [PASSED] 4
[20:22:28] [PASSED] 8
[20:22:28] [PASSED] 32
[20:22:28] [PASSED] 256
[20:22:28] =============== [PASSED] test_range_compact ================
[20:22:28] ==================== test_range_spare =====================
[20:22:28] [PASSED] 4
[20:22:28] [PASSED] 8
[20:22:28] [PASSED] 32
[20:22:28] [PASSED] 256
[20:22:28] ================ [PASSED] test_range_spare =================
[20:22:28] ===================== [PASSED] guc_dbm =====================
[20:22:28] ================== guc_idm (22 subtests) ===================
[20:22:28] [PASSED] bad_init
[20:22:28] [PASSED] no_init
[20:22:28] [PASSED] init_fini
[20:22:28] [PASSED] check_init_small
[20:22:28] [PASSED] check_init_shared
[20:22:28] [PASSED] check_used
[20:22:28] [PASSED] check_quota
[20:22:28] [PASSED] check_all
[20:22:28] [PASSED] check_limits
[20:22:28] [PASSED] check_overlap
[20:22:28] [PASSED] check_overlap_alloc
[20:22:28] [PASSED] check_overlap_release
[20:22:28] [PASSED] check_overlap_partial_init
[20:22:28] [PASSED] check_overlap_partial_shared_range_blocking
[20:22:28] [PASSED] check_used_usable
[20:22:28] [PASSED] check_used_shareable
[20:22:28] [PASSED] check_used_mixed
[20:22:28] [PASSED] check_release_usable_range
[20:22:28] [PASSED] check_release_shareable_range
[20:22:28] [PASSED] check_split_boundaries
[20:22:28] [PASSED] check_shareable_spare
[20:22:28] [PASSED] check_shareable_spare_fragmented_tail
[20:22:28] ===================== [PASSED] guc_idm =====================
[20:22:28] ============== guc_klv_helpers (13 subtests) ===============
[20:22:28] [PASSED] test_count
[20:22:28] [PASSED] test_encode_u32
[20:22:28] [PASSED] test_encode_u64
[20:22:28] [PASSED] test_encode_string
[20:22:28] [PASSED] test_encode_object_raw
[20:22:28] [PASSED] test_encode_object_klv
[20:22:28] [PASSED] test_encode_object_nested
[20:22:28] [PASSED] test_encode_object_basic
[20:22:28] ===================== test_decode_u16 =====================
[20:22:28] [PASSED] empty
[20:22:28] [PASSED] valid
[20:22:28] [PASSED] max
[20:22:28] [PASSED] big
[20:22:28] [PASSED] long
[20:22:28] ================= [PASSED] test_decode_u16 =================
[20:22:28] ===================== test_decode_u32 =====================
[20:22:28] [PASSED] empty
[20:22:28] [PASSED] valid
[20:22:28] [PASSED] max
[20:22:28] [PASSED] long
[20:22:28] ================= [PASSED] test_decode_u32 =================
[20:22:28] ===================== test_decode_u64 =====================
[20:22:28] [PASSED] empty
[20:22:28] [PASSED] short
[20:22:28] [PASSED] valid
[20:22:28] [PASSED] max
[20:22:28] [PASSED] long
[20:22:28] ================= [PASSED] test_decode_u64 =================
[20:22:28] ===================== test_decode_str =====================
[20:22:28] [PASSED] empty
[20:22:28] [PASSED] one
[20:22:28] [PASSED] one_trash
[20:22:28] [PASSED] two
[20:22:28] [PASSED] two_trash
[20:22:28] [PASSED] three
[20:22:28] [PASSED] dword
[20:22:28] [PASSED] four
[20:22:28] [PASSED] five
[20:22:28] [PASSED] six
[20:22:28] [PASSED] seven
[20:22:28] [PASSED] qword
[20:22:28] ================= [PASSED] test_decode_str =================
[20:22:28] [PASSED] test_print
[20:22:28] ================= [PASSED] guc_klv_helpers =================
[20:22:28] =================== xe_log (4 subtests) ====================
[20:22:28] [PASSED] demo_cper
[20:22:28] [PASSED] demo_dmesg
[20:22:28] ======================= test_dmesg ========================
[20:22:28] [PASSED] test_fatal
[20:22:28] [PASSED] test_fatal_tile
[20:22:28] [PASSED] test_fatal_gt
[20:22:28] [PASSED] test_fatal_comp
[20:22:28] [PASSED] test_fatal_comp_tile
[20:22:28] [PASSED] test_fatal_comp_gt
[20:22:28] [PASSED] test_fatal_all
[20:22:28] [PASSED] test_recoverable
[20:22:28] [PASSED] test_recoverable_tile
[20:22:28] [PASSED] test_recoverable_gt
[20:22:28] [PASSED] test_recoverable_comp
[20:22:28] [PASSED] test_recoverable_comp_tile
[20:22:28] [PASSED] test_recoverable_comp_gt
[20:22:28] [PASSED] test_recoverable_all
[20:22:28] [PASSED] test_info
[20:22:28] [PASSED] test_info_tile
[20:22:28] [PASSED] test_info_gt
[20:22:28] [PASSED] test_info_err
[20:22:28] [PASSED] test_info_comp
[20:22:28] [PASSED] test_info_comp_tile
[20:22:28] [PASSED] test_info_comp_gt
[20:22:28] [PASSED] test_info_all
[20:22:28] [PASSED] test_hw_fatal
[20:22:28] [PASSED] test_hw_recoverable
[20:22:28] [PASSED] test_hw_corrected
[20:22:28] [PASSED] test_hw_informational
[20:22:28] =================== [PASSED] test_dmesg ====================
[20:22:28] ====================== test_invalid =======================
[20:22:28] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[20:22:28] ================== [SKIPPED] test_invalid ==================
[20:22:28] ===================== [PASSED] xe_log ======================
[20:22:28] ================== no_relay (3 subtests) ===================
[20:22:28] [PASSED] xe_drops_guc2pf_if_not_ready
[20:22:28] [PASSED] xe_drops_guc2vf_if_not_ready
[20:22:28] [PASSED] xe_rejects_send_if_not_ready
[20:22:28] ==================== [PASSED] no_relay =====================
[20:22:28] ================== pf_relay (14 subtests) ==================
[20:22:28] [PASSED] pf_rejects_guc2pf_too_short
[20:22:28] [PASSED] pf_rejects_guc2pf_too_long
[20:22:28] [PASSED] pf_rejects_guc2pf_no_payload
[20:22:28] [PASSED] pf_fails_no_payload
[20:22:28] [PASSED] pf_fails_bad_origin
[20:22:28] [PASSED] pf_fails_bad_type
[20:22:28] [PASSED] pf_txn_reports_error
[20:22:28] [PASSED] pf_txn_sends_pf2guc
[20:22:28] [PASSED] pf_sends_pf2guc
[20:22:28] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:22:28] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:22:28] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:22:28] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:22:28] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:22:28] ==================== [PASSED] pf_relay =====================
[20:22:28] ================== vf_relay (3 subtests) ===================
[20:22:28] [PASSED] vf_rejects_guc2vf_too_short
[20:22:28] [PASSED] vf_rejects_guc2vf_too_long
[20:22:28] [PASSED] vf_rejects_guc2vf_no_payload
[20:22:28] ==================== [PASSED] vf_relay =====================
[20:22:28] ================ pf_gt_config (9 subtests) =================
[20:22:28] [PASSED] fair_contexts_1vf
[20:22:28] [PASSED] fair_doorbells_1vf
[20:22:28] [PASSED] fair_ggtt_1vf
[20:22:28] ====================== fair_vram_1vf ======================
[20:22:28] [PASSED] 3.50 GiB
[20:22:28] [PASSED] 11.5 GiB
[20:22:28] [PASSED] 15.5 GiB
[20:22:28] [PASSED] 31.5 GiB
[20:22:28] [PASSED] 63.5 GiB
[20:22:28] [PASSED] 1.91 GiB
[20:22:28] ================== [PASSED] fair_vram_1vf ==================
[20:22:28] ================ fair_vram_1vf_admin_only =================
[20:22:28] [PASSED] 3.50 GiB
[20:22:28] [PASSED] 11.5 GiB
[20:22:28] [PASSED] 15.5 GiB
[20:22:28] [PASSED] 31.5 GiB
[20:22:28] [PASSED] 63.5 GiB
[20:22:28] [PASSED] 1.91 GiB
[20:22:28] ============ [PASSED] fair_vram_1vf_admin_only =============
[20:22:28] ====================== fair_contexts ======================
[20:22:28] [PASSED] 1 VF
[20:22:28] [PASSED] 2 VFs
[20:22:28] [PASSED] 3 VFs
[20:22:28] [PASSED] 4 VFs
[20:22:28] [PASSED] 5 VFs
[20:22:28] [PASSED] 6 VFs
[20:22:28] [PASSED] 7 VFs
[20:22:28] [PASSED] 8 VFs
[20:22:28] [PASSED] 9 VFs
[20:22:28] [PASSED] 10 VFs
[20:22:28] [PASSED] 11 VFs
[20:22:28] [PASSED] 12 VFs
[20:22:28] [PASSED] 13 VFs
[20:22:28] [PASSED] 14 VFs
[20:22:28] [PASSED] 15 VFs
[20:22:28] [PASSED] 16 VFs
[20:22:28] [PASSED] 17 VFs
[20:22:28] [PASSED] 18 VFs
[20:22:28] [PASSED] 19 VFs
[20:22:28] [PASSED] 20 VFs
[20:22:28] [PASSED] 21 VFs
[20:22:28] [PASSED] 22 VFs
[20:22:28] [PASSED] 23 VFs
[20:22:28] [PASSED] 24 VFs
[20:22:28] [PASSED] 25 VFs
[20:22:28] [PASSED] 26 VFs
[20:22:28] [PASSED] 27 VFs
[20:22:28] [PASSED] 28 VFs
[20:22:28] [PASSED] 29 VFs
[20:22:28] [PASSED] 30 VFs
[20:22:28] [PASSED] 31 VFs
[20:22:28] [PASSED] 32 VFs
[20:22:28] [PASSED] 33 VFs
[20:22:28] [PASSED] 34 VFs
[20:22:28] [PASSED] 35 VFs
[20:22:28] [PASSED] 36 VFs
[20:22:28] [PASSED] 37 VFs
[20:22:28] [PASSED] 38 VFs
[20:22:28] [PASSED] 39 VFs
[20:22:28] [PASSED] 40 VFs
[20:22:28] [PASSED] 41 VFs
[20:22:28] [PASSED] 42 VFs
[20:22:28] [PASSED] 43 VFs
[20:22:28] [PASSED] 44 VFs
[20:22:28] [PASSED] 45 VFs
[20:22:28] [PASSED] 46 VFs
[20:22:28] [PASSED] 47 VFs
[20:22:28] [PASSED] 48 VFs
[20:22:28] [PASSED] 49 VFs
[20:22:28] [PASSED] 50 VFs
[20:22:28] [PASSED] 51 VFs
[20:22:28] [PASSED] 52 VFs
[20:22:28] [PASSED] 53 VFs
[20:22:28] [PASSED] 54 VFs
[20:22:28] [PASSED] 55 VFs
[20:22:28] [PASSED] 56 VFs
[20:22:28] [PASSED] 57 VFs
[20:22:28] [PASSED] 58 VFs
[20:22:28] [PASSED] 59 VFs
[20:22:28] [PASSED] 60 VFs
[20:22:28] [PASSED] 61 VFs
[20:22:28] [PASSED] 62 VFs
[20:22:28] [PASSED] 63 VFs
[20:22:28] ================== [PASSED] fair_contexts ==================
[20:22:28] ===================== fair_doorbells ======================
[20:22:28] [PASSED] 1 VF
[20:22:28] [PASSED] 2 VFs
[20:22:28] [PASSED] 3 VFs
[20:22:28] [PASSED] 4 VFs
[20:22:28] [PASSED] 5 VFs
[20:22:28] [PASSED] 6 VFs
[20:22:28] [PASSED] 7 VFs
[20:22:28] [PASSED] 8 VFs
[20:22:28] [PASSED] 9 VFs
[20:22:28] [PASSED] 10 VFs
[20:22:28] [PASSED] 11 VFs
[20:22:28] [PASSED] 12 VFs
[20:22:28] [PASSED] 13 VFs
[20:22:28] [PASSED] 14 VFs
[20:22:28] [PASSED] 15 VFs
[20:22:28] [PASSED] 16 VFs
[20:22:28] [PASSED] 17 VFs
[20:22:28] [PASSED] 18 VFs
[20:22:28] [PASSED] 19 VFs
[20:22:28] [PASSED] 20 VFs
[20:22:28] [PASSED] 21 VFs
[20:22:28] [PASSED] 22 VFs
[20:22:28] [PASSED] 23 VFs
[20:22:28] [PASSED] 24 VFs
[20:22:28] [PASSED] 25 VFs
[20:22:28] [PASSED] 26 VFs
[20:22:28] [PASSED] 27 VFs
[20:22:28] [PASSED] 28 VFs
[20:22:28] [PASSED] 29 VFs
[20:22:28] [PASSED] 30 VFs
[20:22:28] [PASSED] 31 VFs
[20:22:28] [PASSED] 32 VFs
[20:22:28] [PASSED] 33 VFs
[20:22:28] [PASSED] 34 VFs
[20:22:28] [PASSED] 35 VFs
[20:22:28] [PASSED] 36 VFs
[20:22:28] [PASSED] 37 VFs
[20:22:28] [PASSED] 38 VFs
[20:22:28] [PASSED] 39 VFs
[20:22:28] [PASSED] 40 VFs
[20:22:28] [PASSED] 41 VFs
[20:22:28] [PASSED] 42 VFs
[20:22:28] [PASSED] 43 VFs
[20:22:28] [PASSED] 44 VFs
[20:22:28] [PASSED] 45 VFs
[20:22:28] [PASSED] 46 VFs
[20:22:28] [PASSED] 47 VFs
[20:22:28] [PASSED] 48 VFs
[20:22:28] [PASSED] 49 VFs
[20:22:28] [PASSED] 50 VFs
[20:22:28] [PASSED] 51 VFs
[20:22:28] [PASSED] 52 VFs
[20:22:28] [PASSED] 53 VFs
[20:22:28] [PASSED] 54 VFs
[20:22:28] [PASSED] 55 VFs
[20:22:28] [PASSED] 56 VFs
[20:22:28] [PASSED] 57 VFs
[20:22:28] [PASSED] 58 VFs
[20:22:28] [PASSED] 59 VFs
[20:22:28] [PASSED] 60 VFs
[20:22:28] [PASSED] 61 VFs
[20:22:28] [PASSED] 62 VFs
[20:22:28] [PASSED] 63 VFs
[20:22:28] ================= [PASSED] fair_doorbells ==================
[20:22:28] ======================== fair_ggtt ========================
[20:22:28] [PASSED] 1 VF
[20:22:28] [PASSED] 2 VFs
[20:22:28] [PASSED] 3 VFs
[20:22:28] [PASSED] 4 VFs
[20:22:28] [PASSED] 5 VFs
[20:22:28] [PASSED] 6 VFs
[20:22:28] [PASSED] 7 VFs
[20:22:28] [PASSED] 8 VFs
[20:22:28] [PASSED] 9 VFs
[20:22:28] [PASSED] 10 VFs
[20:22:28] [PASSED] 11 VFs
[20:22:28] [PASSED] 12 VFs
[20:22:28] [PASSED] 13 VFs
[20:22:28] [PASSED] 14 VFs
[20:22:28] [PASSED] 15 VFs
[20:22:28] [PASSED] 16 VFs
[20:22:28] [PASSED] 17 VFs
[20:22:28] [PASSED] 18 VFs
[20:22:28] [PASSED] 19 VFs
[20:22:28] [PASSED] 20 VFs
[20:22:28] [PASSED] 21 VFs
[20:22:28] [PASSED] 22 VFs
[20:22:28] [PASSED] 23 VFs
[20:22:28] [PASSED] 24 VFs
[20:22:28] [PASSED] 25 VFs
[20:22:28] [PASSED] 26 VFs
[20:22:28] [PASSED] 27 VFs
[20:22:28] [PASSED] 28 VFs
[20:22:28] [PASSED] 29 VFs
[20:22:28] [PASSED] 30 VFs
[20:22:28] [PASSED] 31 VFs
[20:22:28] [PASSED] 32 VFs
[20:22:28] [PASSED] 33 VFs
[20:22:28] [PASSED] 34 VFs
[20:22:28] [PASSED] 35 VFs
[20:22:28] [PASSED] 36 VFs
[20:22:28] [PASSED] 37 VFs
[20:22:28] [PASSED] 38 VFs
[20:22:28] [PASSED] 39 VFs
[20:22:28] [PASSED] 40 VFs
[20:22:28] [PASSED] 41 VFs
[20:22:28] [PASSED] 42 VFs
[20:22:28] [PASSED] 43 VFs
[20:22:28] [PASSED] 44 VFs
[20:22:28] [PASSED] 45 VFs
[20:22:28] [PASSED] 46 VFs
[20:22:28] [PASSED] 47 VFs
[20:22:28] [PASSED] 48 VFs
[20:22:28] [PASSED] 49 VFs
[20:22:28] [PASSED] 50 VFs
[20:22:28] [PASSED] 51 VFs
[20:22:28] [PASSED] 52 VFs
[20:22:28] [PASSED] 53 VFs
[20:22:28] [PASSED] 54 VFs
[20:22:28] [PASSED] 55 VFs
[20:22:28] [PASSED] 56 VFs
[20:22:28] [PASSED] 57 VFs
[20:22:28] [PASSED] 58 VFs
[20:22:28] [PASSED] 59 VFs
[20:22:28] [PASSED] 60 VFs
[20:22:28] [PASSED] 61 VFs
[20:22:28] [PASSED] 62 VFs
[20:22:28] [PASSED] 63 VFs
[20:22:28] ==================== [PASSED] fair_ggtt ====================
[20:22:28] ======================== fair_vram ========================
[20:22:28] [PASSED] 1 VF
[20:22:28] [PASSED] 2 VFs
[20:22:28] [PASSED] 3 VFs
[20:22:28] [PASSED] 4 VFs
[20:22:28] [PASSED] 5 VFs
[20:22:28] [PASSED] 6 VFs
[20:22:28] [PASSED] 7 VFs
[20:22:28] [PASSED] 8 VFs
[20:22:28] [PASSED] 9 VFs
[20:22:28] [PASSED] 10 VFs
[20:22:28] [PASSED] 11 VFs
[20:22:28] [PASSED] 12 VFs
[20:22:28] [PASSED] 13 VFs
[20:22:28] [PASSED] 14 VFs
[20:22:28] [PASSED] 15 VFs
[20:22:28] [PASSED] 16 VFs
[20:22:28] [PASSED] 17 VFs
[20:22:28] [PASSED] 18 VFs
[20:22:28] [PASSED] 19 VFs
[20:22:28] [PASSED] 20 VFs
[20:22:28] [PASSED] 21 VFs
[20:22:28] [PASSED] 22 VFs
[20:22:28] [PASSED] 23 VFs
[20:22:28] [PASSED] 24 VFs
[20:22:28] [PASSED] 25 VFs
[20:22:28] [PASSED] 26 VFs
[20:22:28] [PASSED] 27 VFs
[20:22:28] [PASSED] 28 VFs
[20:22:28] [PASSED] 29 VFs
[20:22:28] [PASSED] 30 VFs
[20:22:28] [PASSED] 31 VFs
[20:22:28] [PASSED] 32 VFs
[20:22:28] [PASSED] 33 VFs
[20:22:28] [PASSED] 34 VFs
[20:22:28] [PASSED] 35 VFs
[20:22:28] [PASSED] 36 VFs
[20:22:28] [PASSED] 37 VFs
[20:22:28] [PASSED] 38 VFs
[20:22:28] [PASSED] 39 VFs
[20:22:28] [PASSED] 40 VFs
[20:22:28] [PASSED] 41 VFs
[20:22:28] [PASSED] 42 VFs
[20:22:28] [PASSED] 43 VFs
[20:22:28] [PASSED] 44 VFs
[20:22:28] [PASSED] 45 VFs
[20:22:28] [PASSED] 46 VFs
[20:22:28] [PASSED] 47 VFs
[20:22:28] [PASSED] 48 VFs
[20:22:28] [PASSED] 49 VFs
[20:22:28] [PASSED] 50 VFs
[20:22:28] [PASSED] 51 VFs
[20:22:28] [PASSED] 52 VFs
[20:22:28] [PASSED] 53 VFs
[20:22:28] [PASSED] 54 VFs
[20:22:28] [PASSED] 55 VFs
[20:22:28] [PASSED] 56 VFs
[20:22:28] [PASSED] 57 VFs
[20:22:28] [PASSED] 58 VFs
[20:22:28] [PASSED] 59 VFs
[20:22:28] [PASSED] 60 VFs
[20:22:28] [PASSED] 61 VFs
[20:22:28] [PASSED] 62 VFs
[20:22:28] [PASSED] 63 VFs
[20:22:28] ==================== [PASSED] fair_vram ====================
[20:22:28] ================== [PASSED] pf_gt_config ===================
[20:22:28] ===================== lmtt (1 subtest) =====================
[20:22:28] ======================== test_ops =========================
[20:22:28] [PASSED] 2-level
[20:22:28] [PASSED] multi-level
[20:22:28] ==================== [PASSED] test_ops =====================
[20:22:28] ====================== [PASSED] lmtt =======================
[20:22:28] ================= sriov_packet (1 subtest) =================
[20:22:28] [PASSED] test_descriptor_init
[20:22:28] ================== [PASSED] sriov_packet ===================
[20:22:28] ================= pf_service (11 subtests) =================
[20:22:28] [PASSED] pf_negotiate_any
[20:22:28] [PASSED] pf_negotiate_base_match
[20:22:28] [PASSED] pf_negotiate_base_newer
[20:22:28] [PASSED] pf_negotiate_base_next
[20:22:28] [SKIPPED] pf_negotiate_base_older (no older minor)
[20:22:28] [PASSED] pf_negotiate_base_prev
[20:22:28] [PASSED] pf_negotiate_latest_match
[20:22:28] [PASSED] pf_negotiate_latest_newer
[20:22:28] [PASSED] pf_negotiate_latest_next
[20:22:28] [SKIPPED] pf_negotiate_latest_older (no older minor)
[20:22:28] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[20:22:28] =================== [PASSED] pf_service ====================
[20:22:28] ================= xe_guc_g2g (2 subtests) ==================
[20:22:28] ============== xe_live_guc_g2g_kunit_default ==============
[20:22:28] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[20:22:28] ============== xe_live_guc_g2g_kunit_allmem ===============
[20:22:28] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[20:22:28] =================== [SKIPPED] xe_guc_g2g ===================
[20:22:28] =================== xe_mocs (2 subtests) ===================
[20:22:28] ================ xe_live_mocs_kernel_kunit ================
[20:22:28] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[20:22:28] ================ xe_live_mocs_reset_kunit =================
[20:22:28] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[20:22:28] ==================== [SKIPPED] xe_mocs =====================
[20:22:28] ================= xe_migrate (3 subtests) ==================
[20:22:28] ================= xe_migrate_sanity_kunit =================
[20:22:28] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[20:22:28] ================== xe_validate_ccs_kunit ==================
[20:22:28] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[20:22:28] ============= xe_migrate_access_memory_kunit ==============
[20:22:28] ========= [SKIPPED] xe_migrate_access_memory_kunit =========
[20:22:28] =================== [SKIPPED] xe_migrate ===================
[20:22:28] ================== xe_dma_buf (1 subtest) ==================
[20:22:28] ==================== xe_dma_buf_kunit =====================
[20:22:28] ================ [SKIPPED] xe_dma_buf_kunit ================
[20:22:28] =================== [SKIPPED] xe_dma_buf ===================
[20:22:28] ================= xe_bo_shrink (1 subtest) =================
[20:22:28] =================== xe_bo_shrink_kunit ====================
[20:22:28] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[20:22:28] ================== [SKIPPED] xe_bo_shrink ==================
[20:22:28] ==================== xe_bo (2 subtests) ====================
[20:22:28] ================== xe_ccs_migrate_kunit ===================
[20:22:28] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[20:22:28] ==================== xe_bo_evict_kunit ====================
[20:22:28] =============== [SKIPPED] xe_bo_evict_kunit ================
[20:22:28] ===================== [SKIPPED] xe_bo ======================
[20:22:28] =================== xe_any (9 subtests) ====================
[20:22:28] [PASSED] test_to_xe
[20:22:28] [PASSED] test_to_dev
[20:22:28] [PASSED] test_to_pdev
[20:22:28] [PASSED] test_to_drm
[20:22:28] [PASSED] test_if_pdev
[20:22:28] [PASSED] test_if_xe
[20:22:28] [PASSED] test_if_tile
[20:22:28] [PASSED] test_if_gt
[20:22:28] [PASSED] test_to_id
[20:22:28] ===================== [PASSED] xe_any ======================
[20:22:28] ==================== args (13 subtests) ====================
[20:22:28] [PASSED] count_args_test
[20:22:28] [PASSED] call_args_example
[20:22:28] [PASSED] call_args_test
[20:22:28] [PASSED] drop_first_arg_example
[20:22:28] [PASSED] drop_first_arg_test
[20:22:28] [PASSED] first_arg_example
[20:22:28] [PASSED] first_arg_test
[20:22:28] [PASSED] last_arg_example
[20:22:28] [PASSED] last_arg_test
[20:22:28] [PASSED] pick_arg_example
[20:22:28] [PASSED] if_args_example
[20:22:28] [PASSED] if_args_test
[20:22:28] [PASSED] sep_comma_example
[20:22:28] ====================== [PASSED] args =======================
[20:22:28] =================== xe_pci (3 subtests) ====================
[20:22:28] ==================== check_graphics_ip ====================
[20:22:28] [PASSED] 12.00 Xe_LP
[20:22:28] [PASSED] 12.10 Xe_LP+
[20:22:28] [PASSED] 12.55 Xe_HPG
[20:22:28] [PASSED] 12.60 Xe_HPC
[20:22:28] [PASSED] 12.70 Xe_LPG
[20:22:28] [PASSED] 12.71 Xe_LPG
[20:22:28] [PASSED] 12.74 Xe_LPG+
[20:22:28] [PASSED] 20.01 Xe2_HPG
[20:22:28] [PASSED] 20.02 Xe2_HPG
[20:22:28] [PASSED] 20.04 Xe2_LPG
[20:22:28] [PASSED] 30.00 Xe3_LPG
[20:22:28] [PASSED] 30.01 Xe3_LPG
[20:22:28] [PASSED] 30.03 Xe3_LPG
[20:22:28] [PASSED] 30.04 Xe3_LPG
[20:22:28] [PASSED] 30.05 Xe3_LPG
[20:22:28] [PASSED] 35.10 Xe3p_LPG
[20:22:28] [PASSED] 35.11 Xe3p_XPC
[20:22:28] ================ [PASSED] check_graphics_ip ================
[20:22:28] ===================== check_media_ip ======================
[20:22:28] [PASSED] 12.00 Xe_M
[20:22:28] [PASSED] 12.55 Xe_HPM
[20:22:28] [PASSED] 13.00 Xe_LPM+
[20:22:28] [PASSED] 13.01 Xe2_HPM
[20:22:28] [PASSED] 20.00 Xe2_LPM
[20:22:28] [PASSED] 30.00 Xe3_LPM
[20:22:28] [PASSED] 30.02 Xe3_LPM
[20:22:28] [PASSED] 35.00 Xe3p_LPM
[20:22:28] [PASSED] 35.03 Xe3p_HPM
[20:22:28] ================= [PASSED] check_media_ip ==================
[20:22:28] =================== check_platform_desc ===================
[20:22:28] [PASSED] 0x9A60 (TIGERLAKE)
[20:22:28] [PASSED] 0x9A68 (TIGERLAKE)
[20:22:28] [PASSED] 0x9A70 (TIGERLAKE)
[20:22:28] [PASSED] 0x9A40 (TIGERLAKE)
[20:22:28] [PASSED] 0x9A49 (TIGERLAKE)
[20:22:28] [PASSED] 0x9A59 (TIGERLAKE)
[20:22:28] [PASSED] 0x9A78 (TIGERLAKE)
[20:22:28] [PASSED] 0x9AC0 (TIGERLAKE)
[20:22:28] [PASSED] 0x9AC9 (TIGERLAKE)
[20:22:28] [PASSED] 0x9AD9 (TIGERLAKE)
[20:22:28] [PASSED] 0x9AF8 (TIGERLAKE)
[20:22:28] [PASSED] 0x4C80 (ROCKETLAKE)
[20:22:28] [PASSED] 0x4C8A (ROCKETLAKE)
[20:22:28] [PASSED] 0x4C8B (ROCKETLAKE)
[20:22:28] [PASSED] 0x4C8C (ROCKETLAKE)
[20:22:28] [PASSED] 0x4C90 (ROCKETLAKE)
[20:22:28] [PASSED] 0x4C9A (ROCKETLAKE)
[20:22:28] [PASSED] 0x4680 (ALDERLAKE_S)
[20:22:28] [PASSED] 0x4682 (ALDERLAKE_S)
[20:22:28] [PASSED] 0x4688 (ALDERLAKE_S)
[20:22:28] [PASSED] 0x468A (ALDERLAKE_S)
[20:22:28] [PASSED] 0x468B (ALDERLAKE_S)
[20:22:28] [PASSED] 0x4690 (ALDERLAKE_S)
[20:22:28] [PASSED] 0x4692 (ALDERLAKE_S)
[20:22:28] [PASSED] 0x4693 (ALDERLAKE_S)
[20:22:28] [PASSED] 0x46A0 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46A1 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46A2 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46A3 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46A6 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46A8 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46AA (ALDERLAKE_P)
[20:22:28] [PASSED] 0x462A (ALDERLAKE_P)
[20:22:28] [PASSED] 0x4626 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x4628 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46B0 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46B1 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46B2 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46B3 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46C0 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46C1 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46C2 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46C3 (ALDERLAKE_P)
[20:22:28] [PASSED] 0x46D0 (ALDERLAKE_N)
[20:22:28] [PASSED] 0x46D1 (ALDERLAKE_N)
[20:22:28] [PASSED] 0x46D2 (ALDERLAKE_N)
[20:22:28] [PASSED] 0x46D3 (ALDERLAKE_N)
[20:22:28] [PASSED] 0x46D4 (ALDERLAKE_N)
[20:22:28] [PASSED] 0xA721 (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7A1 (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7A9 (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7AC (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7AD (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA720 (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7A0 (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7A8 (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7AA (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA7AB (ALDERLAKE_P)
[20:22:28] [PASSED] 0xA780 (ALDERLAKE_S)
[20:22:28] [PASSED] 0xA781 (ALDERLAKE_S)
[20:22:28] [PASSED] 0xA782 (ALDERLAKE_S)
[20:22:28] [PASSED] 0xA783 (ALDERLAKE_S)
[20:22:28] [PASSED] 0xA788 (ALDERLAKE_S)
[20:22:28] [PASSED] 0xA789 (ALDERLAKE_S)
[20:22:28] [PASSED] 0xA78A (ALDERLAKE_S)
[20:22:28] [PASSED] 0xA78B (ALDERLAKE_S)
[20:22:28] [PASSED] 0x4905 (DG1)
[20:22:28] [PASSED] 0x4906 (DG1)
[20:22:28] [PASSED] 0x4907 (DG1)
[20:22:28] [PASSED] 0x4908 (DG1)
[20:22:28] [PASSED] 0x4909 (DG1)
[20:22:28] [PASSED] 0x56C0 (DG2)
[20:22:28] [PASSED] 0x56C2 (DG2)
[20:22:28] [PASSED] 0x56C1 (DG2)
[20:22:28] [PASSED] 0x7D51 (METEORLAKE)
[20:22:28] [PASSED] 0x7DD1 (METEORLAKE)
[20:22:28] [PASSED] 0x7D41 (METEORLAKE)
[20:22:28] [PASSED] 0x7D67 (METEORLAKE)
[20:22:28] [PASSED] 0xB640 (METEORLAKE)
[20:22:28] [PASSED] 0x56A0 (DG2)
[20:22:28] [PASSED] 0x56A1 (DG2)
[20:22:28] [PASSED] 0x56A2 (DG2)
[20:22:28] [PASSED] 0x56BE (DG2)
[20:22:28] [PASSED] 0x56BF (DG2)
[20:22:28] [PASSED] 0x5690 (DG2)
[20:22:28] [PASSED] 0x5691 (DG2)
[20:22:28] [PASSED] 0x5692 (DG2)
[20:22:28] [PASSED] 0x56A5 (DG2)
[20:22:28] [PASSED] 0x56A6 (DG2)
[20:22:28] [PASSED] 0x56B0 (DG2)
[20:22:28] [PASSED] 0x56B1 (DG2)
[20:22:28] [PASSED] 0x56BA (DG2)
[20:22:28] [PASSED] 0x56BB (DG2)
[20:22:28] [PASSED] 0x56BC (DG2)
[20:22:28] [PASSED] 0x56BD (DG2)
[20:22:28] [PASSED] 0x5693 (DG2)
[20:22:28] [PASSED] 0x5694 (DG2)
[20:22:28] [PASSED] 0x5695 (DG2)
[20:22:28] [PASSED] 0x56A3 (DG2)
[20:22:28] [PASSED] 0x56A4 (DG2)
[20:22:28] [PASSED] 0x56B2 (DG2)
[20:22:28] [PASSED] 0x56B3 (DG2)
[20:22:28] [PASSED] 0x5696 (DG2)
[20:22:28] [PASSED] 0x5697 (DG2)
[20:22:28] [PASSED] 0xB69 (PVC)
[20:22:28] [PASSED] 0xB6E (PVC)
[20:22:28] [PASSED] 0xBD4 (PVC)
[20:22:28] [PASSED] 0xBD5 (PVC)
[20:22:28] [PASSED] 0xBD6 (PVC)
[20:22:28] [PASSED] 0xBD7 (PVC)
[20:22:28] [PASSED] 0xBD8 (PVC)
[20:22:28] [PASSED] 0xBD9 (PVC)
[20:22:28] [PASSED] 0xBDA (PVC)
[20:22:28] [PASSED] 0xBDB (PVC)
[20:22:28] [PASSED] 0xBE0 (PVC)
[20:22:28] [PASSED] 0xBE1 (PVC)
[20:22:28] [PASSED] 0xBE5 (PVC)
[20:22:28] [PASSED] 0x7D40 (METEORLAKE)
[20:22:28] [PASSED] 0x7D45 (METEORLAKE)
[20:22:28] [PASSED] 0x7D55 (METEORLAKE)
[20:22:28] [PASSED] 0x7D60 (METEORLAKE)
[20:22:28] [PASSED] 0x7DD5 (METEORLAKE)
[20:22:28] [PASSED] 0x6420 (LUNARLAKE)
[20:22:28] [PASSED] 0x64A0 (LUNARLAKE)
[20:22:28] [PASSED] 0x64B0 (LUNARLAKE)
[20:22:28] [PASSED] 0xE202 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE209 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE20B (BATTLEMAGE)
[20:22:28] [PASSED] 0xE20C (BATTLEMAGE)
[20:22:28] [PASSED] 0xE20D (BATTLEMAGE)
[20:22:28] [PASSED] 0xE210 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE211 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE212 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE216 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE220 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE221 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE222 (BATTLEMAGE)
[20:22:28] [PASSED] 0xE223 (BATTLEMAGE)
[20:22:28] [PASSED] 0xB080 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB081 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB082 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB083 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB084 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB085 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB086 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB087 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB08F (PANTHERLAKE)
[20:22:28] [PASSED] 0xB090 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB0A0 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB0A1 (PANTHERLAKE)
[20:22:28] [PASSED] 0xB0B0 (PANTHERLAKE)
[20:22:28] [PASSED] 0xFD80 (PANTHERLAKE)
[20:22:28] [PASSED] 0xFD81 (PANTHERLAKE)
[20:22:28] [PASSED] 0xD740 (NOVALAKE_S)
[20:22:28] [PASSED] 0xD741 (NOVALAKE_S)
[20:22:28] [PASSED] 0xD742 (NOVALAKE_S)
[20:22:28] [PASSED] 0xD743 (NOVALAKE_S)
[20:22:28] [PASSED] 0xD745 (NOVALAKE_S)
[20:22:28] [PASSED] 0xD74A (NOVALAKE_S)
[20:22:28] [PASSED] 0xD74B (NOVALAKE_S)
[20:22:28] [PASSED] 0x674C (CRESCENTISLAND)
[20:22:28] [PASSED] 0x674D (CRESCENTISLAND)
[20:22:28] [PASSED] 0x674E (CRESCENTISLAND)
[20:22:28] [PASSED] 0x674F (CRESCENTISLAND)
[20:22:28] [PASSED] 0x6750 (CRESCENTISLAND)
[20:22:28] [PASSED] 0x6751 (CRESCENTISLAND)
[20:22:28] [PASSED] 0x6752 (CRESCENTISLAND)
[20:22:28] [PASSED] 0xD750 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD751 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD752 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD753 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD754 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD755 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD756 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD757 (NOVALAKE_P)
[20:22:28] [PASSED] 0xD75F (NOVALAKE_P)
[20:22:28] =============== [PASSED] check_platform_desc ===============
[20:22:28] ===================== [PASSED] xe_pci ======================
[20:22:28] ============= xe_rtp_tables_test (5 subtests) ==============
[20:22:28] ================== xe_rtp_table_gt_test ===================
[20:22:28] [PASSED] gt_was/14011060649
[20:22:28] [PASSED] gt_was/14011059788
[20:22:28] [PASSED] gt_was/14015795083
[20:22:28] [PASSED] gt_was/16021867713
[20:22:28] [PASSED] gt_was/14019449301
[20:22:28] [PASSED] gt_was/16028005424
[20:22:28] [PASSED] gt_was/14026578760
[20:22:28] [PASSED] gt_was/1409420604
[20:22:28] [PASSED] gt_was/1408615072
[20:22:28] [PASSED] gt_was/22010523718
[20:22:28] [PASSED] gt_was/14011006942
[20:22:28] [PASSED] gt_was/14014830051
[20:22:28] [PASSED] gt_was/18018781329
[20:22:28] [PASSED] gt_was/1509235366
[20:22:28] [PASSED] gt_was/18018781329
[20:22:28] [PASSED] gt_was/16016694945
[20:22:28] [PASSED] gt_was/14018575942
[20:22:28] [PASSED] gt_was/22016670082
[20:22:28] [PASSED] gt_was/22016670082
[20:22:28] [PASSED] gt_was/14017421178
[20:22:28] [PASSED] gt_was/16025250150
[20:22:28] [PASSED] gt_was/14021871409
[20:22:28] [PASSED] gt_was/16021865536
[20:22:28] [PASSED] gt_was/14021486841
[20:22:28] [PASSED] gt_was/14025160223
[20:22:28] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[20:22:28] [PASSED] gt_was/14025635424
[20:22:28] [PASSED] gt_was/16028005424
[20:22:28] ============== [PASSED] xe_rtp_table_gt_test ===============
[20:22:28] ================== xe_rtp_table_gt_test ===================
[20:22:28] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[20:22:28] [PASSED] gt_tunings/Tuning: 32B Access Enable
[20:22:28] [PASSED] gt_tunings/Tuning: L3 cache
[20:22:28] [PASSED] gt_tunings/Tuning: L3 cache - media
[20:22:28] [PASSED] gt_tunings/Tuning: Compression Overfetch
[20:22:28] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[20:22:28] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[20:22:28] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[20:22:28] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[20:22:28] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[20:22:28] [PASSED] gt_tunings/Tuning: Stateless compression control
[20:22:28] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[20:22:28] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[20:22:28] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[20:22:28] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[20:22:28] [PASSED] gt_tunings/Tuning: Force All Non-Compressible Memory Reads to be 256B Overfetches
[20:22:28] ============== [PASSED] xe_rtp_table_gt_test ===============
[20:22:28] ================== xe_rtp_table_oob_test ==================
[20:22:28] [PASSED] oob_was/1607983814
[20:22:28] [PASSED] oob_was/16010904313
[20:22:28] [PASSED] oob_was/18022495364
[20:22:28] [PASSED] oob_was/22012773006
[20:22:28] [PASSED] oob_was/14014475959
[20:22:28] [PASSED] oob_was/22011391025
[20:22:28] [PASSED] oob_was/22012727170
[20:22:28] [PASSED] oob_was/22012727685
[20:22:28] [PASSED] oob_was/22016596838
[20:22:28] [PASSED] oob_was/18020744125
[20:22:28] [PASSED] oob_was/1409600907
[20:22:28] [PASSED] oob_was/22014953428
[20:22:28] [PASSED] oob_was/16017236439
[20:22:28] [PASSED] oob_was/14019821291
[20:22:28] [PASSED] oob_was/14015076503
[20:22:28] [PASSED] oob_was/22016122933
[20:22:28] [PASSED] oob_was/14018913170
[20:22:28] [PASSED] oob_was/14018094691
[20:22:28] [PASSED] oob_was/18024947630
[20:22:28] [PASSED] oob_was/16022287689
[20:22:28] [PASSED] oob_was/13011645652
[20:22:28] [PASSED] oob_was/14022293748
[20:22:28] [PASSED] oob_was/22019794406
[20:22:28] [PASSED] oob_was/22019338487
[20:22:28] [PASSED] oob_was/16023588340
[20:22:28] [PASSED] oob_was/14019789679
[20:22:28] [PASSED] oob_was/14022866841
[20:22:28] [PASSED] oob_was/16021333562
[20:22:28] [PASSED] oob_was/14016712196
[20:22:28] [PASSED] oob_was/14015568240
[20:22:28] [PASSED] oob_was/18013179988
[20:22:28] [PASSED] oob_was/1508761755
[20:22:28] [PASSED] oob_was/16023105232
[20:22:28] [PASSED] oob_was/16026508708
[20:22:28] [PASSED] oob_was/14020001231
[20:22:28] [PASSED] oob_was/16023683509
[20:22:28] [PASSED] oob_was/14025515070
[20:22:28] [PASSED] oob_was/15015404425_disable
[20:22:28] [PASSED] oob_was/16026007364
[20:22:28] [PASSED] oob_was/14020316580
[20:22:28] [PASSED] oob_was/14025883347
[20:22:28] [PASSED] oob_was/16029380221
[20:22:28] [PASSED] oob_was/22022079272
[20:22:28] [PASSED] oob_was/16029897822
[20:22:28] [PASSED] oob_was/14026539277
[20:22:28] [PASSED] oob_was/14027054324
[20:22:28] [PASSED] oob_was/14025941587
[20:22:28] [PASSED] oob_was/16030224309
[20:22:28] [PASSED] oob_was/14028709524
[20:22:28] ============== [PASSED] xe_rtp_table_oob_test ==============
[20:22:28] ================ xe_rtp_table_dev_oob_test ================
[20:22:28] [PASSED] device_oob_was/22010954014
[20:22:28] [PASSED] device_oob_was/15015404425
[20:22:28] [PASSED] device_oob_was/22019338487_display
[20:22:28] [PASSED] device_oob_was/14022085890
[20:22:28] [PASSED] device_oob_was/14026633728
[20:22:28] [PASSED] device_oob_was/14026746987
[20:22:28] [PASSED] device_oob_was/14026779378
[20:22:28] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[20:22:28] ========== xe_rtp_table_missing_upper_bound_test ==========
[20:22:28] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[20:22:28] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[20:22:28] [PASSED] register_whitelist/1806527549
[20:22:28] [PASSED] register_whitelist/allow_read_ctx_timestamp
[20:22:28] [PASSED] register_whitelist/allow_read_queue_timestamp
[20:22:28] [PASSED] register_whitelist/16014440446
[20:22:28] [PASSED] register_whitelist/16017236439
[20:22:28] [PASSED] register_whitelist/16020183090
[20:22:28] [PASSED] register_whitelist/14024997852
[20:22:28] [PASSED] register_whitelist/14024997852
[20:22:28] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[20:22:28] =============== [PASSED] xe_rtp_tables_test ================
[20:22:28] =================== xe_rtp (3 subtests) ====================
[20:22:28] =================== xe_rtp_rules_tests ====================
[20:22:28] [PASSED] no
[20:22:28] [PASSED] yes
[20:22:28] [PASSED] no-and-no
[20:22:28] [PASSED] no-and-yes
[20:22:28] [PASSED] yes-and-no
[20:22:28] [PASSED] yes-and-yes
[20:22:28] [PASSED] no-or-no
[20:22:28] [PASSED] no-or-yes
[20:22:28] [PASSED] yes-or-no
[20:22:28] [PASSED] yes-or-yes
[20:22:28] [PASSED] no-yes-or-yes-no
[20:22:28] [PASSED] no-yes-or-yes-yes
[20:22:28] [PASSED] yes-yes-or-no-yes
[20:22:28] [PASSED] yes-yes-or-yes-yes
[20:22:28] [PASSED] no-no-or-yes-or-no
[20:22:28] [PASSED] or
[20:22:28] [PASSED] or-yes
[20:22:28] [PASSED] or-no
[20:22:28] [PASSED] yes-or
[20:22:28] [PASSED] no-or
[20:22:28] [PASSED] no-or-or-yes
[20:22:28] [PASSED] yes-or-or-no
[20:22:28] [PASSED] no-or-or-no
[20:22:28] [PASSED] missing-context-engine-class
[20:22:28] [PASSED] missing-context-engine-class-or-yes
[20:22:28] [PASSED] missing-context-engine-class-or-or-yes
[20:22:28] =============== [PASSED] xe_rtp_rules_tests ================
[20:22:28] =============== xe_rtp_process_to_sr_tests ================
[20:22:28] [PASSED] coalesce-same-reg
[20:22:28] [PASSED] coalesce-same-reg-literal-and-func
[20:22:28] [PASSED] no-match-no-add
[20:22:28] [PASSED] two-regs-two-entries
[20:22:28] [PASSED] clr-one-set-other
[20:22:28] [PASSED] set-field
[20:22:28] [PASSED] conflict-duplicate
[20:22:28] [PASSED] conflict-not-disjoint
[20:22:28] [PASSED] conflict-not-disjoint-literal-and-func
[20:22:28] [PASSED] conflict-reg-type
[20:22:28] [PASSED] bad-mcr-reg-forced-to-regular
[20:22:28] [PASSED] bad-regular-reg-forced-to-mcr
[20:22:28] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[20:22:28] ================== xe_rtp_process_tests ===================
[20:22:28] [PASSED] active1
[20:22:28] [PASSED] active2
[20:22:28] [PASSED] active-inactive
[20:22:28] [PASSED] inactive-active
[20:22:28] [PASSED] inactive-active-inactive
[20:22:28] [PASSED] inactive-inactive-inactive
[20:22:28] ============== [PASSED] xe_rtp_process_tests ===============
[20:22:28] ===================== [PASSED] xe_rtp ======================
[20:22:28] ==================== xe_wa (1 subtest) =====================
[20:22:28] ======================== xe_wa_gt =========================
[20:22:28] [PASSED] TIGERLAKE B0
[20:22:28] [PASSED] DG1 A0
[20:22:28] [PASSED] DG1 B0
[20:22:28] [PASSED] ALDERLAKE_S A0
[20:22:28] [PASSED] ALDERLAKE_S B0
[20:22:28] [PASSED] ALDERLAKE_S C0
[20:22:28] [PASSED] ALDERLAKE_S D0
[20:22:28] [PASSED] ALDERLAKE_P A0
[20:22:28] [PASSED] ALDERLAKE_P B0
[20:22:28] [PASSED] ALDERLAKE_P C0
[20:22:28] [PASSED] ALDERLAKE_S RPLS D0
[20:22:28] [PASSED] ALDERLAKE_P RPLU E0
[20:22:28] [PASSED] DG2 G10 C0
[20:22:28] [PASSED] DG2 G11 B1
[20:22:28] [PASSED] DG2 G12 A1
[20:22:28] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:22:28] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:22:28] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[20:22:28] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[20:22:28] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[20:22:28] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[20:22:28] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[20:22:28] ==================== [PASSED] xe_wa_gt =====================
[20:22:28] ====================== [PASSED] xe_wa ======================
[20:22:28] ============================================================
[20:22:28] Testing complete. Ran 840 tests: passed: 811, skipped: 29
[20:22:28] Elapsed time: 41.177s total, 2.537s configuring, 37.874s building, 0.716s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[20:22:28] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:22:31] 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
[20:22:55] Starting KUnit Kernel (1/1)...
[20:22:55] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:22:55] ============ drm_test_pick_cmdline (2 subtests) ============
[20:22:55] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[20:22:55] =============== drm_test_pick_cmdline_named ===============
[20:22:55] [PASSED] NTSC
[20:22:56] [PASSED] NTSC-J
[20:22:56] [PASSED] PAL
[20:22:56] [PASSED] PAL-M
[20:22:56] =========== [PASSED] drm_test_pick_cmdline_named ===========
[20:22:56] ============== [PASSED] drm_test_pick_cmdline ==============
[20:22:56] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[20:22:56] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[20:22:56] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[20:22:56] =========== drm_validate_clone_mode (2 subtests) ===========
[20:22:56] ============== drm_test_check_in_clone_mode ===============
[20:22:56] [PASSED] in_clone_mode
[20:22:56] [PASSED] not_in_clone_mode
[20:22:56] ========== [PASSED] drm_test_check_in_clone_mode ===========
[20:22:56] =============== drm_test_check_valid_clones ===============
[20:22:56] [PASSED] not_in_clone_mode
[20:22:56] [PASSED] valid_clone
[20:22:56] [PASSED] invalid_clone
[20:22:56] =========== [PASSED] drm_test_check_valid_clones ===========
[20:22:56] ============= [PASSED] drm_validate_clone_mode =============
[20:22:56] ============= drm_validate_modeset (1 subtest) =============
[20:22:56] [PASSED] drm_test_check_connector_changed_modeset
[20:22:56] ============== [PASSED] drm_validate_modeset ===============
[20:22:56] ====== drm_test_bridge_get_current_state (1 subtest) =======
[20:22:56] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[20:22:56] ======== [PASSED] drm_test_bridge_get_current_state ========
[20:22:56] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[20:22:56] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[20:22:56] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[20:22:56] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts
[20:22:56] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[20:22:56] ============== drm_bridge_alloc (2 subtests) ===============
[20:22:56] [PASSED] drm_test_drm_bridge_alloc_basic
[20:22:56] [PASSED] drm_test_drm_bridge_alloc_get_put
[20:22:56] ================ [PASSED] drm_bridge_alloc =================
[20:22:56] ============= drm_bridge_bus_fmt (5 subtests) ==============
[20:22:56] [PASSED] drm_test_bridge_rgb_yuv_rgb
[20:22:56] [PASSED] drm_test_bridge_must_convert_to_yuv444
[20:22:56] [PASSED] drm_test_bridge_hdmi_auto_rgb
[20:22:56] [PASSED] drm_test_bridge_auto_first
[20:22:56] [PASSED] drm_test_bridge_rgb_yuv_no_path
[20:22:56] =============== [PASSED] drm_bridge_bus_fmt ================
[20:22:56] ============= drm_cmdline_parser (40 subtests) =============
[20:22:56] [PASSED] drm_test_cmdline_force_d_only
[20:22:56] [PASSED] drm_test_cmdline_force_D_only_dvi
[20:22:56] [PASSED] drm_test_cmdline_force_D_only_hdmi
[20:22:56] [PASSED] drm_test_cmdline_force_D_only_not_digital
[20:22:56] [PASSED] drm_test_cmdline_force_e_only
[20:22:56] [PASSED] drm_test_cmdline_res
[20:22:56] [PASSED] drm_test_cmdline_res_vesa
[20:22:56] [PASSED] drm_test_cmdline_res_vesa_rblank
[20:22:56] [PASSED] drm_test_cmdline_res_rblank
[20:22:56] [PASSED] drm_test_cmdline_res_bpp
[20:22:56] [PASSED] drm_test_cmdline_res_refresh
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[20:22:56] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[20:22:56] [PASSED] drm_test_cmdline_res_margins_force_on
[20:22:56] [PASSED] drm_test_cmdline_res_vesa_margins
[20:22:56] [PASSED] drm_test_cmdline_name
[20:22:56] [PASSED] drm_test_cmdline_name_bpp
[20:22:56] [PASSED] drm_test_cmdline_name_option
[20:22:56] [PASSED] drm_test_cmdline_name_bpp_option
[20:22:56] [PASSED] drm_test_cmdline_rotate_0
[20:22:56] [PASSED] drm_test_cmdline_rotate_90
[20:22:56] [PASSED] drm_test_cmdline_rotate_180
[20:22:56] [PASSED] drm_test_cmdline_rotate_270
[20:22:56] [PASSED] drm_test_cmdline_hmirror
[20:22:56] [PASSED] drm_test_cmdline_vmirror
[20:22:56] [PASSED] drm_test_cmdline_margin_options
[20:22:56] [PASSED] drm_test_cmdline_multiple_options
[20:22:56] [PASSED] drm_test_cmdline_bpp_extra_and_option
[20:22:56] [PASSED] drm_test_cmdline_extra_and_option
[20:22:56] [PASSED] drm_test_cmdline_freestanding_options
[20:22:56] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[20:22:56] [PASSED] drm_test_cmdline_panel_orientation
[20:22:56] ================ drm_test_cmdline_invalid =================
[20:22:56] [PASSED] margin_only
[20:22:56] [PASSED] interlace_only
[20:22:56] [PASSED] res_missing_x
[20:22:56] [PASSED] res_missing_y
[20:22:56] [PASSED] res_bad_y
[20:22:56] [PASSED] res_missing_y_bpp
[20:22:56] [PASSED] res_bad_bpp
[20:22:56] [PASSED] res_bad_refresh
[20:22:56] [PASSED] res_bpp_refresh_force_on_off
[20:22:56] [PASSED] res_invalid_mode
[20:22:56] [PASSED] res_bpp_wrong_place_mode
[20:22:56] [PASSED] name_bpp_refresh
[20:22:56] [PASSED] name_refresh
[20:22:56] [PASSED] name_refresh_wrong_mode
[20:22:56] [PASSED] name_refresh_invalid_mode
[20:22:56] [PASSED] rotate_multiple
[20:22:56] [PASSED] rotate_invalid_val
[20:22:56] [PASSED] rotate_truncated
[20:22:56] [PASSED] invalid_option
[20:22:56] [PASSED] invalid_tv_option
[20:22:56] [PASSED] truncated_tv_option
[20:22:56] ============ [PASSED] drm_test_cmdline_invalid =============
[20:22:56] =============== drm_test_cmdline_tv_options ===============
[20:22:56] [PASSED] NTSC
[20:22:56] [PASSED] NTSC_443
[20:22:56] [PASSED] NTSC_J
[20:22:56] [PASSED] PAL
[20:22:56] [PASSED] PAL_M
[20:22:56] [PASSED] PAL_N
[20:22:56] [PASSED] SECAM
[20:22:56] [PASSED] MONO_525
[20:22:56] [PASSED] MONO_625
[20:22:56] =========== [PASSED] drm_test_cmdline_tv_options ===========
[20:22:56] =============== [PASSED] drm_cmdline_parser ================
[20:22:56] ========== drmm_connector_hdmi_init (20 subtests) ==========
[20:22:56] [PASSED] drm_test_connector_hdmi_init_valid
[20:22:56] [PASSED] drm_test_connector_hdmi_init_bpc_8
[20:22:56] [PASSED] drm_test_connector_hdmi_init_bpc_10
[20:22:56] [PASSED] drm_test_connector_hdmi_init_bpc_12
[20:22:56] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[20:22:56] [PASSED] drm_test_connector_hdmi_init_bpc_null
[20:22:56] [PASSED] drm_test_connector_hdmi_init_formats_empty
[20:22:56] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[20:22:56] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[20:22:56] [PASSED] supported_formats=0x9 yuv420_allowed=1
[20:22:56] [PASSED] supported_formats=0x9 yuv420_allowed=0
[20:22:56] [PASSED] supported_formats=0x5 yuv420_allowed=1
[20:22:56] [PASSED] supported_formats=0x5 yuv420_allowed=0
[20:22:56] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[20:22:56] [PASSED] drm_test_connector_hdmi_init_null_ddc
[20:22:56] [PASSED] drm_test_connector_hdmi_init_null_product
[20:22:56] [PASSED] drm_test_connector_hdmi_init_null_vendor
[20:22:56] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[20:22:56] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[20:22:56] [PASSED] drm_test_connector_hdmi_init_product_valid
[20:22:56] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[20:22:56] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[20:22:56] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[20:22:56] ========= drm_test_connector_hdmi_init_type_valid =========
[20:22:56] [PASSED] HDMI-A
[20:22:56] [PASSED] HDMI-B
[20:22:56] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[20:22:56] ======== drm_test_connector_hdmi_init_type_invalid ========
[20:22:56] [PASSED] Unknown
[20:22:56] [PASSED] VGA
[20:22:56] [PASSED] DVI-I
[20:22:56] [PASSED] DVI-D
[20:22:56] [PASSED] DVI-A
[20:22:56] [PASSED] Composite
[20:22:56] [PASSED] SVIDEO
[20:22:56] [PASSED] LVDS
[20:22:56] [PASSED] Component
[20:22:56] [PASSED] DIN
[20:22:56] [PASSED] DP
[20:22:56] [PASSED] TV
[20:22:56] [PASSED] eDP
[20:22:56] [PASSED] Virtual
[20:22:56] [PASSED] DSI
[20:22:56] [PASSED] DPI
[20:22:56] [PASSED] Writeback
[20:22:56] [PASSED] SPI
[20:22:56] [PASSED] USB
[20:22:56] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[20:22:56] ============ [PASSED] drmm_connector_hdmi_init =============
[20:22:56] ============= drmm_connector_init (3 subtests) =============
[20:22:56] [PASSED] drm_test_drmm_connector_init
[20:22:56] [PASSED] drm_test_drmm_connector_init_null_ddc
[20:22:56] ========= drm_test_drmm_connector_init_type_valid =========
[20:22:56] [PASSED] Unknown
[20:22:56] [PASSED] VGA
[20:22:56] [PASSED] DVI-I
[20:22:56] [PASSED] DVI-D
[20:22:56] [PASSED] DVI-A
[20:22:56] [PASSED] Composite
[20:22:56] [PASSED] SVIDEO
[20:22:56] [PASSED] LVDS
[20:22:56] [PASSED] Component
[20:22:56] [PASSED] DIN
[20:22:56] [PASSED] DP
[20:22:56] [PASSED] HDMI-A
[20:22:56] [PASSED] HDMI-B
[20:22:56] [PASSED] TV
[20:22:56] [PASSED] eDP
[20:22:56] [PASSED] Virtual
[20:22:56] [PASSED] DSI
[20:22:56] [PASSED] DPI
[20:22:56] [PASSED] Writeback
[20:22:56] [PASSED] SPI
[20:22:56] [PASSED] USB
[20:22:56] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[20:22:56] =============== [PASSED] drmm_connector_init ===============
[20:22:56] ========= drm_connector_dynamic_init (6 subtests) ==========
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_init
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_init_properties
[20:22:56] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[20:22:56] [PASSED] Unknown
[20:22:56] [PASSED] VGA
[20:22:56] [PASSED] DVI-I
[20:22:56] [PASSED] DVI-D
[20:22:56] [PASSED] DVI-A
[20:22:56] [PASSED] Composite
[20:22:56] [PASSED] SVIDEO
[20:22:56] [PASSED] LVDS
[20:22:56] [PASSED] Component
[20:22:56] [PASSED] DIN
[20:22:56] [PASSED] DP
[20:22:56] [PASSED] HDMI-A
[20:22:56] [PASSED] HDMI-B
[20:22:56] [PASSED] TV
[20:22:56] [PASSED] eDP
[20:22:56] [PASSED] Virtual
[20:22:56] [PASSED] DSI
[20:22:56] [PASSED] DPI
[20:22:56] [PASSED] Writeback
[20:22:56] [PASSED] SPI
[20:22:56] [PASSED] USB
[20:22:56] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[20:22:56] ======== drm_test_drm_connector_dynamic_init_name =========
[20:22:56] [PASSED] Unknown
[20:22:56] [PASSED] VGA
[20:22:56] [PASSED] DVI-I
[20:22:56] [PASSED] DVI-D
[20:22:56] [PASSED] DVI-A
[20:22:56] [PASSED] Composite
[20:22:56] [PASSED] SVIDEO
[20:22:56] [PASSED] LVDS
[20:22:56] [PASSED] Component
[20:22:56] [PASSED] DIN
[20:22:56] [PASSED] DP
[20:22:56] [PASSED] HDMI-A
[20:22:56] [PASSED] HDMI-B
[20:22:56] [PASSED] TV
[20:22:56] [PASSED] eDP
[20:22:56] [PASSED] Virtual
[20:22:56] [PASSED] DSI
[20:22:56] [PASSED] DPI
[20:22:56] [PASSED] Writeback
[20:22:56] [PASSED] SPI
[20:22:56] [PASSED] USB
[20:22:56] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[20:22:56] =========== [PASSED] drm_connector_dynamic_init ============
[20:22:56] ==== drm_connector_dynamic_register_early (4 subtests) =====
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[20:22:56] ====== [PASSED] drm_connector_dynamic_register_early =======
[20:22:56] ======= drm_connector_dynamic_register (7 subtests) ========
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[20:22:56] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[20:22:56] ========= [PASSED] drm_connector_dynamic_register ==========
[20:22:56] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[20:22:56] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[20:22:56] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[20:22:56] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[20:22:56] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[20:22:56] ========== drm_test_get_tv_mode_from_name_valid ===========
[20:22:56] [PASSED] NTSC
[20:22:56] [PASSED] NTSC-443
[20:22:56] [PASSED] NTSC-J
[20:22:56] [PASSED] PAL
[20:22:56] [PASSED] PAL-M
[20:22:56] [PASSED] PAL-N
[20:22:56] [PASSED] SECAM
[20:22:56] [PASSED] Mono
[20:22:56] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[20:22:56] [PASSED] drm_test_get_tv_mode_from_name_truncated
[20:22:56] ============ [PASSED] drm_get_tv_mode_from_name ============
[20:22:56] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[20:22:56] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[20:22:56] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[20:22:56] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[20:22:56] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[20:22:56] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[20:22:56] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[20:22:56] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[20:22:56] [PASSED] VIC 96
[20:22:56] [PASSED] VIC 97
[20:22:56] [PASSED] VIC 101
[20:22:56] [PASSED] VIC 102
[20:22:56] [PASSED] VIC 106
[20:22:56] [PASSED] VIC 107
[20:22:56] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[20:22:56] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[20:22:56] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[20:22:56] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[20:22:56] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[20:22:56] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[20:22:56] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[20:22:56] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[20:22:56] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[20:22:56] [PASSED] Automatic
[20:22:56] [PASSED] Full
[20:22:56] [PASSED] Limited 16:235
[20:22:56] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[20:22:56] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[20:22:56] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[20:22:56] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[20:22:56] === drm_test_drm_hdmi_connector_get_output_format_name ====
[20:22:56] [PASSED] RGB
[20:22:56] [PASSED] YUV 4:2:0
[20:22:56] [PASSED] YUV 4:2:2
[20:22:56] [PASSED] YUV 4:4:4
[20:22:56] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[20:22:56] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[20:22:56] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[20:22:56] ============= drm_damage_helper (21 subtests) ==============
[20:22:56] [PASSED] drm_test_damage_iter_no_damage
[20:22:56] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[20:22:56] [PASSED] drm_test_damage_iter_no_damage_src_moved
[20:22:56] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[20:22:56] [PASSED] drm_test_damage_iter_no_damage_not_visible
[20:22:56] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[20:22:56] [PASSED] drm_test_damage_iter_no_damage_no_fb
[20:22:56] [PASSED] drm_test_damage_iter_simple_damage
[20:22:56] [PASSED] drm_test_damage_iter_single_damage
[20:22:56] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[20:22:56] [PASSED] drm_test_damage_iter_single_damage_outside_src
[20:22:56] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[20:22:56] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[20:22:56] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[20:22:56] [PASSED] drm_test_damage_iter_single_damage_src_moved
[20:22:56] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[20:22:56] [PASSED] drm_test_damage_iter_damage
[20:22:56] [PASSED] drm_test_damage_iter_damage_one_intersect
[20:22:56] [PASSED] drm_test_damage_iter_damage_one_outside
[20:22:56] [PASSED] drm_test_damage_iter_damage_src_moved
[20:22:56] [PASSED] drm_test_damage_iter_damage_not_visible
[20:22:56] ================ [PASSED] drm_damage_helper ================
[20:22:56] ============== drm_dp_mst_helper (3 subtests) ==============
[20:22:56] ============== drm_test_dp_mst_calc_pbn_mode ==============
[20:22:56] [PASSED] Clock 154000 BPP 30 DSC disabled
[20:22:56] [PASSED] Clock 234000 BPP 30 DSC disabled
[20:22:56] [PASSED] Clock 297000 BPP 24 DSC disabled
[20:22:56] [PASSED] Clock 332880 BPP 24 DSC enabled
[20:22:56] [PASSED] Clock 324540 BPP 24 DSC enabled
[20:22:56] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[20:22:56] ============== drm_test_dp_mst_calc_pbn_div ===============
[20:22:56] [PASSED] Link rate 2000000 lane count 4
[20:22:56] [PASSED] Link rate 2000000 lane count 2
[20:22:56] [PASSED] Link rate 2000000 lane count 1
[20:22:56] [PASSED] Link rate 1350000 lane count 4
[20:22:56] [PASSED] Link rate 1350000 lane count 2
[20:22:56] [PASSED] Link rate 1350000 lane count 1
[20:22:56] [PASSED] Link rate 1000000 lane count 4
[20:22:56] [PASSED] Link rate 1000000 lane count 2
[20:22:56] [PASSED] Link rate 1000000 lane count 1
[20:22:56] [PASSED] Link rate 810000 lane count 4
[20:22:56] [PASSED] Link rate 810000 lane count 2
[20:22:56] [PASSED] Link rate 810000 lane count 1
[20:22:56] [PASSED] Link rate 540000 lane count 4
[20:22:56] [PASSED] Link rate 540000 lane count 2
[20:22:56] [PASSED] Link rate 540000 lane count 1
[20:22:56] [PASSED] Link rate 270000 lane count 4
[20:22:56] [PASSED] Link rate 270000 lane count 2
[20:22:56] [PASSED] Link rate 270000 lane count 1
[20:22:56] [PASSED] Link rate 162000 lane count 4
[20:22:56] [PASSED] Link rate 162000 lane count 2
[20:22:56] [PASSED] Link rate 162000 lane count 1
[20:22:56] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[20:22:56] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[20:22:56] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[20:22:56] [PASSED] DP_POWER_UP_PHY with port number
[20:22:56] [PASSED] DP_POWER_DOWN_PHY with port number
[20:22:56] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[20:22:56] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[20:22:56] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[20:22:56] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[20:22:56] [PASSED] DP_QUERY_PAYLOAD with port number
[20:22:56] [PASSED] DP_QUERY_PAYLOAD with VCPI
[20:22:56] [PASSED] DP_REMOTE_DPCD_READ with port number
[20:22:56] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[20:22:56] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[20:22:56] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[20:22:56] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[20:22:56] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[20:22:56] [PASSED] DP_REMOTE_I2C_READ with port number
[20:22:56] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[20:22:56] [PASSED] DP_REMOTE_I2C_READ with transactions array
[20:22:56] [PASSED] DP_REMOTE_I2C_WRITE with port number
[20:22:56] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[20:22:56] [PASSED] DP_REMOTE_I2C_WRITE with data array
[20:22:56] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[20:22:56] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[20:22:56] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[20:22:56] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[20:22:56] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[20:22:56] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[20:22:56] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[20:22:56] ================ [PASSED] drm_dp_mst_helper ================
[20:22:56] ================== drm_exec (7 subtests) ===================
[20:22:56] [PASSED] sanitycheck
[20:22:56] [PASSED] test_lock
[20:22:56] [PASSED] test_lock_unlock
[20:22:56] [PASSED] test_duplicates
[20:22:56] [PASSED] test_prepare
[20:22:56] [PASSED] test_prepare_array
[20:22:56] [PASSED] test_multiple_loops
[20:22:56] ==================== [PASSED] drm_exec =====================
[20:22:56] =========== drm_format_helper_test (17 subtests) ===========
[20:22:56] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[20:22:56] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[20:22:56] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[20:22:56] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[20:22:56] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[20:22:56] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[20:22:56] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[20:22:56] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[20:22:56] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[20:22:56] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[20:22:56] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[20:22:56] ============== drm_test_fb_xrgb8888_to_mono ===============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[20:22:56] ==================== drm_test_fb_swab =====================
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ================ [PASSED] drm_test_fb_swab =================
[20:22:56] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[20:22:56] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[20:22:56] [PASSED] single_pixel_source_buffer
[20:22:56] [PASSED] single_pixel_clip_rectangle
[20:22:56] [PASSED] well_known_colors
[20:22:56] [PASSED] destination_pitch
[20:22:56] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[20:22:56] ================= drm_test_fb_clip_offset =================
[20:22:56] [PASSED] pass through
[20:22:56] [PASSED] horizontal offset
[20:22:56] [PASSED] vertical offset
[20:22:56] [PASSED] horizontal and vertical offset
[20:22:56] [PASSED] horizontal offset (custom pitch)
[20:22:56] [PASSED] vertical offset (custom pitch)
[20:22:56] [PASSED] horizontal and vertical offset (custom pitch)
[20:22:56] ============= [PASSED] drm_test_fb_clip_offset =============
[20:22:56] =================== drm_test_fb_memcpy ====================
[20:22:56] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[20:22:56] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[20:22:56] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[20:22:56] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[20:22:56] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[20:22:56] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[20:22:56] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[20:22:56] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[20:22:56] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[20:22:56] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[20:22:56] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[20:22:56] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[20:22:56] =============== [PASSED] drm_test_fb_memcpy ================
[20:22:56] ============= [PASSED] drm_format_helper_test ==============
[20:22:56] ================= drm_format (18 subtests) =================
[20:22:56] [PASSED] drm_test_format_block_width_invalid
[20:22:56] [PASSED] drm_test_format_block_width_one_plane
[20:22:56] [PASSED] drm_test_format_block_width_two_plane
[20:22:56] [PASSED] drm_test_format_block_width_three_plane
[20:22:56] [PASSED] drm_test_format_block_width_tiled
[20:22:56] [PASSED] drm_test_format_block_height_invalid
[20:22:56] [PASSED] drm_test_format_block_height_one_plane
[20:22:56] [PASSED] drm_test_format_block_height_two_plane
[20:22:56] [PASSED] drm_test_format_block_height_three_plane
[20:22:56] [PASSED] drm_test_format_block_height_tiled
[20:22:56] [PASSED] drm_test_format_min_pitch_invalid
[20:22:56] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[20:22:56] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[20:22:56] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[20:22:56] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[20:22:56] [PASSED] drm_test_format_min_pitch_two_plane
[20:22:56] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[20:22:56] [PASSED] drm_test_format_min_pitch_tiled
[20:22:56] =================== [PASSED] drm_format ====================
[20:22:56] ============== drm_framebuffer (10 subtests) ===============
[20:22:56] ========== drm_test_framebuffer_check_src_coords ==========
[20:22:56] [PASSED] Success: source fits into fb
[20:22:56] [PASSED] Fail: overflowing fb with x-axis coordinate
[20:22:56] [PASSED] Fail: overflowing fb with y-axis coordinate
[20:22:56] [PASSED] Fail: overflowing fb with source width
[20:22:56] [PASSED] Fail: overflowing fb with source height
[20:22:56] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[20:22:56] [PASSED] drm_test_framebuffer_cleanup
[20:22:56] =============== drm_test_framebuffer_create ===============
[20:22:56] [PASSED] ABGR8888 normal sizes
[20:22:56] [PASSED] ABGR8888 max sizes
[20:22:56] [PASSED] ABGR8888 pitch greater than min required
[20:22:56] [PASSED] ABGR8888 pitch less than min required
[20:22:56] [PASSED] ABGR8888 Invalid width
[20:22:56] [PASSED] ABGR8888 Invalid buffer handle
[20:22:56] [PASSED] No pixel format
[20:22:56] [PASSED] ABGR8888 Width 0
[20:22:56] [PASSED] ABGR8888 Height 0
[20:22:56] [PASSED] ABGR8888 Out of bound height * pitch combination
[20:22:56] [PASSED] ABGR8888 Large buffer offset
[20:22:56] [PASSED] ABGR8888 Buffer offset for inexistent plane
[20:22:56] [PASSED] ABGR8888 Invalid flag
[20:22:56] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[20:22:56] [PASSED] ABGR8888 Valid buffer modifier
[20:22:56] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[20:22:56] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[20:22:56] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[20:22:56] [PASSED] NV12 Normal sizes
[20:22:56] [PASSED] NV12 Max sizes
[20:22:56] [PASSED] NV12 Invalid pitch
[20:22:56] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[20:22:56] [PASSED] NV12 different modifier per-plane
[20:22:56] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[20:22:56] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[20:22:56] [PASSED] NV12 Modifier for inexistent plane
[20:22:56] [PASSED] NV12 Handle for inexistent plane
[20:22:56] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[20:22:56] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[20:22:56] [PASSED] YVU420 Normal sizes
[20:22:56] [PASSED] YVU420 Max sizes
[20:22:56] [PASSED] YVU420 Invalid pitch
[20:22:56] [PASSED] YVU420 Different pitches
[20:22:56] [PASSED] YVU420 Different buffer offsets/pitches
[20:22:56] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[20:22:56] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[20:22:56] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[20:22:56] [PASSED] YVU420 Valid modifier
[20:22:56] [PASSED] YVU420 Different modifiers per plane
[20:22:56] [PASSED] YVU420 Modifier for inexistent plane
[20:22:56] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[20:22:56] [PASSED] X0L2 Normal sizes
[20:22:56] [PASSED] X0L2 Max sizes
[20:22:56] [PASSED] X0L2 Invalid pitch
[20:22:56] [PASSED] X0L2 Pitch greater than minimum required
[20:22:56] [PASSED] X0L2 Handle for inexistent plane
[20:22:56] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[20:22:56] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[20:22:56] [PASSED] X0L2 Valid modifier
[20:22:56] [PASSED] X0L2 Modifier for inexistent plane
[20:22:56] =========== [PASSED] drm_test_framebuffer_create ===========
[20:22:56] [PASSED] drm_test_framebuffer_free
[20:22:56] [PASSED] drm_test_framebuffer_init
[20:22:56] [PASSED] drm_test_framebuffer_init_bad_format
[20:22:56] [PASSED] drm_test_framebuffer_init_dev_mismatch
[20:22:56] [PASSED] drm_test_framebuffer_lookup
[20:22:56] [PASSED] drm_test_framebuffer_lookup_inexistent
[20:22:56] [PASSED] drm_test_framebuffer_modifiers_not_supported
[20:22:56] ================= [PASSED] drm_framebuffer =================
[20:22:56] ================ drm_gem_shmem (8 subtests) ================
[20:22:56] [PASSED] drm_gem_shmem_test_obj_create
[20:22:56] [PASSED] drm_gem_shmem_test_obj_create_private
[20:22:56] [PASSED] drm_gem_shmem_test_pin_pages
[20:22:56] [PASSED] drm_gem_shmem_test_vmap
[20:22:56] [PASSED] drm_gem_shmem_test_get_sg_table
[20:22:56] [PASSED] drm_gem_shmem_test_get_pages_sgt
[20:22:56] [PASSED] drm_gem_shmem_test_madvise
[20:22:56] [PASSED] drm_gem_shmem_test_purge
[20:22:56] ================== [PASSED] drm_gem_shmem ==================
[20:22:56] === drm_atomic_helper_connector_hdmi_check (29 subtests) ===
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[20:22:56] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[20:22:56] [PASSED] Automatic
[20:22:56] [PASSED] Full
[20:22:56] [PASSED] Limited 16:235
[20:22:56] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[20:22:56] [PASSED] drm_test_check_disable_connector
[20:22:56] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[20:22:56] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[20:22:56] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[20:22:56] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[20:22:56] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[20:22:56] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[20:22:56] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[20:22:56] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[20:22:56] [PASSED] drm_test_check_output_bpc_dvi
[20:22:56] [PASSED] drm_test_check_output_bpc_format_vic_1
[20:22:56] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[20:22:56] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[20:22:56] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[20:22:56] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[20:22:56] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[20:22:56] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[20:22:56] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[20:22:56] ============ drm_test_check_hdmi_color_format =============
[20:22:56] [PASSED] AUTO -> RGB
[20:22:56] [PASSED] YCBCR422 -> YUV422
[20:22:56] [PASSED] YCBCR420 -> YUV420
[20:22:56] [PASSED] YCBCR444 -> YUV444
[20:22:56] [PASSED] RGB -> RGB
[20:22:56] ======== [PASSED] drm_test_check_hdmi_color_format =========
[20:22:56] ======== drm_test_check_hdmi_color_format_420_only ========
[20:22:56] [PASSED] RGB should fail
[20:22:56] [PASSED] YUV444 should fail
[20:22:56] [PASSED] YUV422 should fail
[20:22:56] [PASSED] YUV420 should work
[20:22:56] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ====
[20:22:56] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[20:22:56] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[20:22:56] [PASSED] drm_test_check_broadcast_rgb_value
[20:22:56] [PASSED] drm_test_check_bpc_8_value
[20:22:56] [PASSED] drm_test_check_bpc_10_value
[20:22:56] [PASSED] drm_test_check_bpc_12_value
[20:22:56] [PASSED] drm_test_check_format_value
[20:22:56] [PASSED] drm_test_check_tmds_char_value
[20:22:56] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[20:22:56] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) =
[20:22:56] [PASSED] drm_test_check_mode_valid
[20:22:56] [PASSED] drm_test_check_mode_valid_reject
[20:22:56] [PASSED] drm_test_check_mode_valid_reject_rate
[20:22:56] [PASSED] drm_test_check_mode_valid_reject_max_clock
[20:22:56] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock
[20:22:56] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector
[20:22:56] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb
[20:22:56] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[20:22:56] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[20:22:56] [PASSED] drm_test_check_infoframes
[20:22:56] [PASSED] drm_test_check_reject_avi_infoframe
[20:22:56] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[20:22:56] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[20:22:56] [PASSED] drm_test_check_reject_audio_infoframe
[20:22:56] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[20:22:56] ================= drm_managed (2 subtests) =================
[20:22:56] [PASSED] drm_test_managed_release_action
[20:22:56] [PASSED] drm_test_managed_run_action
[20:22:56] =================== [PASSED] drm_managed ===================
[20:22:56] =================== drm_mm (6 subtests) ====================
[20:22:56] [PASSED] drm_test_mm_init
[20:22:56] [PASSED] drm_test_mm_debug
[20:22:56] [PASSED] drm_test_mm_align32
[20:22:56] [PASSED] drm_test_mm_align64
[20:22:56] [PASSED] drm_test_mm_lowest
[20:22:56] [PASSED] drm_test_mm_highest
[20:22:56] ===================== [PASSED] drm_mm ======================
[20:22:56] ============= drm_modes_analog_tv (5 subtests) =============
[20:22:56] [PASSED] drm_test_modes_analog_tv_mono_576i
[20:22:56] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[20:22:56] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[20:22:56] [PASSED] drm_test_modes_analog_tv_pal_576i
[20:22:56] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[20:22:56] =============== [PASSED] drm_modes_analog_tv ===============
[20:22:56] ============== drm_panic_helper (3 subtests) ===============
[20:22:56] ============= drm_test_panic_screen_user_map ==============
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[20:22:56] ========= [PASSED] drm_test_panic_screen_user_map ==========
[20:22:56] ============= drm_test_panic_screen_user_page =============
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[20:22:56] ========= [PASSED] drm_test_panic_screen_user_page =========
[20:22:56] ========== drm_test_panic_screen_user_set_pixel ===========
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[20:22:56] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[20:22:56] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[20:22:56] ====== [PASSED] drm_test_panic_screen_user_set_pixel =======
[20:22:56] ================ [PASSED] drm_panic_helper =================
[20:22:56] ============== drm_plane_helper (2 subtests) ===============
[20:22:56] =============== drm_test_check_plane_state ================
[20:22:56] [PASSED] clipping_simple
[20:22:56] [PASSED] clipping_rotate_reflect
[20:22:56] [PASSED] positioning_simple
[20:22:56] [PASSED] upscaling
[20:22:56] [PASSED] downscaling
[20:22:56] [PASSED] rounding1
[20:22:56] [PASSED] rounding2
[20:22:56] [PASSED] rounding3
[20:22:56] [PASSED] rounding4
[20:22:56] =========== [PASSED] drm_test_check_plane_state ============
[20:22:56] =========== drm_test_check_invalid_plane_state ============
[20:22:56] [PASSED] positioning_invalid
[20:22:56] [PASSED] upscaling_invalid
[20:22:56] [PASSED] downscaling_invalid
[20:22:56] ======= [PASSED] drm_test_check_invalid_plane_state ========
[20:22:56] ================ [PASSED] drm_plane_helper =================
[20:22:56] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[20:22:56] ====== drm_test_connector_helper_tv_get_modes_check =======
[20:22:56] [PASSED] None
[20:22:56] [PASSED] PAL
[20:22:56] [PASSED] NTSC
[20:22:56] [PASSED] Both, NTSC Default
[20:22:56] [PASSED] Both, PAL Default
[20:22:56] [PASSED] Both, NTSC Default, with PAL on command-line
[20:22:56] [PASSED] Both, PAL Default, with NTSC on command-line
[20:22:56] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[20:22:56] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[20:22:56] ================== drm_rect (9 subtests) ===================
[20:22:56] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[20:22:56] [PASSED] drm_test_rect_clip_scaled_not_clipped
[20:22:56] [PASSED] drm_test_rect_clip_scaled_clipped
[20:22:56] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[20:22:56] ================= drm_test_rect_intersect =================
[20:22:56] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[20:22:56] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[20:22:56] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[20:22:56] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[20:22:56] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[20:22:56] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[20:22:56] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[20:22:56] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[20:22:56] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[20:22:56] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[20:22:56] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[20:22:56] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[20:22:56] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[20:22:56] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[20:22:56] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[20:22:56] ============= [PASSED] drm_test_rect_intersect =============
[20:22:56] ================ drm_test_rect_calc_hscale ================
[20:22:56] [PASSED] normal use
[20:22:56] [PASSED] out of max range
[20:22:56] [PASSED] out of min range
[20:22:56] [PASSED] zero dst
[20:22:56] [PASSED] negative src
[20:22:56] [PASSED] negative dst
[20:22:56] ============ [PASSED] drm_test_rect_calc_hscale ============
[20:22:56] ================ drm_test_rect_calc_vscale ================
[20:22:56] [PASSED] normal use
[20:22:56] [PASSED] out of max range
[20:22:56] [PASSED] out of min range
[20:22:56] [PASSED] zero dst
[20:22:56] [PASSED] negative src
[20:22:56] [PASSED] negative dst
[20:22:56] ============ [PASSED] drm_test_rect_calc_vscale ============
[20:22:56] ================== drm_test_rect_rotate ===================
[20:22:56] [PASSED] reflect-x
[20:22:56] [PASSED] reflect-y
[20:22:56] [PASSED] rotate-0
[20:22:56] [PASSED] rotate-90
[20:22:56] [PASSED] rotate-180
[20:22:56] [PASSED] rotate-270
[20:22:56] ============== [PASSED] drm_test_rect_rotate ===============
[20:22:56] ================ drm_test_rect_rotate_inv =================
[20:22:56] [PASSED] reflect-x
[20:22:56] [PASSED] reflect-y
[20:22:56] [PASSED] rotate-0
[20:22:56] [PASSED] rotate-90
[20:22:56] [PASSED] rotate-180
[20:22:56] [PASSED] rotate-270
[20:22:56] ============ [PASSED] drm_test_rect_rotate_inv =============
[20:22:56] ==================== [PASSED] drm_rect =====================
[20:22:56] ============ drm_sysfb_modeset_test (1 subtest) ============
[20:22:56] ============ drm_test_sysfb_build_fourcc_list =============
[20:22:56] [PASSED] no native formats
[20:22:56] [PASSED] XRGB8888 as native format
[20:22:56] [PASSED] remove duplicates
[20:22:56] [PASSED] convert alpha formats
[20:22:56] [PASSED] random formats
[20:22:56] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[20:22:56] ============= [PASSED] drm_sysfb_modeset_test ==============
[20:22:56] ================== drm_fixp (2 subtests) ===================
[20:22:56] [PASSED] drm_test_int2fixp
[20:22:56] [PASSED] drm_test_sm2fixp
[20:22:56] ==================== [PASSED] drm_fixp =====================
[20:22:56] ============================================================
[20:22:56] Testing complete. Ran 667 tests: passed: 667
[20:22:56] Elapsed time: 27.620s total, 2.435s configuring, 24.769s building, 0.404s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[20:22:56] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:22:59] 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
../drivers/gpu/drm/ttm/ttm_pool.c: In function ‘ttm_pool_restore_abort’:
../drivers/gpu/drm/ttm/ttm_pool.c:1076:24: warning: variable ‘mid’ set but not used [-Wunused-but-set-variable]
1076 | pgoff_t i, nr, mid;
| ^~~
../drivers/gpu/drm/ttm/ttm_pool.c: In function ‘ttm_pool_backup’:
../drivers/gpu/drm/ttm/ttm_pool.c:1181:14: warning: unused variable ‘partial’ [-Wunused-variable]
1181 | bool partial = ttm_tt_is_partial(tt);
| ^~~~~~~
[20:23:09] Starting KUnit Kernel (1/1)...
[20:23:09] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:23:09] ================= ttm_device (5 subtests) ==================
[20:23:09] [PASSED] ttm_device_init_basic
[20:23:09] [PASSED] ttm_device_init_multiple
[20:23:09] [PASSED] ttm_device_fini_basic
[20:23:09] [PASSED] ttm_device_init_no_vma_man
[20:23:09] ================== ttm_device_init_pools ==================
[20:23:09] [PASSED] No DMA allocations, no DMA32 required
[20:23:09] [PASSED] DMA allocations, DMA32 required
[20:23:09] [PASSED] No DMA allocations, DMA32 required
[20:23:09] [PASSED] DMA allocations, no DMA32 required
[20:23:09] ============== [PASSED] ttm_device_init_pools ==============
[20:23:09] =================== [PASSED] ttm_device ====================
[20:23:09] ================== ttm_pool (8 subtests) ===================
[20:23:09] ================== ttm_pool_alloc_basic ===================
[20:23:09] [PASSED] One page
[20:23:09] [PASSED] More than one page
[20:23:09] [PASSED] Above the allocation limit
[20:23:09] [PASSED] One page, with coherent DMA mappings enabled
[20:23:09] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[20:23:09] ============== [PASSED] ttm_pool_alloc_basic ===============
[20:23:09] ============== ttm_pool_alloc_basic_dma_addr ==============
[20:23:09] [PASSED] One page
[20:23:09] [PASSED] More than one page
[20:23:09] [PASSED] Above the allocation limit
[20:23:09] [PASSED] One page, with coherent DMA mappings enabled
[20:23:09] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[20:23:09] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[20:23:09] [PASSED] ttm_pool_alloc_order_caching_match
[20:23:09] [PASSED] ttm_pool_alloc_caching_mismatch
[20:23:09] [PASSED] ttm_pool_alloc_order_mismatch
[20:23:09] [PASSED] ttm_pool_free_dma_alloc
[20:23:09] [PASSED] ttm_pool_free_no_dma_alloc
[20:23:09] [PASSED] ttm_pool_fini_basic
[20:23:09] ==================== [PASSED] ttm_pool =====================
[20:23:09] ================ ttm_resource (8 subtests) =================
[20:23:09] ================= ttm_resource_init_basic =================
[20:23:09] [PASSED] Init resource in TTM_PL_SYSTEM
[20:23:09] [PASSED] Init resource in TTM_PL_VRAM
[20:23:09] [PASSED] Init resource in a private placement
[20:23:09] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[20:23:09] ============= [PASSED] ttm_resource_init_basic =============
[20:23:09] [PASSED] ttm_resource_init_pinned
[20:23:09] [PASSED] ttm_resource_fini_basic
[20:23:09] [PASSED] ttm_resource_manager_init_basic
[20:23:09] [PASSED] ttm_resource_manager_usage_basic
[20:23:09] [PASSED] ttm_resource_manager_set_used_basic
[20:23:09] [PASSED] ttm_sys_man_alloc_basic
[20:23:09] [PASSED] ttm_sys_man_free_basic
[20:23:09] ================== [PASSED] ttm_resource ===================
[20:23:09] =================== ttm_tt (15 subtests) ===================
[20:23:09] ==================== ttm_tt_init_basic ====================
[20:23:09] [PASSED] Page-aligned size
[20:23:09] [PASSED] Extra pages requested
[20:23:09] ================ [PASSED] ttm_tt_init_basic ================
[20:23:09] [PASSED] ttm_tt_init_misaligned
[20:23:09] [PASSED] ttm_tt_fini_basic
[20:23:09] [PASSED] ttm_tt_fini_sg
[20:23:09] [PASSED] ttm_tt_fini_shmem
[20:23:09] [PASSED] ttm_tt_create_basic
[20:23:09] [PASSED] ttm_tt_create_invalid_bo_type
[20:23:09] [PASSED] ttm_tt_create_ttm_exists
[20:23:09] [PASSED] ttm_tt_create_failed
[20:23:09] [PASSED] ttm_tt_destroy_basic
[20:23:09] [PASSED] ttm_tt_populate_null_ttm
[20:23:09] [PASSED] ttm_tt_populate_populated_ttm
[20:23:09] [PASSED] ttm_tt_unpopulate_basic
[20:23:09] [PASSED] ttm_tt_unpopulate_empty_ttm
[20:23:09] [PASSED] ttm_tt_swapin_basic
[20:23:09] ===================== [PASSED] ttm_tt ======================
[20:23:09] =================== ttm_bo (14 subtests) ===================
[20:23:09] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[20:23:09] [PASSED] Cannot be interrupted and sleeps
[20:23:09] [PASSED] Cannot be interrupted, locks straight away
[20:23:09] [PASSED] Can be interrupted, sleeps
[20:23:09] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[20:23:09] [PASSED] ttm_bo_reserve_locked_no_sleep
[20:23:09] [PASSED] ttm_bo_reserve_no_wait_ticket
[20:23:09] [PASSED] ttm_bo_reserve_double_resv
[20:23:09] [PASSED] ttm_bo_reserve_interrupted
[20:23:09] [PASSED] ttm_bo_reserve_deadlock
[20:23:09] [PASSED] ttm_bo_unreserve_basic
[20:23:09] [PASSED] ttm_bo_unreserve_pinned
[20:23:09] [PASSED] ttm_bo_unreserve_bulk
[20:23:09] [PASSED] ttm_bo_fini_basic
[20:23:09] [PASSED] ttm_bo_fini_shared_resv
[20:23:09] [PASSED] ttm_bo_pin_basic
[20:23:09] [PASSED] ttm_bo_pin_unpin_resource
[20:23:09] [PASSED] ttm_bo_multiple_pin_one_unpin
[20:23:09] ===================== [PASSED] ttm_bo ======================
[20:23:09] ============== ttm_bo_validate (22 subtests) ===============
[20:23:09] ============== ttm_bo_init_reserved_sys_man ===============
[20:23:09] [PASSED] Buffer object for userspace
[20:23:09] [PASSED] Kernel buffer object
[20:23:09] [PASSED] Shared buffer object
[20:23:09] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[20:23:09] ============== ttm_bo_init_reserved_mock_man ==============
[20:23:09] [PASSED] Buffer object for userspace
[20:23:09] [PASSED] Kernel buffer object
[20:23:09] [PASSED] Shared buffer object
[20:23:09] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[20:23:09] [PASSED] ttm_bo_init_reserved_resv
[20:23:09] ================== ttm_bo_validate_basic ==================
[20:23:09] [PASSED] Buffer object for userspace
[20:23:09] [PASSED] Kernel buffer object
[20:23:09] [PASSED] Shared buffer object
[20:23:09] ============== [PASSED] ttm_bo_validate_basic ==============
[20:23:09] [PASSED] ttm_bo_validate_invalid_placement
[20:23:09] ============= ttm_bo_validate_same_placement ==============
[20:23:09] [PASSED] System manager
[20:23:09] [PASSED] VRAM manager
[20:23:09] ========= [PASSED] ttm_bo_validate_same_placement ==========
[20:23:09] [PASSED] ttm_bo_validate_failed_alloc
[20:23:09] [PASSED] ttm_bo_validate_pinned
[20:23:09] [PASSED] ttm_bo_validate_busy_placement
[20:23:09] ================ ttm_bo_validate_multihop =================
[20:23:09] [PASSED] Buffer object for userspace
[20:23:09] [PASSED] Kernel buffer object
[20:23:09] [PASSED] Shared buffer object
[20:23:09] ============ [PASSED] ttm_bo_validate_multihop =============
[20:23:09] ========== ttm_bo_validate_no_placement_signaled ==========
[20:23:09] [PASSED] Buffer object in system domain, no page vector
[20:23:09] [PASSED] Buffer object in system domain with an existing page vector
[20:23:09] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[20:23:09] ======== ttm_bo_validate_no_placement_not_signaled ========
[20:23:09] [PASSED] Buffer object for userspace
[20:23:09] [PASSED] Kernel buffer object
[20:23:09] [PASSED] Shared buffer object
[20:23:09] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[20:23:09] [PASSED] ttm_bo_validate_move_fence_signaled
[20:23:09] ========= ttm_bo_validate_move_fence_not_signaled =========
[20:23:09] [PASSED] Waits for GPU
[20:23:09] [PASSED] Tries to lock straight away
[20:23:09] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[20:23:09] [PASSED] ttm_bo_validate_swapout
[20:23:09] [PASSED] ttm_bo_validate_happy_evict
[20:23:09] [PASSED] ttm_bo_validate_all_pinned_evict
[20:23:09] [PASSED] ttm_bo_validate_allowed_only_evict
[20:23:09] [PASSED] ttm_bo_validate_deleted_evict
[20:23:09] [PASSED] ttm_bo_validate_busy_domain_evict
[20:23:09] [PASSED] ttm_bo_validate_evict_gutting
[20:23:09] [PASSED] ttm_bo_validate_recrusive_evict
[20:23:09] ================= [PASSED] ttm_bo_validate =================
[20:23:09] ============================================================
[20:23:09] Testing complete. Ran 102 tests: passed: 102
[20:23:09] Elapsed time: 12.851s total, 2.546s configuring, 10.090s building, 0.171s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[20:23:09] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:23:11] 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
[20:23:20] Starting KUnit Kernel (1/1)...
[20:23:20] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:23:20] =============== dma-buf-fence (12 subtests) ================
[20:23:20] [PASSED] test_sanitycheck
[20:23:20] [PASSED] test_signaling
[20:23:20] [PASSED] test_add_callback
[20:23:20] [PASSED] test_late_add_callback
[20:23:20] [PASSED] test_rm_callback
[20:23:20] [PASSED] test_late_rm_callback
[20:23:20] [PASSED] test_status
[20:23:20] [PASSED] test_error
[20:23:20] [PASSED] test_wait
[20:23:20] [PASSED] test_wait_timeout
[20:23:20] [PASSED] test_stub
[20:23:20] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[20:23:20] ================== [PASSED] dma-buf-fence ==================
[20:23:20] ============ dma-buf-fence-chain (11 subtests) =============
[20:23:20] [PASSED] test_sanitycheck
[20:23:20] [PASSED] test_find_seqno
[20:23:20] [PASSED] test_find_signaled
[20:23:20] [PASSED] test_find_out_of_order
[20:23:26] [PASSED] test_find_gap
[20:23:26] [PASSED] test_find_race
[20:23:26] [PASSED] test_signal_forward
[20:23:26] [PASSED] test_signal_backward
[20:23:26] [PASSED] test_wait_forward
[20:23:26] [PASSED] test_wait_backward
[20:23:26] [PASSED] test_wait_random
[20:23:26] =============== [PASSED] dma-buf-fence-chain ===============
[20:23:26] ============ dma-buf-fence-unwrap (11 subtests) ============
[20:23:26] [PASSED] test_sanitycheck
[20:23:26] [PASSED] test_unwrap_array
[20:23:26] [PASSED] test_unwrap_chain
[20:23:26] [PASSED] test_unwrap_chain_array
[20:23:26] [PASSED] test_unwrap_merge
[20:23:26] [PASSED] test_unwrap_merge_duplicate
[20:23:26] [PASSED] test_unwrap_merge_seqno
[20:23:26] [PASSED] test_unwrap_merge_order
[20:23:26] [PASSED] test_unwrap_merge_complex
[20:23:26] [PASSED] test_unwrap_merge_complex_seqno
[20:23:26] [PASSED] test_dedup_empty
[20:23:26] ============== [PASSED] dma-buf-fence-unwrap ===============
[20:23:26] ================ dma-buf-resv (5 subtests) =================
[20:23:26] [PASSED] test_sanitycheck
[20:23:26] ===================== test_signaling ======================
[20:23:26] [PASSED] kernel
[20:23:26] [PASSED] write
[20:23:26] [PASSED] read
[20:23:26] [PASSED] bookkeep
[20:23:26] ================= [PASSED] test_signaling ==================
[20:23:26] ====================== test_for_each ======================
[20:23:26] [PASSED] kernel
[20:23:26] [PASSED] write
[20:23:26] [PASSED] read
[20:23:26] [PASSED] bookkeep
[20:23:26] ================== [PASSED] test_for_each ==================
[20:23:26] ================= test_for_each_unlocked ==================
[20:23:26] [PASSED] kernel
[20:23:26] [PASSED] write
[20:23:26] [PASSED] read
[20:23:26] [PASSED] bookkeep
[20:23:26] ============= [PASSED] test_for_each_unlocked ==============
[20:23:26] ===================== test_get_fences =====================
[20:23:26] [PASSED] kernel
[20:23:26] [PASSED] write
[20:23:26] [PASSED] read
[20:23:26] [PASSED] bookkeep
[20:23:26] ================= [PASSED] test_get_fences =================
[20:23:26] ================== [PASSED] dma-buf-resv ===================
[20:23:26] ============================================================
[20:23:26] Testing complete. Ran 51 tests: passed: 50, skipped: 1
[20:23:26] Elapsed time: 16.739s total, 2.518s configuring, 8.849s building, 5.363s 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 drm/ttm, drm/xe: Support partially backed-up ttm_tts
2026-11-04 20:13 [PATCH 0/4] drm/ttm, drm/xe: Support partially backed-up ttm_tts Thomas Hellström
` (4 preceding siblings ...)
2026-11-04 20:23 ` ✓ CI.KUnit: success for drm/ttm, drm/xe: Support partially backed-up ttm_tts Patchwork
@ 2026-11-04 20:57 ` Patchwork
5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2026-11-04 20:57 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 875 bytes --]
== Series Details ==
Series: drm/ttm, drm/xe: Support partially backed-up ttm_tts
URL : https://patchwork.freedesktop.org/series/177782/
State : success
== Summary ==
CI Bug Log - changes from xe-6061-0c04a32b952ce54c8629218c2071051731965ae1_BAT -> xe-pw-177782v1_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (15 -> 15)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* Linux: xe-6061-0c04a32b952ce54c8629218c2071051731965ae1 -> xe-pw-177782v1
IGT_9177: 9177
xe-6061-0c04a32b952ce54c8629218c2071051731965ae1: 0c04a32b952ce54c8629218c2071051731965ae1
xe-pw-177782v1: 177782v1
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177782v1/index.html
[-- Attachment #2: Type: text/html, Size: 1423 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread