Add reclaim to the dmem cgroup controller
Subsystems (8)
Thomas Hellström
maintainerv7 cover Add reclaim to the dmem cgroup controller
When writing a "max" limit lower than the current usage, the existing code silently failed. This series aims to improve on that by returning -EBUSY on failure and also attempt to synchronously reclaim device memory to push the usage under the new max limit to avoid the error.
Patch 1 fixes a pre-existing amdgpu_vram_mgr_init() error path Patch 2 introduces struct dmem_cgroup_init for extensible region
registration.
Patch 3 implements and documents a reclaim callback interface
for the dmem controller.
Patch 4 implements a TTM reclaim callback.
Patches 5-6 hook up the reclaim callback to the dmem cgroup-aware
drivers xe and amdgpu.
v2:
- Remove the error propagation that was in a previous series (Maarten)
- A number of updates in patch 1. See its commit message for details (Maarten)
v3:
- Add patch 1 fixing a pre-existing amdgpu_vram_mgr_init() error path bug where drmm_cgroup_register_region() was called before INIT_LIST_HEAD() and gpu_buddy_init(), causing a kernel panic on failure. (Sashiko-bot)
- Use an rwsem to protect reclaim callback registration and region unregister against concurrent reclaim invocations. (Sashiko-bot)
- Fix ttm_resource_manager_set_dmem_region() storing an error pointer in man->cg unconditionally. (Sashiko-bot)
- Fix kernel-doc function name format for ttm_bo_evict_cgroup() and ttm_resource_manager_set_dmem_region().
v4:
- Rebased on drm-tip; dropped the XE_PL_STOLEN guard in the xe patch as stolen memory uses a separate TTM manager.
v5:
- Add patch 2 introducing struct dmem_cgroup_init to make the dmem_cgroup_register_region() API extensible without adding positional arguments in the future.
- Use nonblock=true in reset_all_resource_limits() to avoid sleeping inside rcu_read_lock() in dmemcs_offline(). (Sashiko-bot)
- Compare usage against the truncated limit stored in cnt.max, not the original u64. (Sashiko-bot)
- Use DMEM_MAX_RECLAIM_RETRIES (16) retry budget instead of 5, matching the memcg controller; only -ENOSPC (no progress) counts against the budget, other errors abort immediately.
- Handle NULL region in ttm_resource_manager_set_dmem_region() to clear the reclaim callback, preventing use-after-free when the manager is torn down while the dmem region outlives it. (Sashiko-bot)
- Return 0 on any eviction progress; reserve -ENOSPC for zero progress.
- Clear the reclaim callback in xe and amdgpu fini paths to prevent use-after-free after driver unbind with open DRM file descriptors. (Sashiko-bot)
- Register xe fini devres action before drmm_cgroup_register_region() so LIFO teardown runs unregister first, draining callbacks before the manager is destroyed. (Sashiko-bot)
- Switch amdgpu to explicit dmem_cgroup_unregister_region() at the top of amdgpu_vram_mgr_fini() before any manager teardown, since amdgpu's fini is called explicitly during driver unbind before drmm cleanup. (Sashiko-bot)
- Wrap the xe reclaim callback with drm_dev_enter()/drm_dev_exit() to prevent TTM reclaim from running after driver unbind.
v6:
- Move the ops check inside down_read() in set_resource_max(), guarded by region->unregistered, to close a UAF race against dmem_cgroup_unregister_region(). (Sashiko-bot)
- Fix dmem_cgroup_ops->reclaim docstring: -ENOSPC is retried up to DMEM_MAX_RECLAIM_RETRIES times, not an immediate stop. (Sashiko-bot)
- Fix mgr->cg_region never being assigned in amdgpu_vram_mgr_init(), causing dmem_cgroup_unregister_region() in fini to silently no-op. (Sashiko-bot)
- Reorder amdgpu_vram_mgr_fini() to call set_used(false) and evict_all() before dmem_cgroup_unregister_region(), so ttm_resource_free() can uncharge via man->cg during eviction; clear man->cg after unregister. (Sashiko-bot)
v7:
- Replace the per-region rw_semaphore with a static SRCU domain (dmemcg_srcu). SRCU is a better fit: it avoids per-region lock overhead on every reclaim call, and synchronize_srcu() at unregister time is a rare, shutdown-time operation. (Maarten)
- Trim in-function comments to focus on what rather than how.
- Switch back to drmm_cgroup_register_region() with a drm_dev_enter/ exit guard in the reclaim callback (matching xe), rather than manual register/unregister. drm_dev_unplug() fires before vram_mgr_fini(), so drm_dev_enter() returning false prevents any reclaim from touching the manager during teardown. This also fixes the "vram" name collision on multi-GPU systems, since drmm_cgroup_register_region() automatically prefixes with "drm/<pci-addr>/". (Sashiko-bot)
User-space tests are at
https://patchwork.freedesktop.org/series/163935/
Test-with: [email protected]
Thomas Hellström (6):
drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init() cgroup/dmem: Introduce struct dmem_cgroup_init for region
initialization
cgroup/dmem: Add reclaim callback for lowering max below current usage drm/ttm: Hook up a cgroup-aware reclaim callback for the dmem
controller
drm/xe: Wire up dmem cgroup reclaim for VRAM manager drm/amdgpu: Wire up dmem cgroup reclaim for VRAM manager
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 38 +++++++- drivers/gpu/drm/drm_drv.c | 8 +- drivers/gpu/drm/ttm/ttm_bo.c | 95 +++++++++++++++++++- drivers/gpu/drm/ttm/ttm_bo_util.c | 3 +- drivers/gpu/drm/ttm/ttm_resource.c | 50 +++++++++++ drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 53 +++++++++-- include/drm/drm_drv.h | 4 +- include/drm/ttm/ttm_bo.h | 10 +++ include/drm/ttm/ttm_resource.h | 7 ++ include/linux/cgroup_dmem.h | 38 +++++++- kernel/cgroup/dmem.c | 91 +++++++++++++++---- 12 files changed, 362 insertions(+), 37 deletions(-)
Signature · 1 line
2.54.0
Thomas Hellström
maintainerPATCH v7 1/6 drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
drmm_cgroup_register_region() is called before INIT_LIST_HEAD() and gpu_buddy_init() in amdgpu_vram_mgr_init(). If it fails, the function returns early and bypasses those initializations.
Since adev->mman.initialized is set to true before amdgpu_vram_mgr_init() is called, a failure triggers amdgpu_ttm_fini(), which calls amdgpu_vram_mgr_fini(), which then:
- Calls list_for_each_entry_safe() on reservations_pending and reserved_pages, whose list_head::next pointers are zero-initialized (NULL). The loop does not recognize them as empty and dereferences NULL.
- Calls gpu_buddy_fini(), which iterates free_trees[] unconditionally via for_each_free_tree(). Since mm->free_trees is NULL (never allocated), this dereferences NULL.
Both result in a kernel panic on the module load error path.
Fix by moving drmm_cgroup_register_region() to after the list and buddy allocator are fully initialized, so the teardown path is safe to run.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +4 -3
@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)struct ttm_resource_manager *man = &mgr->manager;int err; - man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); -if (IS_ERR (man->cg)) -return PTR_ERR (man->cg);ttm_resource_manager_init (man, &adev->mman.bdev, adev->gmc.real_vram_size);
@@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)return err; + man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); +if (IS_ERR (man->cg)) +return PTR_ERR (man->cg); +ttm_set_driver_manager (&adev->mman.bdev,TTM_PL_VRAM , &mgr->manager);ttm_resource_manager_set_used (man, true);return 0 ;
Signature · 1 line
2.54.0
Christian König
maintainerRe: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
Arun please take a look at this.
Thanks,
Christian.
Quoted 64 lines · Thomas Hellström
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingandreserved_pages, whoselist_head::nextpointers are zero-initialized (NULL). The loop does not recognize them as empty and dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[] unconditionally viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction in TTM")Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström <[email protected]>--- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +4
-3@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)struct ttm_resource_manager *man = &mgr->manager;int err; - man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); -if (IS_ERR (man->cg)) -return PTR_ERR (man->cg);ttm_resource_manager_init (man, &adev->mman.bdev, adev->gmc.real_vram_size);@@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)return err; + man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); +if (IS_ERR (man->cg)) +return PTR_ERR (man->cg); +ttm_set_driver_manager (&adev->mman.bdev,TTM_PL_VRAM , &mgr->manager);ttm_resource_manager_set_used (man, true);return 0 ;
Thomas Hellström
maintainerRe: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
Quoted 4 lines · Christian König
Arun please take a look at this.
Thanks,
Christian.
FWIW Sashiko claims there is yet another pre-existing bug WRT ordering here, but since the fix wasn't needed for the rest of the series, I focused on this one.
Thanks,
Thomas
Quoted 81 lines · Thomas Hellström
Quoted 79 lines
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function
returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()
is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingandreserved_pages, whoselist_head::nextpointers are zero- initialized
(NULL). The loop does not recognize them as empty and dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[] unconditionally
viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy
allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Closes:
https://sashiko.dev/#/patchset/[email protected]?part=4Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction inTTM")
Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström <[email protected]>---
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 7 ++++---1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-0@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) struct ttm_resource_manager *man = &mgr->manager; int err;drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-1- man->cg = drmm_cgroup_register_region(adev_to_drm(adev),"vram",
adev->gmc.real_vram_size);drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-2-if (IS_ERR (man->cg)) -return PTR_ERR (man->cg);
ttm_resource_manager_init(man, &adev->mman.bdev, adev->gmc.real_vram_size);drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-0@@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) if (err) return err;drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +1
-0+ man->cg = drmm_cgroup_register_region(adev_to_drm(adev),"vram",
adev->gmc.real_vram_size);drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +3
-0+if (IS_ERR (man->cg)) +return PTR_ERR (man->cg); +
ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);
ttm_resource_manager_set_used(man, true); return 0;
Arunpravin Paneer Selvam
maintainerRe: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
Quoted 8 lines · Thomas Hellström
Quoted 4 lines · Christian König
Arun please take a look at this.
Thanks,
Christian.FWIW Sashiko claims there is yet another pre-existing bug WRT ordering here, but since the fix wasn't needed for the rest of the series, I focused on this one.
Thanks for pointing that out. I have sent a fix for the pre-existing bug reported by Sashiko as a separate patch.
https://patchwork.freedesktop.org/patch/741782/
Thanks,
Arun.
Quoted 85 lines
Thanks,
ThomasQuoted 80 lines · Thomas Hellström
Quoted 79 lines
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function
returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()
is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingandreserved_pages, whoselist_head::nextpointers are zero-
initialized
(NULL). The loop does not recognize them as empty and
dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[]
unconditionally
viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy
allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Closes:
https://sashiko.dev/#/patchset/[email protected]?part=4Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction inTTM")
Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström <[email protected]>--- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-3@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) struct ttm_resource_manager *man = &mgr->manager; int err; - man->cg =drmm_cgroup_register_region (adev_to_drm (adev), "vram", adev->gmc.real_vram_size); -if (IS_ERR (man->cg)) -return PTR_ERR (man->cg); ttm_resource_manager_init(man, &adev->mman.bdev,
adev->gmc.real_vram_size);drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +4
-0@@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) if (err) return err; + man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); +if (IS_ERR (man->cg)) +return PTR_ERR (man->cg); + ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM,
&mgr->manager);
ttm_resource_manager_set_used(man, true);
return 0;
Re: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
In reply to Christian KönigQuoted 1 line · Christian König
Arun please take a look at this.
Sure Christian. This fix looks correct to me.
Thanks,
Arun.
Quoted 69 lines
Thanks,
Christian.Quoted 64 lines · Thomas Hellström
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingandreserved_pages, whoselist_head::nextpointers are zero-initialized (NULL). The loop does not recognize them as empty and dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[] unconditionally viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction in TTM")Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström <[email protected]>--- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +4
-3@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)struct ttm_resource_manager *man = &mgr->manager;int err; - man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); -if (IS_ERR (man->cg)) -return PTR_ERR (man->cg);ttm_resource_manager_init (man, &adev->mman.bdev, adev->gmc.real_vram_size);@@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)return err; + man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); +if (IS_ERR (man->cg)) +return PTR_ERR (man->cg); +ttm_set_driver_manager (&adev->mman.bdev,TTM_PL_VRAM , &mgr->manager);ttm_resource_manager_set_used (man, true);return 0 ;
Maarten Lankhorst
maintainerRe: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
Hey,
Can I merge this through drm-misc-next together with the rest of the series?
Kind regards
~Maarten
Quoted 76 lines · Arunpravin Paneer Selvam
Quoted 1 line · Christian König
Arun please take a look at this.
Sure Christian. This fix looks correct to me.
Reviewed-by Arunpravin Paneer Selvam <[email protected]>Thanks,
Arun.Quoted 66 lines
Thanks,
Christian.Quoted 61 lines · Thomas Hellström
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingandreserved_pages, whoselist_head::nextpointers are zero-initialized (NULL). The loop does not recognize them as empty and dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[] unconditionally viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction in TTM")Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström <[email protected]>---
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c| 7 ++++---1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-2@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) struct ttm_resource_manager *man = &mgr->manager; int err; - man->cg = drmm_cgroup_register_region(adev_to_drm(adev), "vram", adev->gmc.real_vram_size); - if (IS_ERR(man->cg)) - return PTR_ERR(man->cg); ttm_resource_manager_init(man, &adev->mman.bdev, adev->gmc.real_vram_size); @@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)
return err;
+man->cg=drmm_cgroup_register_region(adev_to_drm(adev), "vram", adev->gmc.real_vram_size); + if (IS_ERR(man->cg))
+ returnPTR_ERR(man->cg);
+
ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);ttm_resource_manager_set_used(man, true);
return 0;
Thomas Hellström
maintainerRe: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
Hi, Maarten,
Quoted 7 lines · Maarten Lankhorst
Hey,
Can I merge this through drm-misc-next together with the rest of the series?
Kind regards
~Maarten
For the xe patches, Ack from me.
I do have a v8 that fixes a sashiko comment on the last patch, though, but I was holding that awaiting a review on the other patches.
Thanks,
Thomas
Quoted 97 lines · Arunpravin Paneer Selvam
Quoted 95 lines · Christian König
Quoted 1 line
Arun please take a look at this.
Sure Christian. This fix looks correct to me.
Reviewed-by: Arunpravin Paneer Selvam
<[email protected]>Thanks,
Arun.Quoted 84 lines
Thanks,
Christian.Quoted 79 lines · Thomas Hellström
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function
returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()
is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingand
reserved_pages, whoselist_head::nextpointers are zero- initialized
(NULL). The loop does not recognize them as empty and dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[] unconditionally
viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy
allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Closes:
https://sashiko.dev/#/patchset/[email protected]?part=4Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction inTTM")
Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström<[email protected]>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c| 7 ++++---1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-2@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) struct ttm_resource_manager *man = &mgr->manager; int err; - man->cg = drmm_cgroup_register_region(adev_to_drm(adev),"vram" , adev->gmc.real_vram_size); - if (IS_ERR(man->cg)) - return PTR_ERR(man->cg); ttm_resource_manager_init(man, &adev->mman.bdev,
adev->gmc.real_vram_size);
@@ -935,6 +932,10 @@ intamdgpu_vram_mgr_init(struct amdgpu_device *adev)
if (err)
return err;
+man->cg=drmm_cgroup_register_region(adev_to_drm(adev), "vram", adev->gmc.real_vram_size);
+ if (IS_ERR(man->cg))
+ returnPTR_ERR(man->cg);
+
ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);
ttm_resource_manager_set_used(man, true); return 0;
Re: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
Hey,
Quoted 8 lines · Thomas Hellström
Hi, Maarten,
Quoted 5 lines · Maarten Lankhorst
Hey,
Can I merge this through drm-misc-next together with the rest of the series?
Quoted 7 lines
Quoted 2 lines
Kind regards
~MaartenFor the xe patches, Ack from me.
I do have a v8 that fixes a sashiko comment on the last patch, though, but I was holding that awaiting a review on the other patches.
Yeah seems about right. Patches themselves look good to me now, so would be nice if amd can ack here or in v8.
Series themselves look good, so feel free to add my r-b to entire series: (and Thadeu's t-b)
Quoted 103 lines
Thanks,
ThomasQuoted 97 lines · Arunpravin Paneer Selvam
Quoted 95 lines · Christian König
Quoted 1 line
Arun please take a look at this.
Sure Christian. This fix looks correct to me.
Reviewed-by: Arunpravin Paneer Selvam
<[email protected]>Thanks,
Arun.Quoted 84 lines
Thanks,
Christian.Quoted 79 lines · Thomas Hellström
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function
returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()
is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingand
reserved_pages, whoselist_head::nextpointers are zero- initialized
(NULL). The loop does not recognize them as empty and dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[] unconditionally
viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy
allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Closes:
https://sashiko.dev/#/patchset/[email protected]?part=4Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction inTTM")
Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström<[email protected]>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c| 7 ++++---1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-2@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) struct ttm_resource_manager *man = &mgr->manager; int err; - man->cg = drmm_cgroup_register_region(adev_to_drm(adev),"vram" , adev->gmc.real_vram_size); - if (IS_ERR(man->cg)) - return PTR_ERR(man->cg); ttm_resource_manager_init(man, &adev->mman.bdev,
adev->gmc.real_vram_size);
@@ -935,6 +932,10 @@ intamdgpu_vram_mgr_init(struct amdgpu_device *adev)
if (err)
return err;
+man->cg=drmm_cgroup_register_region(adev_to_drm(adev), "vram", adev->gmc.real_vram_size);
+ if (IS_ERR(man->cg))
+ returnPTR_ERR(man->cg);
+
ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);
ttm_resource_manager_set_used(man, true); return 0;
Re: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
Quoted 11 lines · Maarten Lankhorst
Hey,
Quoted 8 lines · Thomas Hellström
Hi, Maarten,
Quoted 5 lines · Maarten Lankhorst
Hey,
Can I merge this through drm-misc-next together with the rest of the series?
Quoted 7 lines
Quoted 6 lines
Quoted 2 lines
Kind regards
~MaartenFor the xe patches, Ack from me.
I do have a v8 that fixes a sashiko comment on the last patch, though, but I was holding that awaiting a review on the other patches.
Yeah seems about right. Patches themselves look good to me now, so would be nice if amd can ack here or in v8.
I have already sent my Reviewed-by for this patch.
Thanks,
Arun.
Quoted 103 lines
Series themselves look good, so feel free to add my r-b to entire series: (and Thadeu's t-b)
Reviewed-by Maarten Lankhorst <[email protected]>Quoted 98 lines
Thanks,
ThomasQuoted 93 lines · Arunpravin Paneer Selvam
Quoted 92 lines · Christian König
Quoted 1 line
Arun please take a look at this.
Sure Christian. This fix looks correct to me.
Reviewed-by: Arunpravin Paneer Selvam
<[email protected]>Thanks,
Arun.Quoted 83 lines
Thanks,
Christian.Quoted 79 lines · Thomas Hellström
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function
returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()
is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pending
and
reserved_pages, whoselist_head::nextpointers are zero-
initialized
(NULL). The loop does not recognize them as empty and
dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[]
unconditionally
viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy
allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Closes:
https://sashiko.dev/#/patchset/[email protected]?part=4Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction inTTM")
Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström--- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-2@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) struct ttm_resource_manager *man = &mgr->manager; int err; - man->cg = drmm_cgroup_register_region(adev_to_drm(adev),"vram" , adev->gmc.real_vram_size); - if (IS_ERR(man->cg)) - return PTR_ERR(man->cg); ttm_resource_manager_init(man, &adev->mman.bdev, adev->gmc.real_vram_size); @@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct
amdgpu_device*adev)
if (err)
return err;
+man->cg= drmm_cgroup_register_region(adev_to_drm(adev),
"vram",adev->gmc.real_vram_size);
+ if (IS_ERR(man->cg))
+ returnPTR_ERR(man->cg);
+
ttm_set_driver_manager(&adev->mman.bdev,TTM_PL_VRAM,&mgr->manager);
ttm_resource_manager_set_used(man, true); return 0;
Christian König
maintainerRe: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
In reply to Maarten LankhorstQuoted 3 lines · Maarten Lankhorst
Hey,
Can I merge this through drm-misc-next together with the rest of the series?
Sure go ahead, sorry for the delay I was on vacation for a while.
Regards,
Christian.
Quoted 82 lines
Kind regards
~MaartenQuoted 76 lines · Arunpravin Paneer Selvam
Quoted 1 line · Christian König
Arun please take a look at this.
Sure Christian. This fix looks correct to me.
Reviewed-by Arunpravin Paneer Selvam <[email protected]>Thanks,
Arun.Quoted 66 lines
Thanks,
Christian.Quoted 61 lines · Thomas Hellström
drmm_cgroup_register_region()is called beforeINIT_LIST_HEAD()andgpu_buddy_init()inamdgpu_vram_mgr_init(). If it fails, the function returns early and bypasses those initializations.Since
adev->mman.initializedis set to true beforeamdgpu_vram_mgr_init()is called, a failure triggersamdgpu_ttm_fini(), which callsamdgpu_vram_mgr_fini(), which then:- Calls
list_for_each_entry_safe()onreservations_pendingandreserved_pages, whoselist_head::nextpointers are zero-initialized (NULL). The loop does not recognize them as empty and dereferences NULL.- Calls
gpu_buddy_fini(), which iterates free_trees[] unconditionally viafor_each_free_tree(). Sincemm->free_treesis NULL (never allocated), this dereferences NULL.Both result in a kernel panic on the module load error path.
Fix by moving
drmm_cgroup_register_region()to after the list and buddy allocator are fully initialized, so the teardown path is safe to run.Reported-by Sashiko-bot <[email protected]>Fixes 2b624a2c1865 ("drm/ttm: Handle cgroup based eviction in TTM")Cc Friedrich Vock <[email protected]>Cc Maarten Lankhorst <[email protected]>Cc Tejun Heo <[email protected]>Cc Maxime Ripard <[email protected]>Cc Christian König <[email protected]>Cc Alex Deucher <[email protected]>Cc <[email protected]> # v6.14+Assisted-by GitHub_Copilot:claude-sonnet-4.6Signed-off-by Thomas Hellström <[email protected]>---
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c| 7 ++++---1 file changed, 4 insertions(+), 3 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-2@@ -918,9 +918,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) struct ttm_resource_manager *man = &mgr->manager; int err; - man->cg = drmm_cgroup_register_region(adev_to_drm(adev), "vram", adev->gmc.real_vram_size); - if (IS_ERR(man->cg)) - return PTR_ERR(man->cg); ttm_resource_manager_init(man, &adev->mman.bdev, adev->gmc.real_vram_size); @@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)
return err;
+man->cg=drmm_cgroup_register_region(adev_to_drm(adev), "vram", adev->gmc.real_vram_size); + if (IS_ERR(man->cg))
+ returnPTR_ERR(man->cg);
+
ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);ttm_resource_manager_set_used(man, true);
return 0;
[email protected]
AI reviewRe: [PATCH v7 1/6] drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
In reply to Thomas HellströmThank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] The patch resolves a panic when drmm_cgroup_register_region() fails, but leaves an identical teardown vulnerability if gpu_buddy_init() fails. --
commit 3650035d068659ae5cf730d3debae46e3ebe9589
Author: Thomas Hellström <[email protected]>
drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init()
This commit fixes a kernel panic on the module load error path by moving drmm_cgroup_register_region() after the list and buddy allocator are fully initialized. This prevents the teardown path from dereferencing uninitialized pointers if the cgroup registration fails.
Quoted 3 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-0
[ ... ]
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c int amdgpu_vram_mgr_init(struct amdgpu_device *adev) · line 934
Quoted 4 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-0@@ -935,6 +932,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) err =gpu_buddy_init (&mgr->mm, man->size,PAGE_SIZE );if (err)return err;
[Severity: High]
This isn't a bug introduced by this patch, but while fixing the teardown vulnerability for the cgroup registration, does this leave an identical teardown vulnerability if gpu_buddy_init() fails?
If gpu_buddy_init() fails, it frees the memory but leaves dangling pointers and a non-zero mm->n_roots:
drivers/gpu/buddy.c:gpu_buddy_init() {
...
out_free_roots:
while (root_count--)
gpu_block_free(mm, mm->roots[root_count]);
kfree(mm->roots);
out_free_tree:
while (i--)
kfree(mm->free_trees[i]);
kfree(mm->free_trees);
return -ENOMEM;
}Since adev->mman.initialized is already set to true by the caller (amdgpu_ttm_init()), returning this error triggers the driver's teardown path which unconditionally calls gpu_buddy_fini():
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:amdgpu_vram_mgr_fini() {
...
if (!adev->gmc.is_app_apu)
gpu_buddy_fini(&mgr->mm);
...
}This would lead to a use-after-free, NULL pointer dereference, and double-free when gpu_buddy_fini() iterates up to the non-zero mm->n_roots:
drivers/gpu/buddy.c:gpu_buddy_fini() {
...
for (i = 0; i < mm->n_roots; ++i) {
order = ilog2(size) - ilog2(mm->chunk_size);
start = gpu_buddy_block_offset(mm->roots[i]);
...
}Should gpu_buddy_init() clear mm->n_roots and zero the pointers on error, or should amdgpu_vram_mgr_init() clear its state upon this failure?
Quoted 7 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +4
-0+ man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); +if (IS_ERR (man->cg)) +return PTR_ERR (man->cg); +ttm_set_driver_manager (&adev->mman.bdev,TTM_PL_VRAM , &mgr->manager);ttm_resource_manager_set_used (man, true);return 0 ;
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=1
Thomas Hellström
maintainerPATCH v7 2/6 cgroup/dmem: Introduce struct dmem_cgroup_init for region initialization
In reply to Thomas HellströmReplace the bare u64 size argument to dmem_cgroup_register_region() and drmm_cgroup_register_region() with a const struct dmem_cgroup_init * pointer. The struct currently carries only the size field, but using a struct makes the API extensible: future callers can supply additional initialization parameters without adding more positional arguments.
Update all in-tree callers (amdgpu, xe) to use a compound-literal initializer.
v5:
- Commit introduced.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 6 +++++- drivers/gpu/drm/drm_drv.c | 8 +++++--- drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 7 ++++++- include/drm/drm_drv.h | 4 +++- include/linux/cgroup_dmem.h | 16 +++++++++++++--- kernel/cgroup/dmem.c | 10 ++++++---- 6 files changed, 38 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +5 -1
@@ -23,6 +23,7 @@*/ #include <linux/dma-mapping.h> +#include <linux/cgroup_dmem.h> #include <drm/ttm/ttm_range_manager.h> #include <drm/drm_drv.h> #include <drm/drm_buddy.h>
@@ -932,7 +933,10 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)return err; - man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , adev->gmc.real_vram_size); + man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , + &(struct dmem_cgroup_init ){ + .size = adev->gmc.real_vram_size, + });if (IS_ERR (man->cg))return PTR_ERR (man->cg);
drivers/gpu/drm/drm_drv.c +5 -3
@@ -960,17 +960,19 @@ static void drmm_cg_unregister_region(struct drm_device *dev, void *arg)* drmm_cgroup_register_region - Register a region of a DRM device to cgroups * @dev: device for region * @region_name: Region name for registering -* @size: Size of region in bytes +* @init: Initialization parameters for the region. * * This decreases the ref-count of @dev by one. The device is destroyed if the * ref-count drops to zero. */ -struct dmem_cgroup_region *drmm_cgroup_register_region (struct drm_device *dev,const char *region_name,u64 size) +struct dmem_cgroup_region * +drmm_cgroup_register_region (struct drm_device *dev,const char *region_name, +const struct dmem_cgroup_init *init) {struct dmem_cgroup_region *region;int ret; - region =dmem_cgroup_register_region (size,"drm/%s/%s" , dev->unique, region_name); + region =dmem_cgroup_register_region (init,"drm/%s/%s" , dev->unique, region_name);if (IS_ERR_OR_NULL (region))return region;
drivers/gpu/drm/xe/xe_ttm_vram_mgr.c +6 -1
@@ -4,6 +4,8 @@* Copyright (C) 2021-2022 Red Hat */ +#include <linux/cgroup_dmem.h> +#include <drm/drm_managed.h> #include <drm/drm_drv.h> #include <drm/drm_buddy.h>
@@ -303,7 +305,10 @@ int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr,int err; name = mem_type ==XE_PL_VRAM0 ?"vram0" :"vram1" ; - man->cg =drmm_cgroup_register_region (&xe->drm, name, size); + man->cg =drmm_cgroup_register_region (&xe->drm, name, + &(struct dmem_cgroup_init ){ + .size = size, + });if (IS_ERR (man->cg))return PTR_ERR (man->cg);
include/drm/drm_drv.h +3 -1
@@ -34,6 +34,7 @@#include <drm/drm_device.h> +struct dmem_cgroup_init ;struct dmem_cgroup_region ;struct drm_fb_helper ;struct drm_fb_helper_surface_size ;
@@ -433,7 +434,8 @@ void *__devm_drm_dev_alloc(struct device *parent,struct dmem_cgroup_region *drmm_cgroup_register_region (struct drm_device *dev, -const char *region_name,u64 size); +const char *region_name, +const struct dmem_cgroup_init *init);/** * devm_drm_dev_alloc - Resource managed allocation of a &drm_device instance
include/linux/cgroup_dmem.h +13 -3
@@ -14,8 +14,18 @@ struct dmem_cgroup_pool_state;/* Opaque definition of a cgroup region, used internally */ struct dmem_cgroup_region ; +/** +* struct dmem_cgroup_init - Initialization parameters for a dmem cgroup region. +* @size: Size of the region in bytes. +*/ +struct dmem_cgroup_init { +u64 size; +}; +#if IS_ENABLED (CONFIG_CGROUP_DMEM ) -struct dmem_cgroup_region *dmem_cgroup_register_region (u64 size,const char *name_fmt, ...)__printf (2 ,3 ); +struct dmem_cgroup_region * +dmem_cgroup_register_region (const struct dmem_cgroup_init *init, +const char *name_fmt, ...)__printf (2 ,3 );void dmem_cgroup_unregister_region (struct dmem_cgroup_region *region); int dmem_cgroup_try_charge(struct dmem_cgroup_region *region, u64 size, struct dmem_cgroup_pool_state **ret_pool,
@@ -27,8 +37,8 @@ bool dmem_cgroup_state_evict_valuable(struct dmem_cgroup_pool_state *limit_pool,void dmem_cgroup_pool_state_put (struct dmem_cgroup_pool_state *pool);#else -static inline __printf(2,3) struct dmem_cgroup_region * -dmem_cgroup_register_region(u64 size, const char *name_fmt, ...) +static inline __printf(2, 3) struct dmem_cgroup_region * +dmem_cgroup_register_region(const struct dmem_cgroup_init *init, const char *name_fmt, ...) {return NULL ; }
kernel/cgroup/dmem.c +6 -4
@@ -502,7 +502,7 @@ EXPORT_SYMBOL_GPL(dmem_cgroup_unregister_region);/** * dmem_cgroup_register_region() - Register a regions for dev cgroup. -* @size: Size of region to register, in bytes. +* @init: Initialization parameters for the region. * @fmt: Region parameters to register * * This function registers a node in the dmem cgroup with the
@@ -511,13 +511,15 @@ EXPORT_SYMBOL_GPL(dmem_cgroup_unregister_region);* * Return: NULL or a struct on success, PTR_ERR on failure. */ -struct dmem_cgroup_region *dmem_cgroup_register_region (u64 size,const char *fmt, ...) +struct dmem_cgroup_region * +dmem_cgroup_register_region (const struct dmem_cgroup_init *init, +const char *fmt, ...) {struct dmem_cgroup_region *ret;char *region_name;va_list ap; -if (!size) +if (!init || !init->size)return NULL ;va_start (ap, fmt);
@@ -534,7 +536,7 @@ struct dmem_cgroup_region *dmem_cgroup_register_region(u64 size, const char *fmtINIT_LIST_HEAD (&ret->pools); ret->name = region_name; - ret->size = size; + ret->size = init->size;kref_init (&ret->ref);spin_lock (&dmemcg_lock);
Signature · 1 line
2.54.0
Thomas Hellström
maintainerPATCH v7 3/6 cgroup/dmem: Add reclaim callback for lowering max below current usage
In reply to Thomas HellströmAdd an optional reclaim callback to struct dmem_cgroup_region. When dmem.max is set below the current usage of a cgroup pool, the new limit is applied immediately (so that concurrent allocations are throttled while reclaim is in progress) and then the driver is asked to evict memory to bring usage back below the limit.
Reclaim is attempted up to a bounded number of times. No error is returned to userspace if usage remains above the limit after reclaim, and a pending signal will abort the reclaim loop early. This matches the behavior of memory.max in the memory cgroup controller.
Also honor O_NONBLOCK so that if that flag is set during the max value write, no reclaim is initiated. The idea is to avoid charging the reclaim cost to the writer of the max value.
v2:
- Write max before reclaim is attempted (Maarten)
- Let signals abort the reclaim without error (Maarten)
- If a new max value is written with the O_NONBLOCK flag, reclaim is not attempted (Maarten)
- Extract region from the pool parameter rather than passing it explicitly to set_resource_xxx().
v3:
- Use an rw_semaphore (unregister_sem) to protect reclaim callbacks against concurrent region unregistration: readers (reclaim) hold the read side; dmem_cgroup_unregister_region() takes the write side to drain in-flight callbacks before returning. (Sashiko-bot)
v5:
- Rebased on the introduction of struct dmem_cgroup_init.
- Use nonblock=true in reset_all_resource_limits() to avoid sleeping inside rcu_read_lock() in dmemcs_offline(). (Sashiko-bot)
- Compare usage against the truncated limit value stored in cnt.max, not the original u64. (Sashiko-bot)
- Use a DMEM_MAX_RECLAIM_RETRIES (16) retry budget instead of 5, matching the memcg controller's MAX_RECLAIM_RETRIES. Only -ENOSPC (no progress) counts against the retry budget; other errors terminate the loop immediately.
v6:
- Fix dmem_cgroup_ops->reclaim docstring: -ENOSPC does not stop reclaim immediately but is retried up to DMEM_MAX_RECLAIM_RETRIES times; only other negative errors terminate the loop. (Sashiko-bot)
v7:
- Replace the per-region rw_semaphore with a static SRCU domain (dmemcg_srcu). SRCU is a better fit than rwsem for this use: it avoids the per-region lock overhead on every reclaim call, and synchronize_srcu() at unregister time is a rare operation. (Maarten)
- Trim in-function comments to focus on what rather than how.
--- include/linux/cgroup_dmem.h | 22 ++++++++++ kernel/cgroup/dmem.c | 81 +++++++++++++++++++++++++++++++------ 2 files changed, 91 insertions(+), 12 deletions(-)
include/linux/cgroup_dmem.h +22 -0
@@ -14,12 +14,34 @@ struct dmem_cgroup_pool_state;/* Opaque definition of a cgroup region, used internally */ struct dmem_cgroup_region ; +/** +* struct dmem_cgroup_ops - Operations for a dmem cgroup region. +* @reclaim: Optional callback invoked when dmem.max is set below the current +* usage of a pool. The driver should attempt to free at least +* @target_bytes from @pool. May be called multiple times if usage +* remains above the limit after returning. +* +* Return: 0 if some progress was made (even if less than +* @target_bytes was freed), -ENOSPC if no progress could be made +* (the caller will retry up to a bounded number of times), or +* another negative error code if a fatal error occurred (stops +* further reclaim attempts immediately). +*/ +struct dmem_cgroup_ops { +int (*reclaim)(struct dmem_cgroup_pool_state *pool, +u64 target_bytes,void *priv); +}; +/** * struct dmem_cgroup_init - Initialization parameters for a dmem cgroup region. * @size: Size of the region in bytes. +* @ops: Optional operations for this region. May be NULL. +* @reclaim_priv: Opaque pointer passed to @ops->reclaim. May be NULL. */ struct dmem_cgroup_init {u64 size; +const struct dmem_cgroup_ops *ops; +void *reclaim_priv; };#if IS_ENABLED (CONFIG_CGROUP_DMEM )
kernel/cgroup/dmem.c +69 -12
152 lines not on this page · raw message
Signature · 1 line
2.54.0
[email protected]
AI reviewRe: [PATCH v7 3/6] cgroup/dmem: Add reclaim callback for lowering max below current usage
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] Holding `srcu_read_lock` across a potentially unbounded reclaim loop causes `synchronize_srcu()`…
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Holding srcu_read_lock across a potentially unbounded reclaim loop causes synchronize_srcu() to hang indefinitely during region unregistration. --
commit a6f9976e310be028f3b0c1a4f382c0d26ce5f305
Author: Thomas Hellström <[email protected]>
Subject: cgroup/dmem: Add reclaim callback for lowering max below current usage
This commit adds an optional reclaim callback to struct dmem_cgroup_region that is invoked when dmem.max is lowered. It introduces an SRCU domain to protect reclaim callbacks against concurrent region unregistrations.
Quoted 4 lines
kernel/cgroup/dmem.c +0
-0
[ ... ]
Quoted 28 lines
kernel/cgroup/dmem.c +21
-2@@ -145,21 +161,52 @@ static void free_cg_pool(struct dmem_cgroup_pool_state *pool) }static void -set_resource_max (struct dmem_cgroup_pool_state *pool,u64 val) +set_resource_max (struct dmem_cgroup_pool_state *pool,u64 val,bool nonblock) { -page_counter_set_max (&pool->cnt, val); +struct dmem_cgroup_region *region = pool->region; +unsigned long limit = (unsigned long )val; + +/* Apply the new limit immediately so concurrent allocations are throttled. */ +xchg (&pool->cnt.max, limit); + +if (nonblock) +return ; + +int srcu_idx =srcu_read_lock (&dmemcg_srcu); + +if (!READ_ONCE (region->unregistered) && region->ops && region->ops->reclaim) { +for (int retries =DMEM_MAX_RECLAIM_RETRIES ; ; ) { +u64 usage =page_counter_read (&pool->cnt); +int ret; + +if (usage <= limit) +break ; + +if (signal_pending (current))
kernel/cgroup/dmem.c static void free_cg_pool(struct dmem_cgroup_pool_state *pool) · line 195
Quoted 10 lines
kernel/cgroup/dmem.c +10
-0+break ; + + ret = region->ops->reclaim (pool, usage - limit, region->reclaim_priv); + +/* -ENOSPC means no progress; other errors are fatal. */ +if (ret && (ret != -ENOSPC || !retries--)) +break ; + +cond_resched (); + }
[Severity: High]
Can this loop cause synchronize_srcu() in dmem_cgroup_unregister_region() to hang indefinitely?
If the driver's reclaim() callback repeatedly returns 0 (indicating some progress) but concurrent allocations keep usage above the limit, this loop could run for a very long time.
Because srcu_read_lock() is held outside the loop, a concurrent call to dmem_cgroup_unregister_region() would block in synchronize_srcu() waiting for this reader to finish.
Would it be safer to scope the SRCU read lock inside the loop iteration? This would allow synchronize_srcu() to proceed and the loop could safely abort when it sees region->unregistered become true.
Quoted 3 lines
kernel/cgroup/dmem.c +2
-0+ } +srcu_read_unlock (&dmemcg_srcu, srcu_idx); }
[ ... ]
Quoted 12 lines
kernel/cgroup/dmem.c +3
-1@@ -488,9 +539,11 @@ void dmem_cgroup_unregister_region(struct dmem_cgroup_region *region)* no new pools should be added to the dead region * by get_cg_pool_unlocked. */ - region->unregistered = true; +WRITE_ONCE (region->unregistered, true);spin_unlock (&dmemcg_lock); +synchronize_srcu (&dmemcg_srcu); +kref_put (®ion->ref, dmemcg_free_region); }
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=3
Tejun Heo
maintainerRe: [PATCH v7 3/6] cgroup/dmem: Add reclaim callback for lowering max below current usage
In reply to Thomas HellströmHello,
Quoted 3 lines · Thomas Hellström
Also honor
O_NONBLOCKso that if that flag is set during the max value write, no reclaim is initiated. The idea is to avoid charging the reclaim cost to the writer of the max value.
Is this really necessary? I'm not necessarily against it but this is trivial to work around from userspace and feels like a gratuitous addition. What's the use case?
Thanks.
Signature · 1 line
tejun
Thomas Hellström
maintainerRe: [PATCH v7 3/6] cgroup/dmem: Add reclaim callback for lowering max below current usage
Hi,
Quoted 7 lines · Tejun Heo
Hello,
Quoted 3 lines · Thomas Hellström
Also honor
O_NONBLOCKso that if that flag is set during the max value write, no reclaim is initiated. The idea is to avoid charging the reclaim cost to the writer of the max value.
Quoted 5 lines
Is this really necessary? I'm not necessarily against it but this is trivial
to work around from userspace and feels like a gratuitous addition. What's
the use case?
This was something that was added at the request of Maarten. The idea is to mimic the memcg behaviour. For memcg, the use-case was to avoid having the reclaim cost (I assume in terms of cpu time) land on the next allocator instead of the process writing the new max value.
I think there are more details in the memcg commit history, but the presence here is solely to mimic memcg WRT this.
Thanks,
Thomas
Quoted 2 lines
Thanks.
Maarten Lankhorst
maintainerRe: [PATCH v7 3/6] cgroup/dmem: Add reclaim callback for lowering max below current usage
In reply to Tejun HeoHey,
Quoted 10 lines · Tejun Heo
Hello,
Quoted 3 lines · Thomas Hellström
Also honor
O_NONBLOCKso that if that flag is set during the max value write, no reclaim is initiated. The idea is to avoid charging the reclaim cost to the writer of the max value.Is this really necessary? I'm not necessarily against it but this is trivial to work around from userspace and feels like a gratuitous addition. What's the use case?
The usecase is similar to the usecase in memcg's max/high, it allows the controller to lower the limit, but move the penalty for lowering the limit to the affected cgroups instead of making the controlling process block, especially when changing a lot of limits dynamically this can make a difference.
Kind regards,
~Maarten Lankhorst
Thomas Hellström
maintainerPATCH v7 4/6 drm/ttm: Hook up a cgroup-aware reclaim callback for the dmem controller
In reply to Thomas HellströmAdd ttm_bo_evict_cgroup() to evict buffer objects charged to a specific dmem cgroup pool from a resource manager's LRU until a byte target is met. Add ttm_resource_manager_set_dmem_region() to associate a dmem cgroup region with a resource manager; drivers supply their own dmem_cgroup_ops with ttm_resource_manager_dmem_reclaim as the reclaim function and the manager pointer as reclaim_priv in the dmem_cgroup_init to wire up TTM eviction as the reclaim callback.
The eviction context is interruptible; signals abort the operation and propagate back through the write() syscall.
Introduce a new mode for the bo LRU walker so that sleeping locks can be taken. This can be used when the caller doesn't hold any previous dma_resv locks, and where it intends to hold at most one lock at a time.
Like the rest of the TTM eviction this should sooner than later be converted to full WW transactions.
v3:
- Fix ttm_resource_manager_set_dmem_region() storing an error pointer in man->cg unconditionally. (Sashiko-bot)
- Fix kernel-doc function name format for ttm_bo_evict_cgroup() and ttm_resource_manager_set_dmem_region().
v5:
- Rebased on the introduction of struct dmem_cgroup_init.
- Handle NULL region in ttm_resource_manager_set_dmem_region() to clear the reclaim callback, preventing use-after-free when the manager is torn down while the dmem region outlives it. (Sashiko-bot)
- Return 0 on any progress (even partial eviction), -ENOSPC only when nothing was freed; fixes callers that expected 0 on partial success.
- Document that the reclaim callback should return 0 if some progress was made, -ENOSPC if no progress at all, or another error for fatal failures.
--- drivers/gpu/drm/ttm/ttm_bo.c | 95 +++++++++++++++++++++++++++++- drivers/gpu/drm/ttm/ttm_bo_util.c | 3 +- drivers/gpu/drm/ttm/ttm_resource.c | 50 ++++++++++++++++ include/drm/ttm/ttm_bo.h | 10 ++++ include/drm/ttm/ttm_resource.h | 7 +++ 5 files changed, 161 insertions(+), 4 deletions(-)
drivers/gpu/drm/ttm/ttm_bo.c +92 -3
@@ -515,12 +515,20 @@ static s64 ttm_bo_evict_cb(struct ttm_lru_walk *walk, struct ttm_buffer_object * {struct ttm_bo_evict_walk *evict_walk =container_of (walk,typeof (*evict_walk), walk); +/* Capture size before eviction in case res is cleared. */ +s64 bo_size = bo->base.size;s64 lret;if (!dmem_cgroup_state_evict_valuable (evict_walk->limit_pool, bo->resource->css, evict_walk->try_low, &evict_walk->hit_low))return 0 ; +/* +* evict_walk->place is NULL in cgroup drain mode. Drivers' +* eviction_valuable() callbacks must handle a NULL place, treating it +* as "any placement": the TTM base implementation already does so via +* ttm_resource_intersects(). +*/ if (bo->pin_count || !bo->bdev->funcs->eviction_valuable (bo, evict_walk->place))return 0 ;
@@ -536,11 +544,15 @@ static s64 ttm_bo_evict_cb(struct ttm_lru_walk *walk, struct ttm_buffer_object * goto out; evict_walk->evicted++; -if (evict_walk->res) +if (evict_walk->res) { lret =ttm_resource_alloc (evict_walk->evictor, evict_walk->place, evict_walk->res,NULL ); -if (lret ==0 ) -return 1 ; +if (lret ==0 ) +return 1 ; + }else { +/* Cgroup drain: return bytes freed for byte-denominated progress. */ +return bo_size; + } out:/* Errors that should terminate the walk. */ if (lret == -ENOSPC )
@@ -614,6 +626,83 @@ static int ttm_bo_evict_alloc(struct ttm_device *bdev,return 0 ; } +/** +* ttm_bo_evict_cgroup() - Evict buffer objects charged to a specific cgroup. +* @bdev: The TTM device. +* @man: The resource manager whose LRU to walk. +* @limit_pool: The cgroup pool state whose members should be evicted. +* @target_bytes: Number of bytes to free. +* @ctx: The TTM operation context. +* +* Walk the LRU of @man and evict buffer objects that are charged to the +* cgroup identified by @limit_pool, until at least @target_bytes have been +* freed. Mirrors the two-pass (trylock -> sleeping-lock, low-watermark) +* strategy used by ttm_bo_evict_alloc(). +* +* Return: >= @target_bytes on full success, 0..target_bytes-1 if partial, +* negative error code on fatal error. +*/ +s64 ttm_bo_evict_cgroup (struct ttm_device *bdev, +struct ttm_resource_manager *man, +struct dmem_cgroup_pool_state *limit_pool, +s64 target_bytes, +struct ttm_operation_ctx *ctx) +{ +struct ttm_bo_evict_walk evict_walk = { + .walk = { + .ops = &ttm_evict_walk_ops, + .arg = { .ctx = ctx }, + }, + .limit_pool = limit_pool, +/* place, evictor, res left NULL: selects cgroup drain mode */ + }; +s64 lret, pass; + + evict_walk.walk.arg.trylock_only = true; + lret =ttm_lru_walk_for_evict (&evict_walk.walk, bdev, man, target_bytes); +if (lret <0 || lret >= target_bytes) +return lret; + +/* Second pass: also evict BOs at the low watermark. */ +if (evict_walk.hit_low) { + evict_walk.try_low = true; + pass =ttm_lru_walk_for_evict (&evict_walk.walk, bdev, man, + target_bytes - lret); +if (pass <0 ) +return pass; + lret += pass; +if (lret >= target_bytes) +return lret; + } + +/* Full sleeping-lock pass for remaining target. */ + evict_walk.try_low = evict_walk.hit_low = false; + evict_walk.walk.arg.trylock_only = false; + +retry: + evict_walk.walk.arg.sleeping_lock = true; +do { + evict_walk.evicted =0 ; + pass =ttm_lru_walk_for_evict (&evict_walk.walk, bdev, man, + target_bytes - lret); +if (pass <0 ) { + lret = pass; + goto out; + } + lret += pass; + }while (lret < target_bytes && evict_walk.evicted); + +/* One more attempt if we hit the low limit during sleeping-lock pass. */ +if (lret < target_bytes && evict_walk.hit_low && !evict_walk.try_low) { + evict_walk.try_low = true; + goto retry; + } + +out: +return lret; +} +EXPORT_SYMBOL (ttm_bo_evict_cgroup); +/** * ttm_bo_pin - Pin the buffer object. * @bo: The buffer object to pin
drivers/gpu/drm/ttm/ttm_bo_util.c +2 -1
@@ -999,7 +999,8 @@ __ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs) bo = res->bo;if (ttm_lru_walk_trylock (curs, bo)) bo_locked = true; -else if (!arg->ticket || arg->ctx->no_wait_gpu || arg->trylock_only) +else if ((!arg->ticket && !arg->sleeping_lock) || arg->ctx->no_wait_gpu || + arg->trylock_only)continue ;if (!ttm_bo_get_unless_zero (bo)) {
drivers/gpu/drm/ttm/ttm_resource.c +50 -0
53 lines not on this page · raw message
include/drm/ttm/ttm_bo.h +10 -0
@@ -226,6 +226,11 @@ struct ttm_lru_walk_arg {struct ww_acquire_ctx *ticket;/** @trylock_only: Only use trylock for locking. */ bool trylock_only; +/** +* @sleeping_lock: Use sleeping locks even with %NULL @ticket. +* @trylock_only has precedence over this field. +*/ +bool sleeping_lock; };/**
@@ -431,6 +436,11 @@ void ttm_bo_unpin(struct ttm_buffer_object *bo);int ttm_bo_evict_first (struct ttm_device *bdev,struct ttm_resource_manager *man,struct ttm_operation_ctx *ctx); +s64 ttm_bo_evict_cgroup (struct ttm_device *bdev, +struct ttm_resource_manager *man, +struct dmem_cgroup_pool_state *limit_pool, +s64 target_bytes, +struct ttm_operation_ctx *ctx);int ttm_bo_access (struct ttm_buffer_object *bo,unsigned long offset,void *buf,int len,int write); vm_fault_t ttm_bo_vm_reserve(struct ttm_buffer_object *bo,
include/drm/ttm/ttm_resource.h +7 -0
@@ -39,6 +39,7 @@struct dentry ;struct dmem_cgroup_device ; +struct dmem_cgroup_region ;struct drm_printer ;struct ttm_device ;struct ttm_resource_manager ;
@@ -477,6 +478,12 @@ void ttm_resource_manager_init(struct ttm_resource_manager *man,struct ttm_device *bdev, uint64_t size); +void ttm_resource_manager_set_dmem_region (struct ttm_resource_manager *man, +struct dmem_cgroup_region *region); + +int ttm_resource_manager_dmem_reclaim (struct dmem_cgroup_pool_state *pool, +u64 target_bytes,void *priv); +int ttm_resource_manager_evict_all (struct ttm_device *bdev,struct ttm_resource_manager *man);
Signature · 1 line
2.54.0
[email protected]
AI reviewRe: [PATCH v7 4/6] drm/ttm: Hook up a cgroup-aware reclaim callback for the dmem controller
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] `ttm_resource_manager_set_dmem_region()` fails to clear the cgroup region pointer when passed…
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] ttm_resource_manager_set_dmem_region() fails to clear the cgroup region pointer when passed NULL, leaving a dangling pointer that can cause a use-after-free. --
commit 02822c8c1770f6a971fca6d0ddb57472d4eea596
Author: Thomas Hellström <[email protected]>
drm/ttm: Hook up a cgroup-aware reclaim callback for the dmem controller
This commit introduces functionality to evict buffer objects charged to a specific dmem cgroup pool from a resource manager's LRU. It adds ttm_resource_manager_set_dmem_region() to associate a dmem cgroup region with a resource manager, and provides a reclaim callback that drivers can wire up to TTM eviction.
Quoted 4 lines
drivers/gpu/drm/ttm/ttm_resource.c +0
-0
[ ... ]
drivers/gpu/drm/ttm/ttm_resource.c void ttm_resource_manager_create_debugfs(struct ttm_resource_manager *man, · line 1005
Quoted 7 lines
drivers/gpu/drm/ttm/ttm_resource.c +7
-0+void ttm_resource_manager_set_dmem_region (struct ttm_resource_manager *man, +struct dmem_cgroup_region *region) +{ +if (!IS_ERR_OR_NULL (region)) + man->cg = region; +} +EXPORT_SYMBOL (ttm_resource_manager_set_dmem_region);
[Severity: High]
The v5 changelog mentions handling a NULL region here to clear the reclaim callback and prevent use-after-free bugs. However, if region is NULL, !IS_ERR_OR_NULL(region) evaluates to false.
Does this skip the assignment and fail to clear man->cg, leaving a dangling pointer if a driver tries to detach the region before teardown?
Should this code check !IS_ERR(region) instead, or unconditionally assign man->cg = NULL when the passed region is NULL?
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=4
Thomas Hellström
maintainerPATCH v7 5/6 drm/xe: Wire up dmem cgroup reclaim for VRAM manager
In reply to Thomas HellströmRegister the VRAM manager with the dmem cgroup reclaim infrastructure so that lowering dmem.max below current VRAM usage triggers TTM eviction rather than failing with -EBUSY.
v4:
- Rebased on drm-tip; dropped the XE_PL_STOLEN guard as stolen memory uses a separate TTM manager and never calls __xe_ttm_vram_mgr_init().
v5:
- Rebased on the introduction of struct dmem_cgroup_init.
- Register the fini drmm action before drmm_cgroup_register_region() so that devres LIFO teardown runs unregister_region() first (draining any in-flight reclaim callbacks via the rwsem) and xe_ttm_vram_mgr_fini() second, ensuring the manager is never accessed by a reclaim callback after teardown. (Sashiko-bot)
- Wrap the reclaim callback in xe_ttm_vram_mgr_dmem_reclaim() using drm_dev_enter()/drm_dev_exit() to prevent TTM reclaim from running after driver unbind.
--- drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 54 +++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 9 deletions(-)
drivers/gpu/drm/xe/xe_ttm_vram_mgr.c +45 -9
@@ -276,6 +276,28 @@ static const struct ttm_resource_manager_func xe_ttm_vram_mgr_func = { .debug = xe_ttm_vram_mgr_debug }; +static const struct dmem_cgroup_ops xe_ttm_vram_mgr_dmem_ops; + +static int xe_ttm_vram_mgr_dmem_reclaim (struct dmem_cgroup_pool_state *pool, +u64 target_bytes,void *priv) +{ +struct ttm_resource_manager *man = priv; +struct xe_device *xe =ttm_to_xe_device (man->bdev); +int ret, idx; + +if (!drm_dev_enter (&xe->drm, &idx)) +return -ENODEV ; + + ret =ttm_resource_manager_dmem_reclaim (pool, target_bytes, priv); + +drm_dev_exit (idx); +return ret; +} + +static const struct dmem_cgroup_ops xe_ttm_vram_mgr_dmem_ops = { + .reclaim = xe_ttm_vram_mgr_dmem_reclaim, +}; +static void xe_ttm_vram_mgr_fini (struct drm_device *dev,void *arg) {struct xe_device *xe =to_xe_device (dev);
@@ -301,17 +323,10 @@ int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr, u64 default_page_size) {struct ttm_resource_manager *man = &mgr->manager; +struct dmem_cgroup_region *cg;const char *name;int err; - name = mem_type ==XE_PL_VRAM0 ?"vram0" :"vram1" ; - man->cg =drmm_cgroup_register_region (&xe->drm, name, - &(struct dmem_cgroup_init ){ - .size = size, - }); -if (IS_ERR (man->cg)) -return PTR_ERR (man->cg); - man->func = &xe_ttm_vram_mgr_func; mgr->mem_type = mem_type; err =drmm_mutex_init (&xe->drm, &mgr->lock);
@@ -330,7 +345,28 @@ int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr,ttm_set_driver_manager (&xe->ttm, mem_type, &mgr->manager);ttm_resource_manager_set_used (&mgr->manager, true); -return drmm_add_action_or_reset (&xe->drm, xe_ttm_vram_mgr_fini, mgr); +/* +* Register the fini action before the cgroup region so that devres +* LIFO teardown runs unregister_region first (draining any in-flight +* reclaim callbacks) and the manager fini second. +*/ + err =drmm_add_action_or_reset (&xe->drm, xe_ttm_vram_mgr_fini, mgr); +if (err) +return err; + + name = mem_type ==XE_PL_VRAM0 ?"vram0" :"vram1" ; + cg =drmm_cgroup_register_region (&xe->drm, name, + &(struct dmem_cgroup_init ){ + .size = size, + .ops = &xe_ttm_vram_mgr_dmem_ops, + .reclaim_priv = man, + }); +if (IS_ERR (cg)) +return PTR_ERR (cg); + +ttm_resource_manager_set_dmem_region (man, cg); + +return 0 ; }/**
Signature · 1 line
2.54.0
Thomas Hellström
maintainerPATCH v7 6/6 drm/amdgpu: Wire up dmem cgroup reclaim for VRAM manager
In reply to Thomas HellströmRegister the VRAM manager with the dmem cgroup reclaim infrastructure so that lowering dmem.max below current VRAM usage triggers TTM eviction rather than failing with -EBUSY.
Guard place->flags in amdgpu_ttm_bo_eviction_valuable() against NULL, as the TTM reclaim path passes a NULL place in cgroup drain mode.
Use drmm_cgroup_register_region() so that the region is automatically unregistered at DRM device release, after drm_dev_unplug() has already made drm_dev_enter() return false. The drm_dev_enter/exit guard in the reclaim callback ensures no reclaim work touches the TTM manager after driver unbind, closing the window between vram_mgr_fini() (called from drm_driver.release) and the drmm cleanup that unregisters the region.
v3:
- Rebased on fix for uninitialized list and buddy allocator on the drmm_cgroup_register_region() error path.
v5:
- Rebased on the introduction of struct dmem_cgroup_init.
- Clear the reclaim callback in amdgpu_vram_mgr_fini() to prevent use-after-free if cgroup reclaim is triggered after driver unbind while userspace holds an open DRM file descriptor. (Sashiko-bot)
- Switch from drmm_cgroup_register_region() to the raw dmem_cgroup_register_region() and store the region in amdgpu_vram_mgr.cg_region. Call dmem_cgroup_unregister_region() in amdgpu_vram_mgr_fini() after ttm_resource_manager_evict_all() to drain in-flight reclaim callbacks, and clear man->cg afterwards. This is required because amdgpu's vram manager fini is called explicitly during driver unbind, which may precede the DRM device release and thus precede any drmm-based cleanup. (Sashiko-bot)
v6:
- Fix mgr->cg_region never being assigned, so dmem_cgroup_unregister_region() in fini silently no-ops on NULL and leaks the region. (Sashiko-bot)
- Reorder fini to call set_used(false) and evict_all() before dmem_cgroup_unregister_region(), so ttm_resource_free() can uncharge via man->cg during eviction; clear man->cg after unregister. (Sashiko-bot)
v7:
- Move dmem_cgroup_unregister_region() before the early return on evict_all() failure; not doing so leaves a dangling reclaim callback pointing to the partially-torn-down VRAM manager, causing a use-after-free when the cgroup later triggers reclaim. (Sashiko-bot)
- Switch back to drmm_cgroup_register_region() with a drm_dev_enter/ exit guard in the reclaim callback (matching xe), rather than manual register/unregister. drm_dev_unplug() fires before vram_mgr_fini(), so drm_dev_enter() returning false prevents any reclaim from touching the manager during teardown. This also fixes the "vram" name collision on multi-GPU systems, since drmm_cgroup_register_region() automatically prefixes with "drm/<pci-addr>/". (Sashiko-bot)
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 37 +++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +1 -1
@@ -1507,7 +1507,7 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,dma_resv_for_each_fence (&resv_cursor, bo->base.resv,DMA_RESV_USAGE_BOOKKEEP , f) {if (amdkfd_fence_check_mm (f, current->mm) && - !(place->flags &TTM_PL_FLAG_CONTIGUOUS )) + !(place && (place->flags &TTM_PL_FLAG_CONTIGUOUS )))return false; }
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +32 -5
@@ -906,6 +906,28 @@ static const struct ttm_resource_manager_func amdgpu_vram_mgr_func = { .debug = amdgpu_vram_mgr_debug }; +static const struct dmem_cgroup_ops amdgpu_vram_mgr_dmem_ops; + +static int amdgpu_vram_mgr_dmem_reclaim (struct dmem_cgroup_pool_state *pool, +u64 target_bytes,void *priv) +{ +struct ttm_resource_manager *man = priv; +struct amdgpu_device *adev =amdgpu_ttm_adev (man->bdev); +int ret, idx; + +if (!drm_dev_enter (adev_to_drm (adev), &idx)) +return -ENODEV ; + + ret =ttm_resource_manager_dmem_reclaim (pool, target_bytes, priv); + +drm_dev_exit (idx); +return ret; +} + +static const struct dmem_cgroup_ops amdgpu_vram_mgr_dmem_ops = { + .reclaim = amdgpu_vram_mgr_dmem_reclaim, +}; +/** * amdgpu_vram_mgr_init - init VRAM manager and DRM MM *
@@ -917,6 +939,7 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) {struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr;struct ttm_resource_manager *man = &mgr->manager; +struct dmem_cgroup_region *cg;int err; ttm_resource_manager_init(man, &adev->mman.bdev,
@@ -933,12 +956,16 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)return err; - man->cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , - &(struct dmem_cgroup_init ){ + cg =drmm_cgroup_register_region (adev_to_drm (adev),"vram" , + &(struct dmem_cgroup_init ){ .size = adev->gmc.real_vram_size, - }); -if (IS_ERR (man->cg)) -return PTR_ERR (man->cg); + .ops = &amdgpu_vram_mgr_dmem_ops, + .reclaim_priv = man, + }); +if (IS_ERR (cg)) +return PTR_ERR (cg); + +ttm_resource_manager_set_dmem_region (man, cg);ttm_set_driver_manager (&adev->mman.bdev,TTM_PL_VRAM , &mgr->manager);ttm_resource_manager_set_used (man, true);
Signature · 1 line
2.54.0
[email protected]
AI reviewRe: [PATCH v7 6/6] drm/amdgpu: Wire up dmem cgroup reclaim for VRAM manager
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [High] Use-After-Free due to concurrent cgroup reclaim during probe error teardown. - [Medium] Memory…
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Use-After-Free due to concurrent cgroup reclaim during probe error teardown.
- [Medium] Memory leak of VRAM manager buddy allocator on cgroup region registration failure. --
commit 7beb8b077a31ff08f80ed7810a3913fd3a463579
Author: Thomas Hellström <[email protected]>
drm/amdgpu: Wire up dmem cgroup reclaim for VRAM manager
Register the VRAM manager with the dmem cgroup reclaim infrastructure so that lowering dmem.max below current VRAM usage triggers TTM eviction rather than failing with -EBUSY.
[ ... ]
Quoted 4 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +0
-0
[ ... ]
Quoted 5 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +1
-0@@ -906,6 +906,28 @@ static const struct ttm_resource_manager_func amdgpu_vram_mgr_func = { .debug = amdgpu_vram_mgr_debug }; +static const struct dmem_cgroup_ops amdgpu_vram_mgr_dmem_ops;
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c static const struct ttm_resource_manager_func amdgpu_vram_mgr_func = { · line 919
Quoted 10 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +10
-0+ +static int amdgpu_vram_mgr_dmem_reclaim (struct dmem_cgroup_pool_state *pool, +u64 target_bytes,void *priv) +{ +struct ttm_resource_manager *man = priv; +struct amdgpu_device *adev =amdgpu_ttm_adev (man->bdev); +int ret, idx; + +if (!drm_dev_enter (adev_to_drm (adev), &idx)) +return -ENODEV ;
[Severity: High]
Does this drm_dev_enter() check adequately protect against teardown during a probe error?
If a failure occurs during amdgpu_pci_probe() (for instance in amdgpu_driver_load_kms()), drm_dev_unplug() is never called, so dev->unplugged remains false. The teardown path then proceeds to drm_dev_release() which does:
drm_dev_release(dev) {
if (dev->driver->release)
dev->driver->release(dev);
drm_managed_release(dev);
...
}The driver release callback will destroy the VRAM manager and TTM structures. Only after this does drm_managed_release() unregister the cgroup region. If a cgroup memory reclaim occurs during this window, drm_dev_enter() will allow execution to proceed, and ttm_resource_manager_dmem_reclaim() will dereference the destroyed VRAM manager. Is there a way to prevent reclaim from accessing the manager during probe failure teardown?
Quoted 6 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +6
-0+ + ret =ttm_resource_manager_dmem_reclaim (pool, target_bytes, priv); + +drm_dev_exit (idx); +return ret; +}
[ ... ]
Quoted 7 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +1
-2@@ -933,12 +956,16 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)if (err)return err; - man->cg = drmm_cgroup_register_region(adev_to_drm(adev), "vram", - &(struct dmem_cgroup_init){ + cg = drmm_cgroup_register_region(adev_to_drm(adev), "vram",
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c int amdgpu_vram_mgr_init(struct amdgpu_device *adev) · line 966
Quoted 10 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +6
-3+ &(struct dmem_cgroup_init ){ .size = adev->gmc.real_vram_size, - }); -if (IS_ERR (man->cg)) -return PTR_ERR (man->cg); + .ops = &amdgpu_vram_mgr_dmem_ops, + .reclaim_priv = man, + }); +if (IS_ERR (cg)) +return PTR_ERR (cg);
[Severity: Medium]
Does returning here leak the buddy allocator initialized earlier in this function via gpu_buddy_init()?
If drmm_cgroup_register_region() fails, the error propagates out of amdgpu_ttm_init(), causing the GMC IP block's sw_init to fail. During driver teardown, amdgpu_device_ip_fini() skips calling sw_fini for IP blocks where status.sw is false. Since amdgpu_vram_mgr_fini() is skipped, it seems the buddy allocator memory allocated by gpu_buddy_init() will never be freed.
Should this error path call gpu_buddy_fini() before returning?
Quoted 5 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +2
-0+ +ttm_resource_manager_set_dmem_region (man, cg);ttm_set_driver_manager (&adev->mman.bdev,TTM_PL_VRAM , &mgr->manager);ttm_resource_manager_set_used (man, true);
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=6
Patchwork
CI✗ CI.checkpatch: warning for Add reclaim to the dmem cgroup controller (rev7)
In reply to Thomas Hellström== Series Details ==
== Series Details ==
Series: Add reclaim to the dmem cgroup controller (rev7)
URL : https://patchwork.freedesktop.org/series/163970/
State : warning
== Summary ==
+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master 061140b9bc586ae7f40abc1249c97e1cc72d1b9d
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 680d728b97f2c45af959bb96f1248eaeeb5061b6
Author: Thomas Hellström <[email protected]> Date: Fri Jul 3 15:05:41 2026 +0200
drm/amdgpu: Wire up dmem cgroup reclaim for VRAM manager
Register the VRAM manager with the dmem cgroup reclaim infrastructure so that lowering dmem.max below current VRAM usage triggers TTM eviction rather than failing with -EBUSY.
Guard place->flags in amdgpu_ttm_bo_eviction_valuable() against NULL, as the TTM reclaim path passes a NULL place in cgroup drain mode.
Use drmm_cgroup_register_region() so that the region is automatically unregistered at DRM device release, after drm_dev_unplug() has already made drm_dev_enter() return false. The drm_dev_enter/exit guard in the reclaim callback ensures no reclaim work touches the TTM manager after driver unbind, closing the window between vram_mgr_fini() (called from drm_driver.release) and the drmm cleanup that unregisters the region.
v3:
- Rebased on fix for uninitialized list and buddy allocator on the drmm_cgroup_register_region() error path.
v5:
- Rebased on the introduction of struct dmem_cgroup_init.
- Clear the reclaim callback in amdgpu_vram_mgr_fini() to prevent use-after-free if cgroup reclaim is triggered after driver unbind while userspace holds an open DRM file descriptor. (Sashiko-bot)
- Switch from drmm_cgroup_register_region() to the raw dmem_cgroup_register_region() and store the region in amdgpu_vram_mgr.cg_region. Call dmem_cgroup_unregister_region() in amdgpu_vram_mgr_fini() after ttm_resource_manager_evict_all() to drain in-flight reclaim callbacks, and clear man->cg afterwards. This is required because amdgpu's vram manager fini is called explicitly during driver unbind, which may precede the DRM device release and thus precede any drmm-based cleanup. (Sashiko-bot)
v6:
- Fix mgr->cg_region never being assigned, so dmem_cgroup_unregister_region() in fini silently no-ops on NULL and leaks the region. (Sashiko-bot)
- Reorder fini to call set_used(false) and evict_all() before dmem_cgroup_unregister_region(), so ttm_resource_free() can uncharge via man->cg during eviction; clear man->cg after unregister. (Sashiko-bot)
v7:
- Move dmem_cgroup_unregister_region() before the early return on evict_all() failure; not doing so leaves a dangling reclaim callback pointing to the partially-torn-down VRAM manager, causing a use-after-free when the cgroup later triggers reclaim. (Sashiko-bot)
- Switch back to drmm_cgroup_register_region() with a drm_dev_enter/ exit guard in the reclaim callback (matching xe), rather than manual register/unregister. drm_dev_unplug() fires before vram_mgr_fini(), so drm_dev_enter() returning false prevents any reclaim from touching the manager during teardown. This also fixes the "vram" name collision on multi-GPU systems, since drmm_cgroup_register_region() automatically prefixes with "drm/<pci-addr>/". (Sashiko-bot)
+ /mt/dim checkpatch 7c1fa3022f1e344b4289d72ed795fdb4672389ac drm-intel 5ff92f59222b drm/amdgpu: Fix init ordering in amdgpu_vram_mgr_init() 6733af82c623 cgroup/dmem: Introduce struct dmem_cgroup_init for region initialization 025f5b2b370b cgroup/dmem: Add reclaim callback for lowering max below current usage 839d4f1181cc drm/ttm: Hook up a cgroup-aware reclaim callback for the dmem controller -:147: CHECK:MULTIPLE_ASSIGNMENTS: multiple assignments should be avoided #147: FILE: drivers/gpu/drm/ttm/ttm_bo.c:679:
+ evict_walk.try_low = evict_walk.hit_low = false;
total: 0 errors, 0 warnings, 1 checks, 224 lines checked d7d7b4f1f579 drm/xe: Wire up dmem cgroup reclaim for VRAM manager -:42: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #42: FILE: drivers/gpu/drm/xe/xe_ttm_vram_mgr.c:282:
+static int xe_ttm_vram_mgr_dmem_reclaim(struct dmem_cgroup_pool_state *pool,
+ u64 target_bytes, void *priv)
total: 0 errors, 0 warnings, 1 checks, 75 lines checked 680d728b97f2 drm/amdgpu: Wire up dmem cgroup reclaim for VRAM manager
Patchwork
CI✓ CI.KUnit: success for Add reclaim to the dmem cgroup controller (rev7)
In reply to Thomas Hellström== Series Details ==
== Series Details ==
Series: Add reclaim to the dmem cgroup controller (rev7)
URL : https://patchwork.freedesktop.org/series/163970/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [13:27:16] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:27:20] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
../drivers/gpu/drm/xe/xe_pt.c:1430:13: warning: ‘xe_pt_svm_userptr_notifier_lock’ defined but not used [-Wunused-function]
1430 | static void xe_pt_svm_userptr_notifier_lock(struct xe_vm *vm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[13:27:52] Starting KUnit Kernel (1/1)...
[13:27:52] ============================================================ Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [13:27:52] ================== guc_buf (11 subtests) =================== [13:27:52] [PASSED] test_smallest [13:27:52] [PASSED] test_largest [13:27:52] [PASSED] test_granular [13:27:52] [PASSED] test_unique [13:27:52] [PASSED] test_overlap [13:27:52] [PASSED] test_reusable [13:27:52] [PASSED] test_too_big [13:27:52] [PASSED] test_flush [13:27:52] [PASSED] test_lookup [13:27:52] [PASSED] test_data [13:27:52] [PASSED] test_class [13:27:52] ===================== [PASSED] guc_buf ===================== [13:27:52] =================== guc_dbm (7 subtests) =================== [13:27:52] [PASSED] test_empty [13:27:52] [PASSED] test_default [13:27:52] ======================== test_size ======================== [13:27:52] [PASSED] 4 [13:27:52] [PASSED] 8 [13:27:52] [PASSED] 32 [13:27:52] [PASSED] 256 [13:27:52] ==================== [PASSED] test_size ==================== [13:27:52] ======================= test_reuse ======================== [13:27:52] [PASSED] 4 [13:27:52] [PASSED] 8 [13:27:52] [PASSED] 32 [13:27:52] [PASSED] 256 [13:27:52] =================== [PASSED] test_reuse ==================== [13:27:52] =================== test_range_overlap ==================== [13:27:52] [PASSED] 4 [13:27:52] [PASSED] 8 [13:27:52] [PASSED] 32 [13:27:52] [PASSED] 256 [13:27:52] =============== [PASSED] test_range_overlap ================ [13:27:52] =================== test_range_compact ==================== [13:27:52] [PASSED] 4 [13:27:52] [PASSED] 8 [13:27:52] [PASSED] 32 [13:27:52] [PASSED] 256 [13:27:52] =============== [PASSED] test_range_compact ================ [13:27:52] ==================== test_range_spare ===================== [13:27:52] [PASSED] 4 [13:27:52] [PASSED] 8 [13:27:52] [PASSED] 32 [13:27:52] [PASSED] 256 [13:27:52] ================ [PASSED] test_range_spare ================= [13:27:52] ===================== [PASSED] guc_dbm ===================== [13:27:52] =================== guc_idm (6 subtests) =================== [13:27:52] [PASSED] bad_init [13:27:52] [PASSED] no_init [13:27:52] [PASSED] init_fini [13:27:52] [PASSED] check_used [13:27:52] [PASSED] check_quota [13:27:52] [PASSED] check_all [13:27:52] ===================== [PASSED] guc_idm ===================== [13:27:52] ================== no_relay (3 subtests) =================== [13:27:52] [PASSED] xe_drops_guc2pf_if_not_ready [13:27:52] [PASSED] xe_drops_guc2vf_if_not_ready [13:27:52] [PASSED] xe_rejects_send_if_not_ready [13:27:52] ==================== [PASSED] no_relay ===================== [13:27:52] ================== pf_relay (14 subtests) ================== [13:27:52] [PASSED] pf_rejects_guc2pf_too_short [13:27:52] [PASSED] pf_rejects_guc2pf_too_long [13:27:52] [PASSED] pf_rejects_guc2pf_no_payload [13:27:52] [PASSED] pf_fails_no_payload [13:27:52] [PASSED] pf_fails_bad_origin [13:27:52] [PASSED] pf_fails_bad_type [13:27:52] [PASSED] pf_txn_reports_error [13:27:52] [PASSED] pf_txn_sends_pf2guc [13:27:52] [PASSED] pf_sends_pf2guc [13:27:52] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV) [13:27:52] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV) [13:27:52] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV) [13:27:52] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV) [13:27:52] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV) [13:27:52] ==================== [PASSED] pf_relay ===================== [13:27:52] ================== vf_relay (3 subtests) =================== [13:27:52] [PASSED] vf_rejects_guc2vf_too_short [13:27:52] [PASSED] vf_rejects_guc2vf_too_long [13:27:52] [PASSED] vf_rejects_guc2vf_no_payload [13:27:52] ==================== [PASSED] vf_relay ===================== [13:27:52] ================ pf_gt_config (9 subtests) ================= [13:27:52] [PASSED] fair_contexts_1vf [13:27:52] [PASSED] fair_doorbells_1vf [13:27:52] [PASSED] fair_ggtt_1vf [13:27:52] ====================== fair_vram_1vf ====================== [13:27:52] [PASSED] 3.50 GiB [13:27:52] [PASSED] 11.5 GiB [13:27:52] [PASSED] 15.5 GiB [13:27:52] [PASSED] 31.5 GiB [13:27:52] [PASSED] 63.5 GiB [13:27:52] [PASSED] 1.91 GiB [13:27:52] ================== [PASSED] fair_vram_1vf ================== [13:27:52] ================ fair_vram_1vf_admin_only ================= [13:27:52] [PASSED] 3.50 GiB [13:27:52] [PASSED] 11.5 GiB [13:27:52] [PASSED] 15.5 GiB [13:27:52] [PASSED] 31.5 GiB [13:27:52] [PASSED] 63.5 GiB [13:27:52] [PASSED] 1.91 GiB [13:27:52] ============ [PASSED] fair_vram_1vf_admin_only ============= [13:27:52] ====================== fair_contexts ====================== [13:27:52] [PASSED] 1 VF [13:27:52] [PASSED] 2 VFs [13:27:52] [PASSED] 3 VFs [13:27:52] [PASSED] 4 VFs [13:27:52] [PASSED] 5 VFs [13:27:52] [PASSED] 6 VFs [13:27:52] [PASSED] 7 VFs [13:27:52] [PASSED] 8 VFs [13:27:52] [PASSED] 9 VFs [13:27:52] [PASSED] 10 VFs [13:27:52] [PASSED] 11 VFs [13:27:52] [PASSED] 12 VFs [13:27:52] [PASSED] 13 VFs [13:27:52] [PASSED] 14 VFs [13:27:52] [PASSED] 15 VFs [13:27:52] [PASSED] 16 VFs [13:27:52] [PASSED] 17 VFs [13:27:52] [PASSED] 18 VFs [13:27:52] [PASSED] 19 VFs [13:27:52] [PASSED] 20 VFs [13:27:52] [PASSED] 21 VFs [13:27:52] [PASSED] 22 VFs [13:27:52] [PASSED] 23 VFs [13:27:52] [PASSED] 24 VFs [13:27:52] [PASSED] 25 VFs [13:27:52] [PASSED] 26 VFs [13:27:52] [PASSED] 27 VFs [13:27:52] [PASSED] 28 VFs [13:27:52] [PASSED] 29 VFs [13:27:52] [PASSED] 30 VFs [13:27:52] [PASSED] 31 VFs [13:27:52] [PASSED] 32 VFs [13:27:52] [PASSED] 33 VFs [13:27:52] [PASSED] 34 VFs [13:27:52] [PASSED] 35 VFs [13:27:52] [PASSED] 36 VFs [13:27:52] [PASSED] 37 VFs [13:27:52] [PASSED] 38 VFs [13:27:52] [PASSED] 39 VFs [13:27:52] [PASSED] 40 VFs [13:27:52] [PASSED] 41 VFs [13:27:52] [PASSED] 42 VFs [13:27:52] [PASSED] 43 VFs [13:27:52] [PASSED] 44 VFs [13:27:52] [PASSED] 45 VFs [13:27:52] [PASSED] 46 VFs [13:27:52] [PASSED] 47 VFs [13:27:52] [PASSED] 48 VFs [13:27:52] [PASSED] 49 VFs [13:27:52] [PASSED] 50 VFs [13:27:52] [PASSED] 51 VFs [13:27:52] [PASSED] 52 VFs [13:27:52] [PASSED] 53 VFs [13:27:52] [PASSED] 54 VFs [13:27:52] [PASSED] 55 VFs [13:27:52] [PASSED] 56 VFs [13:27:52] [PASSED] 57 VFs [13:27:52] [PASSED] 58 VFs [13:27:52] [PASSED] 59 VFs [13:27:52] [PASSED] 60 VFs [13:27:52] [PASSED] 61 VFs [13:27:52] [PASSED] 62 VFs [13:27:52] [PASSED] 63 VFs [13:27:52] ================== [PASSED] fair_contexts ================== [13:27:52] ===================== fair_doorbells ====================== [13:27:52] [PASSED] 1 VF [13:27:52] [PASSED] 2 VFs [13:27:52] [PASSED] 3 VFs [13:27:52] [PASSED] 4 VFs [13:27:52] [PASSED] 5 VFs [13:27:52] [PASSED] 6 VFs [13:27:52] [PASSED] 7 VFs [13:27:52] [PASSED] 8 VFs [13:27:52] [PASSED] 9 VFs [13:27:52] [PASSED] 10 VFs [13:27:52] [PASSED] 11 VFs [13:27:52] [PASSED] 12 VFs [13:27:52] [PASSED] 13 VFs [13:27:52] [PASSED] 14 VFs [13:27:52] [PASSED] 15 VFs [13:27:52] [PASSED] 16 VFs [13:27:52] [PASSED] 17 VFs [13:27:52] [PASSED] 18 VFs [13:27:52] [PASSED] 19 VFs [13:27:52] [PASSED] 20 VFs [13:27:52] [PASSED] 21 VFs [13:27:52] [PASSED] 22 VFs [13:27:52] [PASSED] 23 VFs [13:27:52] [PASSED] 24 VFs [13:27:52] [PASSED] 25 VFs [13:27:52] [PASSED] 26 VFs [13:27:52] [PASSED] 27 VFs [13:27:52] [PASSED] 28 VFs [13:27:52] [PASSED] 29 VFs [13:27:52] [PASSED] 30 VFs [13:27:52] [PASSED] 31 VFs [13:27:52] [PASSED] 32 VFs [13:27:52] [PASSED] 33 VFs [13:27:52] [PASSED] 34 VFs [13:27:52] [PASSED] 35 VFs [13:27:52] [PASSED] 36 VFs [13:27:52] [PASSED] 37 VFs [13:27:52] [PASSED] 38 VFs [13:27:52] [PASSED] 39 VFs [13:27:52] [PASSED] 40 VFs [13:27:52] [PASSED] 41 VFs [13:27:52] [PASSED] 42 VFs [13:27:52] [PASSED] 43 VFs [13:27:52] [PASSED] 44 VFs [13:27:52] [PASSED] 45 VFs [13:27:52] [PASSED] 46 VFs [13:27:52] [PASSED] 47 VFs [13:27:52] [PASSED] 48 VFs [13:27:52] [PASSED] 49 VFs [13:27:52] [PASSED] 50 VFs [13:27:52] [PASSED] 51 VFs [13:27:52] [PASSED] 52 VFs [13:27:52] [PASSED] 53 VFs [13:27:52] [PASSED] 54 VFs [13:27:52] [PASSED] 55 VFs [13:27:52] [PASSED] 56 VFs [13:27:52] [PASSED] 57 VFs [13:27:52] [PASSED] 58 VFs [13:27:52] [PASSED] 59 VFs [13:27:52] [PASSED] 60 VFs [13:27:52] [PASSED] 61 VFs [13:27:52] [PASSED] 62 VFs [13:27:52] [PASSED] 63 VFs [13:27:52] ================= [PASSED] fair_doorbells ================== [13:27:52] ======================== fair_ggtt ======================== [13:27:52] [PASSED] 1 VF [13:27:52] [PASSED] 2 VFs [13:27:52] [PASSED] 3 VFs [13:27:52] [PASSED] 4 VFs [13:27:52] [PASSED] 5 VFs [13:27:52] [PASSED] 6 VFs [13:27:52] [PASSED] 7 VFs [13:27:52] [PASSED] 8 VFs [13:27:52] [PASSED] 9 VFs [13:27:52] [PASSED] 10 VFs [13:27:52] [PASSED] 11 VFs [13:27:52] [PASSED] 12 VFs [13:27:52] [PASSED] 13 VFs [13:27:52] [PASSED] 14 VFs [13:27:52] [PASSED] 15 VFs [13:27:52] [PASSED] 16 VFs [13:27:52] [PASSED] 17 VFs [13:27:52] [PASSED] 18 VFs [13:27:52] [PASSED] 19 VFs [13:27:52] [PASSED] 20 VFs [13:27:52] [PASSED] 21 VFs [13:27:52] [PASSED] 22 VFs [13:27:52] [PASSED] 23 VFs [13:27:52] [PASSED] 24 VFs [13:27:52] [PASSED] 25 VFs [13:27:52] [PASSED] 26 VFs [13:27:52] [PASSED] 27 VFs [13:27:52] [PASSED] 28 VFs [13:27:52] [PASSED] 29 VFs [13:27:52] [PASSED] 30 VFs [13:27:52] [PASSED] 31 VFs [13:27:52] [PASSED] 32 VFs [13:27:52] [PASSED] 33 VFs [13:27:52] [PASSED] 34 VFs [13:27:52] [PASSED] 35 VFs [13:27:52] [PASSED] 36 VFs [13:27:52] [PASSED] 37 VFs [13:27:52] [PASSED] 38 VFs [13:27:52] [PASSED] 39 VFs [13:27:52] [PASSED] 40 VFs [13:27:52] [PASSED] 41 VFs [13:27:52] [PASSED] 42 VFs [13:27:52] [PASSED] 43 VFs [13:27:52] [PASSED] 44 VFs [13:27:52] [PASSED] 45 VFs [13:27:52] [PASSED] 46 VFs [13:27:52] [PASSED] 47 VFs [13:27:52] [PASSED] 48 VFs [13:27:52] [PASSED] 49 VFs [13:27:52] [PASSED] 50 VFs [13:27:52] [PASSED] 51 VFs [13:27:52] [PASSED] 52 VFs [13:27:52] [PASSED] 53 VFs [13:27:52] [PASSED] 54 VFs [13:27:52] [PASSED] 55 VFs [13:27:52] [PASSED] 56 VFs [13:27:52] [PASSED] 57 VFs [13:27:52] [PASSED] 58 VFs [13:27:52] [PASSED] 59 VFs [13:27:52] [PASSED] 60 VFs [13:27:52] [PASSED] 61 VFs [13:27:52] [PASSED] 62 VFs [13:27:52] [PASSED] 63 VFs [13:27:52] ==================== [PASSED] fair_ggtt ==================== [13:27:52] ======================== fair_vram ======================== [13:27:52] [PASSED] 1 VF [13:27:52] [PASSED] 2 VFs [13:27:52] [PASSED] 3 VFs [13:27:52] [PASSED] 4 VFs [13:27:52] [PASSED] 5 VFs [13:27:52] [PASSED] 6 VFs [13:27:52] [PASSED] 7 VFs [13:27:52] [PASSED] 8 VFs [13:27:52] [PASSED] 9 VFs [13:27:52] [PASSED] 10 VFs [13:27:52] [PASSED] 11 VFs [13:27:52] [PASSED] 12 VFs [13:27:52] [PASSED] 13 VFs [13:27:52] [PASSED] 14 VFs [13:27:52] [PASSED] 15 VFs [13:27:52] [PASSED] 16 VFs [13:27:52] [PASSED] 17 VFs [13:27:52] [PASSED] 18 VFs [13:27:52] [PASSED] 19 VFs [13:27:52] [PASSED] 20 VFs [13:27:52] [PASSED] 21 VFs [13:27:52] [PASSED] 22 VFs [13:27:52] [PASSED] 23 VFs [13:27:52] [PASSED] 24 VFs [13:27:52] [PASSED] 25 VFs [13:27:52] [PASSED] 26 VFs [13:27:52] [PASSED] 27 VFs [13:27:52] [PASSED] 28 VFs [13:27:52] [PASSED] 29 VFs [13:27:52] [PASSED] 30 VFs [13:27:52] [PASSED] 31 VFs [13:27:52] [PASSED] 32 VFs [13:27:52] [PASSED] 33 VFs [13:27:52] [PASSED] 34 VFs [13:27:52] [PASSED] 35 VFs [13:27:52] [PASSED] 36 VFs [13:27:52] [PASSED] 37 VFs [13:27:52] [PASSED] 38 VFs [13:27:52] [PASSED] 39 VFs [13:27:52] [PASSED] 40 VFs [13:27:52] [PASSED] 41 VFs [13:27:52] [PASSED] 42 VFs [13:27:52] [PASSED] 43 VFs [13:27:52] [PASSED] 44 VFs [13:27:52] [PASSED] 45 VFs [13:27:52] [PASSED] 46 VFs [13:27:52] [PASSED] 47 VFs [13:27:52] [PASSED] 48 VFs [13:27:52] [PASSED] 49 VFs [13:27:52] [PASSED] 50 VFs [13:27:52] [PASSED] 51 VFs [13:27:52] [PASSED] 52 VFs [13:27:52] [PASSED] 53 VFs [13:27:52] [PASSED] 54 VFs [13:27:52] [PASSED] 55 VFs [13:27:52] [PASSED] 56 VFs [13:27:52] [PASSED] 57 VFs [13:27:52] [PASSED] 58 VFs [13:27:52] [PASSED] 59 VFs [13:27:52] [PASSED] 60 VFs [13:27:52] [PASSED] 61 VFs [13:27:52] [PASSED] 62 VFs [13:27:52] [PASSED] 63 VFs [13:27:52] ==================== [PASSED] fair_vram ==================== [13:27:52] ================== [PASSED] pf_gt_config =================== [13:27:52] ===================== lmtt (1 subtest) ===================== [13:27:52] ======================== test_ops ========================= [13:27:52] [PASSED] 2-level [13:27:52] [PASSED] multi-level [13:27:52] ==================== [PASSED] test_ops ===================== [13:27:52] ====================== [PASSED] lmtt ======================= [13:27:52] ================= pf_service (11 subtests) ================= [13:27:52] [PASSED] pf_negotiate_any [13:27:52] [PASSED] pf_negotiate_base_match [13:27:52] [PASSED] pf_negotiate_base_newer [13:27:52] [PASSED] pf_negotiate_base_next [13:27:52] [SKIPPED] pf_negotiate_base_older (no older minor) [13:27:52] [PASSED] pf_negotiate_base_prev [13:27:52] [PASSED] pf_negotiate_latest_match [13:27:52] [PASSED] pf_negotiate_latest_newer [13:27:52] [PASSED] pf_negotiate_latest_next [13:27:52] [SKIPPED] pf_negotiate_latest_older (no older minor) [13:27:52] [SKIPPED] pf_negotiate_latest_prev (no prev major) [13:27:52] =================== [PASSED] pf_service ==================== [13:27:52] ================= xe_guc_g2g (2 subtests) ================== [13:27:52] ============== xe_live_guc_g2g_kunit_default ============== [13:27:52] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ========== [13:27:52] ============== xe_live_guc_g2g_kunit_allmem =============== [13:27:52] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ========== [13:27:52] =================== [SKIPPED] xe_guc_g2g =================== [13:27:52] =================== xe_mocs (2 subtests) =================== [13:27:52] ================ xe_live_mocs_kernel_kunit ================ [13:27:52] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============ [13:27:52] ================ xe_live_mocs_reset_kunit ================= [13:27:52] ============ [SKIPPED] xe_live_mocs_reset_kunit ============ [13:27:52] ==================== [SKIPPED] xe_mocs ===================== [13:27:52] ================= xe_migrate (2 subtests) ================== [13:27:52] ================= xe_migrate_sanity_kunit ================= [13:27:52] ============ [SKIPPED] xe_migrate_sanity_kunit ============= [13:27:52] ================== xe_validate_ccs_kunit ================== [13:27:52] ============= [SKIPPED] xe_validate_ccs_kunit ============== [13:27:52] =================== [SKIPPED] xe_migrate =================== [13:27:52] ================== xe_dma_buf (1 subtest) ================== [13:27:52] ==================== xe_dma_buf_kunit ===================== [13:27:52] ================ [SKIPPED] xe_dma_buf_kunit ================ [13:27:52] =================== [SKIPPED] xe_dma_buf =================== [13:27:52] ================= xe_bo_shrink (1 subtest) ================= [13:27:52] =================== xe_bo_shrink_kunit ==================== [13:27:52] =============== [SKIPPED] xe_bo_shrink_kunit =============== [13:27:52] ================== [SKIPPED] xe_bo_shrink ================== [13:27:52] ==================== xe_bo (2 subtests) ==================== [13:27:52] ================== xe_ccs_migrate_kunit =================== [13:27:52] ============== [SKIPPED] xe_ccs_migrate_kunit ============== [13:27:52] ==================== xe_bo_evict_kunit ==================== [13:27:52] =============== [SKIPPED] xe_bo_evict_kunit ================ [13:27:52] ===================== [SKIPPED] xe_bo ====================== [13:27:52] ==================== args (13 subtests) ==================== [13:27:52] [PASSED] count_args_test [13:27:52] [PASSED] call_args_example [13:27:52] [PASSED] call_args_test [13:27:52] [PASSED] drop_first_arg_example [13:27:52] [PASSED] drop_first_arg_test [13:27:52] [PASSED] first_arg_example [13:27:52] [PASSED] first_arg_test [13:27:52] [PASSED] last_arg_example [13:27:52] [PASSED] last_arg_test [13:27:52] [PASSED] pick_arg_example [13:27:52] [PASSED] if_args_example [13:27:52] [PASSED] if_args_test [13:27:52] [PASSED] sep_comma_example [13:27:52] ====================== [PASSED] args ======================= [13:27:52] =================== xe_pci (3 subtests) ==================== [13:27:52] ==================== check_graphics_ip ==================== [13:27:52] [PASSED] 12.00 Xe_LP [13:27:52] [PASSED] 12.10 Xe_LP+ [13:27:52] [PASSED] 12.55 Xe_HPG [13:27:52] [PASSED] 12.60 Xe_HPC [13:27:52] [PASSED] 12.70 Xe_LPG [13:27:52] [PASSED] 12.71 Xe_LPG [13:27:52] [PASSED] 12.74 Xe_LPG+ [13:27:52] [PASSED] 20.01 Xe2_HPG [13:27:52] [PASSED] 20.02 Xe2_HPG [13:27:52] [PASSED] 20.04 Xe2_LPG [13:27:52] [PASSED] 30.00 Xe3_LPG [13:27:52] [PASSED] 30.01 Xe3_LPG [13:27:52] [PASSED] 30.03 Xe3_LPG [13:27:52] [PASSED] 30.04 Xe3_LPG [13:27:52] [PASSED] 30.05 Xe3_LPG [13:27:52] [PASSED] 35.10 Xe3p_LPG [13:27:52] [PASSED] 35.11 Xe3p_XPC [13:27:52] ================ [PASSED] check_graphics_ip ================ [13:27:52] ===================== check_media_ip ====================== [13:27:52] [PASSED] 12.00 Xe_M [13:27:52] [PASSED] 12.55 Xe_HPM [13:27:52] [PASSED] 13.00 Xe_LPM+ [13:27:52] [PASSED] 13.01 Xe2_HPM [13:27:52] [PASSED] 20.00 Xe2_LPM [13:27:52] [PASSED] 30.00 Xe3_LPM [13:27:52] [PASSED] 30.02 Xe3_LPM [13:27:52] [PASSED] 35.00 Xe3p_LPM [13:27:52] [PASSED] 35.03 Xe3p_HPM [13:27:52] ================= [PASSED] check_media_ip ================== [13:27:52] =================== check_platform_desc =================== [13:27:52] [PASSED] 0x9A60 (TIGERLAKE) [13:27:52] [PASSED] 0x9A68 (TIGERLAKE) [13:27:52] [PASSED] 0x9A70 (TIGERLAKE) [13:27:52] [PASSED] 0x9A40 (TIGERLAKE) [13:27:52] [PASSED] 0x9A49 (TIGERLAKE) [13:27:52] [PASSED] 0x9A59 (TIGERLAKE) [13:27:52] [PASSED] 0x9A78 (TIGERLAKE) [13:27:52] [PASSED] 0x9AC0 (TIGERLAKE) [13:27:52] [PASSED] 0x9AC9 (TIGERLAKE) [13:27:52] [PASSED] 0x9AD9 (TIGERLAKE) [13:27:52] [PASSED] 0x9AF8 (TIGERLAKE) [13:27:52] [PASSED] 0x4C80 (ROCKETLAKE) [13:27:52] [PASSED] 0x4C8A (ROCKETLAKE) [13:27:52] [PASSED] 0x4C8B (ROCKETLAKE) [13:27:52] [PASSED] 0x4C8C (ROCKETLAKE) [13:27:52] [PASSED] 0x4C90 (ROCKETLAKE) [13:27:52] [PASSED] 0x4C9A (ROCKETLAKE) [13:27:52] [PASSED] 0x4680 (ALDERLAKE_S) [13:27:52] [PASSED] 0x4682 (ALDERLAKE_S) [13:27:52] [PASSED] 0x4688 (ALDERLAKE_S) [13:27:52] [PASSED] 0x468A (ALDERLAKE_S) [13:27:52] [PASSED] 0x468B (ALDERLAKE_S) [13:27:52] [PASSED] 0x4690 (ALDERLAKE_S) [13:27:52] [PASSED] 0x4692 (ALDERLAKE_S) [13:27:52] [PASSED] 0x4693 (ALDERLAKE_S) [13:27:52] [PASSED] 0x46A0 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46A1 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46A2 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46A3 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46A6 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46A8 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46AA (ALDERLAKE_P) [13:27:52] [PASSED] 0x462A (ALDERLAKE_P) [13:27:52] [PASSED] 0x4626 (ALDERLAKE_P) [13:27:52] [PASSED] 0x4628 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46B0 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46B1 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46B2 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46B3 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46C0 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46C1 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46C2 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46C3 (ALDERLAKE_P) [13:27:52] [PASSED] 0x46D0 (ALDERLAKE_N) [13:27:52] [PASSED] 0x46D1 (ALDERLAKE_N) [13:27:52] [PASSED] 0x46D2 (ALDERLAKE_N) [13:27:52] [PASSED] 0x46D3 (ALDERLAKE_N) [13:27:52] [PASSED] 0x46D4 (ALDERLAKE_N) [13:27:52] [PASSED] 0xA721 (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7A1 (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7A9 (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7AC (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7AD (ALDERLAKE_P) [13:27:52] [PASSED] 0xA720 (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7A0 (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7A8 (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7AA (ALDERLAKE_P) [13:27:52] [PASSED] 0xA7AB (ALDERLAKE_P) [13:27:52] [PASSED] 0xA780 (ALDERLAKE_S) [13:27:52] [PASSED] 0xA781 (ALDERLAKE_S) [13:27:52] [PASSED] 0xA782 (ALDERLAKE_S) [13:27:52] [PASSED] 0xA783 (ALDERLAKE_S) [13:27:52] [PASSED] 0xA788 (ALDERLAKE_S) [13:27:52] [PASSED] 0xA789 (ALDERLAKE_S) [13:27:52] [PASSED] 0xA78A (ALDERLAKE_S) [13:27:52] [PASSED] 0xA78B (ALDERLAKE_S) [13:27:52] [PASSED] 0x4905 (DG1) [13:27:52] [PASSED] 0x4906 (DG1) [13:27:52] [PASSED] 0x4907 (DG1) [13:27:52] [PASSED] 0x4908 (DG1) [13:27:52] [PASSED] 0x4909 (DG1) [13:27:52] [PASSED] 0x56C0 (DG2) [13:27:52] [PASSED] 0x56C2 (DG2) [13:27:52] [PASSED] 0x56C1 (DG2) [13:27:52] [PASSED] 0x7D51 (METEORLAKE) [13:27:52] [PASSED] 0x7DD1 (METEORLAKE) [13:27:52] [PASSED] 0x7D41 (METEORLAKE) [13:27:52] [PASSED] 0x7D67 (METEORLAKE) [13:27:52] [PASSED] 0xB640 (METEORLAKE) [13:27:52] [PASSED] 0x56A0 (DG2) [13:27:52] [PASSED] 0x56A1 (DG2) [13:27:52] [PASSED] 0x56A2 (DG2) [13:27:52] [PASSED] 0x56BE (DG2) [13:27:52] [PASSED] 0x56BF (DG2) [13:27:52] [PASSED] 0x5690 (DG2) [13:27:52] [PASSED] 0x5691 (DG2) [13:27:52] [PASSED] 0x5692 (DG2) [13:27:52] [PASSED] 0x56A5 (DG2) [13:27:52] [PASSED] 0x56A6 (DG2) [13:27:52] [PASSED] 0x56B0 (DG2) [13:27:52] [PASSED] 0x56B1 (DG2) [13:27:52] [PASSED] 0x56BA (DG2) [13:27:52] [PASSED] 0x56BB (DG2) [13:27:52] [PASSED] 0x56BC (DG2) [13:27:52] [PASSED] 0x56BD (DG2) [13:27:52] [PASSED] 0x5693 (DG2) [13:27:52] [PASSED] 0x5694 (DG2) [13:27:52] [PASSED] 0x5695 (DG2) [13:27:52] [PASSED] 0x56A3 (DG2) [13:27:52] [PASSED] 0x56A4 (DG2) [13:27:52] [PASSED] 0x56B2 (DG2) [13:27:52] [PASSED] 0x56B3 (DG2) [13:27:52] [PASSED] 0x5696 (DG2) [13:27:52] [PASSED] 0x5697 (DG2) [13:27:52] [PASSED] 0xB69 (PVC) [13:27:52] [PASSED] 0xB6E (PVC) [13:27:52] [PASSED] 0xBD4 (PVC) [13:27:52] [PASSED] 0xBD5 (PVC) [13:27:52] [PASSED] 0xBD6 (PVC) [13:27:52] [PASSED] 0xBD7 (PVC) [13:27:52] [PASSED] 0xBD8 (PVC) [13:27:52] [PASSED] 0xBD9 (PVC) [13:27:52] [PASSED] 0xBDA (PVC) [13:27:52] [PASSED] 0xBDB (PVC) [13:27:52] [PASSED] 0xBE0 (PVC) [13:27:52] [PASSED] 0xBE1 (PVC) [13:27:52] [PASSED] 0xBE5 (PVC) [13:27:52] [PASSED] 0x7D40 (METEORLAKE) [13:27:52] [PASSED] 0x7D45 (METEORLAKE) [13:27:52] [PASSED] 0x7D55 (METEORLAKE) [13:27:52] [PASSED] 0x7D60 (METEORLAKE) [13:27:52] [PASSED] 0x7DD5 (METEORLAKE) [13:27:52] [PASSED] 0x6420 (LUNARLAKE) [13:27:52] [PASSED] 0x64A0 (LUNARLAKE) [13:27:52] [PASSED] 0x64B0 (LUNARLAKE) [13:27:52] [PASSED] 0xE202 (BATTLEMAGE) [13:27:52] [PASSED] 0xE209 (BATTLEMAGE) [13:27:52] [PASSED] 0xE20B (BATTLEMAGE) [13:27:52] [PASSED] 0xE20C (BATTLEMAGE) [13:27:52] [PASSED] 0xE20D (BATTLEMAGE) [13:27:52] [PASSED] 0xE210 (BATTLEMAGE) [13:27:52] [PASSED] 0xE211 (BATTLEMAGE) [13:27:52] [PASSED] 0xE212 (BATTLEMAGE) [13:27:52] [PASSED] 0xE216 (BATTLEMAGE) [13:27:52] [PASSED] 0xE220 (BATTLEMAGE) [13:27:52] [PASSED] 0xE221 (BATTLEMAGE) [13:27:52] [PASSED] 0xE222 (BATTLEMAGE) [13:27:52] [PASSED] 0xE223 (BATTLEMAGE) [13:27:52] [PASSED] 0xB080 (PANTHERLAKE) [13:27:52] [PASSED] 0xB081 (PANTHERLAKE) [13:27:52] [PASSED] 0xB082 (PANTHERLAKE) [13:27:52] [PASSED] 0xB083 (PANTHERLAKE) [13:27:52] [PASSED] 0xB084 (PANTHERLAKE) [13:27:52] [PASSED] 0xB085 (PANTHERLAKE) [13:27:52] [PASSED] 0xB086 (PANTHERLAKE) [13:27:52] [PASSED] 0xB087 (PANTHERLAKE) [13:27:52] [PASSED] 0xB08F (PANTHERLAKE) [13:27:52] [PASSED] 0xB090 (PANTHERLAKE) [13:27:52] [PASSED] 0xB0A0 (PANTHERLAKE) [13:27:52] [PASSED] 0xB0B0 (PANTHERLAKE) [13:27:52] [PASSED] 0xFD80 (PANTHERLAKE) [13:27:52] [PASSED] 0xFD81 (PANTHERLAKE) [13:27:52] [PASSED] 0xD740 (NOVALAKE_S) [13:27:52] [PASSED] 0xD741 (NOVALAKE_S) [13:27:52] [PASSED] 0xD742 (NOVALAKE_S) [13:27:52] [PASSED] 0xD743 (NOVALAKE_S) [13:27:52] [PASSED] 0xD745 (NOVALAKE_S) [13:27:52] [PASSED] 0xD74A (NOVALAKE_S) [13:27:52] [PASSED] 0xD74B (NOVALAKE_S) [13:27:52] [PASSED] 0x674C (CRESCENTISLAND) [13:27:52] [PASSED] 0x674D (CRESCENTISLAND) [13:27:52] [PASSED] 0x674E (CRESCENTISLAND) [13:27:52] [PASSED] 0x674F (CRESCENTISLAND) [13:27:52] [PASSED] 0x6750 (CRESCENTISLAND) [13:27:52] [PASSED] 0xD750 (NOVALAKE_P) [13:27:52] [PASSED] 0xD751 (NOVALAKE_P) [13:27:52] [PASSED] 0xD752 (NOVALAKE_P) [13:27:52] [PASSED] 0xD753 (NOVALAKE_P) [13:27:52] [PASSED] 0xD754 (NOVALAKE_P) [13:27:52] [PASSED] 0xD755 (NOVALAKE_P) [13:27:52] [PASSED] 0xD756 (NOVALAKE_P) [13:27:52] [PASSED] 0xD757 (NOVALAKE_P) [13:27:52] [PASSED] 0xD75F (NOVALAKE_P) [13:27:52] =============== [PASSED] check_platform_desc =============== [13:27:52] ===================== [PASSED] xe_pci ====================== [13:27:52] ============= xe_rtp_tables_test (5 subtests) ============== [13:27:52] ================== xe_rtp_table_gt_test =================== [13:27:52] [PASSED] gt_was/14011060649 [13:27:52] [PASSED] gt_was/14011059788 [13:27:52] [PASSED] gt_was/14015795083 [13:27:52] [PASSED] gt_was/16021867713 [13:27:52] [PASSED] gt_was/14019449301 [13:27:52] [PASSED] gt_was/16028005424 [13:27:52] [PASSED] gt_was/14026578760 [13:27:52] [PASSED] gt_was/1409420604 [13:27:52] [PASSED] gt_was/1408615072 [13:27:52] [PASSED] gt_was/22010523718 [13:27:52] [PASSED] gt_was/14011006942 [13:27:52] [PASSED] gt_was/14014830051 [13:27:52] [PASSED] gt_was/18018781329 [13:27:52] [PASSED] gt_was/1509235366 [13:27:52] [PASSED] gt_was/18018781329 [13:27:52] [PASSED] gt_was/16016694945 [13:27:52] [PASSED] gt_was/14018575942 [13:27:52] [PASSED] gt_was/22016670082 [13:27:52] [PASSED] gt_was/22016670082 [13:27:52] [PASSED] gt_was/14017421178 [13:27:52] [PASSED] gt_was/16025250150 [13:27:52] [PASSED] gt_was/14021871409 [13:27:52] [PASSED] gt_was/16021865536 [13:27:52] [PASSED] gt_was/14021486841 [13:27:52] [PASSED] gt_was/14025160223 [13:27:52] [PASSED] gt_was/14026144927, 16029437861, 14026127056 [13:27:52] [PASSED] gt_was/14025635424 [13:27:52] [PASSED] gt_was/16028005424 [13:27:52] ============== [PASSED] xe_rtp_table_gt_test =============== [13:27:52] ================== xe_rtp_table_gt_test =================== [13:27:52] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable [13:27:52] [PASSED] gt_tunings/Tuning: 32B Access Enable [13:27:52] [PASSED] gt_tunings/Tuning: L3 cache [13:27:52] [PASSED] gt_tunings/Tuning: L3 cache - media [13:27:52] [PASSED] gt_tunings/Tuning: Compression Overfetch [13:27:52] [PASSED] gt_tunings/Tuning: Compression Overfetch - media [13:27:52] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 [13:27:52] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media [13:27:52] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only [13:27:52] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media [13:27:52] [PASSED] gt_tunings/Tuning: Stateless compression control [13:27:52] [PASSED] gt_tunings/Tuning: Stateless compression control - media [13:27:52] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache [13:27:52] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media [13:27:52] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB [13:27:52] ============== [PASSED] xe_rtp_table_gt_test =============== [13:27:52] ================== xe_rtp_table_oob_test ================== [13:27:52] [PASSED] oob_was/1607983814 [13:27:52] [PASSED] oob_was/16010904313 [13:27:52] [PASSED] oob_was/18022495364 [13:27:52] [PASSED] oob_was/22012773006 [13:27:52] [PASSED] oob_was/14014475959 [13:27:52] [PASSED] oob_was/22011391025 [13:27:52] [PASSED] oob_was/22012727170 [13:27:52] [PASSED] oob_was/22012727685 [13:27:52] [PASSED] oob_was/22016596838 [13:27:52] [PASSED] oob_was/18020744125 [13:27:52] [PASSED] oob_was/1409600907 [13:27:52] [PASSED] oob_was/22014953428 [13:27:52] [PASSED] oob_was/16017236439 [13:27:52] [PASSED] oob_was/14019821291 [13:27:52] [PASSED] oob_was/14015076503 [13:27:52] [PASSED] oob_was/14018913170 [13:27:52] [PASSED] oob_was/14018094691 [13:27:52] [PASSED] oob_was/18024947630 [13:27:52] [PASSED] oob_was/16022287689 [13:27:52] [PASSED] oob_was/13011645652 [13:27:52] [PASSED] oob_was/14022293748 [13:27:52] [PASSED] oob_was/22019794406 [13:27:52] [PASSED] oob_was/22019338487 [13:27:52] [PASSED] oob_was/16023588340 [13:27:52] [PASSED] oob_was/14019789679 [13:27:52] [PASSED] oob_was/14022866841 [13:27:52] [PASSED] oob_was/16021333562 [13:27:52] [PASSED] oob_was/14016712196 [13:27:52] [PASSED] oob_was/14015568240 [13:27:52] [PASSED] oob_was/18013179988 [13:27:52] [PASSED] oob_was/1508761755 [13:27:52] [PASSED] oob_was/16023105232 [13:27:52] [PASSED] oob_was/16026508708 [13:27:52] [PASSED] oob_was/14020001231 [13:27:52] [PASSED] oob_was/16023683509 [13:27:52] [PASSED] oob_was/14025515070 [13:27:52] [PASSED] oob_was/15015404425_disable [13:27:52] [PASSED] oob_was/16026007364 [13:27:52] [PASSED] oob_was/14020316580 [13:27:52] [PASSED] oob_was/14025883347 [13:27:52] [PASSED] oob_was/16029380221 [13:27:52] ============== [PASSED] xe_rtp_table_oob_test ============== [13:27:52] ================ xe_rtp_table_dev_oob_test ================ [13:27:52] [PASSED] device_oob_was/22010954014 [13:27:52] [PASSED] device_oob_was/15015404425 [13:27:52] [PASSED] device_oob_was/22019338487_display [13:27:52] [PASSED] device_oob_was/14022085890 [13:27:52] [PASSED] device_oob_was/14026539277 [13:27:52] [PASSED] device_oob_was/14026633728 [13:27:52] [PASSED] device_oob_was/14026746987 [13:27:52] [PASSED] device_oob_was/14026779378 [13:27:52] ============ [PASSED] xe_rtp_table_dev_oob_test ============ [13:27:52] ========== xe_rtp_table_missing_upper_bound_test ========== [13:27:52] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865 [13:27:52] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037 [13:27:52] [PASSED] register_whitelist/1806527549 [13:27:52] [PASSED] register_whitelist/allow_read_ctx_timestamp [13:27:52] [PASSED] register_whitelist/allow_read_queue_timestamp [13:27:52] [PASSED] register_whitelist/16014440446 [13:27:52] [PASSED] register_whitelist/16017236439 [13:27:52] [PASSED] register_whitelist/16020183090 [13:27:52] [PASSED] register_whitelist/14024997852 [13:27:52] [PASSED] register_whitelist/14024997852 [13:27:52] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ====== [13:27:52] =============== [PASSED] xe_rtp_tables_test ================ [13:27:52] =================== xe_rtp (3 subtests) ==================== [13:27:52] =================== xe_rtp_rules_tests ==================== [13:27:52] [PASSED] no [13:27:52] [PASSED] yes [13:27:52] [PASSED] no-and-no [13:27:52] [PASSED] no-and-yes [13:27:52] [PASSED] yes-and-no [13:27:52] [PASSED] yes-and-yes [13:27:52] [PASSED] no-or-no [13:27:52] [PASSED] no-or-yes [13:27:52] [PASSED] yes-or-no [13:27:52] [PASSED] yes-or-yes [13:27:52] [PASSED] no-yes-or-yes-no [13:27:52] [PASSED] no-yes-or-yes-yes [13:27:52] [PASSED] yes-yes-or-no-yes [13:27:52] [PASSED] yes-yes-or-yes-yes [13:27:52] [PASSED] no-no-or-yes-or-no [13:27:52] [PASSED] or [13:27:52] [PASSED] or-yes [13:27:52] [PASSED] or-no [13:27:52] [PASSED] yes-or [13:27:52] [PASSED] no-or [13:27:52] [PASSED] no-or-or-yes [13:27:52] [PASSED] yes-or-or-no [13:27:52] [PASSED] no-or-or-no [13:27:52] [PASSED] missing-context-engine-class [13:27:52] [PASSED] missing-context-engine-class-or-yes [13:27:52] [PASSED] missing-context-engine-class-or-or-yes [13:27:52] =============== [PASSED] xe_rtp_rules_tests ================ [13:27:52] =============== xe_rtp_process_to_sr_tests ================ [13:27:52] [PASSED] coalesce-same-reg [13:27:52] [PASSED] coalesce-same-reg-literal-and-func [13:27:52] [PASSED] no-match-no-add [13:27:52] [PASSED] two-regs-two-entries [13:27:52] [PASSED] clr-one-set-other [13:27:52] [PASSED] set-field [13:27:52] [PASSED] conflict-duplicate [13:27:52] [PASSED] conflict-not-disjoint [13:27:52] [PASSED] conflict-not-disjoint-literal-and-func [13:27:52] [PASSED] conflict-reg-type [13:27:52] [PASSED] bad-mcr-reg-forced-to-regular [13:27:52] [PASSED] bad-regular-reg-forced-to-mcr [13:27:52] =========== [PASSED] xe_rtp_process_to_sr_tests ============ [13:27:52] ================== xe_rtp_process_tests =================== [13:27:52] [PASSED] active1 [13:27:52] [PASSED] active2 [13:27:52] [PASSED] active-inactive [13:27:52] [PASSED] inactive-active [13:27:52] [PASSED] inactive-active-inactive [13:27:52] [PASSED] inactive-inactive-inactive [13:27:52] ============== [PASSED] xe_rtp_process_tests =============== [13:27:52] ===================== [PASSED] xe_rtp ====================== [13:27:52] ==================== xe_wa (1 subtest) ===================== [13:27:52] ======================== xe_wa_gt ========================= [13:27:52] [PASSED] TIGERLAKE B0 [13:27:52] [PASSED] DG1 A0 [13:27:52] [PASSED] DG1 B0 [13:27:52] [PASSED] ALDERLAKE_S A0 [13:27:52] [PASSED] ALDERLAKE_S B0 [13:27:52] [PASSED] ALDERLAKE_S C0 [13:27:52] [PASSED] ALDERLAKE_S D0 [13:27:52] [PASSED] ALDERLAKE_P A0 [13:27:52] [PASSED] ALDERLAKE_P B0 [13:27:52] [PASSED] ALDERLAKE_P C0 [13:27:52] [PASSED] ALDERLAKE_S RPLS D0 [13:27:52] [PASSED] ALDERLAKE_P RPLU E0 [13:27:52] [PASSED] DG2 G10 C0 [13:27:52] [PASSED] DG2 G11 B1 [13:27:52] [PASSED] DG2 G12 A1 [13:27:52] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0 [13:27:52] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0 [13:27:52] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0 [13:27:52] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0 [13:27:52] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0 [13:27:52] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1 [13:27:52] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0 [13:27:52] ==================== [PASSED] xe_wa_gt ===================== [13:27:52] ====================== [PASSED] xe_wa ====================== [13:27:52] ============================================================ [13:27:52] Testing complete. Ran 729 tests: passed: 711, skipped: 18 [13:27:52] Elapsed time: 36.744s total, 4.400s configuring, 31.676s building, 0.646s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [13:27:52] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig [13:27:54] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [13:28:19] Starting KUnit Kernel (1/1)... [13:28:19] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [13:28:19] ============ drm_test_pick_cmdline (2 subtests) ============ [13:28:19] [PASSED] drm_test_pick_cmdline_res_1920_1080_60 [13:28:19] =============== drm_test_pick_cmdline_named =============== [13:28:19] [PASSED] NTSC [13:28:19] [PASSED] NTSC-J [13:28:19] [PASSED] PAL [13:28:19] [PASSED] PAL-M [13:28:19] =========== [PASSED] drm_test_pick_cmdline_named =========== [13:28:19] ============== [PASSED] drm_test_pick_cmdline ============== [13:28:19] == drm_test_atomic_get_connector_for_encoder (1 subtest) === [13:28:19] [PASSED] drm_test_drm_atomic_get_connector_for_encoder [13:28:19] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ==== [13:28:19] =========== drm_validate_clone_mode (2 subtests) =========== [13:28:19] ============== drm_test_check_in_clone_mode =============== [13:28:19] [PASSED] in_clone_mode [13:28:19] [PASSED] not_in_clone_mode [13:28:19] ========== [PASSED] drm_test_check_in_clone_mode =========== [13:28:19] =============== drm_test_check_valid_clones =============== [13:28:19] [PASSED] not_in_clone_mode [13:28:19] [PASSED] valid_clone [13:28:19] [PASSED] invalid_clone [13:28:19] =========== [PASSED] drm_test_check_valid_clones =========== [13:28:19] ============= [PASSED] drm_validate_clone_mode ============= [13:28:19] ============= drm_validate_modeset (1 subtest) ============= [13:28:19] [PASSED] drm_test_check_connector_changed_modeset [13:28:19] ============== [PASSED] drm_validate_modeset =============== [13:28:19] ====== drm_test_bridge_get_current_state (2 subtests) ====== [13:28:19] [PASSED] drm_test_drm_bridge_get_current_state_atomic [13:28:19] [PASSED] drm_test_drm_bridge_get_current_state_legacy [13:28:19] ======== [PASSED] drm_test_bridge_get_current_state ======== [13:28:19] ====== drm_test_bridge_helper_reset_crtc (4 subtests) ====== [13:28:19] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic [13:28:19] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled [13:28:19] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy [13:28:19] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts [13:28:19] ======== [PASSED] drm_test_bridge_helper_reset_crtc ======== [13:28:19] ============== drm_bridge_alloc (2 subtests) =============== [13:28:19] [PASSED] drm_test_drm_bridge_alloc_basic [13:28:19] [PASSED] drm_test_drm_bridge_alloc_get_put [13:28:19] ================ [PASSED] drm_bridge_alloc ================= [13:28:19] ============= drm_bridge_bus_fmt (5 subtests) ============== [13:28:19] [PASSED] drm_test_bridge_rgb_yuv_rgb [13:28:19] [PASSED] drm_test_bridge_must_convert_to_yuv444 [13:28:19] [PASSED] drm_test_bridge_hdmi_auto_rgb [13:28:19] [PASSED] drm_test_bridge_auto_first [13:28:19] [PASSED] drm_test_bridge_rgb_yuv_no_path [13:28:19] =============== [PASSED] drm_bridge_bus_fmt ================ [13:28:19] ============= drm_cmdline_parser (40 subtests) ============= [13:28:19] [PASSED] drm_test_cmdline_force_d_only [13:28:19] [PASSED] drm_test_cmdline_force_D_only_dvi [13:28:19] [PASSED] drm_test_cmdline_force_D_only_hdmi [13:28:19] [PASSED] drm_test_cmdline_force_D_only_not_digital [13:28:19] [PASSED] drm_test_cmdline_force_e_only [13:28:19] [PASSED] drm_test_cmdline_res [13:28:19] [PASSED] drm_test_cmdline_res_vesa [13:28:19] [PASSED] drm_test_cmdline_res_vesa_rblank [13:28:19] [PASSED] drm_test_cmdline_res_rblank [13:28:19] [PASSED] drm_test_cmdline_res_bpp [13:28:19] [PASSED] drm_test_cmdline_res_refresh [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh_margins [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital [13:28:19] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on [13:28:19] [PASSED] drm_test_cmdline_res_margins_force_on [13:28:19] [PASSED] drm_test_cmdline_res_vesa_margins [13:28:19] [PASSED] drm_test_cmdline_name [13:28:19] [PASSED] drm_test_cmdline_name_bpp [13:28:19] [PASSED] drm_test_cmdline_name_option [13:28:19] [PASSED] drm_test_cmdline_name_bpp_option [13:28:19] [PASSED] drm_test_cmdline_rotate_0 [13:28:19] [PASSED] drm_test_cmdline_rotate_90 [13:28:19] [PASSED] drm_test_cmdline_rotate_180 [13:28:19] [PASSED] drm_test_cmdline_rotate_270 [13:28:19] [PASSED] drm_test_cmdline_hmirror [13:28:19] [PASSED] drm_test_cmdline_vmirror [13:28:19] [PASSED] drm_test_cmdline_margin_options [13:28:19] [PASSED] drm_test_cmdline_multiple_options [13:28:19] [PASSED] drm_test_cmdline_bpp_extra_and_option [13:28:19] [PASSED] drm_test_cmdline_extra_and_option [13:28:19] [PASSED] drm_test_cmdline_freestanding_options [13:28:19] [PASSED] drm_test_cmdline_freestanding_force_e_and_options [13:28:19] [PASSED] drm_test_cmdline_panel_orientation [13:28:19] ================ drm_test_cmdline_invalid ================= [13:28:19] [PASSED] margin_only [13:28:19] [PASSED] interlace_only [13:28:19] [PASSED] res_missing_x [13:28:19] [PASSED] res_missing_y [13:28:19] [PASSED] res_bad_y [13:28:19] [PASSED] res_missing_y_bpp [13:28:19] [PASSED] res_bad_bpp [13:28:19] [PASSED] res_bad_refresh [13:28:19] [PASSED] res_bpp_refresh_force_on_off [13:28:19] [PASSED] res_invalid_mode [13:28:19] [PASSED] res_bpp_wrong_place_mode [13:28:19] [PASSED] name_bpp_refresh [13:28:19] [PASSED] name_refresh [13:28:19] [PASSED] name_refresh_wrong_mode [13:28:19] [PASSED] name_refresh_invalid_mode [13:28:19] [PASSED] rotate_multiple [13:28:19] [PASSED] rotate_invalid_val [13:28:19] [PASSED] rotate_truncated [13:28:19] [PASSED] invalid_option [13:28:19] [PASSED] invalid_tv_option [13:28:19] [PASSED] truncated_tv_option [13:28:19] ============ [PASSED] drm_test_cmdline_invalid ============= [13:28:19] =============== drm_test_cmdline_tv_options =============== [13:28:19] [PASSED] NTSC [13:28:19] [PASSED] NTSC_443 [13:28:19] [PASSED] NTSC_J [13:28:19] [PASSED] PAL [13:28:19] [PASSED] PAL_M [13:28:19] [PASSED] PAL_N [13:28:19] [PASSED] SECAM [13:28:19] [PASSED] MONO_525 [13:28:19] [PASSED] MONO_625 [13:28:19] =========== [PASSED] drm_test_cmdline_tv_options =========== [13:28:19] =============== [PASSED] drm_cmdline_parser ================ [13:28:19] ========== drmm_connector_hdmi_init (20 subtests) ========== [13:28:19] [PASSED] drm_test_connector_hdmi_init_valid [13:28:19] [PASSED] drm_test_connector_hdmi_init_bpc_8 [13:28:19] [PASSED] drm_test_connector_hdmi_init_bpc_10 [13:28:19] [PASSED] drm_test_connector_hdmi_init_bpc_12 [13:28:19] [PASSED] drm_test_connector_hdmi_init_bpc_invalid [13:28:19] [PASSED] drm_test_connector_hdmi_init_bpc_null [13:28:19] [PASSED] drm_test_connector_hdmi_init_formats_empty [13:28:19] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb [13:28:19] === drm_test_connector_hdmi_init_formats_yuv420_allowed === [13:28:19] [PASSED] supported_formats=0x9 yuv420_allowed=1 [13:28:19] [PASSED] supported_formats=0x9 yuv420_allowed=0 [13:28:19] [PASSED] supported_formats=0x5 yuv420_allowed=1 [13:28:19] [PASSED] supported_formats=0x5 yuv420_allowed=0 [13:28:19] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed === [13:28:19] [PASSED] drm_test_connector_hdmi_init_null_ddc [13:28:19] [PASSED] drm_test_connector_hdmi_init_null_product [13:28:19] [PASSED] drm_test_connector_hdmi_init_null_vendor [13:28:19] [PASSED] drm_test_connector_hdmi_init_product_length_exact [13:28:19] [PASSED] drm_test_connector_hdmi_init_product_length_too_long [13:28:19] [PASSED] drm_test_connector_hdmi_init_product_valid [13:28:19] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact [13:28:19] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long [13:28:19] [PASSED] drm_test_connector_hdmi_init_vendor_valid [13:28:19] ========= drm_test_connector_hdmi_init_type_valid ========= [13:28:19] [PASSED] HDMI-A [13:28:19] [PASSED] HDMI-B [13:28:19] ===== [PASSED] drm_test_connector_hdmi_init_type_valid ===== [13:28:19] ======== drm_test_connector_hdmi_init_type_invalid ======== [13:28:19] [PASSED] Unknown [13:28:19] [PASSED] VGA [13:28:19] [PASSED] DVI-I [13:28:19] [PASSED] DVI-D [13:28:19] [PASSED] DVI-A [13:28:19] [PASSED] Composite [13:28:19] [PASSED] SVIDEO [13:28:19] [PASSED] LVDS [13:28:19] [PASSED] Component [13:28:19] [PASSED] DIN [13:28:19] [PASSED] DP [13:28:19] [PASSED] TV [13:28:19] [PASSED] eDP [13:28:19] [PASSED] Virtual [13:28:19] [PASSED] DSI [13:28:19] [PASSED] DPI [13:28:19] [PASSED] Writeback [13:28:19] [PASSED] SPI [13:28:19] [PASSED] USB [13:28:19] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ==== [13:28:19] ============ [PASSED] drmm_connector_hdmi_init ============= [13:28:19] ============= drmm_connector_init (3 subtests) ============= [13:28:19] [PASSED] drm_test_drmm_connector_init [13:28:19] [PASSED] drm_test_drmm_connector_init_null_ddc [13:28:19] ========= drm_test_drmm_connector_init_type_valid ========= [13:28:19] [PASSED] Unknown [13:28:19] [PASSED] VGA [13:28:19] [PASSED] DVI-I [13:28:19] [PASSED] DVI-D [13:28:19] [PASSED] DVI-A [13:28:19] [PASSED] Composite [13:28:19] [PASSED] SVIDEO [13:28:19] [PASSED] LVDS [13:28:19] [PASSED] Component [13:28:19] [PASSED] DIN [13:28:19] [PASSED] DP [13:28:19] [PASSED] HDMI-A [13:28:19] [PASSED] HDMI-B [13:28:19] [PASSED] TV [13:28:19] [PASSED] eDP [13:28:19] [PASSED] Virtual [13:28:19] [PASSED] DSI [13:28:19] [PASSED] DPI [13:28:19] [PASSED] Writeback [13:28:19] [PASSED] SPI [13:28:19] [PASSED] USB [13:28:19] ===== [PASSED] drm_test_drmm_connector_init_type_valid ===== [13:28:19] =============== [PASSED] drmm_connector_init =============== [13:28:19] ========= drm_connector_dynamic_init (6 subtests) ========== [13:28:19] [PASSED] drm_test_drm_connector_dynamic_init [13:28:19] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc [13:28:19] [PASSED] drm_test_drm_connector_dynamic_init_not_added [13:28:19] [PASSED] drm_test_drm_connector_dynamic_init_properties [13:28:19] ===== drm_test_drm_connector_dynamic_init_type_valid ====== [13:28:19] [PASSED] Unknown [13:28:19] [PASSED] VGA [13:28:19] [PASSED] DVI-I [13:28:19] [PASSED] DVI-D [13:28:19] [PASSED] DVI-A [13:28:19] [PASSED] Composite [13:28:19] [PASSED] SVIDEO [13:28:19] [PASSED] LVDS [13:28:19] [PASSED] Component [13:28:19] [PASSED] DIN [13:28:19] [PASSED] DP [13:28:19] [PASSED] HDMI-A [13:28:19] [PASSED] HDMI-B [13:28:19] [PASSED] TV [13:28:19] [PASSED] eDP [13:28:19] [PASSED] Virtual [13:28:19] [PASSED] DSI [13:28:19] [PASSED] DPI [13:28:19] [PASSED] Writeback [13:28:19] [PASSED] SPI [13:28:19] [PASSED] USB [13:28:19] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid == [13:28:19] ======== drm_test_drm_connector_dynamic_init_name ========= [13:28:19] [PASSED] Unknown [13:28:19] [PASSED] VGA [13:28:19] [PASSED] DVI-I [13:28:19] [PASSED] DVI-D [13:28:19] [PASSED] DVI-A [13:28:19] [PASSED] Composite [13:28:19] [PASSED] SVIDEO [13:28:19] [PASSED] LVDS [13:28:19] [PASSED] Component [13:28:19] [PASSED] DIN [13:28:19] [PASSED] DP [13:28:19] [PASSED] HDMI-A [13:28:19] [PASSED] HDMI-B [13:28:19] [PASSED] TV [13:28:19] [PASSED] eDP [13:28:19] [PASSED] Virtual [13:28:19] [PASSED] DSI [13:28:19] [PASSED] DPI [13:28:19] [PASSED] Writeback [13:28:19] [PASSED] SPI [13:28:19] [PASSED] USB [13:28:19] ==== [PASSED] drm_test_drm_connector_dynamic_init_name ===== [13:28:19] =========== [PASSED] drm_connector_dynamic_init ============ [13:28:19] ==== drm_connector_dynamic_register_early (4 subtests) ===== [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_early_defer [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object [13:28:19] ====== [PASSED] drm_connector_dynamic_register_early ======= [13:28:19] ======= drm_connector_dynamic_register (7 subtests) ======== [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_on_list [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_no_defer [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_no_init [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_mode_object [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_sysfs [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name [13:28:19] [PASSED] drm_test_drm_connector_dynamic_register_debugfs [13:28:19] ========= [PASSED] drm_connector_dynamic_register ========== [13:28:19] = drm_connector_attach_broadcast_rgb_property (2 subtests) = [13:28:19] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property [13:28:19] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector [13:28:19] === [PASSED] drm_connector_attach_broadcast_rgb_property === [13:28:19] ========== drm_get_tv_mode_from_name (2 subtests) ========== [13:28:19] ========== drm_test_get_tv_mode_from_name_valid =========== [13:28:19] [PASSED] NTSC [13:28:19] [PASSED] NTSC-443 [13:28:19] [PASSED] NTSC-J [13:28:19] [PASSED] PAL [13:28:19] [PASSED] PAL-M [13:28:19] [PASSED] PAL-N [13:28:19] [PASSED] SECAM [13:28:19] [PASSED] Mono [13:28:19] ====== [PASSED] drm_test_get_tv_mode_from_name_valid ======= [13:28:19] [PASSED] drm_test_get_tv_mode_from_name_truncated [13:28:19] ============ [PASSED] drm_get_tv_mode_from_name ============ [13:28:19] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) = [13:28:19] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb [13:28:19] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc [13:28:19] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1 [13:28:19] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc [13:28:19] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1 [13:28:19] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double [13:28:19] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid = [13:28:19] [PASSED] VIC 96 [13:28:19] [PASSED] VIC 97 [13:28:19] [PASSED] VIC 101 [13:28:19] [PASSED] VIC 102 [13:28:19] [PASSED] VIC 106 [13:28:19] [PASSED] VIC 107 [13:28:19] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid === [13:28:19] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc [13:28:19] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc [13:28:19] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc [13:28:19] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc [13:28:19] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc [13:28:19] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ==== [13:28:19] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) == [13:28:19] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ==== [13:28:19] [PASSED] Automatic [13:28:19] [PASSED] Full [13:28:19] [PASSED] Limited 16:235 [13:28:19] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name === [13:28:19] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid [13:28:19] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ==== [13:28:19] == drm_hdmi_connector_get_output_format_name (2 subtests) == [13:28:19] === drm_test_drm_hdmi_connector_get_output_format_name ==== [13:28:19] [PASSED] RGB [13:28:19] [PASSED] YUV 4:2:0 [13:28:19] [PASSED] YUV 4:2:2 [13:28:19] [PASSED] YUV 4:4:4 [13:28:19] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name === [13:28:19] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid [13:28:19] ==== [PASSED] drm_hdmi_connector_get_output_format_name ==== [13:28:19] ============= drm_damage_helper (21 subtests) ============== [13:28:19] [PASSED] drm_test_damage_iter_no_damage [13:28:19] [PASSED] drm_test_damage_iter_no_damage_fractional_src [13:28:19] [PASSED] drm_test_damage_iter_no_damage_src_moved [13:28:19] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved [13:28:19] [PASSED] drm_test_damage_iter_no_damage_not_visible [13:28:19] [PASSED] drm_test_damage_iter_no_damage_no_crtc [13:28:19] [PASSED] drm_test_damage_iter_no_damage_no_fb [13:28:19] [PASSED] drm_test_damage_iter_simple_damage [13:28:19] [PASSED] drm_test_damage_iter_single_damage [13:28:19] [PASSED] drm_test_damage_iter_single_damage_intersect_src [13:28:19] [PASSED] drm_test_damage_iter_single_damage_outside_src [13:28:19] [PASSED] drm_test_damage_iter_single_damage_fractional_src [13:28:19] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src [13:28:19] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src [13:28:19] [PASSED] drm_test_damage_iter_single_damage_src_moved [13:28:19] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved [13:28:19] [PASSED] drm_test_damage_iter_damage [13:28:19] [PASSED] drm_test_damage_iter_damage_one_intersect [13:28:19] [PASSED] drm_test_damage_iter_damage_one_outside [13:28:19] [PASSED] drm_test_damage_iter_damage_src_moved [13:28:19] [PASSED] drm_test_damage_iter_damage_not_visible [13:28:19] ================ [PASSED] drm_damage_helper ================ [13:28:19] ============== drm_dp_mst_helper (3 subtests) ============== [13:28:19] ============== drm_test_dp_mst_calc_pbn_mode ============== [13:28:19] [PASSED] Clock 154000 BPP 30 DSC disabled [13:28:19] [PASSED] Clock 234000 BPP 30 DSC disabled [13:28:19] [PASSED] Clock 297000 BPP 24 DSC disabled [13:28:19] [PASSED] Clock 332880 BPP 24 DSC enabled [13:28:19] [PASSED] Clock 324540 BPP 24 DSC enabled [13:28:19] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ========== [13:28:19] ============== drm_test_dp_mst_calc_pbn_div =============== [13:28:19] [PASSED] Link rate 2000000 lane count 4 [13:28:19] [PASSED] Link rate 2000000 lane count 2 [13:28:19] [PASSED] Link rate 2000000 lane count 1 [13:28:19] [PASSED] Link rate 1350000 lane count 4 [13:28:19] [PASSED] Link rate 1350000 lane count 2 [13:28:19] [PASSED] Link rate 1350000 lane count 1 [13:28:19] [PASSED] Link rate 1000000 lane count 4 [13:28:19] [PASSED] Link rate 1000000 lane count 2 [13:28:19] [PASSED] Link rate 1000000 lane count 1 [13:28:19] [PASSED] Link rate 810000 lane count 4 [13:28:19] [PASSED] Link rate 810000 lane count 2 [13:28:19] [PASSED] Link rate 810000 lane count 1 [13:28:19] [PASSED] Link rate 540000 lane count 4 [13:28:19] [PASSED] Link rate 540000 lane count 2 [13:28:19] [PASSED] Link rate 540000 lane count 1 [13:28:19] [PASSED] Link rate 270000 lane count 4 [13:28:19] [PASSED] Link rate 270000 lane count 2 [13:28:19] [PASSED] Link rate 270000 lane count 1 [13:28:19] [PASSED] Link rate 162000 lane count 4 [13:28:19] [PASSED] Link rate 162000 lane count 2 [13:28:19] [PASSED] Link rate 162000 lane count 1 [13:28:19] ========== [PASSED] drm_test_dp_mst_calc_pbn_div =========== [13:28:19] ========= drm_test_dp_mst_sideband_msg_req_decode ========= [13:28:19] [PASSED] DP_ENUM_PATH_RESOURCES with port number [13:28:19] [PASSED] DP_POWER_UP_PHY with port number [13:28:19] [PASSED] DP_POWER_DOWN_PHY with port number [13:28:19] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks [13:28:19] [PASSED] DP_ALLOCATE_PAYLOAD with port number [13:28:19] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI [13:28:19] [PASSED] DP_ALLOCATE_PAYLOAD with PBN [13:28:19] [PASSED] DP_QUERY_PAYLOAD with port number [13:28:19] [PASSED] DP_QUERY_PAYLOAD with VCPI [13:28:19] [PASSED] DP_REMOTE_DPCD_READ with port number [13:28:19] [PASSED] DP_REMOTE_DPCD_READ with DPCD address [13:28:19] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes [13:28:19] [PASSED] DP_REMOTE_DPCD_WRITE with port number [13:28:19] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address [13:28:19] [PASSED] DP_REMOTE_DPCD_WRITE with data array [13:28:19] [PASSED] DP_REMOTE_I2C_READ with port number [13:28:19] [PASSED] DP_REMOTE_I2C_READ with I2C device ID [13:28:19] [PASSED] DP_REMOTE_I2C_READ with transactions array [13:28:19] [PASSED] DP_REMOTE_I2C_WRITE with port number [13:28:19] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID [13:28:19] [PASSED] DP_REMOTE_I2C_WRITE with data array [13:28:19] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID [13:28:19] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID [13:28:19] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event [13:28:19] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event [13:28:19] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior [13:28:19] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior [13:28:19] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode ===== [13:28:19] ================ [PASSED] drm_dp_mst_helper ================ [13:28:19] ================== drm_exec (7 subtests) =================== [13:28:19] [PASSED] sanitycheck [13:28:19] [PASSED] test_lock [13:28:19] [PASSED] test_lock_unlock [13:28:19] [PASSED] test_duplicates [13:28:19] [PASSED] test_prepare [13:28:19] [PASSED] test_prepare_array [13:28:19] [PASSED] test_multiple_loops [13:28:19] ==================== [PASSED] drm_exec ===================== [13:28:19] =========== drm_format_helper_test (17 subtests) =========== [13:28:19] ============== drm_test_fb_xrgb8888_to_gray8 ============== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ========== [13:28:19] ============= drm_test_fb_xrgb8888_to_rgb332 ============== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ========== [13:28:19] ============= drm_test_fb_xrgb8888_to_rgb565 ============== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ========== [13:28:19] ============ drm_test_fb_xrgb8888_to_xrgb1555 ============= [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 ========= [13:28:19] ============ drm_test_fb_xrgb8888_to_argb1555 ============= [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 ========= [13:28:19] ============ drm_test_fb_xrgb8888_to_rgba5551 ============= [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 ========= [13:28:19] ============= drm_test_fb_xrgb8888_to_rgb888 ============== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ========== [13:28:19] ============= drm_test_fb_xrgb8888_to_bgr888 ============== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ========== [13:28:19] ============ drm_test_fb_xrgb8888_to_argb8888 ============= [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 ========= [13:28:19] =========== drm_test_fb_xrgb8888_to_xrgb2101010 =========== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 ======= [13:28:19] =========== drm_test_fb_xrgb8888_to_argb2101010 =========== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 ======= [13:28:19] ============== drm_test_fb_xrgb8888_to_mono =============== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ========== [PASSED] drm_test_fb_xrgb8888_to_mono =========== [13:28:19] ==================== drm_test_fb_swab ===================== [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ================ [PASSED] drm_test_fb_swab ================= [13:28:19] ============ drm_test_fb_xrgb8888_to_xbgr8888 ============= [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 ========= [13:28:19] ============ drm_test_fb_xrgb8888_to_abgr8888 ============= [13:28:19] [PASSED] single_pixel_source_buffer [13:28:19] [PASSED] single_pixel_clip_rectangle [13:28:19] [PASSED] well_known_colors [13:28:19] [PASSED] destination_pitch [13:28:19] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 ========= [13:28:19] ================= drm_test_fb_clip_offset ================= [13:28:19] [PASSED] pass through [13:28:19] [PASSED] horizontal offset [13:28:19] [PASSED] vertical offset [13:28:19] [PASSED] horizontal and vertical offset [13:28:19] [PASSED] horizontal offset (custom pitch) [13:28:19] [PASSED] vertical offset (custom pitch) [13:28:19] [PASSED] horizontal and vertical offset (custom pitch) [13:28:19] ============= [PASSED] drm_test_fb_clip_offset ============= [13:28:19] =================== drm_test_fb_memcpy ==================== [13:28:19] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258) [13:28:19] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258) [13:28:19] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559) [13:28:19] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258) [13:28:19] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258) [13:28:19] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559) [13:28:19] [PASSED] well_known_colors: XB24 little-endian (0x34324258) [13:28:19] [PASSED] well_known_colors: XRA8 little-endian (0x38415258) [13:28:19] [PASSED] well_known_colors: YU24 little-endian (0x34325559) [13:28:19] [PASSED] destination_pitch: XB24 little-endian (0x34324258) [13:28:19] [PASSED] destination_pitch: XRA8 little-endian (0x38415258) [13:28:19] [PASSED] destination_pitch: YU24 little-endian (0x34325559) [13:28:19] =============== [PASSED] drm_test_fb_memcpy ================ [13:28:19] ============= [PASSED] drm_format_helper_test ============== [13:28:19] ================= drm_format (18 subtests) ================= [13:28:19] [PASSED] drm_test_format_block_width_invalid [13:28:19] [PASSED] drm_test_format_block_width_one_plane [13:28:19] [PASSED] drm_test_format_block_width_two_plane [13:28:19] [PASSED] drm_test_format_block_width_three_plane [13:28:19] [PASSED] drm_test_format_block_width_tiled [13:28:19] [PASSED] drm_test_format_block_height_invalid [13:28:19] [PASSED] drm_test_format_block_height_one_plane [13:28:19] [PASSED] drm_test_format_block_height_two_plane [13:28:19] [PASSED] drm_test_format_block_height_three_plane [13:28:19] [PASSED] drm_test_format_block_height_tiled [13:28:19] [PASSED] drm_test_format_min_pitch_invalid [13:28:19] [PASSED] drm_test_format_min_pitch_one_plane_8bpp [13:28:19] [PASSED] drm_test_format_min_pitch_one_plane_16bpp [13:28:19] [PASSED] drm_test_format_min_pitch_one_plane_24bpp [13:28:19] [PASSED] drm_test_format_min_pitch_one_plane_32bpp [13:28:19] [PASSED] drm_test_format_min_pitch_two_plane [13:28:19] [PASSED] drm_test_format_min_pitch_three_plane_8bpp [13:28:19] [PASSED] drm_test_format_min_pitch_tiled [13:28:19] =================== [PASSED] drm_format ==================== [13:28:19] ============== drm_framebuffer (10 subtests) =============== [13:28:19] ========== drm_test_framebuffer_check_src_coords ========== [13:28:19] [PASSED] Success: source fits into fb [13:28:19] [PASSED] Fail: overflowing fb with x-axis coordinate [13:28:19] [PASSED] Fail: overflowing fb with y-axis coordinate [13:28:19] [PASSED] Fail: overflowing fb with source width [13:28:19] [PASSED] Fail: overflowing fb with source height [13:28:19] ====== [PASSED] drm_test_framebuffer_check_src_coords ====== [13:28:19] [PASSED] drm_test_framebuffer_cleanup [13:28:19] =============== drm_test_framebuffer_create =============== [13:28:19] [PASSED] ABGR8888 normal sizes [13:28:19] [PASSED] ABGR8888 max sizes [13:28:19] [PASSED] ABGR8888 pitch greater than min required [13:28:19] [PASSED] ABGR8888 pitch less than min required [13:28:19] [PASSED] ABGR8888 Invalid width [13:28:19] [PASSED] ABGR8888 Invalid buffer handle [13:28:19] [PASSED] No pixel format [13:28:19] [PASSED] ABGR8888 Width 0 [13:28:19] [PASSED] ABGR8888 Height 0 [13:28:19] [PASSED] ABGR8888 Out of bound height * pitch combination [13:28:19] [PASSED] ABGR8888 Large buffer offset [13:28:19] [PASSED] ABGR8888 Buffer offset for inexistent plane [13:28:19] [PASSED] ABGR8888 Invalid flag [13:28:19] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers [13:28:19] [PASSED] ABGR8888 Valid buffer modifier [13:28:19] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) [13:28:19] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS [13:28:19] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS [13:28:19] [PASSED] NV12 Normal sizes [13:28:19] [PASSED] NV12 Max sizes [13:28:19] [PASSED] NV12 Invalid pitch [13:28:19] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag [13:28:19] [PASSED] NV12 different modifier per-plane [13:28:19] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE [13:28:19] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS [13:28:19] [PASSED] NV12 Modifier for inexistent plane [13:28:19] [PASSED] NV12 Handle for inexistent plane [13:28:19] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS [13:28:19] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier [13:28:19] [PASSED] YVU420 Normal sizes [13:28:19] [PASSED] YVU420 Max sizes [13:28:19] [PASSED] YVU420 Invalid pitch [13:28:19] [PASSED] YVU420 Different pitches [13:28:19] [PASSED] YVU420 Different buffer offsets/pitches [13:28:19] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS [13:28:19] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS [13:28:19] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS [13:28:19] [PASSED] YVU420 Valid modifier [13:28:19] [PASSED] YVU420 Different modifiers per plane [13:28:19] [PASSED] YVU420 Modifier for inexistent plane [13:28:19] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR) [13:28:19] [PASSED] X0L2 Normal sizes [13:28:19] [PASSED] X0L2 Max sizes [13:28:19] [PASSED] X0L2 Invalid pitch [13:28:19] [PASSED] X0L2 Pitch greater than minimum required [13:28:19] [PASSED] X0L2 Handle for inexistent plane [13:28:19] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set [13:28:19] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set [13:28:19] [PASSED] X0L2 Valid modifier [13:28:19] [PASSED] X0L2 Modifier for inexistent plane [13:28:19] =========== [PASSED] drm_test_framebuffer_create =========== [13:28:19] [PASSED] drm_test_framebuffer_free [13:28:19] [PASSED] drm_test_framebuffer_init [13:28:19] [PASSED] drm_test_framebuffer_init_bad_format [13:28:19] [PASSED] drm_test_framebuffer_init_dev_mismatch [13:28:19] [PASSED] drm_test_framebuffer_lookup [13:28:19] [PASSED] drm_test_framebuffer_lookup_inexistent [13:28:19] [PASSED] drm_test_framebuffer_modifiers_not_supported [13:28:19] ================= [PASSED] drm_framebuffer ================= [13:28:19] ================ drm_gem_shmem (8 subtests) ================ [13:28:19] [PASSED] drm_gem_shmem_test_obj_create [13:28:19] [PASSED] drm_gem_shmem_test_obj_create_private [13:28:19] [PASSED] drm_gem_shmem_test_pin_pages [13:28:19] [PASSED] drm_gem_shmem_test_vmap [13:28:19] [PASSED] drm_gem_shmem_test_get_sg_table [13:28:19] [PASSED] drm_gem_shmem_test_get_pages_sgt [13:28:19] [PASSED] drm_gem_shmem_test_madvise [13:28:19] [PASSED] drm_gem_shmem_test_purge [13:28:19] ================== [PASSED] drm_gem_shmem ================== [13:28:19] === drm_atomic_helper_connector_hdmi_check (29 subtests) === [13:28:19] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode [13:28:19] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1 [13:28:19] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode [13:28:19] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1 [13:28:19] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode [13:28:19] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1 [13:28:19] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 ======= [13:28:19] [PASSED] Automatic [13:28:19] [PASSED] Full [13:28:19] [PASSED] Limited 16:235 [13:28:19] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 === [13:28:19] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed [13:28:19] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed [13:28:19] [PASSED] drm_test_check_disable_connector [13:28:19] [PASSED] drm_test_check_hdmi_funcs_reject_rate [13:28:19] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb [13:28:19] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420 [13:28:19] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422 [13:28:19] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420 [13:28:19] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420 [13:28:19] [PASSED] drm_test_check_output_bpc_crtc_mode_changed [13:28:19] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed [13:28:19] [PASSED] drm_test_check_output_bpc_dvi [13:28:19] [PASSED] drm_test_check_output_bpc_format_vic_1 [13:28:19] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only [13:28:19] [PASSED] drm_test_check_output_bpc_format_display_rgb_only [13:28:19] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only [13:28:19] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only [13:28:19] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc [13:28:19] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc [13:28:19] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc [13:28:19] ============ drm_test_check_hdmi_color_format ============= [13:28:19] [PASSED] AUTO -> RGB [13:28:19] [PASSED] YCBCR422 -> YUV422 [13:28:19] [PASSED] YCBCR420 -> YUV420 [13:28:19] [PASSED] YCBCR444 -> YUV444 [13:28:19] [PASSED] RGB -> RGB [13:28:19] ======== [PASSED] drm_test_check_hdmi_color_format ========= [13:28:19] ======== drm_test_check_hdmi_color_format_420_only ======== [13:28:19] [PASSED] RGB should fail [13:28:19] [PASSED] YUV444 should fail [13:28:19] [PASSED] YUV422 should fail [13:28:19] [PASSED] YUV420 should work [13:28:19] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ==== [13:28:19] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ====== [13:28:19] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ==== [13:28:19] [PASSED] drm_test_check_broadcast_rgb_value [13:28:19] [PASSED] drm_test_check_bpc_8_value [13:28:19] [PASSED] drm_test_check_bpc_10_value [13:28:19] [PASSED] drm_test_check_bpc_12_value [13:28:19] [PASSED] drm_test_check_format_value [13:28:19] [PASSED] drm_test_check_tmds_char_value [13:28:19] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ====== [13:28:19] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) = [13:28:19] [PASSED] drm_test_check_mode_valid [13:28:19] [PASSED] drm_test_check_mode_valid_reject [13:28:19] [PASSED] drm_test_check_mode_valid_reject_rate [13:28:19] [PASSED] drm_test_check_mode_valid_reject_max_clock [13:28:19] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock [13:28:19] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector [13:28:19] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb [13:28:19] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid === [13:28:19] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) = [13:28:19] [PASSED] drm_test_check_infoframes [13:28:19] [PASSED] drm_test_check_reject_avi_infoframe [13:28:19] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8 [13:28:19] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10 [13:28:19] [PASSED] drm_test_check_reject_audio_infoframe [13:28:19] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes === [13:28:19] ================= drm_managed (2 subtests) ================= [13:28:19] [PASSED] drm_test_managed_release_action [13:28:19] [PASSED] drm_test_managed_run_action [13:28:19] =================== [PASSED] drm_managed =================== [13:28:19] =================== drm_mm (6 subtests) ==================== [13:28:19] [PASSED] drm_test_mm_init [13:28:19] [PASSED] drm_test_mm_debug [13:28:19] [PASSED] drm_test_mm_align32 [13:28:19] [PASSED] drm_test_mm_align64 [13:28:19] [PASSED] drm_test_mm_lowest [13:28:19] [PASSED] drm_test_mm_highest [13:28:19] ===================== [PASSED] drm_mm ====================== [13:28:19] ============= drm_modes_analog_tv (5 subtests) ============= [13:28:19] [PASSED] drm_test_modes_analog_tv_mono_576i [13:28:19] [PASSED] drm_test_modes_analog_tv_ntsc_480i [13:28:19] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined [13:28:19] [PASSED] drm_test_modes_analog_tv_pal_576i [13:28:19] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined [13:28:19] =============== [PASSED] drm_modes_analog_tv =============== [13:28:19] ============== drm_plane_helper (2 subtests) =============== [13:28:19] =============== drm_test_check_plane_state ================ [13:28:19] [PASSED] clipping_simple [13:28:19] [PASSED] clipping_rotate_reflect [13:28:19] [PASSED] positioning_simple [13:28:19] [PASSED] upscaling [13:28:19] [PASSED] downscaling [13:28:19] [PASSED] rounding1 [13:28:19] [PASSED] rounding2 [13:28:19] [PASSED] rounding3 [13:28:19] [PASSED] rounding4 [13:28:19] =========== [PASSED] drm_test_check_plane_state ============ [13:28:19] =========== drm_test_check_invalid_plane_state ============ [13:28:19] [PASSED] positioning_invalid [13:28:19] [PASSED] upscaling_invalid [13:28:19] [PASSED] downscaling_invalid [13:28:19] ======= [PASSED] drm_test_check_invalid_plane_state ======== [13:28:19] ================ [PASSED] drm_plane_helper ================= [13:28:19] ====== drm_connector_helper_tv_get_modes (1 subtest) ======= [13:28:19] ====== drm_test_connector_helper_tv_get_modes_check ======= [13:28:19] [PASSED] None [13:28:19] [PASSED] PAL [13:28:19] [PASSED] NTSC [13:28:19] [PASSED] Both, NTSC Default [13:28:19] [PASSED] Both, PAL Default [13:28:19] [PASSED] Both, NTSC Default, with PAL on command-line [13:28:19] [PASSED] Both, PAL Default, with NTSC on command-line [13:28:19] == [PASSED] drm_test_connector_helper_tv_get_modes_check === [13:28:19] ======== [PASSED] drm_connector_helper_tv_get_modes ======== [13:28:19] ================== drm_rect (9 subtests) =================== [13:28:19] [PASSED] drm_test_rect_clip_scaled_div_by_zero [13:28:19] [PASSED] drm_test_rect_clip_scaled_not_clipped [13:28:19] [PASSED] drm_test_rect_clip_scaled_clipped [13:28:19] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned [13:28:19] ================= drm_test_rect_intersect ================= [13:28:19] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0 [13:28:19] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1 [13:28:19] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0 [13:28:19] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1 [13:28:19] [PASSED] right x left: 2x1+0+0 x 3x1+1+0 [13:28:19] [PASSED] left x right: 3x1+1+0 x 2x1+0+0 [13:28:19] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1 [13:28:19] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0 [13:28:19] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1 [13:28:19] [PASSED] touching side: 1x1+0+0 x 1x1+1+0 [13:28:19] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0 [13:28:19] [PASSED] inside another: 2x2+0+0 x 1x1+1+1 [13:28:19] [PASSED] far away: 1x1+0+0 x 1x1+3+6 [13:28:19] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10 [13:28:19] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10 [13:28:19] ============= [PASSED] drm_test_rect_intersect ============= [13:28:19] ================ drm_test_rect_calc_hscale ================ [13:28:19] [PASSED] normal use [13:28:19] [PASSED] out of max range [13:28:19] [PASSED] out of min range [13:28:19] [PASSED] zero dst [13:28:19] [PASSED] negative src [13:28:19] [PASSED] negative dst [13:28:19] ============ [PASSED] drm_test_rect_calc_hscale ============ [13:28:19] ================ drm_test_rect_calc_vscale ================ [13:28:19] [PASSED] normal use [13:28:19] [PASSED] out of max range [13:28:19] [PASSED] out of min range [13:28:19] [PASSED] zero dst [13:28:19] [PASSED] negative src [13:28:19] [PASSED] negative dst [13:28:19] ============ [PASSED] drm_test_rect_calc_vscale ============ [13:28:19] ================== drm_test_rect_rotate =================== [13:28:19] [PASSED] reflect-x [13:28:19] [PASSED] reflect-y [13:28:19] [PASSED] rotate-0 [13:28:19] [PASSED] rotate-90 [13:28:19] [PASSED] rotate-180 [13:28:19] [PASSED] rotate-270 [13:28:19] ============== [PASSED] drm_test_rect_rotate =============== [13:28:19] ================ drm_test_rect_rotate_inv ================= [13:28:19] [PASSED] reflect-x [13:28:19] [PASSED] reflect-y [13:28:19] [PASSED] rotate-0 [13:28:19] [PASSED] rotate-90 [13:28:19] [PASSED] rotate-180 [13:28:19] [PASSED] rotate-270 [13:28:19] ============ [PASSED] drm_test_rect_rotate_inv ============= [13:28:19] ==================== [PASSED] drm_rect ===================== [13:28:19] ============ drm_sysfb_modeset_test (1 subtest) ============ [13:28:19] ============ drm_test_sysfb_build_fourcc_list ============= [13:28:19] [PASSED] no native formats [13:28:19] [PASSED] XRGB8888 as native format [13:28:19] [PASSED] remove duplicates [13:28:19] [PASSED] convert alpha formats [13:28:19] [PASSED] random formats [13:28:19] ======== [PASSED] drm_test_sysfb_build_fourcc_list ========= [13:28:19] ============= [PASSED] drm_sysfb_modeset_test ============== [13:28:19] ================== drm_fixp (2 subtests) =================== [13:28:19] [PASSED] drm_test_int2fixp [13:28:19] [PASSED] drm_test_sm2fixp [13:28:19] ==================== [PASSED] drm_fixp ===================== [13:28:19] ============================================================ [13:28:19] Testing complete. Ran 639 tests: passed: 639 [13:28:19] Elapsed time: 26.483s total, 1.780s configuring, 24.536s building, 0.142s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig [13:28:19] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig [13:28:21] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [13:28:31] Starting KUnit Kernel (1/1)... [13:28:31] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [13:28:31] ================= ttm_device (5 subtests) ================== [13:28:31] [PASSED] ttm_device_init_basic [13:28:31] [PASSED] ttm_device_init_multiple [13:28:31] [PASSED] ttm_device_fini_basic [13:28:31] [PASSED] ttm_device_init_no_vma_man [13:28:31] ================== ttm_device_init_pools ================== [13:28:31] [PASSED] No DMA allocations, no DMA32 required [13:28:31] [PASSED] DMA allocations, DMA32 required [13:28:31] [PASSED] No DMA allocations, DMA32 required [13:28:31] [PASSED] DMA allocations, no DMA32 required [13:28:31] ============== [PASSED] ttm_device_init_pools ============== [13:28:31] =================== [PASSED] ttm_device ==================== [13:28:31] ================== ttm_pool (8 subtests) =================== [13:28:31] ================== ttm_pool_alloc_basic =================== [13:28:31] [PASSED] One page [13:28:31] [PASSED] More than one page [13:28:31] [PASSED] Above the allocation limit [13:28:31] [PASSED] One page, with coherent DMA mappings enabled [13:28:31] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [13:28:31] ============== [PASSED] ttm_pool_alloc_basic =============== [13:28:31] ============== ttm_pool_alloc_basic_dma_addr ============== [13:28:31] [PASSED] One page [13:28:31] [PASSED] More than one page [13:28:31] [PASSED] Above the allocation limit [13:28:31] [PASSED] One page, with coherent DMA mappings enabled [13:28:31] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [13:28:31] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ========== [13:28:31] [PASSED] ttm_pool_alloc_order_caching_match [13:28:31] [PASSED] ttm_pool_alloc_caching_mismatch [13:28:31] [PASSED] ttm_pool_alloc_order_mismatch [13:28:31] [PASSED] ttm_pool_free_dma_alloc [13:28:31] [PASSED] ttm_pool_free_no_dma_alloc [13:28:31] [PASSED] ttm_pool_fini_basic [13:28:31] ==================== [PASSED] ttm_pool ===================== [13:28:31] ================ ttm_resource (8 subtests) ================= [13:28:31] ================= ttm_resource_init_basic ================= [13:28:31] [PASSED] Init resource in TTM_PL_SYSTEM [13:28:31] [PASSED] Init resource in TTM_PL_VRAM [13:28:31] [PASSED] Init resource in a private placement [13:28:31] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags [13:28:31] ============= [PASSED] ttm_resource_init_basic ============= [13:28:31] [PASSED] ttm_resource_init_pinned [13:28:31] [PASSED] ttm_resource_fini_basic [13:28:31] [PASSED] ttm_resource_manager_init_basic [13:28:31] [PASSED] ttm_resource_manager_usage_basic [13:28:31] [PASSED] ttm_resource_manager_set_used_basic [13:28:31] [PASSED] ttm_sys_man_alloc_basic [13:28:31] [PASSED] ttm_sys_man_free_basic [13:28:31] ================== [PASSED] ttm_resource =================== [13:28:31] =================== ttm_tt (15 subtests) =================== [13:28:31] ==================== ttm_tt_init_basic ==================== [13:28:31] [PASSED] Page-aligned size [13:28:31] [PASSED] Extra pages requested [13:28:31] ================ [PASSED] ttm_tt_init_basic ================ [13:28:31] [PASSED] ttm_tt_init_misaligned [13:28:31] [PASSED] ttm_tt_fini_basic [13:28:31] [PASSED] ttm_tt_fini_sg [13:28:31] [PASSED] ttm_tt_fini_shmem [13:28:31] [PASSED] ttm_tt_create_basic [13:28:31] [PASSED] ttm_tt_create_invalid_bo_type [13:28:31] [PASSED] ttm_tt_create_ttm_exists [13:28:31] [PASSED] ttm_tt_create_failed [13:28:31] [PASSED] ttm_tt_destroy_basic [13:28:31] [PASSED] ttm_tt_populate_null_ttm [13:28:31] [PASSED] ttm_tt_populate_populated_ttm [13:28:31] [PASSED] ttm_tt_unpopulate_basic [13:28:31] [PASSED] ttm_tt_unpopulate_empty_ttm [13:28:31] [PASSED] ttm_tt_swapin_basic [13:28:31] ===================== [PASSED] ttm_tt ====================== [13:28:31] =================== ttm_bo (14 subtests) =================== [13:28:31] =========== ttm_bo_reserve_optimistic_no_ticket =========== [13:28:31] [PASSED] Cannot be interrupted and sleeps [13:28:31] [PASSED] Cannot be interrupted, locks straight away [13:28:31] [PASSED] Can be interrupted, sleeps [13:28:31] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket ======= [13:28:31] [PASSED] ttm_bo_reserve_locked_no_sleep [13:28:31] [PASSED] ttm_bo_reserve_no_wait_ticket [13:28:31] [PASSED] ttm_bo_reserve_double_resv [13:28:31] [PASSED] ttm_bo_reserve_interrupted [13:28:31] [PASSED] ttm_bo_reserve_deadlock [13:28:31] [PASSED] ttm_bo_unreserve_basic [13:28:31] [PASSED] ttm_bo_unreserve_pinned [13:28:31] [PASSED] ttm_bo_unreserve_bulk [13:28:31] [PASSED] ttm_bo_fini_basic [13:28:31] [PASSED] ttm_bo_fini_shared_resv [13:28:31] [PASSED] ttm_bo_pin_basic [13:28:31] [PASSED] ttm_bo_pin_unpin_resource [13:28:31] [PASSED] ttm_bo_multiple_pin_one_unpin [13:28:31] ===================== [PASSED] ttm_bo ====================== [13:28:31] ============== ttm_bo_validate (22 subtests) =============== [13:28:31] ============== ttm_bo_init_reserved_sys_man =============== [13:28:31] [PASSED] Buffer object for userspace [13:28:31] [PASSED] Kernel buffer object [13:28:31] [PASSED] Shared buffer object [13:28:31] ========== [PASSED] ttm_bo_init_reserved_sys_man =========== [13:28:31] ============== ttm_bo_init_reserved_mock_man ============== [13:28:31] [PASSED] Buffer object for userspace [13:28:31] [PASSED] Kernel buffer object [13:28:31] [PASSED] Shared buffer object [13:28:31] ========== [PASSED] ttm_bo_init_reserved_mock_man ========== [13:28:31] [PASSED] ttm_bo_init_reserved_resv [13:28:31] ================== ttm_bo_validate_basic ================== [13:28:31] [PASSED] Buffer object for userspace [13:28:31] [PASSED] Kernel buffer object [13:28:31] [PASSED] Shared buffer object [13:28:31] ============== [PASSED] ttm_bo_validate_basic ============== [13:28:31] [PASSED] ttm_bo_validate_invalid_placement [13:28:31] ============= ttm_bo_validate_same_placement ============== [13:28:31] [PASSED] System manager [13:28:31] [PASSED] VRAM manager [13:28:31] ========= [PASSED] ttm_bo_validate_same_placement ========== [13:28:31] [PASSED] ttm_bo_validate_failed_alloc [13:28:31] [PASSED] ttm_bo_validate_pinned [13:28:31] [PASSED] ttm_bo_validate_busy_placement [13:28:31] ================ ttm_bo_validate_multihop ================= [13:28:31] [PASSED] Buffer object for userspace [13:28:31] [PASSED] Kernel buffer object [13:28:31] [PASSED] Shared buffer object [13:28:31] ============ [PASSED] ttm_bo_validate_multihop ============= [13:28:31] ========== ttm_bo_validate_no_placement_signaled ========== [13:28:31] [PASSED] Buffer object in system domain, no page vector [13:28:31] [PASSED] Buffer object in system domain with an existing page vector [13:28:31] ====== [PASSED] ttm_bo_validate_no_placement_signaled ====== [13:28:31] ======== ttm_bo_validate_no_placement_not_signaled ======== [13:28:31] [PASSED] Buffer object for userspace [13:28:31] [PASSED] Kernel buffer object [13:28:31] [PASSED] Shared buffer object [13:28:31] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ==== [13:28:31] [PASSED] ttm_bo_validate_move_fence_signaled [13:28:31] ========= ttm_bo_validate_move_fence_not_signaled ========= [13:28:31] [PASSED] Waits for GPU [13:28:31] [PASSED] Tries to lock straight away [13:28:31] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled ===== [13:28:31] [PASSED] ttm_bo_validate_swapout [13:28:31] [PASSED] ttm_bo_validate_happy_evict [13:28:31] [PASSED] ttm_bo_validate_all_pinned_evict [13:28:31] [PASSED] ttm_bo_validate_allowed_only_evict [13:28:31] [PASSED] ttm_bo_validate_deleted_evict [13:28:31] [PASSED] ttm_bo_validate_busy_domain_evict [13:28:31] [PASSED] ttm_bo_validate_evict_gutting [13:28:31] [PASSED] ttm_bo_validate_recrusive_evict [13:28:31] ================= [PASSED] ttm_bo_validate ================= [13:28:31] ============================================================ [13:28:31] Testing complete. Ran 102 tests: passed: 102 [13:28:31] Elapsed time: 11.891s total, 1.788s configuring, 9.838s building, 0.235s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
Patchwork
CI✓ Xe.CI.BAT: success for Add reclaim to the dmem cgroup controller (rev7)
In reply to Thomas Hellström== Series Details ==
== Series Details ==
Series: Add reclaim to the dmem cgroup controller (rev7)
URL : https://patchwork.freedesktop.org/series/163970/
State : success
== Summary ==
CI Bug Log - changes from xe-5336-539ef0bb9cab59e164d7b737287384864a457d05_BAT -> xe-pw-163970v7_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (12 -> 12)
------------------------------
No changes in participating hosts
New tests
---------
New tests have been introduced between xe-5336-539ef0bb9cab59e164d7b737287384864a457d05_BAT and xe-pw-163970v7_BAT:
### New IGT tests (9) ###
* igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-a-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.69] s
* igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-c-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.68] s
* igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-d-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.66] s
* igt@kms_pipe_crc_basic@nonblocking-crc@pipe-a-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.68] s
* igt@kms_pipe_crc_basic@nonblocking-crc@pipe-c-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.68] s
* igt@kms_pipe_crc_basic@nonblocking-crc@pipe-d-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.66] s
* igt@kms_pipe_crc_basic@read-crc@pipe-a-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.60] s
* igt@kms_pipe_crc_basic@read-crc@pipe-c-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.62] s
* igt@kms_pipe_crc_basic@read-crc@pipe-d-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [0.61] s
Changes
-------
No changes found
Build changes
-------------
* Linux: xe-5336-539ef0bb9cab59e164d7b737287384864a457d05 -> xe-pw-163970v7
IGT_8990: 8990
xe-5336-539ef0bb9cab59e164d7b737287384864a457d05: 539ef0bb9cab59e164d7b737287384864a457d05
xe-pw-163970v7: 163970v7
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/index.html
Quoted 92 lines · Thomas Hellström
When writing a "max" limit lower than the current usage, the existing code silently failed. This series aims to improve on that by returning
-EBUSYon failure and also attempt to synchronously reclaim device memory to push the usage under the new max limit to avoid the error.Patch 1 fixes a pre-existing
amdgpu_vram_mgr_init()error path Patch 2 introduces structdmem_cgroup_initfor extensible region
registration.
Patch 3 implements and documents a reclaim callback interface
for the dmem controller.
Patch 4 implements a TTM reclaim callback.
Patches 5-6 hook up the reclaim callback to the dmem cgroup-aware
drivers xe and amdgpu.v2:
- Remove the error propagation that was in a previous series (Maarten)
- A number of updates in patch 1. See its commit message for details (Maarten)v3:
- Add patch 1 fixing a pre-existingamdgpu_vram_mgr_init()error path bug wheredrmm_cgroup_register_region()was called beforeINIT_LIST_HEAD()andgpu_buddy_init(), causing a kernel panic on failure. (Sashiko-bot)
- Use an rwsem to protect reclaim callback registration and region unregister against concurrent reclaim invocations. (Sashiko-bot)
- Fixttm_resource_manager_set_dmem_region()storing an error pointer inman->cgunconditionally. (Sashiko-bot)
- Fix kernel-doc function name format forttm_bo_evict_cgroup()andttm_resource_manager_set_dmem_region().v4:
- Rebased on drm-tip; dropped theXE_PL_STOLENguard in the xe patch as stolen memory uses a separate TTM manager.v5:
- Add patch 2 introducing structdmem_cgroup_initto make thedmem_cgroup_register_region()API extensible without adding positional arguments in the future.
- Use nonblock=true inreset_all_resource_limits()to avoid sleeping insidercu_read_lock()indmemcs_offline(). (Sashiko-bot)
- Compare usage against the truncated limit stored in cnt.max, not the original u64. (Sashiko-bot)
- UseDMEM_MAX_RECLAIM_RETRIES(16) retry budget instead of 5, matching the memcg controller; only-ENOSPC(no progress) counts against the budget, other errors abort immediately.
- Handle NULL region inttm_resource_manager_set_dmem_region()to clear the reclaim callback, preventing use-after-free when the manager is torn down while the dmem region outlives it. (Sashiko-bot)
- Return 0 on any eviction progress; reserve-ENOSPCfor zero progress.
- Clear the reclaim callback in xe and amdgpu fini paths to prevent use-after-free after driver unbind with open DRM file descriptors. (Sashiko-bot)
- Register xe fini devres action beforedrmm_cgroup_register_region()so LIFO teardown runs unregister first, draining callbacks before the manager is destroyed. (Sashiko-bot)
- Switch amdgpu to explicitdmem_cgroup_unregister_region()at the top ofamdgpu_vram_mgr_fini()before any manager teardown, since amdgpu's fini is called explicitly during driver unbind before drmm cleanup. (Sashiko-bot)
- Wrap the xe reclaim callback with drm_dev_enter()/drm_dev_exit() to prevent TTM reclaim from running after driver unbind.v6:
- Move the ops check insidedown_read()inset_resource_max(), guarded byregion->unregistered, to close a UAF race againstdmem_cgroup_unregister_region(). (Sashiko-bot)
- Fixdmem_cgroup_ops->reclaimdocstring:-ENOSPCis retried up toDMEM_MAX_RECLAIM_RETRIEStimes, not an immediate stop. (Sashiko-bot)
- Fixmgr->cg_regionnever being assigned inamdgpu_vram_mgr_init(), causingdmem_cgroup_unregister_region()in fini to silently no-op. (Sashiko-bot)
- Reorderamdgpu_vram_mgr_fini()to callset_used(false)andevict_all()beforedmem_cgroup_unregister_region(), sottm_resource_free()can uncharge viaman->cgduring eviction; clearman->cgafter unregister. (Sashiko-bot)v7:
- Replace the per-regionrw_semaphorewith a static SRCU domain (dmemcg_srcu). SRCU is a better fit: it avoids per-region lock overhead on every reclaim call, andsynchronize_srcu()at unregister time is a rare, shutdown-time operation. (Maarten)
- Trim in-function comments to focus on what rather than how.
- Switch back todrmm_cgroup_register_region()with a drm_dev_enter/ exit guard in the reclaim callback (matching xe), rather than manual register/unregister.drm_dev_unplug()fires beforevram_mgr_fini(), sodrm_dev_enter()returning false prevents any reclaim from touching the manager during teardown. This also fixes the "vram" name collision on multi-GPU systems, sincedrmm_cgroup_register_region()automatically prefixes with "drm/<pci-addr>/". (Sashiko-bot)
Quoted 5 lines
User-space tests are at
https://patchwork.freedesktop.org/series/163935/Test-with: [email protected]
I used the branch at [1] to run tests over amdgpu and they pass.
[1] https://gitlab.freedesktop.org/cascardo/igt-gpu-tools/-/commits/dmem_max?ref_type=heads
Quoted 27 lines
Thomas Hellström (6):
drm/amdgpu: Fix init ordering inamdgpu_vram_mgr_init()cgroup/dmem: Introduce structdmem_cgroup_initfor region
initialization
cgroup/dmem: Add reclaim callback for lowering max below current usage drm/ttm: Hook up a cgroup-aware reclaim callback for the dmem
controller
drm/xe: Wire up dmem cgroup reclaim for VRAM manager drm/amdgpu: Wire up dmem cgroup reclaim for VRAM managerdrivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 38 +++++++- drivers/gpu/drm/drm_drv.c | 8 +- drivers/gpu/drm/ttm/ttm_bo.c | 95 +++++++++++++++++++- drivers/gpu/drm/ttm/ttm_bo_util.c | 3 +- drivers/gpu/drm/ttm/ttm_resource.c | 50 +++++++++++ drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 53 +++++++++-- include/drm/drm_drv.h | 4 +- include/drm/ttm/ttm_bo.h | 10 +++ include/drm/ttm/ttm_resource.h | 7 ++ include/linux/cgroup_dmem.h | 38 +++++++- kernel/cgroup/dmem.c | 91 +++++++++++++++---- 12 files changed, 362 insertions(+), 37 deletions(-)Signature · 1 line
2.54.0
Patchwork
CI✗ Xe.CI.FULL: failure for Add reclaim to the dmem cgroup controller (rev7)
In reply to Thomas Hellström== Series Details ==
== Series Details ==
Series: Add reclaim to the dmem cgroup controller (rev7)
URL : https://patchwork.freedesktop.org/series/163970/
State : failure
== Summary ==
CI Bug Log - changes from xe-5336-539ef0bb9cab59e164d7b737287384864a457d05_FULL -> xe-pw-163970v7_FULL
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-163970v7_FULL absolutely need to be verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-163970v7_FULL, please notify your bug team ([email protected]) to allow them to document this new failure mode, which will reduce false positives in CI.
Participating hosts (2 -> 2)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-163970v7_FULL:
### IGT changes ###
#### Possible regressions ####
* igt@runner@aborted:
- shard-lnl: NOTRUN -> [FAIL][1]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-lnl-8/igt@[email protected]
* igt@xe_pmu@engine-activity-accuracy-2@engine-drm_xe_engine_class_video_enhance0:
- shard-bmg: [PASS][2] -> [INCOMPLETE][3] +1 other test incomplete
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-bmg-2/igt@xe_pmu@engine-activity-accuracy-2@engine-drm_xe_engine_class_video_enhance0.html
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@xe_pmu@engine-activity-accuracy-2@engine-drm_xe_engine_class_video_enhance0.html
Known issues
------------
Here are the changes found in xe-pw-163970v7_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
- shard-bmg: NOTRUN -> [SKIP][4] ([Intel XE#2370])
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
* igt@kms_big_fb@x-tiled-8bpp-rotate-90:
- shard-bmg: NOTRUN -> [SKIP][5] ([Intel XE#2327])
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_big_fb@y-tiled-64bpp-rotate-90:
- shard-bmg: NOTRUN -> [SKIP][6] ([Intel XE#1124]) +4 other tests skip
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_big_fb@yf-tiled-addfb-size-overflow:
- shard-bmg: NOTRUN -> [SKIP][7] ([Intel XE#610] / [Intel XE#7387])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_bw@linear-tiling-3-displays-target-2560x1440p:
- shard-bmg: NOTRUN -> [SKIP][8] ([Intel XE#367])
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs-cc:
- shard-bmg: NOTRUN -> [SKIP][9] ([Intel XE#2887]) +7 other tests skip
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_cdclk@plane-scaling:
- shard-bmg: NOTRUN -> [SKIP][10] ([Intel XE#2724] / [Intel XE#7449])
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_chamelium_color@ctm-green-to-red:
- shard-bmg: NOTRUN -> [SKIP][11] ([Intel XE#2325] / [Intel XE#7358])
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_chamelium_edid@dp-edid-stress-resolution-non-4k:
- shard-bmg: NOTRUN -> [SKIP][12] ([Intel XE#2252]) +1 other test skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_content_protection@content-type-change:
- shard-bmg: NOTRUN -> [SKIP][13] ([Intel XE#7642])
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][14] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374]) +1 other test fail
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@kms_content_protection@[email protected]
* igt@kms_cursor_crc@cursor-onscreen-512x170:
- shard-bmg: NOTRUN -> [SKIP][15] ([Intel XE#2321] / [Intel XE#7355])
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_cursor_crc@cursor-onscreen-max-size:
- shard-bmg: NOTRUN -> [SKIP][16] ([Intel XE#2320]) +2 other tests skip
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_cursor_legacy@flip-vs-cursor-atomic:
- shard-bmg: [PASS][17] -> [FAIL][18] ([Intel XE#7809])
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-bmg-1/igt@[email protected]
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-2/igt@[email protected]
* igt@kms_dsc@dsc-basic:
- shard-bmg: NOTRUN -> [SKIP][19] ([Intel XE#8265]) +1 other test skip
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area:
- shard-bmg: NOTRUN -> [SKIP][20] ([Intel XE#4422] / [Intel XE#7442])
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_feature_discovery@psr2:
- shard-bmg: NOTRUN -> [SKIP][21] ([Intel XE#2374] / [Intel XE#6128])
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling:
- shard-bmg: NOTRUN -> [SKIP][22] ([Intel XE#7178] / [Intel XE#7351])
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html
* igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt:
- shard-bmg: NOTRUN -> [SKIP][23] ([Intel XE#2311]) +27 other tests skip
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_frontbuffer_tracking@fbc-argb161616f-draw-blt:
- shard-bmg: NOTRUN -> [SKIP][24] ([Intel XE#7061] / [Intel XE#7356])
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_frontbuffer_tracking@fbchdr-argb161616f-draw-render:
- shard-bmg: NOTRUN -> [SKIP][25] ([Intel XE#7061]) +2 other tests skip
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_frontbuffer_tracking@fbcpsr-indfb-scaledprimary:
- shard-bmg: NOTRUN -> [SKIP][26] ([Intel XE#2313]) +27 other tests skip
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_frontbuffer_tracking@pipe-fbc-rte:
- shard-bmg: NOTRUN -> [SKIP][27] ([Intel XE#4141]) +5 other tests skip
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
- shard-bmg: NOTRUN -> [SKIP][28] ([Intel XE#4090] / [Intel XE#7443])
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_plane@pixel-format-4-tiled-modifier@pipe-a-plane-5:
- shard-bmg: NOTRUN -> [SKIP][29] ([Intel XE#8303]) +1 other test skip
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@kms_plane@[email protected]
* igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier-source-clamping:
- shard-bmg: NOTRUN -> [SKIP][30] ([Intel XE#7283]) +1 other test skip
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier-source-clamping.html
* igt@kms_pm_dc@deep-pkgc:
- shard-bmg: NOTRUN -> [SKIP][31] ([Intel XE#2505] / [Intel XE#7447])
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_psr2_sf@fbc-psr2-overlay-plane-update-sf-dmg-area:
- shard-bmg: NOTRUN -> [SKIP][32] ([Intel XE#1489]) +5 other tests skip
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_psr@psr-sprite-plane-onoff:
- shard-bmg: NOTRUN -> [SKIP][33] ([Intel XE#2234] / [Intel XE#2850]) +4 other tests skip
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_rotation_crc@primary-rotation-90:
- shard-bmg: NOTRUN -> [SKIP][34] ([Intel XE#3904] / [Intel XE#7342])
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@kms_rotation_crc@primary-y-tiled-reflect-x-0:
- shard-bmg: NOTRUN -> [SKIP][35] ([Intel XE#2330] / [Intel XE#5813])
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_sharpness_filter@filter-basic:
- shard-bmg: NOTRUN -> [SKIP][36] ([Intel XE#6503]) +1 other test skip
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@kms_vrr@seamless-rr-switch-drrs:
- shard-bmg: NOTRUN -> [SKIP][37] ([Intel XE#1499])
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@xe_eudebug@basic-exec-queues-enable:
- shard-bmg: NOTRUN -> [SKIP][38] ([Intel XE#7636]) +5 other tests skip
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_evict@evict-beng-mixed-many-threads-small:
- shard-bmg: [PASS][39] -> [INCOMPLETE][40] ([Intel XE#6321] / [Intel XE#8355])
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-bmg-1/igt@[email protected]
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-2/igt@[email protected]
* igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-mmap:
- shard-bmg: NOTRUN -> [SKIP][41] ([Intel XE#2322] / [Intel XE#7372]) +3 other tests skip
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-mmap.html
* igt@xe_exec_fault_mode@twice-multi-queue-imm:
- shard-bmg: NOTRUN -> [SKIP][42] ([Intel XE#8374]) +4 other tests skip
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_exec_multi_queue@max-queues-userptr-invalidate:
- shard-bmg: NOTRUN -> [SKIP][43] ([Intel XE#8364]) +14 other tests skip
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_exec_reset@multi-queue-gt-reset:
- shard-bmg: NOTRUN -> [SKIP][44] ([Intel XE#8369])
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@xe_exec_system_allocator@twice-large-free-race:
- shard-lnl: [PASS][45] -> [ABORT][46] ([Intel XE#8007])
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-lnl-6/igt@[email protected]
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-lnl-4/igt@[email protected]
* igt@xe_exec_threads@threads-multi-queue-cm-fd-basic:
- shard-bmg: NOTRUN -> [SKIP][47] ([Intel XE#8378]) +3 other tests skip
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_fault_injection@inject-fault-probe-function-xe_sriov_init:
- shard-bmg: [PASS][48] -> [ABORT][49] ([Intel XE#8007])
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-bmg-6/igt@xe_fault_injection@inject-fault-probe-function-xe_sriov_init.html
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-3/igt@xe_fault_injection@inject-fault-probe-function-xe_sriov_init.html
* igt@xe_multigpu_svm@mgpu-atomic-op-conflict:
- shard-bmg: NOTRUN -> [SKIP][50] ([Intel XE#6964]) +2 other tests skip
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@xe_pat@pat-sw-hw-reset-compare:
- shard-bmg: NOTRUN -> [FAIL][51] ([Intel XE#7695])
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_pm@d3cold-basic:
- shard-bmg: NOTRUN -> [SKIP][52] ([Intel XE#2284] / [Intel XE#7370])
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_prefetch_fault@prefetch-fault:
- shard-bmg: NOTRUN -> [SKIP][53] ([Intel XE#7599])
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_pxp@pxp-stale-bo-exec-post-termination-irq:
- shard-bmg: NOTRUN -> [SKIP][54] ([Intel XE#4733] / [Intel XE#7417]) +1 other test skip
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-1/igt@[email protected]
* igt@xe_query@multigpu-query-engines:
- shard-bmg: NOTRUN -> [SKIP][55] ([Intel XE#944])
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
* igt@xe_wedged@wedged-mode-toggle:
- shard-bmg: NOTRUN -> [ABORT][56] ([Intel XE#8007])
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@[email protected]
#### Possible fixes ####
* igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-edp1:
- shard-lnl: [FAIL][57] ([Intel XE#3098] / [Intel XE#3149]) -> [PASS][58] +1 other test pass
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-lnl-3/igt@kms_flip@[email protected]
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-lnl-7/igt@kms_flip@[email protected]
* igt@kms_flip@flip-vs-expired-vblank-interruptible:
- shard-lnl: [FAIL][59] ([Intel XE#301]) -> [PASS][60] +1 other test pass
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-lnl-4/igt@[email protected]
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-lnl-7/igt@[email protected]
* igt@kms_flip@flip-vs-expired-vblank@c-edp1:
- shard-lnl: [FAIL][61] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][62]
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-lnl-1/igt@kms_flip@[email protected]
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-lnl-2/igt@kms_flip@[email protected]
* igt@xe_fault_injection@inject-fault-probe-function-guc_wait_ucode:
- shard-bmg: [ABORT][63] ([Intel XE#8007]) -> [PASS][64] +1 other test pass
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-bmg-5/igt@xe_fault_injection@inject-fault-probe-function-guc_wait_ucode.html
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-5/igt@xe_fault_injection@inject-fault-probe-function-guc_wait_ucode.html
#### Warnings ####
* igt@kms_flip@flip-vs-expired-vblank:
- shard-lnl: [FAIL][65] ([Intel XE#301] / [Intel XE#3149]) -> [FAIL][66] ([Intel XE#301])
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-lnl-1/igt@[email protected]
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-lnl-2/igt@[email protected]
* igt@kms_hdr@brightness-with-hdr:
- shard-bmg: [SKIP][67] ([Intel XE#3544]) -> [SKIP][68] ([Intel XE#3374] / [Intel XE#3544])
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5336-539ef0bb9cab59e164d7b737287384864a457d05/shard-bmg-5/igt@[email protected]
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/shard-bmg-2/igt@[email protected]
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
[Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
[Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
[Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
[Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
[Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
[Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
[Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
[Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
[Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
[Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
[Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
[Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
[Intel XE#2330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2330
[Intel XE#2370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2370
[Intel XE#2374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2374
[Intel XE#2505]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2505
[Intel XE#2724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2724
[Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
[Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
[Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
[Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
[Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
[Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
[Intel XE#4090]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4090
[Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
[Intel XE#4422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4422
[Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
[Intel XE#5813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5813
[Intel XE#610]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/610
[Intel XE#6128]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6128
[Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
[Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
[Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
[Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
[Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
[Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
[Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342
[Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
[Intel XE#7355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7355
[Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
[Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
[Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
[Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
[Intel XE#7374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7374
[Intel XE#7387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7387
[Intel XE#7417]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7417
[Intel XE#7442]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7442
[Intel XE#7443]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7443
[Intel XE#7447]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7447
[Intel XE#7449]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7449
[Intel XE#7599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7599
[Intel XE#7636]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7636
[Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
[Intel XE#7695]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7695
[Intel XE#7809]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7809
[Intel XE#8007]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8007
[Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
[Intel XE#8303]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8303
[Intel XE#8355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8355
[Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
[Intel XE#8369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8369
[Intel XE#8374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8374
[Intel XE#8378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8378
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
Build changes
-------------
* Linux: xe-5336-539ef0bb9cab59e164d7b737287384864a457d05 -> xe-pw-163970v7
IGT_8990: 8990
xe-5336-539ef0bb9cab59e164d7b737287384864a457d05: 539ef0bb9cab59e164d7b737287384864a457d05
xe-pw-163970v7: 163970v7
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-163970v7/index.html