* [RFC v3 1/7] drm/xe/vm: Track CPU_AUTORESET state in xe_vma
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
@ 2026-06-04 9:50 ` Arvind Yadav
2026-06-04 9:50 ` [RFC v3 2/7] drm/xe/vm: Preserve cpu_autoreset_active across GPUVA operations Arvind Yadav
` (9 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Arvind Yadav @ 2026-06-04 9:50 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom
Track MADVISE_AUTORESET CPU-only state in struct xe_vma with a dedicated
cpu_autoreset_active bool.
Add XE_VMA_CPU_AUTORESET_ACTIVE as a pipeline-only bit to carry this
state through MAP/REMAP operations. Runtime state lives in
xe_vma.cpu_autoreset_active rather than vma->gpuva.flags.
The state is set at bind time and cleared on the first successful GPU
fault.
v2:
- Move runtime state from gpuva.flags to xe_vma bool. (Matt)
- Keep XE_VMA_CPU_AUTORESET_ACTIVE pipeline-only. (Matt)
v3:
- Add kernel-doc and lockdep_assert_held to
xe_vma_has_cpu_autoreset_active(). (Matt)
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
drivers/gpu/drm/xe/xe_vm.h | 14 ++++++++++++++
drivers/gpu/drm/xe/xe_vm_types.h | 13 +++++++++++++
2 files changed, 27 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
index c5b900f38ded..0dd201cce968 100644
--- a/drivers/gpu/drm/xe/xe_vm.h
+++ b/drivers/gpu/drm/xe/xe_vm.h
@@ -181,6 +181,20 @@ static inline bool xe_vma_is_userptr(struct xe_vma *vma)
!xe_vma_is_cpu_addr_mirror(vma);
}
+/**
+ * xe_vma_has_cpu_autoreset_active() - Check if VMA is still CPU-only
+ * @vma: VMA to check
+ *
+ * The caller must hold vm->lock (read or write).
+ *
+ * Return: true if CPU-only autoreset is armed, false after the first GPU touch.
+ */
+static inline bool xe_vma_has_cpu_autoreset_active(struct xe_vma *vma)
+{
+ lockdep_assert_held(&xe_vma_vm(vma)->lock);
+ return vma->cpu_autoreset_active;
+}
+
struct xe_vma *xe_vm_find_vma_by_addr(struct xe_vm *vm, u64 page_addr);
int xe_vma_need_vram_for_atomic(struct xe_device *xe, struct xe_vma *vma, bool is_atomic);
diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
index 635ed29b9a69..e6380458272e 100644
--- a/drivers/gpu/drm/xe/xe_vm_types.h
+++ b/drivers/gpu/drm/xe/xe_vm_types.h
@@ -52,6 +52,11 @@ struct xe_vm_pgtable_update_op;
#define XE_VMA_DUMPABLE (DRM_GPUVA_USERBITS << 8)
#define XE_VMA_SYSTEM_ALLOCATOR (DRM_GPUVA_USERBITS << 9)
#define XE_VMA_MADV_AUTORESET (DRM_GPUVA_USERBITS << 10)
+/*
+ * Pipeline-only bit used to carry cpu_autoreset_active through MAP/REMAP.
+ * It must not be stored persistently in vma->gpuva.flags.
+ */
+#define XE_VMA_CPU_AUTORESET_ACTIVE (DRM_GPUVA_USERBITS << 11)
/**
* struct xe_vma_mem_attr - memory attributes associated with vma
@@ -157,6 +162,14 @@ struct xe_vma {
/** @tile_staged: bind is staged for this VMA */
u8 tile_staged;
+ /**
+ * @cpu_autoreset_active: CPU mirror VMA has not been GPU-faulted yet.
+ *
+ * Set for MADVISE_AUTORESET CPU mirror VMAs and cleared on the first
+ * successful GPU fault. Protected by vm->lock.
+ */
+ bool cpu_autoreset_active;
+
/**
* @skip_invalidation: Used in madvise to avoid invalidation
* if mem attributes doesn't change
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* [RFC v3 2/7] drm/xe/vm: Preserve cpu_autoreset_active across GPUVA operations
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
2026-06-04 9:50 ` [RFC v3 1/7] drm/xe/vm: Track CPU_AUTORESET state in xe_vma Arvind Yadav
@ 2026-06-04 9:50 ` Arvind Yadav
2026-06-04 10:07 ` sashiko-bot
2026-06-04 9:50 ` [RFC v3 3/7] drm/xe/svm: Clear CPU_AUTORESET_ACTIVE on first GPU fault Arvind Yadav
` (8 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Arvind Yadav @ 2026-06-04 9:50 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom
GPUVA split and remap operations rebuild VMAs from create flags. These
flags preserve persistent VMA state, but not runtime-only state such as
cpu_autoreset_active.
Forward XE_VMA_CPU_AUTORESET_ACTIVE explicitly through the MAP/REMAP
pipeline so xe_vma_create() can restore cpu_autoreset_active in the new
VMA. The bit remains pipeline-only and is stripped before storing
vma->gpuva.flags.
Also relax the UNMAP attribute warning for MADVISE_AUTORESET VMAs, since
they may legitimately carry non-default madvise-managed attributes.
v2:
- Move runtime state to xe_vma bool and keep
XE_VMA_CPU_AUTORESET_ACTIVE as pipeline-only. (Matt)
- Add xe_vma_effective_create_flags() to centralise flag handling.
v3:
- Guard cpu_autoreset_active assignment to CPU_ADDR_MIRROR VMAs only (Matt)
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
drivers/gpu/drm/xe/xe_vm.c | 44 ++++++++++++++++++++++++++++++++------
1 file changed, 38 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 080c2fff0e95..dec5279f08a2 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -1105,7 +1105,11 @@ static struct xe_vma *xe_vma_create(struct xe_vm *vm,
vma->gpuva.vm = &vm->gpuvm;
vma->gpuva.va.addr = start;
vma->gpuva.va.range = end - start + 1;
- vma->gpuva.flags = flags;
+ /* Pipeline-only, do not store in gpuva.flags. */
+ vma->gpuva.flags = flags & ~XE_VMA_CPU_AUTORESET_ACTIVE;
+ vma->cpu_autoreset_active =
+ (flags & XE_VMA_SYSTEM_ALLOCATOR) &&
+ (flags & XE_VMA_CPU_AUTORESET_ACTIVE);
for_each_tile(tile, vm->xe, id)
vma->tile_mask |= 0x1 << id;
@@ -2479,8 +2483,10 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_vma_ops *vops,
op->map.vma_flags |= XE_VMA_SYSTEM_ALLOCATOR;
if (flags & DRM_XE_VM_BIND_FLAG_DUMPABLE)
op->map.vma_flags |= XE_VMA_DUMPABLE;
- if (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET)
+ if (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET) {
op->map.vma_flags |= XE_VMA_MADV_AUTORESET;
+ op->map.vma_flags |= XE_VMA_CPU_AUTORESET_ACTIVE;
+ }
op->map.request_decompress = flags & DRM_XE_VM_BIND_FLAG_DECOMPRESS;
op->map.pat_index = pat_index;
op->map.invalidate_on_bind =
@@ -2800,6 +2806,9 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
};
flags |= op->map.vma_flags & XE_VMA_CREATE_MASK;
+ /* Forward pipeline-only state. */
+ if (op->map.vma_flags & XE_VMA_CPU_AUTORESET_ACTIVE)
+ flags |= XE_VMA_CPU_AUTORESET_ACTIVE;
vma = new_vma(vm, &op->base.map, &default_attr,
flags);
@@ -2842,6 +2851,10 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
op->remap.old_range = op->remap.range;
flags |= op->base.remap.unmap->va->flags & XE_VMA_CREATE_MASK;
+ /* Forward pipeline-only state. */
+ if (xe_vma_has_cpu_autoreset_active(old))
+ flags |= XE_VMA_CPU_AUTORESET_ACTIVE;
+
if (op->base.remap.prev) {
vma = new_vma(vm, op->base.remap.prev,
&old->attr, flags);
@@ -4693,6 +4706,17 @@ int xe_vma_need_vram_for_atomic(struct xe_device *xe, struct xe_vma *vma, bool i
}
}
+/* Add pipeline-only autoreset state when rebuilding a VMA. */
+static unsigned int xe_vma_effective_create_flags(struct xe_vma *vma)
+{
+ unsigned int flags = vma->gpuva.flags;
+
+ if (xe_vma_has_cpu_autoreset_active(vma))
+ flags |= XE_VMA_CPU_AUTORESET_ACTIVE;
+
+ return flags;
+}
+
static int xe_vm_alloc_vma(struct xe_vm *vm,
struct drm_gpuvm_map_req *map_req,
bool is_madvise)
@@ -4728,19 +4752,24 @@ static int xe_vm_alloc_vma(struct xe_vm *vm,
if (!is_madvise) {
if (__op->op == DRM_GPUVA_OP_UNMAP) {
vma = gpuva_to_vma(op->base.unmap.va);
- XE_WARN_ON(!xe_vma_has_default_mem_attrs(vma));
+ /* AUTORESET VMAs may carry madvise-managed attrs. */
+ XE_WARN_ON(!xe_vma_has_default_mem_attrs(vma) &&
+ !(vma->gpuva.flags & XE_VMA_MADV_AUTORESET));
default_pat = vma->attr.default_pat_index;
- vma_flags = vma->gpuva.flags;
+ vma_flags = xe_vma_effective_create_flags(vma);
}
if (__op->op == DRM_GPUVA_OP_REMAP) {
vma = gpuva_to_vma(op->base.remap.unmap->va);
default_pat = vma->attr.default_pat_index;
- vma_flags = vma->gpuva.flags;
+ vma_flags = xe_vma_effective_create_flags(vma);
}
if (__op->op == DRM_GPUVA_OP_MAP) {
op->map.vma_flags |= vma_flags & XE_VMA_CREATE_MASK;
+ /* Forward pipeline-only state. */
+ if (vma_flags & XE_VMA_CPU_AUTORESET_ACTIVE)
+ op->map.vma_flags |= XE_VMA_CPU_AUTORESET_ACTIVE;
op->map.pat_index = default_pat;
}
} else {
@@ -4749,7 +4778,7 @@ static int xe_vm_alloc_vma(struct xe_vm *vm,
xe_assert(vm->xe, !remap_op);
xe_assert(vm->xe, xe_vma_has_no_bo(vma));
remap_op = true;
- vma_flags = vma->gpuva.flags;
+ vma_flags = xe_vma_effective_create_flags(vma);
}
if (__op->op == DRM_GPUVA_OP_MAP) {
@@ -4762,6 +4791,9 @@ static int xe_vm_alloc_vma(struct xe_vm *vm,
* unmapping.
*/
op->map.vma_flags |= vma_flags & XE_VMA_CREATE_MASK;
+ /* Forward pipeline-only state. */
+ if (vma_flags & XE_VMA_CPU_AUTORESET_ACTIVE)
+ op->map.vma_flags |= XE_VMA_CPU_AUTORESET_ACTIVE;
}
}
print_op(vm->xe, __op);
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [RFC v3 2/7] drm/xe/vm: Preserve cpu_autoreset_active across GPUVA operations
2026-06-04 9:50 ` [RFC v3 2/7] drm/xe/vm: Preserve cpu_autoreset_active across GPUVA operations Arvind Yadav
@ 2026-06-04 10:07 ` sashiko-bot
0 siblings, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-06-04 10:07 UTC (permalink / raw)
To: Arvind Yadav; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [Critical] Merging adjacent VMAs during CPU mirror pagefaults silently clobbers creation flags (e.g., READ_ONLY, MADV_AUTORESET), permanently altering memory properties and potentially leading to privilege escalation.
--
commit 1d97ca671d925d0481b9d913f989dc8216596164
Author: Arvind Yadav <arvind.yadav@intel.com>
drm/xe/vm: Preserve cpu_autoreset_active across GPUVA operations
GPUVA split and remap operations rebuild VMAs from create flags. This
commit explicitly forwards XE_VMA_CPU_AUTORESET_ACTIVE through the
MAP/REMAP pipeline so xe_vma_create() can restore cpu_autoreset_active.
It also relaxes the UNMAP attribute warning for MADVISE_AUTORESET VMAs.
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
[ ... ]
> @@ -4728,19 +4752,24 @@ static int xe_vm_alloc_vma(struct xe_vm *vm,
> if (!is_madvise) {
> if (__op->op == DRM_GPUVA_OP_UNMAP) {
> vma = gpuva_to_vma(op->base.unmap.va);
> - XE_WARN_ON(!xe_vma_has_default_mem_attrs(vma));
> + /* AUTORESET VMAs may carry madvise-managed attrs. */
> + XE_WARN_ON(!xe_vma_has_default_mem_attrs(vma) &&
> + !(vma->gpuva.flags & XE_VMA_MADV_AUTORESET));
> default_pat = vma->attr.default_pat_index;
> - vma_flags = vma->gpuva.flags;
> + vma_flags = xe_vma_effective_create_flags(vma);
> }
>
> if (__op->op == DRM_GPUVA_OP_REMAP) {
> vma = gpuva_to_vma(op->base.remap.unmap->va);
> default_pat = vma->attr.default_pat_index;
> - vma_flags = vma->gpuva.flags;
> + vma_flags = xe_vma_effective_create_flags(vma);
> }
>
> if (__op->op == DRM_GPUVA_OP_MAP) {
> op->map.vma_flags |= vma_flags & XE_VMA_CREATE_MASK;
[Severity: Critical]
This is a pre-existing issue, but does this loop silently clobber creation
flags like XE_VMA_READ_ONLY when merging adjacent VMAs during CPU mirror
pagefaults?
When xe_svm_handle_pagefault() attempts to expand a VMA mapping, it calls
xe_vm_find_cpu_addr_mirror_vma_range(). That function coalesces adjacent
VMAs using is_cpu_addr_vma_with_default_attr():
drivers/gpu/drm/xe/xe_vm.c:is_cpu_addr_vma_with_default_attr() {
return vma && xe_vma_is_cpu_addr_mirror(vma) &&
xe_vma_has_default_mem_attrs(vma);
}
This check verifies the system allocator flag and default memory attributes,
but it doesn't ensure that vma->gpuva.flags (such as XE_VMA_READ_ONLY or
XE_VMA_DUMPABLE) match between the adjacent VMAs.
As a result, xe_vm_alloc_vma() creates a single MAP operation for the
merged range. In the drm_gpuva_for_each_op() loop here, the local vma_flags
variable is continuously overwritten by each UNMAP and REMAP operation.
When the final MAP operation processes this line, it inherits flags
exclusively from the last processed VMA. If a read-write VMA is merged
with an adjacent read-only VMA, is the XE_VMA_READ_ONLY flag completely
lost for the coalesced region, potentially granting writable access to a
mapping originally requested as read-only?
> + /* Forward pipeline-only state. */
> + if (vma_flags & XE_VMA_CPU_AUTORESET_ACTIVE)
> + op->map.vma_flags |= XE_VMA_CPU_AUTORESET_ACTIVE;
> op->map.pat_index = default_pat;
> }
> } else {
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260604095012.367231-1-arvind.yadav@intel.com?part=2
^ permalink raw reply [flat|nested] 17+ messages in thread
* [RFC v3 3/7] drm/xe/svm: Clear CPU_AUTORESET_ACTIVE on first GPU fault
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
2026-06-04 9:50 ` [RFC v3 1/7] drm/xe/vm: Track CPU_AUTORESET state in xe_vma Arvind Yadav
2026-06-04 9:50 ` [RFC v3 2/7] drm/xe/vm: Preserve cpu_autoreset_active across GPUVA operations Arvind Yadav
@ 2026-06-04 9:50 ` Arvind Yadav
2026-06-04 9:50 ` [RFC v3 4/7] drm/xe/vm: Add madvise autoreset notifier worker Arvind Yadav
` (7 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Arvind Yadav @ 2026-06-04 9:50 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom
CPU address mirror VMAs start with cpu_autoreset_active set, indicating
they are still CPU-only.
Clear cpu_autoreset_active after successful fault handling. A successful
return means the fault address already has a valid GPU mapping or PTEs
were installed. Prefetch faults that do not establish a mapping return an
error and do not transition the state.
v2:
- Move xe_vma_gpu_touch() to the success path in
xe_svm_handle_pagefault() so prefetch faults that find no range do
not transition the state. (Matt)
- Add xe_vma_gpu_touch() helper in xe_vm.h and use
vma->cpu_autoreset_active instead of vma->gpuva.flags. (Matt)
v3:
- Drop lockdep_assert_held_write from xe_svm_handle_pagefault. (Matt)
- Re-fetch the VMA in xe_pagefault_service() before clearing state.
- Move gpu_touch from xe_svm_handle_pagefault to xe_pagefault_service
(Matt)
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
drivers/gpu/drm/xe/xe_pagefault.c | 10 +++++++++-
drivers/gpu/drm/xe/xe_vm.h | 13 +++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_pagefault.c b/drivers/gpu/drm/xe/xe_pagefault.c
index dd3c068e1a39..f64d3df08261 100644
--- a/drivers/gpu/drm/xe/xe_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_pagefault.c
@@ -215,8 +215,16 @@ static int xe_pagefault_service(struct xe_pagefault *pf)
err = xe_pagefault_handle_vma(gt, vma, atomic);
unlock_vm:
- if (!err)
+ if (!err) {
+ /* Re-fetch, fault handling may have replaced the VMA. */
+ vma = xe_vm_find_vma_by_addr(vm, pf->consumer.page_addr);
vm->usm.last_fault_vma = vma;
+
+ /* First successful GPU fault ends CPU-only state. */
+ if (vma && xe_vma_is_cpu_addr_mirror(vma) &&
+ xe_vma_has_cpu_autoreset_active(vma))
+ xe_vma_gpu_touch(vma);
+ }
up_write(&vm->lock);
xe_vm_put(vm);
diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
index 0dd201cce968..0ad704b05687 100644
--- a/drivers/gpu/drm/xe/xe_vm.h
+++ b/drivers/gpu/drm/xe/xe_vm.h
@@ -450,4 +450,17 @@ static inline struct drm_exec *xe_vm_validation_exec(struct xe_vm *vm)
((READ_ONCE(tile_present) & ~READ_ONCE(tile_invalidated)) & BIT((tile)->id))
void xe_vma_mem_attr_copy(struct xe_vma_mem_attr *to, struct xe_vma_mem_attr *from);
+
+/**
+ * xe_vma_gpu_touch() - Mark a VMA as no longer CPU-only
+ * @vma: VMA to update
+ *
+ * Clear cpu_autoreset_active after the first successful GPU fault-in.
+ * Caller must hold vm->lock in write mode.
+ */
+static inline void xe_vma_gpu_touch(struct xe_vma *vma)
+{
+ lockdep_assert_held_write(&xe_vma_vm(vma)->lock);
+ vma->cpu_autoreset_active = false;
+}
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* [RFC v3 4/7] drm/xe/vm: Add madvise autoreset notifier worker
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (2 preceding siblings ...)
2026-06-04 9:50 ` [RFC v3 3/7] drm/xe/svm: Clear CPU_AUTORESET_ACTIVE on first GPU fault Arvind Yadav
@ 2026-06-04 9:50 ` Arvind Yadav
2026-06-04 10:14 ` sashiko-bot
2026-06-04 9:50 ` [RFC v3 5/7] drm/xe/vm: Disable madvise notifier on GPU touch Arvind Yadav
` (6 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Arvind Yadav @ 2026-06-04 9:50 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom
Reset madvise-managed VMA attributes when userspace unmaps CPU-only
mirror ranges.
The MMU notifier callback cannot take vm->lock and does not allocate.
It records a pending range in the preallocated notifier and queues the
embedded worker.
If multiple unmap events arrive before the worker runs, the pending range
is widened. The worker then walks the CPU mm and resets only real holes,
leaving ranges still covered by a CPU VMA unchanged.
Use a maple tree for range lookup and a VM-owned list for notifier
lifetime, so teardown does not depend on maple-tree entries.
v2:
- Replace closing state with teardown_rwsem. (Matt)
- Use maple_tree for notifier tracking. (Matt)
- Embed work_struct in notifier; no allocation in callback. (Thomas)
- Coalesce overlapping munmap events via min/max.
- Run notifier removal and workqueue drain outside teardown_rwsem. (Matt)
v3:
- Keep a VM-owned notifier list for teardown.
- Widen pending ranges in the callback and reset only CPU holes in the worker.
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
drivers/gpu/drm/xe/xe_vm_madvise.c | 504 +++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_vm_madvise.h | 8 +
drivers/gpu/drm/xe/xe_vm_types.h | 61 ++++
3 files changed, 573 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
index c4fb29004195..c2abe712598a 100644
--- a/drivers/gpu/drm/xe/xe_vm_madvise.c
+++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
@@ -6,6 +6,8 @@
#include "xe_vm_madvise.h"
#include <linux/nospec.h>
+#include <linux/maple_tree.h>
+#include <linux/workqueue.h>
#include <drm/xe_drm.h>
#include "xe_bo.h"
@@ -14,6 +16,10 @@
#include "xe_svm.h"
#include "xe_tlb_inval.h"
#include "xe_vm.h"
+#include "xe_macros.h"
+
+/* Lockdep class for teardown_rwsem */
+static struct lock_class_key xe_madvise_teardown_key;
struct xe_vmas_in_madvise_range {
u64 addr;
@@ -732,3 +738,501 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
xe_vm_put(vm);
return err;
}
+
+/**
+ * xe_vma_reset_to_default_attrs - Reset madvise attrs to defaults
+ * @vma: VMA to reset
+ */
+static void xe_vma_reset_to_default_attrs(struct xe_vma *vma)
+{
+ struct xe_vma_mem_attr default_attr = {
+ .preferred_loc.devmem_fd = DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE,
+ .preferred_loc.migration_policy = DRM_XE_MIGRATE_ALL_PAGES,
+ .default_pat_index = vma->attr.default_pat_index,
+ .pat_index = vma->attr.default_pat_index,
+ .atomic_access = DRM_XE_ATOMIC_UNDEFINED,
+ .purgeable_state = XE_MADV_PURGEABLE_WILLNEED,
+ };
+
+ xe_vma_mem_attr_copy(&vma->attr, &default_attr);
+}
+
+/**
+ * xe_vm_madvise_process_unmap - Reset attrs for a GPUVA range
+ * @vm: VM
+ * @start: start of range
+ * @end: end of range
+ *
+ * Process CPU-only VMAs overlapping [@start, @end).
+ *
+ * Return: 0 on success, negative error otherwise.
+ */
+static int xe_vm_madvise_process_unmap(struct xe_vm *vm, u64 start, u64 end)
+{
+ u64 addr = start;
+ int err;
+
+ lockdep_assert_held_write(&vm->lock);
+
+ if (xe_vm_is_closed_or_banned(vm))
+ return 0;
+
+ while (addr < end) {
+ struct xe_vma *vma;
+ u64 seg_start, seg_end;
+ bool has_default_attr;
+
+ vma = xe_vm_find_overlapping_vma(vm, addr, end - addr);
+ if (!vma)
+ break;
+
+ /* GPU-touched VMAs are handled by SVM. */
+ if (!xe_vma_has_cpu_autoreset_active(vma)) {
+ addr = xe_vma_end(vma);
+ continue;
+ }
+
+ has_default_attr = xe_vma_has_default_mem_attrs(vma);
+ seg_start = max(addr, xe_vma_start(vma));
+ seg_end = min(end, xe_vma_end(vma));
+
+ /* Merge adjacent default-attr VMAs when possible. */
+ if (has_default_attr &&
+ xe_vma_start(vma) >= start &&
+ xe_vma_end(vma) <= end) {
+ seg_start = xe_vma_start(vma);
+ seg_end = xe_vma_end(vma);
+ xe_vm_find_cpu_addr_mirror_vma_range(vm, &seg_start, &seg_end);
+ if (xe_vma_start(vma) == seg_start && xe_vma_end(vma) == seg_end) {
+ /* Nothing to merge. */
+ addr = seg_end;
+ continue;
+ }
+ } else if (xe_vma_start(vma) == seg_start && xe_vma_end(vma) == seg_end) {
+ /* Exact VMA match, reset in place. */
+ xe_vma_reset_to_default_attrs(vma);
+ addr = seg_end;
+ continue;
+ }
+
+ err = xe_vm_alloc_cpu_addr_mirror_vma(vm, seg_start, seg_end - seg_start);
+ if (err) {
+ if (err == -ENOENT) {
+ /* VMA was removed before the worker ran. */
+ addr = seg_end;
+ continue;
+ }
+ return err;
+ }
+
+ addr = seg_end;
+ }
+
+ return 0;
+}
+
+/**
+ * xe_vm_madvise_process_unmap_holes - Reset attrs for CPU holes
+ * @vm: VM
+ * @mm: mm backing the CPU mirror
+ * @start: start of the pending interval
+ * @end: end of the pending interval
+ *
+ * Walk [@start, @end) and process only ranges not covered by a CPU VMA.
+ * Mapped ranges are skipped so partial-unmap siblings keep their attrs.
+ *
+ * Caller must hold vm->lock for write and mmap_read_lock(@mm).
+ *
+ * Return: 0 on success, negative error otherwise.
+ */
+static int xe_vm_madvise_process_unmap_holes(struct xe_vm *vm,
+ struct mm_struct *mm,
+ u64 start, u64 end)
+{
+ u64 addr = start;
+
+ lockdep_assert_held_write(&vm->lock);
+ mmap_assert_locked(mm);
+
+ while (addr < end) {
+ struct vm_area_struct *cpu_vma;
+ u64 hole_start, hole_end;
+ int err;
+
+ cpu_vma = find_vma(mm, addr);
+
+ if (cpu_vma && cpu_vma->vm_start <= addr) {
+ addr = min_t(u64, cpu_vma->vm_end, end);
+ continue;
+ }
+
+ hole_start = addr;
+ hole_end = cpu_vma ? min_t(u64, cpu_vma->vm_start, end) : end;
+
+ err = xe_vm_madvise_process_unmap(vm, hole_start, hole_end);
+ if (err)
+ return err;
+
+ addr = hole_end;
+ }
+
+ return 0;
+}
+
+/**
+ * xe_madvise_work_func - Worker to process pending unmap events
+ * @w: work_struct embedded in xe_madvise_notifier
+ *
+ * Drains pending intervals recorded by the callback. The worker loops so
+ * events queued while it is running are not lost.
+ */
+static void xe_madvise_work_func(struct work_struct *w)
+{
+ struct xe_madvise_notifier *notifier =
+ container_of(w, struct xe_madvise_notifier, work);
+ struct xe_vm *vm = notifier->vm;
+
+ for (;;) {
+ struct mm_struct *mm;
+ u64 start, end;
+ int err;
+
+ spin_lock(¬ifier->work_lock);
+ if (!notifier->work_pending) {
+ spin_unlock(¬ifier->work_lock);
+ break;
+ }
+ start = notifier->work_start;
+ end = notifier->work_end;
+ notifier->work_pending = false;
+ spin_unlock(¬ifier->work_lock);
+
+ /* The mm is going away, teardown will clean up. */
+ mm = vm->svm.gpusvm.mm;
+ if (!mm || !mmget_not_zero(mm))
+ break;
+
+ down_write(&vm->lock);
+ mmap_read_lock(mm);
+
+ err = xe_vm_madvise_process_unmap_holes(vm, mm, start, end);
+
+ mmap_read_unlock(mm);
+ up_write(&vm->lock);
+ mmput(mm);
+
+ if (err)
+ drm_warn(&vm->xe->drm,
+ "madvise autoreset failed [%#llx-%#llx]: %d\n",
+ start, end, err);
+ }
+}
+
+/**
+ * xe_madvise_notifier_callback - MMU notifier callback for CPU munmap
+ * @mni: mmu_interval_notifier
+ * @range: mmu_notifier_range
+ * @cur_seq: current sequence number
+ *
+ * Records one pending interval without allocating. Later events widen it.
+ * The worker checks the CPU mm before resetting attributes.
+ *
+ * Return: false for non-blockable invalidations, true otherwise.
+ */
+static bool xe_madvise_notifier_callback(struct mmu_interval_notifier *mni,
+ const struct mmu_notifier_range *range,
+ unsigned long cur_seq)
+{
+ struct xe_madvise_notifier *notifier =
+ container_of(mni, struct xe_madvise_notifier, mmu_notifier);
+ struct xe_vm *vm = notifier->vm;
+ u64 adj_start, adj_end;
+
+ if (range->event != MMU_NOTIFY_UNMAP)
+ return true;
+
+ if (!mmu_notifier_range_blockable(range))
+ return false;
+
+ if (xe_vm_is_closed(vm))
+ return true;
+
+ mmu_interval_set_seq(mni, cur_seq);
+
+ /* Clamp to notifier boundaries and ignore non-overlap. */
+ adj_start = max_t(u64, range->start, notifier->vma_start);
+ adj_end = min_t(u64, range->end, notifier->vma_end);
+
+ if (adj_start >= adj_end)
+ return true;
+
+ /* Bail if teardown started; trylock fails once fini holds write. */
+ if (!down_read_trylock(&vm->svm.madvise_work.teardown_rwsem))
+ return true;
+
+ /* fini may have NULLed wq before we got here; check under read lock. */
+ if (!vm->svm.madvise_work.wq)
+ goto out;
+
+ spin_lock(¬ifier->work_lock);
+ if (notifier->work_pending) {
+ /*
+ * Widen pending work. The worker only resets CPU holes,
+ * so mapped siblings are left untouched.
+ */
+ notifier->work_start = min(notifier->work_start, adj_start);
+ notifier->work_end = max(notifier->work_end, adj_end);
+ } else {
+ notifier->work_start = adj_start;
+ notifier->work_end = adj_end;
+ notifier->work_pending = true;
+ }
+ spin_unlock(¬ifier->work_lock);
+
+ queue_work(vm->svm.madvise_work.wq, ¬ifier->work);
+
+out:
+ up_read(&vm->svm.madvise_work.teardown_rwsem);
+ return true;
+}
+
+static const struct mmu_interval_notifier_ops xe_madvise_notifier_ops = {
+ .invalidate = xe_madvise_notifier_callback,
+};
+
+/**
+ * xe_vm_madvise_init - Initialize madvise notifier infrastructure
+ * @vm: VM
+ *
+ * Sets up workqueue for async munmap processing.
+ *
+ * Return: 0 on success, -ENOMEM on failure
+ */
+int xe_vm_madvise_init(struct xe_vm *vm)
+{
+ /* Already initialized. */
+ if (vm->svm.madvise_work.wq)
+ return 0;
+
+ mt_init(&vm->svm.madvise_notifiers);
+ INIT_LIST_HEAD(&vm->svm.madvise_notifier_list);
+
+ /* Separate class for notifier teardown. */
+ __init_rwsem(&vm->svm.madvise_work.teardown_rwsem,
+ "xe_madvise_teardown", &xe_madvise_teardown_key);
+
+ /* Not used from reclaim paths. */
+ vm->svm.madvise_work.wq = alloc_workqueue("xe_madvise", WQ_UNBOUND, 0);
+ if (!vm->svm.madvise_work.wq) {
+ mtree_destroy(&vm->svm.madvise_notifiers);
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
+static void xe_madvise_notifier_free(struct xe_madvise_notifier *notifier)
+{
+ xe_vm_put(notifier->vm);
+ kfree(notifier);
+}
+
+static void xe_madvise_notifier_remove_and_free(struct xe_madvise_notifier *notifier)
+{
+ mmu_interval_notifier_remove(¬ifier->mmu_notifier);
+ cancel_work_sync(¬ifier->work);
+ xe_madvise_notifier_free(notifier);
+}
+
+static struct xe_madvise_notifier *
+xe_madvise_notifier_alloc(struct xe_vm *vm, u64 start, u64 end)
+{
+ struct xe_madvise_notifier *notifier;
+
+ notifier = kzalloc_obj(*notifier, GFP_KERNEL);
+ if (!notifier)
+ return NULL;
+
+ notifier->vm = xe_vm_get(vm);
+ notifier->vma_start = start;
+ notifier->vma_end = end;
+ INIT_LIST_HEAD(¬ifier->link);
+ spin_lock_init(¬ifier->work_lock);
+ notifier->work_pending = false;
+ INIT_WORK(¬ifier->work, xe_madvise_work_func);
+
+ return notifier;
+}
+
+static bool xe_madvise_notifier_exact(const struct xe_madvise_notifier *notifier,
+ u64 start, u64 end)
+{
+ return notifier->vma_start == start && notifier->vma_end == end;
+}
+
+static bool xe_madvise_notifier_fully_covered(const struct xe_madvise_notifier *notifier,
+ u64 start, u64 end)
+{
+ /*
+ * Broader notifiers may still cover split siblings, so only remove
+ * notifiers fully covered by the new range.
+ */
+ return notifier->vma_start >= start && notifier->vma_end <= end;
+}
+
+/**
+ * xe_vm_madvise_fini - Cleanup all madvise notifiers
+ * @vm: VM
+ *
+ * Tears down notifiers and drains workqueue. Safe if init partially failed.
+ */
+void xe_vm_madvise_fini(struct xe_vm *vm)
+{
+ struct xe_madvise_notifier *notifier, *next;
+ struct workqueue_struct *wq;
+ LIST_HEAD(tmp);
+
+ /* Nothing to do if init never ran. */
+ if (!vm->svm.madvise_work.wq)
+ return;
+
+ /* Block new callbacks. */
+ down_write(&vm->svm.madvise_work.teardown_rwsem);
+
+ /* Stage all owned notifiers from the VM list. */
+ list_for_each_entry_safe(notifier, next,
+ &vm->svm.madvise_notifier_list, link) {
+ list_del_init(¬ifier->link);
+ list_add_tail(¬ifier->link, &tmp);
+ }
+
+ /* VM is closed; safe to destroy the tree. */
+ mtree_destroy(&vm->svm.madvise_notifiers);
+
+ /* NULL wq so late callbacks bail. */
+ wq = vm->svm.madvise_work.wq;
+ vm->svm.madvise_work.wq = NULL;
+
+ up_write(&vm->svm.madvise_work.teardown_rwsem);
+
+ /*
+ * Remove notifiers outside rwsem; remove() may block on mmap_lock.
+ */
+ list_for_each_entry(notifier, &tmp, link)
+ mmu_interval_notifier_remove(¬ifier->mmu_notifier);
+
+ /* Drain work before freeing; workers reference notifier via container_of. */
+ if (wq) {
+ drain_workqueue(wq);
+ destroy_workqueue(wq);
+ }
+
+ /* Safe to free now: no callbacks can fire, no workers are running. */
+ list_for_each_entry_safe(notifier, next, &tmp, link) {
+ list_del(¬ifier->link);
+ xe_madvise_notifier_free(notifier);
+ }
+}
+
+/**
+ * xe_vm_madvise_register_notifier_range - Register MMU notifier for address range
+ * @vm: VM
+ * @start: Start address (page-aligned)
+ * @end: End address (page-aligned)
+ *
+ * Registers interval notifier for munmap tracking. Uses addresses (not VMA pointers)
+ * to avoid UAF after dropping vm->lock. Deduplicates by range.
+ *
+ * Return: 0 on success, negative error code on failure
+ */
+int xe_vm_madvise_register_notifier_range(struct xe_vm *vm, u64 start, u64 end)
+{
+ struct xe_madvise_notifier *notifier, *old, *tmp;
+ struct xe_madvise_notifier *existing;
+ LIST_HEAD(displaced);
+ int err;
+
+ if (!IS_ALIGNED(start, PAGE_SIZE) || !IS_ALIGNED(end, PAGE_SIZE))
+ return -EINVAL;
+
+ if (WARN_ON_ONCE(end <= start))
+ return -EINVAL;
+
+ if (!vm->svm.gpusvm.mm)
+ return -EINVAL;
+
+ notifier = xe_madvise_notifier_alloc(vm, start, end);
+ if (!notifier)
+ return -ENOMEM;
+
+ /* Insert before vm->lock, this may take mmap_lock. */
+ err = mmu_interval_notifier_insert(¬ifier->mmu_notifier,
+ vm->svm.gpusvm.mm,
+ start, end - start,
+ &xe_madvise_notifier_ops);
+ if (err) {
+ xe_madvise_notifier_free(notifier);
+ return err;
+ }
+
+ /* Dedup and store under vm->lock. */
+ down_write(&vm->lock);
+
+ if (xe_vm_is_closed_or_banned(vm)) {
+ err = -ENOENT;
+ goto unlock_remove_new;
+ }
+
+ /* Dedup by stored range; tree slots can be fragmented by partial overlap. */
+ list_for_each_entry(existing, &vm->svm.madvise_notifier_list, link) {
+ if (xe_madvise_notifier_exact(existing, start, end)) {
+ err = 0;
+ goto unlock_remove_new;
+ }
+ }
+
+ /*
+ * Store first. The VM list owns notifier lifetime, so there is
+ * nothing to restore on failure.
+ */
+ err = mtree_store_range(&vm->svm.madvise_notifiers, start, end - 1,
+ notifier, GFP_KERNEL);
+ if (err)
+ goto unlock_remove_new;
+
+ /* Keep the new notifier reachable for teardown. */
+ list_add_tail(¬ifier->link, &vm->svm.madvise_notifier_list);
+
+ /*
+ * Drop fully covered old notifiers. Broader notifiers may still cover
+ * split siblings, so leave them alive.
+ */
+ list_for_each_entry_safe(old, tmp, &vm->svm.madvise_notifier_list, link) {
+ if (old == notifier)
+ continue;
+ if (!xe_madvise_notifier_fully_covered(old, start, end))
+ continue;
+
+ list_del_init(&old->link);
+ list_add(&old->link, &displaced);
+ }
+
+ up_write(&vm->lock);
+
+ /*
+ * Remove outside vm->lock. remove_and_free() drains callbacks and
+ * work before freeing the notifier.
+ */
+ list_for_each_entry_safe(old, tmp, &displaced, link) {
+ list_del_init(&old->link);
+ xe_madvise_notifier_remove_and_free(old);
+ }
+
+ return 0;
+
+unlock_remove_new:
+ up_write(&vm->lock);
+ xe_madvise_notifier_remove_and_free(notifier);
+
+ return err;
+}
diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.h b/drivers/gpu/drm/xe/xe_vm_madvise.h
index a3078f634c7e..e2013605e190 100644
--- a/drivers/gpu/drm/xe/xe_vm_madvise.h
+++ b/drivers/gpu/drm/xe/xe_vm_madvise.h
@@ -6,11 +6,19 @@
#ifndef _XE_VM_MADVISE_H_
#define _XE_VM_MADVISE_H_
+#include <linux/types.h>
+
struct drm_device;
struct drm_file;
struct xe_bo;
+struct xe_vm;
+struct xe_vma;
int xe_vm_madvise_ioctl(struct drm_device *dev, void *data,
struct drm_file *file);
+int xe_vm_madvise_init(struct xe_vm *vm);
+void xe_vm_madvise_fini(struct xe_vm *vm);
+int xe_vm_madvise_register_notifier_range(struct xe_vm *vm, u64 start, u64 end);
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
index e6380458272e..d47bc338628d 100644
--- a/drivers/gpu/drm/xe/xe_vm_types.h
+++ b/drivers/gpu/drm/xe/xe_vm_types.h
@@ -12,6 +12,7 @@
#include <linux/dma-resv.h>
#include <linux/kref.h>
+#include <linux/maple_tree.h>
#include <linux/mmu_notifier.h>
#include <linux/scatterlist.h>
@@ -31,6 +32,36 @@ struct xe_user_fence;
struct xe_vm;
struct xe_vm_pgtable_update_op;
+/**
+ * struct xe_madvise_notifier - MMU notifier for madvise autoreset
+ *
+ * Tracks CPU munmap on CPU mirror VMAs and queues work to reset attrs.
+ * The callback stores one widened interval without allocating. The worker
+ * walks the CPU mm and resets only holes inside that interval.
+ */
+struct xe_madvise_notifier {
+ /** @mmu_notifier: MMU interval notifier */
+ struct mmu_interval_notifier mmu_notifier;
+ /** @vm: VM this notifier belongs to (holds reference via xe_vm_get) */
+ struct xe_vm *vm;
+ /** @vma_start: Start address of VMA being tracked */
+ u64 vma_start;
+ /** @vma_end: End address of VMA being tracked */
+ u64 vma_end;
+ /** @link: Entry on vm->svm.madvise_notifier_list. */
+ struct list_head link;
+ /** @work_lock: Serialises pending interval state. */
+ spinlock_t work_lock;
+ /** @work_pending: Pending interval is available for the worker. */
+ bool work_pending;
+ /** @work_start: Start of the pending interval. */
+ u64 work_start;
+ /** @work_end: End of the pending interval. */
+ u64 work_end;
+ /** @work: Work item queued on CPU munmap. */
+ struct work_struct work;
+};
+
#if IS_ENABLED(CONFIG_DRM_XE_DEBUG)
#define TEST_VM_OPS_ERROR
#define FORCE_OP_ERROR BIT(31)
@@ -248,6 +279,36 @@ struct xe_vm {
struct xe_pagemap *pagemaps[XE_MAX_TILES_PER_DEVICE];
/** @svm.peer: Used for pagemap connectivity computations. */
struct drm_pagemap_peer peer;
+
+ /**
+ * @svm.madvise_notifiers: Active madvise notifiers, keyed by
+ * [vma_start, vma_end - 1]. The maple tree uses its own internal
+ * spinlock for data integrity. Insertions happen under vm->lock
+ * write; teardown is serialized by teardown_rwsem write.
+ */
+ struct maple_tree madvise_notifiers;
+
+ /**
+ * @svm.madvise_notifier_list: VM-owned list of all madvise notifiers.
+ *
+ * The maple tree is only a lookup index. Teardown walks this list.
+ * Protected by vm->lock.
+ */
+ struct list_head madvise_notifier_list;
+
+ /** @svm.madvise_work: Workqueue for async munmap processing */
+ struct {
+ /** @svm.madvise_work.wq: Workqueue */
+ struct workqueue_struct *wq;
+
+ /**
+ * @svm.madvise_work.teardown_rwsem: Guards VM teardown.
+ *
+ * Callbacks take read via trylock; fini takes write.
+ * A failed trylock means teardown started; bail immediately.
+ */
+ struct rw_semaphore teardown_rwsem;
+ } madvise_work;
} svm;
struct xe_device *xe;
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [RFC v3 4/7] drm/xe/vm: Add madvise autoreset notifier worker
2026-06-04 9:50 ` [RFC v3 4/7] drm/xe/vm: Add madvise autoreset notifier worker Arvind Yadav
@ 2026-06-04 10:14 ` sashiko-bot
0 siblings, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-06-04 10:14 UTC (permalink / raw)
To: Arvind Yadav; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Returning false for non-blockable invalidations incorrectly prevents the OOM reaper from unmapping memory.
- [Medium] Redundant VMA splitting for partial overlaps when the VMA already has default attributes.
--
commit fe0b22bc527cb1c9caa55068f36be5982435fd31
Author: Arvind Yadav <arvind.yadav@intel.com>
drm/xe/vm: Add madvise autoreset notifier worker
This commit adds a worker to reset madvise-managed VMA attributes when
userspace unmaps CPU-only mirror ranges. It uses an MMU notifier callback
to record pending unmap events and widens the range if multiple unmaps
arrive before the worker runs. The worker then resets attributes for ranges
not covered by a CPU VMA.
> diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
> index c4fb290041956..c2abe712598a1 100644
> --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
> +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
[ ... ]
> @@ -732,3 +738,501 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
[ ... ]
> +static int xe_vm_madvise_process_unmap(struct xe_vm *vm, u64 start, u64 end)
> +{
[ ... ]
> + has_default_attr = xe_vma_has_default_mem_attrs(vma);
> + seg_start = max(addr, xe_vma_start(vma));
> + seg_end = min(end, xe_vma_end(vma));
> +
> + /* Merge adjacent default-attr VMAs when possible. */
> + if (has_default_attr &&
> + xe_vma_start(vma) >= start &&
> + xe_vma_end(vma) <= end) {
> + seg_start = xe_vma_start(vma);
> + seg_end = xe_vma_end(vma);
> + xe_vm_find_cpu_addr_mirror_vma_range(vm, &seg_start, &seg_end);
> + if (xe_vma_start(vma) == seg_start && xe_vma_end(vma) == seg_end) {
> + /* Nothing to merge. */
> + addr = seg_end;
> + continue;
> + }
> + } else if (xe_vma_start(vma) == seg_start && xe_vma_end(vma) == seg_end) {
> + /* Exact VMA match, reset in place. */
> + xe_vma_reset_to_default_attrs(vma);
> + addr = seg_end;
> + continue;
> + }
> +
> + err = xe_vm_alloc_cpu_addr_mirror_vma(vm, seg_start, seg_end - seg_start);
[Severity: Medium]
When a CPU hole partially overlaps a GPU VMA that already has default
attributes, will this fall through to xe_vm_alloc_cpu_addr_mirror_vma() and
cause redundant VMA splitting?
If the overlap is strictly partial, both the if and else if conditions above
fail. The fall-through maps the overlapping portion with default attributes,
forcing the GPUVM infrastructure to split the existing VMA.
Since the existing VMA already possessed default attributes, this split
appears to be redundant and might needlessly fragment a single large VMA into
smaller identical pieces. Repeated partial unmaps from userspace could
artificially fragment the VMA tree and leak xe_vma objects.
[ ... ]
> +static bool xe_madvise_notifier_callback(struct mmu_interval_notifier *mni,
> + const struct mmu_notifier_range *range,
> + unsigned long cur_seq)
> +{
> + struct xe_madvise_notifier *notifier =
> + container_of(mni, struct xe_madvise_notifier, mmu_notifier);
> + struct xe_vm *vm = notifier->vm;
> + u64 adj_start, adj_end;
> +
> + if (range->event != MMU_NOTIFY_UNMAP)
> + return true;
> +
> + if (!mmu_notifier_range_blockable(range))
> + return false;
[Severity: High]
Does returning false for non-blockable invalidations incorrectly prevent the
OOM reaper from unmapping memory?
Because the callback implementation is entirely non-blocking (it relies on
down_read_trylock(), spin_lock(), and queue_work()), there seems to be no
technical limitation requiring it to block.
Returning false from an MMU interval notifier's invalidate callback signals
that the invalidation could not be completed without blocking, causing
__mmu_notifier_invalidate_range_start() to return -EAGAIN.
Since the OOM reaper operates in a non-blockable context, receiving -EAGAIN
means it cannot retry indefinitely and will skip the VMA, failing to reclaim
the memory and defeating the purpose of the OOM killer. Could this safely
process the event and unconditionally return true for unmap events instead?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260604095012.367231-1-arvind.yadav@intel.com?part=4
^ permalink raw reply [flat|nested] 17+ messages in thread
* [RFC v3 5/7] drm/xe/vm: Disable madvise notifier on GPU touch
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (3 preceding siblings ...)
2026-06-04 9:50 ` [RFC v3 4/7] drm/xe/vm: Add madvise autoreset notifier worker Arvind Yadav
@ 2026-06-04 9:50 ` Arvind Yadav
2026-06-04 10:03 ` sashiko-bot
2026-06-04 9:50 ` [RFC v3 6/7] drm/xe/vm: Wire MADVISE_AUTORESET notifiers into VM lifecycle Arvind Yadav
` (5 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Arvind Yadav @ 2026-06-04 9:50 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom
MADVISE_AUTORESET notifiers are only needed while the VMA is
CPU-only. After the first GPU fault, later unmaps follow the
normal SVM path.
Add an active flag so GPU-touched VMAs stop queueing autoreset
work. Broader notifiers from split VMAs may still remain active,
but the worker rechecks cpu_autoreset_active under vm->lock
before resetting attrs.
v2:
- Use plain bool active; callback reads it lockless. (Matt)
- Use wq check and mt_for_each in deactivate path. (Matt)
- Add lockdep_assert_held_write(&vm->lock) to xe_vm_madvise_gpu_touch().
v3:
- Deactivate only exact-match notifiers to preserve split siblings.
- Use READ_ONCE/WRITE_ONCE for notifier->active since the MMU notifier
callback reads it locklessly.
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
drivers/gpu/drm/xe/xe_pagefault.c | 5 +++-
drivers/gpu/drm/xe/xe_svm.c | 1 +
drivers/gpu/drm/xe/xe_vm_madvise.c | 47 +++++++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_vm_madvise.h | 1 +
drivers/gpu/drm/xe/xe_vm_types.h | 7 +++++
5 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_pagefault.c b/drivers/gpu/drm/xe/xe_pagefault.c
index f64d3df08261..442a4fcad0c0 100644
--- a/drivers/gpu/drm/xe/xe_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_pagefault.c
@@ -19,6 +19,7 @@
#include "xe_svm.h"
#include "xe_trace_bo.h"
#include "xe_vm.h"
+#include "xe_vm_madvise.h"
/**
* DOC: Xe page faults
@@ -222,8 +223,10 @@ static int xe_pagefault_service(struct xe_pagefault *pf)
/* First successful GPU fault ends CPU-only state. */
if (vma && xe_vma_is_cpu_addr_mirror(vma) &&
- xe_vma_has_cpu_autoreset_active(vma))
+ xe_vma_has_cpu_autoreset_active(vma)) {
xe_vma_gpu_touch(vma);
+ xe_vm_madvise_gpu_touch(vm, vma);
+ }
}
up_write(&vm->lock);
xe_vm_put(vm);
diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index e1651e70c8f0..b58857668d48 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -24,6 +24,7 @@
#include "xe_vm.h"
#include "xe_vm_types.h"
#include "xe_vram_types.h"
+#include "xe_vm_madvise.h"
/* Identifies subclasses of struct drm_pagemap_peer */
#define XE_PEER_PAGEMAP ((void *)0ul)
diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
index c2abe712598a..6c42ce8e3f52 100644
--- a/drivers/gpu/drm/xe/xe_vm_madvise.c
+++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
@@ -948,7 +948,7 @@ static bool xe_madvise_notifier_callback(struct mmu_interval_notifier *mni,
struct xe_vm *vm = notifier->vm;
u64 adj_start, adj_end;
- if (range->event != MMU_NOTIFY_UNMAP)
+ if (range->event != MMU_NOTIFY_UNMAP || !READ_ONCE(notifier->active))
return true;
if (!mmu_notifier_range_blockable(range))
@@ -1057,6 +1057,7 @@ xe_madvise_notifier_alloc(struct xe_vm *vm, u64 start, u64 end)
notifier->vma_start = start;
notifier->vma_end = end;
INIT_LIST_HEAD(¬ifier->link);
+ WRITE_ONCE(notifier->active, true);
spin_lock_init(¬ifier->work_lock);
notifier->work_pending = false;
INIT_WORK(¬ifier->work, xe_madvise_work_func);
@@ -1186,6 +1187,7 @@ int xe_vm_madvise_register_notifier_range(struct xe_vm *vm, u64 start, u64 end)
/* Dedup by stored range; tree slots can be fragmented by partial overlap. */
list_for_each_entry(existing, &vm->svm.madvise_notifier_list, link) {
if (xe_madvise_notifier_exact(existing, start, end)) {
+ WRITE_ONCE(existing->active, true);
err = 0;
goto unlock_remove_new;
}
@@ -1236,3 +1238,46 @@ int xe_vm_madvise_register_notifier_range(struct xe_vm *vm, u64 start, u64 end)
return err;
}
+
+/**
+ * xe_vm_deactivate_madvise_notifier_for_range - Disable callbacks for a VMA
+ * @vm: VM
+ * @start: VMA start
+ * @end: VMA end
+ */
+static void xe_vm_deactivate_madvise_notifier_for_range(struct xe_vm *vm, u64 start, u64 end)
+{
+ struct xe_madvise_notifier *notifier;
+ unsigned long index = start;
+
+ lockdep_assert_held_write(&vm->lock);
+
+ if (!vm->svm.madvise_work.wq)
+ return;
+
+ /*
+ * Only exact-match notifiers are disabled. Broader notifiers may still
+ * cover CPU-only split siblings.
+ */
+ mt_for_each(&vm->svm.madvise_notifiers, notifier, index, end - 1)
+ if (notifier->vma_start == start && notifier->vma_end == end)
+ WRITE_ONCE(notifier->active, false);
+}
+
+/**
+ * xe_vm_madvise_gpu_touch - Disable madvise notifier after GPU touch
+ * @vm: VM
+ * @vma: GPU-touched VMA
+ */
+void xe_vm_madvise_gpu_touch(struct xe_vm *vm, struct xe_vma *vma)
+{
+ lockdep_assert_held_write(&vm->lock);
+
+ /* Only AUTORESET VMAs have madvise notifiers. */
+ if (!(vma->gpuva.flags & XE_VMA_MADV_AUTORESET))
+ return;
+
+ xe_vm_deactivate_madvise_notifier_for_range(vm,
+ xe_vma_start(vma),
+ xe_vma_end(vma));
+}
diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.h b/drivers/gpu/drm/xe/xe_vm_madvise.h
index e2013605e190..d7ea6ff6b0c5 100644
--- a/drivers/gpu/drm/xe/xe_vm_madvise.h
+++ b/drivers/gpu/drm/xe/xe_vm_madvise.h
@@ -20,5 +20,6 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data,
int xe_vm_madvise_init(struct xe_vm *vm);
void xe_vm_madvise_fini(struct xe_vm *vm);
int xe_vm_madvise_register_notifier_range(struct xe_vm *vm, u64 start, u64 end);
+void xe_vm_madvise_gpu_touch(struct xe_vm *vm, struct xe_vma *vma);
#endif
diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
index d47bc338628d..4cb3fd619acf 100644
--- a/drivers/gpu/drm/xe/xe_vm_types.h
+++ b/drivers/gpu/drm/xe/xe_vm_types.h
@@ -50,6 +50,13 @@ struct xe_madvise_notifier {
u64 vma_end;
/** @link: Entry on vm->svm.madvise_notifier_list. */
struct list_head link;
+ /**
+ * @active: Fast-path callback gate.
+ *
+ * Read locklessly by the MMU notifier callback. The worker still checks
+ * cpu_autoreset_active under vm->lock before resetting attrs.
+ */
+ bool active;
/** @work_lock: Serialises pending interval state. */
spinlock_t work_lock;
/** @work_pending: Pending interval is available for the worker. */
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [RFC v3 5/7] drm/xe/vm: Disable madvise notifier on GPU touch
2026-06-04 9:50 ` [RFC v3 5/7] drm/xe/vm: Disable madvise notifier on GPU touch Arvind Yadav
@ 2026-06-04 10:03 ` sashiko-bot
0 siblings, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-06-04 10:03 UTC (permalink / raw)
To: Arvind Yadav; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Unbounded accumulation of `xe_madvise_notifier` structs leading to memory leak and Denial of Service (OOM).
--
commit 01cdfed4cb38d71774f4ae69b625419325962b05
Author: Arvind Yadav <arvind.yadav@intel.com>
drm/xe/vm: Disable madvise notifier on GPU touch
This commit adds an active flag to xe_madvise_notifier to stop queueing
autoreset work once a CPU-only VMA has been GPU-faulted. It modifies the
pagefault handler to touch the VMA and deactivate exact-match notifiers
in the maple tree.
> diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
> index c2abe712598a1..6c42ce8e3f525 100644
> --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
> +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
[ ... ]
> @@ -1236,3 +1238,46 @@ int xe_vm_madvise_register_notifier_range(struct xe_vm *vm, u64 start, u64 end)
>
> return err;
> }
> +
> +/**
> + * xe_vm_deactivate_madvise_notifier_for_range - Disable callbacks for a VMA
> + * @vm: VM
> + * @start: VMA start
> + * @end: VMA end
> + */
> +static void xe_vm_deactivate_madvise_notifier_for_range(struct xe_vm *vm, u64 start, u64 end)
> +{
> + struct xe_madvise_notifier *notifier;
> + unsigned long index = start;
> +
> + lockdep_assert_held_write(&vm->lock);
> +
> + if (!vm->svm.madvise_work.wq)
> + return;
> +
> + /*
> + * Only exact-match notifiers are disabled. Broader notifiers may still
> + * cover CPU-only split siblings.
> + */
> + mt_for_each(&vm->svm.madvise_notifiers, notifier, index, end - 1)
> + if (notifier->vma_start == start && notifier->vma_end == end)
> + WRITE_ONCE(notifier->active, false);
[Severity: High]
This is a pre-existing issue, but does leaving these deactivated notifiers in
memory without freeing them contribute to an unbounded accumulation?
Looking at xe_vm_madvise_register_notifier_range(), notifiers are allocated
and linked to the VM indefinitely:
xe_vm_madvise_register_notifier_range() {
notifier = xe_madvise_notifier_alloc(vm, start, end);
if (!notifier)
return -ENOMEM;
...
list_add_tail(¬ifier->link, &vm->svm.madvise_notifier_list);
}
Since older notifiers are only freed if they are fully covered by a new range
or during VM teardown, could userspace intentionally map, bind with AUTORESET,
madvise, and unbind at different addresses across the virtual address space?
This sequence seems like it would bypass the displacement logic and permanently
leak the notifier objects, potentially consuming kernel memory and causing a
denial of service.
Should xe_vm_deactivate_madvise_notifier_for_range() or the unbind path
actively clean up these deactivated objects?
> +}
> +
> +/**
> + * xe_vm_madvise_gpu_touch - Disable madvise notifier after GPU touch
> + * @vm: VM
> + * @vma: GPU-touched VMA
> + */
> +void xe_vm_madvise_gpu_touch(struct xe_vm *vm, struct xe_vma *vma)
> +{
> + lockdep_assert_held_write(&vm->lock);
> +
> + /* Only AUTORESET VMAs have madvise notifiers. */
> + if (!(vma->gpuva.flags & XE_VMA_MADV_AUTORESET))
> + return;
> +
> + xe_vm_deactivate_madvise_notifier_for_range(vm,
> + xe_vma_start(vma),
> + xe_vma_end(vma));
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260604095012.367231-1-arvind.yadav@intel.com?part=5
^ permalink raw reply [flat|nested] 17+ messages in thread
* [RFC v3 6/7] drm/xe/vm: Wire MADVISE_AUTORESET notifiers into VM lifecycle
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (4 preceding siblings ...)
2026-06-04 9:50 ` [RFC v3 5/7] drm/xe/vm: Disable madvise notifier on GPU touch Arvind Yadav
@ 2026-06-04 9:50 ` Arvind Yadav
2026-06-04 10:05 ` sashiko-bot
2026-06-04 9:50 ` [RFC v3 7/7] drm/xe/svm: Correct memory attribute reset for partial unmap Arvind Yadav
` (4 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Arvind Yadav @ 2026-06-04 9:50 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom
Initialise the MADVISE_AUTORESET notifier infrastructure for fault-mode
VMs and tear it down during VM close.
VM close drops vm->lock around xe_vm_madvise_fini(), since the madvise
worker takes vm->lock while draining pending unmap work. The close path
then retakes vm->lock before xe_svm_fini().
The MADVISE ioctl collects CPU mirror VMA ranges under vm->lock and
registers interval notifiers after dropping it. Registration is
best-effort because mmu_interval_notifier_insert() may take mmap_lock.
If registration fails, disable MADV_AUTORESET for the exact VMA range but
keep cpu_autoreset_active set, since the VMA is still CPU-only until the
first successful GPU fault.
Also skip SVM PTE zapping for CPU mirror VMAs while cpu_autoreset_active
is set, since no GPU PTEs should exist yet.
v2:
- Register notifiers outside vm->lock; take vm->lock only for dedup and
mtree_store_range. (Matt)
- Collect VMA ranges under vm->lock and register notifiers after
unlock. (Matt)
v3:
- Allocate notifier ranges before mutating VMA state.
- Fix notifier-lock unwind when the madvise type is invalid.
- On notifier registration failure, clear MADV_AUTORESET but keep
cpu_autoreset_active.
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
drivers/gpu/drm/xe/xe_svm.c | 9 +++
drivers/gpu/drm/xe/xe_vm.c | 14 ++++
drivers/gpu/drm/xe/xe_vm_madvise.c | 105 ++++++++++++++++++++++++++++-
3 files changed, 125 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index b58857668d48..4169cfae7b51 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -914,6 +914,15 @@ int xe_svm_init(struct xe_vm *vm)
drm_pagemap_release_owner(&vm->svm.peer);
return err;
}
+
+ /* Initialize after gpusvm. */
+ err = xe_vm_madvise_init(vm);
+ if (err) {
+ drm_gpusvm_fini(&vm->svm.gpusvm);
+ xe_svm_put_pagemaps(vm);
+ drm_pagemap_release_owner(&vm->svm.peer);
+ return err;
+ }
} else {
err = drm_gpusvm_init(&vm->svm.gpusvm, "Xe SVM (simple)",
&vm->xe->drm, NULL, 0, 0, 0, NULL,
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index dec5279f08a2..e93d715d3da9 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -1815,6 +1815,8 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags, struct xe_file *xef)
err_svm_fini:
if (flags & XE_VM_FLAG_FAULT_MODE) {
vm->size = 0; /* close the vm */
+ /* Safe if madvise init did not run. */
+ xe_vm_madvise_fini(vm);
xe_svm_fini(vm);
}
err_no_resv:
@@ -1959,6 +1961,18 @@ void xe_vm_close_and_put(struct xe_vm *vm)
xe_vma_destroy_unlocked(vma);
}
+ /*
+ * The VM is closed here, so no new ioctl should enter. Drop vm->lock
+ * while draining madvise workers because they take vm->lock.
+ */
+ xe_assert(vm->xe, xe_vm_is_closed(vm));
+ up_write(&vm->lock);
+
+ if (vm->flags & XE_VM_FLAG_FAULT_MODE)
+ xe_vm_madvise_fini(vm);
+
+ down_write(&vm->lock);
+
xe_svm_fini(vm);
up_write(&vm->lock);
diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
index 6c42ce8e3f52..eb2d17abf9d4 100644
--- a/drivers/gpu/drm/xe/xe_vm_madvise.c
+++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
@@ -28,6 +28,7 @@ struct xe_vmas_in_madvise_range {
int num_vmas;
bool has_bo_vmas;
bool has_svm_userptr_vmas;
+ bool has_cpu_addr_mirror_vmas;
};
/**
@@ -70,7 +71,11 @@ static int get_vmas(struct xe_vm *vm, struct xe_vmas_in_madvise_range *madvise_r
if (xe_vma_bo(vma))
madvise_range->has_bo_vmas = true;
- else if (xe_vma_is_cpu_addr_mirror(vma) || xe_vma_is_userptr(vma))
+ else if (xe_vma_is_cpu_addr_mirror(vma)) {
+ /* CPU mirror VMAs use the SVM notifier lock. */
+ madvise_range->has_svm_userptr_vmas = true;
+ madvise_range->has_cpu_addr_mirror_vmas = true;
+ } else if (xe_vma_is_userptr(vma))
madvise_range->has_svm_userptr_vmas = true;
if (madvise_range->num_vmas == max_vmas) {
@@ -297,7 +302,12 @@ static u8 xe_zap_ptes_in_madvise_range(struct xe_vm *vm, u64 start, u64 end)
continue;
if (xe_vma_is_cpu_addr_mirror(vma)) {
- tile_mask |= xe_svm_ranges_zap_ptes_in_range(vm,
+ /*
+ * CPU-only mirror VMAs have no GPU PTEs yet.
+ * Once GPU-touched, SVM zap applies.
+ */
+ if (!xe_vma_has_cpu_autoreset_active(vma))
+ tile_mask |= xe_svm_ranges_zap_ptes_in_range(vm,
xe_vma_start(vma),
xe_vma_end(vma));
} else {
@@ -559,6 +569,32 @@ static bool check_bo_args_are_sane(struct xe_vm *vm, struct xe_vma **vmas,
}
return true;
}
+
+/*
+ * Clear AUTORESET on CPU mirror VMAs in [start, end). Registration may
+ * fail after the VMA was split or merged, so do not rely on exact match.
+ */
+static void xe_vm_madvise_clear_autoreset_range(struct xe_vm *vm,
+ u64 start, u64 end)
+{
+ u64 addr = start;
+
+ lockdep_assert_held_write(&vm->lock);
+
+ while (addr < end) {
+ struct xe_vma *vma;
+
+ vma = xe_vm_find_overlapping_vma(vm, addr, end - addr);
+ if (!vma)
+ break;
+
+ if (xe_vma_is_cpu_addr_mirror(vma))
+ vma->gpuva.flags &= ~XE_VMA_MADV_AUTORESET;
+
+ addr = xe_vma_end(vma);
+ }
+}
+
/**
* xe_vm_madvise_ioctl - Handle MADVise ioctl for a VM
* @dev: DRM device pointer
@@ -590,6 +626,11 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
struct drm_exec exec;
int err, attr_type;
bool do_retained;
+ struct {
+ u64 start;
+ u64 end;
+ } *notifier_ranges = NULL;
+ int num_notifier_ranges = 0;
vm = xe_vm_lookup(xef, args->vm_id);
if (XE_IOCTL_DBG(xe, !vm))
@@ -661,6 +702,20 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
}
}
+ /*
+ * Allocate before taking BO dma-resv locks. GFP_KERNEL may enter
+ * reclaim, which can reach TTM shrinkers and dma-resv locks.
+ */
+ if (madvise_range.has_cpu_addr_mirror_vmas) {
+ notifier_ranges = kvmalloc_array(madvise_range.num_vmas,
+ sizeof(*notifier_ranges),
+ GFP_KERNEL);
+ if (!notifier_ranges) {
+ err = -ENOMEM;
+ goto free_vmas;
+ }
+ }
+
if (madvise_range.has_bo_vmas) {
if (args->type == DRM_XE_MEM_RANGE_ATTR_ATOMIC) {
if (!check_bo_args_are_sane(vm, madvise_range.vmas,
@@ -708,7 +763,7 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
/* Ensure the madvise function exists for this type */
if (!madvise_funcs[attr_type]) {
err = -EINVAL;
- goto err_fini;
+ goto err_unlock_notifier;
}
madvise_funcs[attr_type](xe, vm, madvise_range.vmas, madvise_range.num_vmas, args,
@@ -717,9 +772,29 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
err = xe_vm_invalidate_madvise_range(vm, madvise_range.addr,
madvise_range.addr + args->range);
+err_unlock_notifier:
if (madvise_range.has_svm_userptr_vmas)
xe_svm_notifier_unlock(vm);
+ if (err)
+ goto err_fini;
+
+ if (madvise_range.has_cpu_addr_mirror_vmas) {
+ for (int i = 0; i < madvise_range.num_vmas; i++) {
+ struct xe_vma *vma = madvise_range.vmas[i];
+
+ if (!xe_vma_is_cpu_addr_mirror(vma))
+ continue;
+ if (!(vma->gpuva.flags & XE_VMA_MADV_AUTORESET))
+ continue;
+ if (!xe_vma_has_cpu_autoreset_active(vma))
+ continue;
+ notifier_ranges[num_notifier_ranges].start = xe_vma_start(vma);
+ notifier_ranges[num_notifier_ranges].end = xe_vma_end(vma);
+ num_notifier_ranges++;
+ }
+ }
+
err_fini:
if (madvise_range.has_bo_vmas)
drm_exec_fini(&exec);
@@ -731,6 +806,30 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
unlock_vm:
up_write(&vm->lock);
+ if (!err) {
+ for (int i = 0; i < num_notifier_ranges; i++) {
+ int ret = xe_vm_madvise_register_notifier_range(vm,
+ notifier_ranges[i].start,
+ notifier_ranges[i].end);
+ if (ret) {
+ drm_warn(&vm->xe->drm,
+ "Failed to register madvise notifier [%#llx-%#llx]: %d\n",
+ notifier_ranges[i].start,
+ notifier_ranges[i].end, ret);
+ /*
+ * Disable AUTORESET, but keep cpu_autoreset_active.
+ * The VMA is still CPU-only.
+ */
+ down_write(&vm->lock);
+ xe_vm_madvise_clear_autoreset_range(vm,
+ notifier_ranges[i].start,
+ notifier_ranges[i].end);
+ up_write(&vm->lock);
+ }
+ }
+ }
+ kvfree(notifier_ranges);
+
/* Write retained value to user after releasing all locks */
if (!err && do_retained)
err = xe_madvise_purgeable_retained_to_user(&details);
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [RFC v3 6/7] drm/xe/vm: Wire MADVISE_AUTORESET notifiers into VM lifecycle
2026-06-04 9:50 ` [RFC v3 6/7] drm/xe/vm: Wire MADVISE_AUTORESET notifiers into VM lifecycle Arvind Yadav
@ 2026-06-04 10:05 ` sashiko-bot
0 siblings, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-06-04 10:05 UTC (permalink / raw)
To: Arvind Yadav; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Unbounded kernel memory leak of `xe_madvise_notifier` structures due to missing cleanup on VMA unbind.
--
commit 842ee67ad0fcd26bd2723ff015ee6cb68da543ef
Author: Arvind Yadav <arvind.yadav@intel.com>
drm/xe/vm: Wire MADVISE_AUTORESET notifiers into VM lifecycle
This commit initializes the MADVISE_AUTORESET notifier infrastructure for
fault-mode VMs and handles tear down during VM close. It also collects CPU
mirror VMA ranges to register interval notifiers after dropping the VM lock.
> diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
> --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
> +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
[ ... ]
> @@ -731,6 +806,30 @@ int xe_vm_madvise_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
> unlock_vm:
> up_write(&vm->lock);
>
> + if (!err) {
> + for (int i = 0; i < num_notifier_ranges; i++) {
> + int ret = xe_vm_madvise_register_notifier_range(vm,
> + notifier_ranges[i].start,
> + notifier_ranges[i].end);
[Severity: High]
Does this code leak xe_madvise_notifier structures if the VMA is
subsequently unbound?
When userspace calls the MADVISE ioctl on a CPU mirror VMA,
xe_vm_madvise_register_notifier_range() allocates a new notifier and
adds it to the VM madvise_notifier_list.
However, there does not appear to be a hook in the VMA teardown path,
such as xe_vma_destroy(), to remove notifiers associated with a
destroyed GPU VMA. The notifiers are only freed when the entire VM is
destroyed in xe_vm_madvise_fini(), or if they are fully covered by a
newly registered notifier.
Could a userspace application repeatedly bind a VMA, call the MADVISE
ioctl, and unbind the VMA, shifting the address range slightly each
time, to indefinitely accumulate xe_madvise_notifier objects and mmu
interval notifiers until it triggers an out of memory condition?
> + if (ret) {
> + drm_warn(&vm->xe->drm,
> + "Failed to register madvise notifier [%#llx-%#llx]: %d\n",
> + notifier_ranges[i].start,
> + notifier_ranges[i].end, ret);
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260604095012.367231-1-arvind.yadav@intel.com?part=6
^ permalink raw reply [flat|nested] 17+ messages in thread
* [RFC v3 7/7] drm/xe/svm: Correct memory attribute reset for partial unmap
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (5 preceding siblings ...)
2026-06-04 9:50 ` [RFC v3 6/7] drm/xe/vm: Wire MADVISE_AUTORESET notifiers into VM lifecycle Arvind Yadav
@ 2026-06-04 9:50 ` Arvind Yadav
2026-06-04 10:12 ` sashiko-bot
2026-06-04 10:32 ` ✗ CI.checkpatch: warning for drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3) Patchwork
` (3 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Arvind Yadav @ 2026-06-04 9:50 UTC (permalink / raw)
To: intel-xe, dri-devel
Cc: matthew.brost, himal.prasad.ghimiray, thomas.hellstrom
From: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
When performing a partial unmap of an SVM range, the memory attributes
were being reset for the entire range instead of just the portion
being unmapped. This could lead to unintended side effects and behaviour.
Fix this by restricting the attribute reset to only the affected subrange
that is being unmapped.
v3:
- Coalesce partial_unmap range via min/max instead of blind overwrite (Matt)
- Restore range_debug() in xe_svm_garbage_collector_add_range() (Matt)
- Update partial_unmap under garbage_collector.lock to avoid races with
the worker.
- Clear consumed partial_unmap state before dropping the GC lock.
- Continue processing remaining queued ranges on non-fatal set_default_attr
failure instead of stranding them.
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
---
drivers/gpu/drm/xe/xe_svm.c | 87 ++++++++++++++++++++++++++++++-------
drivers/gpu/drm/xe/xe_svm.h | 10 +++++
2 files changed, 82 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index 4169cfae7b51..beabae3db2dc 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -58,6 +58,8 @@ void *xe_svm_private_page_owner(struct xe_vm *vm, bool force_smem)
return force_smem ? NULL : vm->svm.peer.owner;
}
+#define XE_SVM_ATTR_RETRY_MAX 3
+
static bool xe_svm_range_in_vram(struct xe_svm_range *range)
{
/*
@@ -127,6 +129,34 @@ static void xe_svm_range_free(struct drm_gpusvm_range *range)
kfree(range);
}
+static void xe_svm_range_set_unmapped(struct xe_svm_range *range,
+ const struct mmu_notifier_range *mmu_range)
+{
+ u64 new_start = max_t(u64, xe_svm_range_start(range), mmu_range->start);
+ u64 new_end = min_t(u64, xe_svm_range_end(range), mmu_range->end);
+
+ drm_gpusvm_range_set_unmapped(&range->base, mmu_range);
+ if (range->base.pages.flags.partial_unmap) {
+ if (range->partial_unmap.start || range->partial_unmap.end) {
+ /*
+ * Coalesce overlapping or adjacent intervals.
+ * Disjoint ranges cannot be tracked in one interval
+ * without covering still-mapped memory.
+ */
+ if (new_start <= range->partial_unmap.end &&
+ new_end >= range->partial_unmap.start) {
+ range->partial_unmap.start =
+ min(range->partial_unmap.start, new_start);
+ range->partial_unmap.end =
+ max(range->partial_unmap.end, new_end);
+ }
+ } else {
+ range->partial_unmap.start = new_start;
+ range->partial_unmap.end = new_end;
+ }
+ }
+}
+
static void
xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range,
const struct mmu_notifier_range *mmu_range)
@@ -135,12 +165,14 @@ xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range,
range_debug(range, "GARBAGE COLLECTOR ADD");
- drm_gpusvm_range_set_unmapped(&range->base, mmu_range);
-
spin_lock(&vm->svm.garbage_collector.lock);
+
+ xe_svm_range_set_unmapped(range, mmu_range);
+
if (list_empty(&range->garbage_collector_link))
list_add_tail(&range->garbage_collector_link,
&vm->svm.garbage_collector.range_list);
+
spin_unlock(&vm->svm.garbage_collector.lock);
queue_work(xe->usm.pf_wq, &vm->svm.garbage_collector.work);
@@ -380,9 +412,10 @@ static int xe_svm_range_set_default_attr(struct xe_vm *vm, u64 start, u64 end)
static int xe_svm_garbage_collector(struct xe_vm *vm)
{
struct xe_svm_range *range;
- u64 range_start;
- u64 range_end;
- int err, ret = 0;
+ u64 unmap_start;
+ u64 unmap_end;
+ int err;
+ int retry_count;
lockdep_assert_held_write(&vm->lock);
@@ -397,8 +430,18 @@ static int xe_svm_garbage_collector(struct xe_vm *vm)
if (!range)
break;
- range_start = xe_svm_range_start(range);
- range_end = xe_svm_range_end(range);
+ if (range->base.pages.flags.partial_unmap &&
+ range->partial_unmap.start && range->partial_unmap.end) {
+ unmap_start = range->partial_unmap.start;
+ unmap_end = range->partial_unmap.end;
+ } else {
+ unmap_start = xe_svm_range_start(range);
+ unmap_end = xe_svm_range_end(range);
+ }
+
+ /* Clear consumed state before dropping lock. */
+ range->partial_unmap.start = 0;
+ range->partial_unmap.end = 0;
list_del(&range->garbage_collector_link);
spin_unlock(&vm->svm.garbage_collector.lock);
@@ -412,17 +455,31 @@ static int xe_svm_garbage_collector(struct xe_vm *vm)
return err;
}
- err = xe_svm_range_set_default_attr(vm, range_start, range_end);
- if (err) {
- if (err == -EAGAIN)
- ret = -EAGAIN;
- else
- return err;
- }
+ /*
+ * Retry if the VMA was recreated while rebuilding attrs.
+ * Repeated failures mean the topology is not converging.
+ */
+ retry_count = 0;
+
+ do {
+ err = xe_svm_range_set_default_attr(vm, unmap_start, unmap_end);
+ if (err == -EAGAIN && ++retry_count > XE_SVM_ATTR_RETRY_MAX) {
+ drm_err(&vm->xe->drm,
+ "SET_ATTR retry limit exceeded for [0x%llx-0x%llx]\n",
+ unmap_start, unmap_end);
+ xe_vm_kill(vm, true);
+ return -EIO;
+ }
+ } while (err == -EAGAIN);
+
+ if (err)
+ drm_warn(&vm->xe->drm,
+ "SET_ATTR failed for [0x%llx-0x%llx]: %pe\n",
+ unmap_start, unmap_end, ERR_PTR(err));
}
spin_unlock(&vm->svm.garbage_collector.lock);
- return ret;
+ return 0;
}
static void xe_svm_garbage_collector_work_func(struct work_struct *w)
diff --git a/drivers/gpu/drm/xe/xe_svm.h b/drivers/gpu/drm/xe/xe_svm.h
index b7b8eeacf196..4651e044cf53 100644
--- a/drivers/gpu/drm/xe/xe_svm.h
+++ b/drivers/gpu/drm/xe/xe_svm.h
@@ -46,6 +46,16 @@ struct xe_svm_range {
* range. Protected by GPU SVM notifier lock.
*/
u8 tile_invalidated;
+ /**
+ * @partial_unmap: Structure to hold partial unmap range info.
+ * Valid only if partial unmap is in effect.
+ */
+ struct {
+ /** @start: Start address of the partial unmap range */
+ u64 start;
+ /** @end: End address of the partial unmap range */
+ u64 end;
+ } partial_unmap;
};
/**
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [RFC v3 7/7] drm/xe/svm: Correct memory attribute reset for partial unmap
2026-06-04 9:50 ` [RFC v3 7/7] drm/xe/svm: Correct memory attribute reset for partial unmap Arvind Yadav
@ 2026-06-04 10:12 ` sashiko-bot
0 siblings, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-06-04 10:12 UTC (permalink / raw)
To: Arvind Yadav; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Concurrent MMU notifiers fail to queue partial unmap range updates due to list poisoning, causing unmapped regions to retain stale attributes.
- [High] Disjoint partial unmaps are silently ignored during coalescing, preventing their VMA memory attributes from being reset.
--
commit 63782c32791ae66c7e1c022f8db4a4b168c0d897
Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
drm/xe/svm: Correct memory attribute reset for partial unmap
When performing a partial unmap of an SVM range, the memory attributes
were being reset for the entire range instead of just the portion
being unmapped. This could lead to unintended side effects and behaviour.
> diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
> @@ -127,6 +129,34 @@ static void xe_svm_range_free(struct drm_gpusvm_range *range)
[ ... ]
> +static void xe_svm_range_set_unmapped(struct xe_svm_range *range,
> + const struct mmu_notifier_range *mmu_range)
> +{
> + u64 new_start = max_t(u64, xe_svm_range_start(range), mmu_range->start);
> + u64 new_end = min_t(u64, xe_svm_range_end(range), mmu_range->end);
> +
> + drm_gpusvm_range_set_unmapped(&range->base, mmu_range);
> + if (range->base.pages.flags.partial_unmap) {
> + if (range->partial_unmap.start || range->partial_unmap.end) {
> + /*
> + * Coalesce overlapping or adjacent intervals.
> + * Disjoint ranges cannot be tracked in one interval
> + * without covering still-mapped memory.
> + */
> + if (new_start <= range->partial_unmap.end &&
> + new_end >= range->partial_unmap.start) {
> + range->partial_unmap.start =
> + min(range->partial_unmap.start, new_start);
> + range->partial_unmap.end =
> + max(range->partial_unmap.end, new_end);
> + }
[Severity: High]
If the new partial unmap is disjoint from the tracked interval, the overlap
condition evaluates to false. Because there is no else block here, does
this mean the disjoint interval is silently discarded?
If so, the garbage collector might only reset the VMA attributes for the
initial subrange, leaving the disjoint unmapped region with stale memory
attributes.
> + } else {
> + range->partial_unmap.start = new_start;
> + range->partial_unmap.end = new_end;
> + }
> + }
> +}
[ ... ]
> @@ -135,12 +165,14 @@ xe_svm_garbage_collector_add_range(struct xe_vm *vm, struct xe_svm_range *range,
>
> range_debug(range, "GARBAGE COLLECTOR ADD");
>
> - drm_gpusvm_range_set_unmapped(&range->base, mmu_range);
> -
> spin_lock(&vm->svm.garbage_collector.lock);
> +
> + xe_svm_range_set_unmapped(range, mmu_range);
> +
> if (list_empty(&range->garbage_collector_link))
> list_add_tail(&range->garbage_collector_link,
> &vm->svm.garbage_collector.range_list);
> +
> spin_unlock(&vm->svm.garbage_collector.lock);
[Severity: High]
Is it possible to lose concurrent MMU notifier updates here due to list
poisoning?
In xe_svm_garbage_collector(), the worker thread removes the item using
list_del(), which poisons the list node pointers, and then the lock is
dropped:
xe_svm_garbage_collector() {
...
list_del(&range->garbage_collector_link);
spin_unlock(&vm->svm.garbage_collector.lock);
...
}
If a concurrent MMU notifier fires for the same range during this unlocked
window, xe_svm_garbage_collector_add_range() acquires the lock, updates the
partial unmap bounds, and evaluates the list_empty() condition above.
Because the pointers are poisoned, list_empty() evaluates to false, and the
range is not re-queued. Would this cause the VMA attributes for this
concurrent unmap to never be reset?
Note that switching to list_del_init() would allow it to be re-queued, but
could that introduce a use-after-free since the worker then destroys the
range?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260604095012.367231-1-arvind.yadav@intel.com?part=7
^ permalink raw reply [flat|nested] 17+ messages in thread
* ✗ CI.checkpatch: warning for drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (6 preceding siblings ...)
2026-06-04 9:50 ` [RFC v3 7/7] drm/xe/svm: Correct memory attribute reset for partial unmap Arvind Yadav
@ 2026-06-04 10:32 ` Patchwork
2026-06-04 10:34 ` ✓ CI.KUnit: success " Patchwork
` (2 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-06-04 10:32 UTC (permalink / raw)
To: Arvind Yadav; +Cc: intel-xe
== Series Details ==
Series: drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
URL : https://patchwork.freedesktop.org/series/161815/
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 b896a89fd0c92f4b48c8953bed8abaedfcad63a1
Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Date: Thu Jun 4 15:20:12 2026 +0530
drm/xe/svm: Correct memory attribute reset for partial unmap
When performing a partial unmap of an SVM range, the memory attributes
were being reset for the entire range instead of just the portion
being unmapped. This could lead to unintended side effects and behaviour.
Fix this by restricting the attribute reset to only the affected subrange
that is being unmapped.
v3:
- Coalesce partial_unmap range via min/max instead of blind overwrite (Matt)
- Restore range_debug() in xe_svm_garbage_collector_add_range() (Matt)
- Update partial_unmap under garbage_collector.lock to avoid races with
the worker.
- Clear consumed partial_unmap state before dropping the GC lock.
- Continue processing remaining queued ranges on non-fatal set_default_attr
failure instead of stranding them.
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Signed-off-by: Arvind Yadav <arvind.yadav@intel.com>
+ /mt/dim checkpatch 70c7b363fab8198549bb9b82134bda0f6bda9452 drm-intel
76568c4603b0 drm/xe/vm: Track CPU_AUTORESET state in xe_vma
38b7fb1e6539 drm/xe/vm: Preserve cpu_autoreset_active across GPUVA operations
-:28: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#28:
- Guard cpu_autoreset_active assignment to CPU_ADDR_MIRROR VMAs only (Matt)
total: 0 errors, 1 warnings, 0 checks, 103 lines checked
5b4cd11bc093 drm/xe/svm: Clear CPU_AUTORESET_ACTIVE on first GPU fault
f9f659d075d9 drm/xe/vm: Add madvise autoreset notifier worker
-:32: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#32:
- Widen pending ranges in the callback and reset only CPU holes in the worker.
total: 0 errors, 1 warnings, 0 checks, 617 lines checked
f5710d0bc501 drm/xe/vm: Disable madvise notifier on GPU touch
-:142: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#142: FILE: drivers/gpu/drm/xe/xe_vm_madvise.c:1281:
+ xe_vm_deactivate_madvise_notifier_for_range(vm,
+ xe_vma_start(vma),
total: 0 errors, 0 warnings, 1 checks, 112 lines checked
931ebcf6f5c9 drm/xe/vm: Wire MADVISE_AUTORESET notifiers into VM lifecycle
b896a89fd0c9 drm/xe/svm: Correct memory attribute reset for partial unmap
-:17: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#17:
- Coalesce partial_unmap range via min/max instead of blind overwrite (Matt)
total: 0 errors, 1 warnings, 0 checks, 146 lines checked
^ permalink raw reply [flat|nested] 17+ messages in thread* ✓ CI.KUnit: success for drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (7 preceding siblings ...)
2026-06-04 10:32 ` ✗ CI.checkpatch: warning for drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3) Patchwork
@ 2026-06-04 10:34 ` Patchwork
2026-06-04 11:35 ` ✓ Xe.CI.BAT: " Patchwork
2026-06-05 0:02 ` ✗ Xe.CI.FULL: failure " Patchwork
10 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-06-04 10:34 UTC (permalink / raw)
To: Arvind Yadav; +Cc: intel-xe
== Series Details ==
Series: drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
URL : https://patchwork.freedesktop.org/series/161815/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[10:32:44] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:32:48] 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
[10:33:19] Starting KUnit Kernel (1/1)...
[10:33:19] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:33:19] ================== guc_buf (11 subtests) ===================
[10:33:19] [PASSED] test_smallest
[10:33:19] [PASSED] test_largest
[10:33:19] [PASSED] test_granular
[10:33:19] [PASSED] test_unique
[10:33:19] [PASSED] test_overlap
[10:33:19] [PASSED] test_reusable
[10:33:19] [PASSED] test_too_big
[10:33:19] [PASSED] test_flush
[10:33:19] [PASSED] test_lookup
[10:33:19] [PASSED] test_data
[10:33:19] [PASSED] test_class
[10:33:19] ===================== [PASSED] guc_buf =====================
[10:33:19] =================== guc_dbm (7 subtests) ===================
[10:33:19] [PASSED] test_empty
[10:33:19] [PASSED] test_default
[10:33:19] ======================== test_size ========================
[10:33:19] [PASSED] 4
[10:33:19] [PASSED] 8
[10:33:19] [PASSED] 32
[10:33:19] [PASSED] 256
[10:33:19] ==================== [PASSED] test_size ====================
[10:33:19] ======================= test_reuse ========================
[10:33:19] [PASSED] 4
[10:33:19] [PASSED] 8
[10:33:19] [PASSED] 32
[10:33:19] [PASSED] 256
[10:33:19] =================== [PASSED] test_reuse ====================
[10:33:19] =================== test_range_overlap ====================
[10:33:19] [PASSED] 4
[10:33:19] [PASSED] 8
[10:33:19] [PASSED] 32
[10:33:19] [PASSED] 256
[10:33:19] =============== [PASSED] test_range_overlap ================
[10:33:19] =================== test_range_compact ====================
[10:33:19] [PASSED] 4
[10:33:19] [PASSED] 8
[10:33:19] [PASSED] 32
[10:33:19] [PASSED] 256
[10:33:19] =============== [PASSED] test_range_compact ================
[10:33:19] ==================== test_range_spare =====================
[10:33:19] [PASSED] 4
[10:33:19] [PASSED] 8
[10:33:19] [PASSED] 32
[10:33:19] [PASSED] 256
[10:33:19] ================ [PASSED] test_range_spare =================
[10:33:19] ===================== [PASSED] guc_dbm =====================
[10:33:19] =================== guc_idm (6 subtests) ===================
[10:33:19] [PASSED] bad_init
[10:33:19] [PASSED] no_init
[10:33:19] [PASSED] init_fini
[10:33:19] [PASSED] check_used
[10:33:19] [PASSED] check_quota
[10:33:19] [PASSED] check_all
[10:33:19] ===================== [PASSED] guc_idm =====================
[10:33:19] ================== no_relay (3 subtests) ===================
[10:33:19] [PASSED] xe_drops_guc2pf_if_not_ready
[10:33:19] [PASSED] xe_drops_guc2vf_if_not_ready
[10:33:19] [PASSED] xe_rejects_send_if_not_ready
[10:33:19] ==================== [PASSED] no_relay =====================
[10:33:19] ================== pf_relay (14 subtests) ==================
[10:33:19] [PASSED] pf_rejects_guc2pf_too_short
[10:33:19] [PASSED] pf_rejects_guc2pf_too_long
[10:33:19] [PASSED] pf_rejects_guc2pf_no_payload
[10:33:19] [PASSED] pf_fails_no_payload
[10:33:19] [PASSED] pf_fails_bad_origin
[10:33:19] [PASSED] pf_fails_bad_type
[10:33:19] [PASSED] pf_txn_reports_error
[10:33:19] [PASSED] pf_txn_sends_pf2guc
[10:33:19] [PASSED] pf_sends_pf2guc
[10:33:19] [SKIPPED] pf_loopback_nop
[10:33:19] [SKIPPED] pf_loopback_echo
[10:33:19] [SKIPPED] pf_loopback_fail
[10:33:19] [SKIPPED] pf_loopback_busy
[10:33:19] [SKIPPED] pf_loopback_retry
[10:33:19] ==================== [PASSED] pf_relay =====================
[10:33:19] ================== vf_relay (3 subtests) ===================
[10:33:19] [PASSED] vf_rejects_guc2vf_too_short
[10:33:19] [PASSED] vf_rejects_guc2vf_too_long
[10:33:19] [PASSED] vf_rejects_guc2vf_no_payload
[10:33:19] ==================== [PASSED] vf_relay =====================
[10:33:19] ================ pf_gt_config (9 subtests) =================
[10:33:19] [PASSED] fair_contexts_1vf
[10:33:19] [PASSED] fair_doorbells_1vf
[10:33:19] [PASSED] fair_ggtt_1vf
[10:33:19] ====================== fair_vram_1vf ======================
[10:33:19] [PASSED] 3.50 GiB
[10:33:19] [PASSED] 11.5 GiB
[10:33:19] [PASSED] 15.5 GiB
[10:33:19] [PASSED] 31.5 GiB
[10:33:19] [PASSED] 63.5 GiB
[10:33:19] [PASSED] 1.91 GiB
[10:33:19] ================== [PASSED] fair_vram_1vf ==================
[10:33:19] ================ fair_vram_1vf_admin_only =================
[10:33:19] [PASSED] 3.50 GiB
[10:33:19] [PASSED] 11.5 GiB
[10:33:19] [PASSED] 15.5 GiB
[10:33:19] [PASSED] 31.5 GiB
[10:33:19] [PASSED] 63.5 GiB
[10:33:19] [PASSED] 1.91 GiB
[10:33:19] ============ [PASSED] fair_vram_1vf_admin_only =============
[10:33:19] ====================== fair_contexts ======================
[10:33:19] [PASSED] 1 VF
[10:33:19] [PASSED] 2 VFs
[10:33:19] [PASSED] 3 VFs
[10:33:19] [PASSED] 4 VFs
[10:33:19] [PASSED] 5 VFs
[10:33:19] [PASSED] 6 VFs
[10:33:19] [PASSED] 7 VFs
[10:33:19] [PASSED] 8 VFs
[10:33:19] [PASSED] 9 VFs
[10:33:19] [PASSED] 10 VFs
[10:33:19] [PASSED] 11 VFs
[10:33:19] [PASSED] 12 VFs
[10:33:19] [PASSED] 13 VFs
[10:33:19] [PASSED] 14 VFs
[10:33:19] [PASSED] 15 VFs
[10:33:19] [PASSED] 16 VFs
[10:33:19] [PASSED] 17 VFs
[10:33:19] [PASSED] 18 VFs
[10:33:19] [PASSED] 19 VFs
[10:33:19] [PASSED] 20 VFs
[10:33:19] [PASSED] 21 VFs
[10:33:19] [PASSED] 22 VFs
[10:33:19] [PASSED] 23 VFs
[10:33:19] [PASSED] 24 VFs
[10:33:19] [PASSED] 25 VFs
[10:33:19] [PASSED] 26 VFs
[10:33:19] [PASSED] 27 VFs
[10:33:19] [PASSED] 28 VFs
[10:33:19] [PASSED] 29 VFs
[10:33:19] [PASSED] 30 VFs
[10:33:19] [PASSED] 31 VFs
[10:33:19] [PASSED] 32 VFs
[10:33:19] [PASSED] 33 VFs
[10:33:19] [PASSED] 34 VFs
[10:33:19] [PASSED] 35 VFs
[10:33:19] [PASSED] 36 VFs
[10:33:19] [PASSED] 37 VFs
[10:33:19] [PASSED] 38 VFs
[10:33:19] [PASSED] 39 VFs
[10:33:19] [PASSED] 40 VFs
[10:33:19] [PASSED] 41 VFs
[10:33:19] [PASSED] 42 VFs
[10:33:19] [PASSED] 43 VFs
[10:33:19] [PASSED] 44 VFs
[10:33:19] [PASSED] 45 VFs
[10:33:19] [PASSED] 46 VFs
[10:33:19] [PASSED] 47 VFs
[10:33:19] [PASSED] 48 VFs
[10:33:19] [PASSED] 49 VFs
[10:33:19] [PASSED] 50 VFs
[10:33:19] [PASSED] 51 VFs
[10:33:19] [PASSED] 52 VFs
[10:33:19] [PASSED] 53 VFs
[10:33:19] [PASSED] 54 VFs
[10:33:19] [PASSED] 55 VFs
[10:33:19] [PASSED] 56 VFs
[10:33:19] [PASSED] 57 VFs
[10:33:19] [PASSED] 58 VFs
[10:33:19] [PASSED] 59 VFs
[10:33:19] [PASSED] 60 VFs
[10:33:19] [PASSED] 61 VFs
[10:33:19] [PASSED] 62 VFs
[10:33:19] [PASSED] 63 VFs
[10:33:19] ================== [PASSED] fair_contexts ==================
[10:33:19] ===================== fair_doorbells ======================
[10:33:19] [PASSED] 1 VF
[10:33:19] [PASSED] 2 VFs
[10:33:19] [PASSED] 3 VFs
[10:33:19] [PASSED] 4 VFs
[10:33:19] [PASSED] 5 VFs
[10:33:19] [PASSED] 6 VFs
[10:33:19] [PASSED] 7 VFs
[10:33:19] [PASSED] 8 VFs
[10:33:19] [PASSED] 9 VFs
[10:33:19] [PASSED] 10 VFs
[10:33:19] [PASSED] 11 VFs
[10:33:19] [PASSED] 12 VFs
[10:33:19] [PASSED] 13 VFs
[10:33:19] [PASSED] 14 VFs
[10:33:19] [PASSED] 15 VFs
[10:33:19] [PASSED] 16 VFs
[10:33:19] [PASSED] 17 VFs
[10:33:19] [PASSED] 18 VFs
[10:33:19] [PASSED] 19 VFs
[10:33:19] [PASSED] 20 VFs
[10:33:19] [PASSED] 21 VFs
[10:33:19] [PASSED] 22 VFs
[10:33:19] [PASSED] 23 VFs
[10:33:19] [PASSED] 24 VFs
[10:33:19] [PASSED] 25 VFs
[10:33:19] [PASSED] 26 VFs
[10:33:19] [PASSED] 27 VFs
[10:33:19] [PASSED] 28 VFs
[10:33:19] [PASSED] 29 VFs
[10:33:19] [PASSED] 30 VFs
[10:33:19] [PASSED] 31 VFs
[10:33:19] [PASSED] 32 VFs
[10:33:19] [PASSED] 33 VFs
[10:33:19] [PASSED] 34 VFs
[10:33:19] [PASSED] 35 VFs
[10:33:19] [PASSED] 36 VFs
[10:33:19] [PASSED] 37 VFs
[10:33:19] [PASSED] 38 VFs
[10:33:19] [PASSED] 39 VFs
[10:33:19] [PASSED] 40 VFs
[10:33:19] [PASSED] 41 VFs
[10:33:19] [PASSED] 42 VFs
[10:33:19] [PASSED] 43 VFs
[10:33:19] [PASSED] 44 VFs
[10:33:19] [PASSED] 45 VFs
[10:33:19] [PASSED] 46 VFs
[10:33:19] [PASSED] 47 VFs
[10:33:19] [PASSED] 48 VFs
[10:33:19] [PASSED] 49 VFs
[10:33:19] [PASSED] 50 VFs
[10:33:19] [PASSED] 51 VFs
[10:33:19] [PASSED] 52 VFs
[10:33:19] [PASSED] 53 VFs
[10:33:19] [PASSED] 54 VFs
[10:33:19] [PASSED] 55 VFs
[10:33:19] [PASSED] 56 VFs
[10:33:19] [PASSED] 57 VFs
[10:33:19] [PASSED] 58 VFs
[10:33:19] [PASSED] 59 VFs
[10:33:19] [PASSED] 60 VFs
[10:33:19] [PASSED] 61 VFs
[10:33:19] [PASSED] 62 VFs
[10:33:19] [PASSED] 63 VFs
[10:33:19] ================= [PASSED] fair_doorbells ==================
[10:33:19] ======================== fair_ggtt ========================
[10:33:19] [PASSED] 1 VF
[10:33:19] [PASSED] 2 VFs
[10:33:19] [PASSED] 3 VFs
[10:33:19] [PASSED] 4 VFs
[10:33:19] [PASSED] 5 VFs
[10:33:19] [PASSED] 6 VFs
[10:33:19] [PASSED] 7 VFs
[10:33:19] [PASSED] 8 VFs
[10:33:19] [PASSED] 9 VFs
[10:33:19] [PASSED] 10 VFs
[10:33:19] [PASSED] 11 VFs
[10:33:19] [PASSED] 12 VFs
[10:33:19] [PASSED] 13 VFs
[10:33:19] [PASSED] 14 VFs
[10:33:19] [PASSED] 15 VFs
[10:33:19] [PASSED] 16 VFs
[10:33:19] [PASSED] 17 VFs
[10:33:19] [PASSED] 18 VFs
[10:33:19] [PASSED] 19 VFs
[10:33:19] [PASSED] 20 VFs
[10:33:19] [PASSED] 21 VFs
[10:33:19] [PASSED] 22 VFs
[10:33:19] [PASSED] 23 VFs
[10:33:19] [PASSED] 24 VFs
[10:33:19] [PASSED] 25 VFs
[10:33:19] [PASSED] 26 VFs
[10:33:19] [PASSED] 27 VFs
[10:33:19] [PASSED] 28 VFs
[10:33:19] [PASSED] 29 VFs
[10:33:19] [PASSED] 30 VFs
[10:33:19] [PASSED] 31 VFs
[10:33:19] [PASSED] 32 VFs
[10:33:19] [PASSED] 33 VFs
[10:33:19] [PASSED] 34 VFs
[10:33:19] [PASSED] 35 VFs
[10:33:19] [PASSED] 36 VFs
[10:33:19] [PASSED] 37 VFs
[10:33:19] [PASSED] 38 VFs
[10:33:19] [PASSED] 39 VFs
[10:33:19] [PASSED] 40 VFs
[10:33:19] [PASSED] 41 VFs
[10:33:19] [PASSED] 42 VFs
[10:33:19] [PASSED] 43 VFs
[10:33:19] [PASSED] 44 VFs
[10:33:19] [PASSED] 45 VFs
[10:33:19] [PASSED] 46 VFs
[10:33:19] [PASSED] 47 VFs
[10:33:19] [PASSED] 48 VFs
[10:33:19] [PASSED] 49 VFs
[10:33:19] [PASSED] 50 VFs
[10:33:19] [PASSED] 51 VFs
[10:33:19] [PASSED] 52 VFs
[10:33:19] [PASSED] 53 VFs
[10:33:19] [PASSED] 54 VFs
[10:33:19] [PASSED] 55 VFs
[10:33:19] [PASSED] 56 VFs
[10:33:19] [PASSED] 57 VFs
[10:33:19] [PASSED] 58 VFs
[10:33:19] [PASSED] 59 VFs
[10:33:19] [PASSED] 60 VFs
[10:33:20] [PASSED] 61 VFs
[10:33:20] [PASSED] 62 VFs
[10:33:20] [PASSED] 63 VFs
[10:33:20] ==================== [PASSED] fair_ggtt ====================
[10:33:20] ======================== fair_vram ========================
[10:33:20] [PASSED] 1 VF
[10:33:20] [PASSED] 2 VFs
[10:33:20] [PASSED] 3 VFs
[10:33:20] [PASSED] 4 VFs
[10:33:20] [PASSED] 5 VFs
[10:33:20] [PASSED] 6 VFs
[10:33:20] [PASSED] 7 VFs
[10:33:20] [PASSED] 8 VFs
[10:33:20] [PASSED] 9 VFs
[10:33:20] [PASSED] 10 VFs
[10:33:20] [PASSED] 11 VFs
[10:33:20] [PASSED] 12 VFs
[10:33:20] [PASSED] 13 VFs
[10:33:20] [PASSED] 14 VFs
[10:33:20] [PASSED] 15 VFs
[10:33:20] [PASSED] 16 VFs
[10:33:20] [PASSED] 17 VFs
[10:33:20] [PASSED] 18 VFs
[10:33:20] [PASSED] 19 VFs
[10:33:20] [PASSED] 20 VFs
[10:33:20] [PASSED] 21 VFs
[10:33:20] [PASSED] 22 VFs
[10:33:20] [PASSED] 23 VFs
[10:33:20] [PASSED] 24 VFs
[10:33:20] [PASSED] 25 VFs
[10:33:20] [PASSED] 26 VFs
[10:33:20] [PASSED] 27 VFs
[10:33:20] [PASSED] 28 VFs
[10:33:20] [PASSED] 29 VFs
[10:33:20] [PASSED] 30 VFs
[10:33:20] [PASSED] 31 VFs
[10:33:20] [PASSED] 32 VFs
[10:33:20] [PASSED] 33 VFs
[10:33:20] [PASSED] 34 VFs
[10:33:20] [PASSED] 35 VFs
[10:33:20] [PASSED] 36 VFs
[10:33:20] [PASSED] 37 VFs
[10:33:20] [PASSED] 38 VFs
[10:33:20] [PASSED] 39 VFs
[10:33:20] [PASSED] 40 VFs
[10:33:20] [PASSED] 41 VFs
[10:33:20] [PASSED] 42 VFs
[10:33:20] [PASSED] 43 VFs
[10:33:20] [PASSED] 44 VFs
[10:33:20] [PASSED] 45 VFs
[10:33:20] [PASSED] 46 VFs
[10:33:20] [PASSED] 47 VFs
[10:33:20] [PASSED] 48 VFs
[10:33:20] [PASSED] 49 VFs
[10:33:20] [PASSED] 50 VFs
[10:33:20] [PASSED] 51 VFs
[10:33:20] [PASSED] 52 VFs
[10:33:20] [PASSED] 53 VFs
[10:33:20] [PASSED] 54 VFs
[10:33:20] [PASSED] 55 VFs
[10:33:20] [PASSED] 56 VFs
[10:33:20] [PASSED] 57 VFs
[10:33:20] [PASSED] 58 VFs
[10:33:20] [PASSED] 59 VFs
[10:33:20] [PASSED] 60 VFs
[10:33:20] [PASSED] 61 VFs
[10:33:20] [PASSED] 62 VFs
[10:33:20] [PASSED] 63 VFs
[10:33:20] ==================== [PASSED] fair_vram ====================
[10:33:20] ================== [PASSED] pf_gt_config ===================
[10:33:20] ===================== lmtt (1 subtest) =====================
[10:33:20] ======================== test_ops =========================
[10:33:20] [PASSED] 2-level
[10:33:20] [PASSED] multi-level
[10:33:20] ==================== [PASSED] test_ops =====================
[10:33:20] ====================== [PASSED] lmtt =======================
[10:33:20] ================= pf_service (11 subtests) =================
[10:33:20] [PASSED] pf_negotiate_any
[10:33:20] [PASSED] pf_negotiate_base_match
[10:33:20] [PASSED] pf_negotiate_base_newer
[10:33:20] [PASSED] pf_negotiate_base_next
[10:33:20] [SKIPPED] pf_negotiate_base_older
[10:33:20] [PASSED] pf_negotiate_base_prev
[10:33:20] [PASSED] pf_negotiate_latest_match
[10:33:20] [PASSED] pf_negotiate_latest_newer
[10:33:20] [PASSED] pf_negotiate_latest_next
[10:33:20] [SKIPPED] pf_negotiate_latest_older
[10:33:20] [SKIPPED] pf_negotiate_latest_prev
[10:33:20] =================== [PASSED] pf_service ====================
[10:33:20] ================= xe_guc_g2g (2 subtests) ==================
[10:33:20] ============== xe_live_guc_g2g_kunit_default ==============
[10:33:20] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[10:33:20] ============== xe_live_guc_g2g_kunit_allmem ===============
[10:33:20] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[10:33:20] =================== [SKIPPED] xe_guc_g2g ===================
[10:33:20] =================== xe_mocs (2 subtests) ===================
[10:33:20] ================ xe_live_mocs_kernel_kunit ================
[10:33:20] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[10:33:20] ================ xe_live_mocs_reset_kunit =================
[10:33:20] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[10:33:20] ==================== [SKIPPED] xe_mocs =====================
[10:33:20] ================= xe_migrate (2 subtests) ==================
[10:33:20] ================= xe_migrate_sanity_kunit =================
[10:33:20] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[10:33:20] ================== xe_validate_ccs_kunit ==================
[10:33:20] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[10:33:20] =================== [SKIPPED] xe_migrate ===================
[10:33:20] ================== xe_dma_buf (1 subtest) ==================
[10:33:20] ==================== xe_dma_buf_kunit =====================
[10:33:20] ================ [SKIPPED] xe_dma_buf_kunit ================
[10:33:20] =================== [SKIPPED] xe_dma_buf ===================
[10:33:20] ================= xe_bo_shrink (1 subtest) =================
[10:33:20] =================== xe_bo_shrink_kunit ====================
[10:33:20] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[10:33:20] ================== [SKIPPED] xe_bo_shrink ==================
[10:33:20] ==================== xe_bo (2 subtests) ====================
[10:33:20] ================== xe_ccs_migrate_kunit ===================
[10:33:20] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[10:33:20] ==================== xe_bo_evict_kunit ====================
[10:33:20] =============== [SKIPPED] xe_bo_evict_kunit ================
[10:33:20] ===================== [SKIPPED] xe_bo ======================
[10:33:20] ==================== args (13 subtests) ====================
[10:33:20] [PASSED] count_args_test
[10:33:20] [PASSED] call_args_example
[10:33:20] [PASSED] call_args_test
[10:33:20] [PASSED] drop_first_arg_example
[10:33:20] [PASSED] drop_first_arg_test
[10:33:20] [PASSED] first_arg_example
[10:33:20] [PASSED] first_arg_test
[10:33:20] [PASSED] last_arg_example
[10:33:20] [PASSED] last_arg_test
[10:33:20] [PASSED] pick_arg_example
[10:33:20] [PASSED] if_args_example
[10:33:20] [PASSED] if_args_test
[10:33:20] [PASSED] sep_comma_example
[10:33:20] ====================== [PASSED] args =======================
[10:33:20] =================== xe_pci (3 subtests) ====================
[10:33:20] ==================== check_graphics_ip ====================
[10:33:20] [PASSED] 12.00 Xe_LP
[10:33:20] [PASSED] 12.10 Xe_LP+
[10:33:20] [PASSED] 12.55 Xe_HPG
[10:33:20] [PASSED] 12.60 Xe_HPC
[10:33:20] [PASSED] 12.70 Xe_LPG
[10:33:20] [PASSED] 12.71 Xe_LPG
[10:33:20] [PASSED] 12.74 Xe_LPG+
[10:33:20] [PASSED] 20.01 Xe2_HPG
[10:33:20] [PASSED] 20.02 Xe2_HPG
[10:33:20] [PASSED] 20.04 Xe2_LPG
[10:33:20] [PASSED] 30.00 Xe3_LPG
[10:33:20] [PASSED] 30.01 Xe3_LPG
[10:33:20] [PASSED] 30.03 Xe3_LPG
[10:33:20] [PASSED] 30.04 Xe3_LPG
[10:33:20] [PASSED] 30.05 Xe3_LPG
[10:33:20] [PASSED] 35.10 Xe3p_LPG
[10:33:20] [PASSED] 35.11 Xe3p_XPC
[10:33:20] ================ [PASSED] check_graphics_ip ================
[10:33:20] ===================== check_media_ip ======================
[10:33:20] [PASSED] 12.00 Xe_M
[10:33:20] [PASSED] 12.55 Xe_HPM
[10:33:20] [PASSED] 13.00 Xe_LPM+
[10:33:20] [PASSED] 13.01 Xe2_HPM
[10:33:20] [PASSED] 20.00 Xe2_LPM
[10:33:20] [PASSED] 30.00 Xe3_LPM
[10:33:20] [PASSED] 30.02 Xe3_LPM
[10:33:20] [PASSED] 35.00 Xe3p_LPM
[10:33:20] [PASSED] 35.03 Xe3p_HPM
[10:33:20] ================= [PASSED] check_media_ip ==================
[10:33:20] =================== check_platform_desc ===================
[10:33:20] [PASSED] 0x9A60 (TIGERLAKE)
[10:33:20] [PASSED] 0x9A68 (TIGERLAKE)
[10:33:20] [PASSED] 0x9A70 (TIGERLAKE)
[10:33:20] [PASSED] 0x9A40 (TIGERLAKE)
[10:33:20] [PASSED] 0x9A49 (TIGERLAKE)
[10:33:20] [PASSED] 0x9A59 (TIGERLAKE)
[10:33:20] [PASSED] 0x9A78 (TIGERLAKE)
[10:33:20] [PASSED] 0x9AC0 (TIGERLAKE)
[10:33:20] [PASSED] 0x9AC9 (TIGERLAKE)
[10:33:20] [PASSED] 0x9AD9 (TIGERLAKE)
[10:33:20] [PASSED] 0x9AF8 (TIGERLAKE)
[10:33:20] [PASSED] 0x4C80 (ROCKETLAKE)
[10:33:20] [PASSED] 0x4C8A (ROCKETLAKE)
[10:33:20] [PASSED] 0x4C8B (ROCKETLAKE)
[10:33:20] [PASSED] 0x4C8C (ROCKETLAKE)
[10:33:20] [PASSED] 0x4C90 (ROCKETLAKE)
[10:33:20] [PASSED] 0x4C9A (ROCKETLAKE)
[10:33:20] [PASSED] 0x4680 (ALDERLAKE_S)
[10:33:20] [PASSED] 0x4682 (ALDERLAKE_S)
[10:33:20] [PASSED] 0x4688 (ALDERLAKE_S)
[10:33:20] [PASSED] 0x468A (ALDERLAKE_S)
[10:33:20] [PASSED] 0x468B (ALDERLAKE_S)
[10:33:20] [PASSED] 0x4690 (ALDERLAKE_S)
[10:33:20] [PASSED] 0x4692 (ALDERLAKE_S)
[10:33:20] [PASSED] 0x4693 (ALDERLAKE_S)
[10:33:20] [PASSED] 0x46A0 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46A1 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46A2 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46A3 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46A6 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46A8 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46AA (ALDERLAKE_P)
[10:33:20] [PASSED] 0x462A (ALDERLAKE_P)
[10:33:20] [PASSED] 0x4626 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x4628 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46B0 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46B1 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46B2 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46B3 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46C0 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46C1 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46C2 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46C3 (ALDERLAKE_P)
[10:33:20] [PASSED] 0x46D0 (ALDERLAKE_N)
[10:33:20] [PASSED] 0x46D1 (ALDERLAKE_N)
[10:33:20] [PASSED] 0x46D2 (ALDERLAKE_N)
[10:33:20] [PASSED] 0x46D3 (ALDERLAKE_N)
[10:33:20] [PASSED] 0x46D4 (ALDERLAKE_N)
[10:33:20] [PASSED] 0xA721 (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7A1 (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7A9 (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7AC (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7AD (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA720 (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7A0 (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7A8 (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7AA (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA7AB (ALDERLAKE_P)
[10:33:20] [PASSED] 0xA780 (ALDERLAKE_S)
[10:33:20] [PASSED] 0xA781 (ALDERLAKE_S)
[10:33:20] [PASSED] 0xA782 (ALDERLAKE_S)
[10:33:20] [PASSED] 0xA783 (ALDERLAKE_S)
[10:33:20] [PASSED] 0xA788 (ALDERLAKE_S)
[10:33:20] [PASSED] 0xA789 (ALDERLAKE_S)
[10:33:20] [PASSED] 0xA78A (ALDERLAKE_S)
[10:33:20] [PASSED] 0xA78B (ALDERLAKE_S)
[10:33:20] [PASSED] 0x4905 (DG1)
[10:33:20] [PASSED] 0x4906 (DG1)
[10:33:20] [PASSED] 0x4907 (DG1)
[10:33:20] [PASSED] 0x4908 (DG1)
[10:33:20] [PASSED] 0x4909 (DG1)
[10:33:20] [PASSED] 0x56C0 (DG2)
[10:33:20] [PASSED] 0x56C2 (DG2)
[10:33:20] [PASSED] 0x56C1 (DG2)
[10:33:20] [PASSED] 0x7D51 (METEORLAKE)
[10:33:20] [PASSED] 0x7DD1 (METEORLAKE)
[10:33:20] [PASSED] 0x7D41 (METEORLAKE)
[10:33:20] [PASSED] 0x7D67 (METEORLAKE)
[10:33:20] [PASSED] 0xB640 (METEORLAKE)
[10:33:20] [PASSED] 0x56A0 (DG2)
[10:33:20] [PASSED] 0x56A1 (DG2)
[10:33:20] [PASSED] 0x56A2 (DG2)
[10:33:20] [PASSED] 0x56BE (DG2)
[10:33:20] [PASSED] 0x56BF (DG2)
[10:33:20] [PASSED] 0x5690 (DG2)
[10:33:20] [PASSED] 0x5691 (DG2)
[10:33:20] [PASSED] 0x5692 (DG2)
[10:33:20] [PASSED] 0x56A5 (DG2)
[10:33:20] [PASSED] 0x56A6 (DG2)
[10:33:20] [PASSED] 0x56B0 (DG2)
[10:33:20] [PASSED] 0x56B1 (DG2)
[10:33:20] [PASSED] 0x56BA (DG2)
[10:33:20] [PASSED] 0x56BB (DG2)
[10:33:20] [PASSED] 0x56BC (DG2)
[10:33:20] [PASSED] 0x56BD (DG2)
[10:33:20] [PASSED] 0x5693 (DG2)
[10:33:20] [PASSED] 0x5694 (DG2)
[10:33:20] [PASSED] 0x5695 (DG2)
[10:33:20] [PASSED] 0x56A3 (DG2)
[10:33:20] [PASSED] 0x56A4 (DG2)
[10:33:20] [PASSED] 0x56B2 (DG2)
[10:33:20] [PASSED] 0x56B3 (DG2)
[10:33:20] [PASSED] 0x5696 (DG2)
[10:33:20] [PASSED] 0x5697 (DG2)
[10:33:20] [PASSED] 0xB69 (PVC)
[10:33:20] [PASSED] 0xB6E (PVC)
[10:33:20] [PASSED] 0xBD4 (PVC)
[10:33:20] [PASSED] 0xBD5 (PVC)
[10:33:20] [PASSED] 0xBD6 (PVC)
[10:33:20] [PASSED] 0xBD7 (PVC)
[10:33:20] [PASSED] 0xBD8 (PVC)
[10:33:20] [PASSED] 0xBD9 (PVC)
[10:33:20] [PASSED] 0xBDA (PVC)
[10:33:20] [PASSED] 0xBDB (PVC)
[10:33:20] [PASSED] 0xBE0 (PVC)
[10:33:20] [PASSED] 0xBE1 (PVC)
[10:33:20] [PASSED] 0xBE5 (PVC)
[10:33:20] [PASSED] 0x7D40 (METEORLAKE)
[10:33:20] [PASSED] 0x7D45 (METEORLAKE)
[10:33:20] [PASSED] 0x7D55 (METEORLAKE)
[10:33:20] [PASSED] 0x7D60 (METEORLAKE)
[10:33:20] [PASSED] 0x7DD5 (METEORLAKE)
[10:33:20] [PASSED] 0x6420 (LUNARLAKE)
[10:33:20] [PASSED] 0x64A0 (LUNARLAKE)
[10:33:20] [PASSED] 0x64B0 (LUNARLAKE)
[10:33:20] [PASSED] 0xE202 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE209 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE20B (BATTLEMAGE)
[10:33:20] [PASSED] 0xE20C (BATTLEMAGE)
[10:33:20] [PASSED] 0xE20D (BATTLEMAGE)
[10:33:20] [PASSED] 0xE210 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE211 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE212 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE216 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE220 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE221 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE222 (BATTLEMAGE)
[10:33:20] [PASSED] 0xE223 (BATTLEMAGE)
[10:33:20] [PASSED] 0xB080 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB081 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB082 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB083 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB084 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB085 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB086 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB087 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB08F (PANTHERLAKE)
[10:33:20] [PASSED] 0xB090 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB0A0 (PANTHERLAKE)
[10:33:20] [PASSED] 0xB0B0 (PANTHERLAKE)
[10:33:20] [PASSED] 0xFD80 (PANTHERLAKE)
[10:33:20] [PASSED] 0xFD81 (PANTHERLAKE)
[10:33:20] [PASSED] 0xD740 (NOVALAKE_S)
[10:33:20] [PASSED] 0xD741 (NOVALAKE_S)
[10:33:20] [PASSED] 0xD742 (NOVALAKE_S)
[10:33:20] [PASSED] 0xD743 (NOVALAKE_S)
[10:33:20] [PASSED] 0xD744 (NOVALAKE_S)
[10:33:20] [PASSED] 0xD745 (NOVALAKE_S)
[10:33:20] [PASSED] 0x674C (CRESCENTISLAND)
[10:33:20] [PASSED] 0x674D (CRESCENTISLAND)
[10:33:20] [PASSED] 0x674E (CRESCENTISLAND)
[10:33:20] [PASSED] 0x674F (CRESCENTISLAND)
[10:33:20] [PASSED] 0x6750 (CRESCENTISLAND)
[10:33:20] [PASSED] 0xD750 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD751 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD752 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD753 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD754 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD755 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD756 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD757 (NOVALAKE_P)
[10:33:20] [PASSED] 0xD75F (NOVALAKE_P)
[10:33:20] =============== [PASSED] check_platform_desc ===============
[10:33:20] ===================== [PASSED] xe_pci ======================
[10:33:20] ============= xe_rtp_tables_test (4 subtests) ==============
[10:33:20] ================== xe_rtp_table_gt_test ===================
[10:33:20] [PASSED] gt_was/14011060649
[10:33:20] [PASSED] gt_was/14011059788
[10:33:20] [PASSED] gt_was/14015795083
[10:33:20] [PASSED] gt_was/16021867713
[10:33:20] [PASSED] gt_was/14019449301
[10:33:20] [PASSED] gt_was/16028005424
[10:33:20] [PASSED] gt_was/14026578760
[10:33:20] [PASSED] gt_was/1409420604
[10:33:20] [PASSED] gt_was/1408615072
[10:33:20] [PASSED] gt_was/22010523718
[10:33:20] [PASSED] gt_was/14011006942
[10:33:20] [PASSED] gt_was/14014830051
[10:33:20] [PASSED] gt_was/18018781329
[10:33:20] [PASSED] gt_was/1509235366
[10:33:20] [PASSED] gt_was/18018781329
[10:33:20] [PASSED] gt_was/16016694945
[10:33:20] [PASSED] gt_was/14018575942
[10:33:20] [PASSED] gt_was/22016670082
[10:33:20] [PASSED] gt_was/22016670082
[10:33:20] [PASSED] gt_was/14017421178
[10:33:20] [PASSED] gt_was/16025250150
[10:33:20] [PASSED] gt_was/14021871409
[10:33:20] [PASSED] gt_was/16021865536
[10:33:20] [PASSED] gt_was/14021486841
[10:33:20] [PASSED] gt_was/14025160223
[10:33:20] [PASSED] gt_was/14026144927, 16029437861
[10:33:20] [PASSED] gt_was/14025635424
[10:33:20] [PASSED] gt_was/16028005424
[10:33:20] ============== [PASSED] xe_rtp_table_gt_test ===============
[10:33:20] ================== xe_rtp_table_gt_test ===================
[10:33:20] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[10:33:20] [PASSED] gt_tunings/Tuning: 32B Access Enable
[10:33:20] [PASSED] gt_tunings/Tuning: L3 cache
[10:33:20] [PASSED] gt_tunings/Tuning: L3 cache - media
[10:33:20] [PASSED] gt_tunings/Tuning: Compression Overfetch
[10:33:20] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[10:33:20] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[10:33:20] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[10:33:20] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[10:33:20] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[10:33:20] [PASSED] gt_tunings/Tuning: Stateless compression control
[10:33:20] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[10:33:20] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[10:33:20] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[10:33:20] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[10:33:20] ============== [PASSED] xe_rtp_table_gt_test ===============
[10:33:20] ================== xe_rtp_table_oob_test ==================
[10:33:20] [PASSED] oob_was/1607983814
[10:33:20] [PASSED] oob_was/16010904313
[10:33:20] [PASSED] oob_was/18022495364
[10:33:20] [PASSED] oob_was/22012773006
[10:33:20] [PASSED] oob_was/14014475959
[10:33:20] [PASSED] oob_was/22011391025
[10:33:20] [PASSED] oob_was/22012727170
[10:33:20] [PASSED] oob_was/22012727685
[10:33:20] [PASSED] oob_was/22016596838
[10:33:20] [PASSED] oob_was/18020744125
[10:33:20] [PASSED] oob_was/1409600907
[10:33:20] [PASSED] oob_was/22014953428
[10:33:20] [PASSED] oob_was/16017236439
[10:33:20] [PASSED] oob_was/14019821291
[10:33:20] [PASSED] oob_was/14015076503
[10:33:20] [PASSED] oob_was/14018913170
[10:33:20] [PASSED] oob_was/14018094691
[10:33:20] [PASSED] oob_was/18024947630
[10:33:20] [PASSED] oob_was/16022287689
[10:33:20] [PASSED] oob_was/13011645652
[10:33:20] [PASSED] oob_was/14022293748
[10:33:20] [PASSED] oob_was/22019794406
[10:33:20] [PASSED] oob_was/22019338487
[10:33:20] [PASSED] oob_was/16023588340
[10:33:20] [PASSED] oob_was/14019789679
[10:33:20] [PASSED] oob_was/14022866841
[10:33:20] [PASSED] oob_was/16021333562
[10:33:20] [PASSED] oob_was/14016712196
[10:33:20] [PASSED] oob_was/14015568240
[10:33:20] [PASSED] oob_was/18013179988
[10:33:20] [PASSED] oob_was/1508761755
[10:33:20] [PASSED] oob_was/16023105232
[10:33:20] [PASSED] oob_was/16026508708
[10:33:20] [PASSED] oob_was/14020001231
[10:33:20] [PASSED] oob_was/16023683509
[10:33:20] [PASSED] oob_was/14025515070
[10:33:20] [PASSED] oob_was/15015404425_disable
[10:33:20] [PASSED] oob_was/16026007364
[10:33:20] [PASSED] oob_was/14020316580
[10:33:20] [PASSED] oob_was/14025883347
[10:33:20] ============== [PASSED] xe_rtp_table_oob_test ==============
[10:33:20] ================ xe_rtp_table_dev_oob_test ================
[10:33:20] [PASSED] device_oob_was/22010954014
[10:33:20] [PASSED] device_oob_was/15015404425
[10:33:20] [PASSED] device_oob_was/22019338487_display
[10:33:20] [PASSED] device_oob_was/14022085890
[10:33:20] [PASSED] device_oob_was/14026539277
[10:33:20] [PASSED] device_oob_was/14026633728
[10:33:20] [PASSED] device_oob_was/14026746987
[10:33:20] [PASSED] device_oob_was/14026779378
[10:33:20] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[10:33:20] =============== [PASSED] xe_rtp_tables_test ================
[10:33:20] =================== xe_rtp (3 subtests) ====================
[10:33:20] =================== xe_rtp_rules_tests ====================
[10:33:20] [PASSED] no
[10:33:20] [PASSED] yes
[10:33:20] [PASSED] no-and-no
[10:33:20] [PASSED] no-and-yes
[10:33:20] [PASSED] yes-and-no
[10:33:20] [PASSED] yes-and-yes
[10:33:20] [PASSED] no-or-no
[10:33:20] [PASSED] no-or-yes
[10:33:20] [PASSED] yes-or-no
[10:33:20] [PASSED] yes-or-yes
[10:33:20] [PASSED] no-yes-or-yes-no
[10:33:20] [PASSED] no-yes-or-yes-yes
[10:33:20] [PASSED] yes-yes-or-no-yes
[10:33:20] [PASSED] yes-yes-or-yes-yes
[10:33:20] [PASSED] no-no-or-yes-or-no
[10:33:20] [PASSED] or
[10:33:20] [PASSED] or-yes
[10:33:20] [PASSED] or-no
[10:33:20] [PASSED] yes-or
[10:33:20] [PASSED] no-or
[10:33:20] [PASSED] no-or-or-yes
[10:33:20] [PASSED] yes-or-or-no
[10:33:20] [PASSED] no-or-or-no
[10:33:20] [PASSED] missing-context-engine-class
[10:33:20] [PASSED] missing-context-engine-class-or-yes
[10:33:20] [PASSED] missing-context-engine-class-or-or-yes
[10:33:20] =============== [PASSED] xe_rtp_rules_tests ================
[10:33:20] =============== xe_rtp_process_to_sr_tests ================
[10:33:20] [PASSED] coalesce-same-reg
[10:33:20] [PASSED] no-match-no-add
[10:33:20] [PASSED] two-regs-two-entries
[10:33:20] [PASSED] clr-one-set-other
[10:33:20] [PASSED] set-field
[10:33:20] [PASSED] conflict-duplicate
[10:33:20] [PASSED] conflict-not-disjoint
[10:33:20] [PASSED] conflict-reg-type
[10:33:20] [PASSED] bad-mcr-reg-forced-to-regular
[10:33:20] [PASSED] bad-regular-reg-forced-to-mcr
[10:33:20] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[10:33:20] ================== xe_rtp_process_tests ===================
[10:33:20] [PASSED] active1
[10:33:20] [PASSED] active2
[10:33:20] [PASSED] active-inactive
[10:33:20] [PASSED] inactive-active
[10:33:20] [PASSED] inactive-active-inactive
[10:33:20] [PASSED] inactive-inactive-inactive
[10:33:20] ============== [PASSED] xe_rtp_process_tests ===============
[10:33:20] ===================== [PASSED] xe_rtp ======================
[10:33:20] ==================== xe_wa (1 subtest) =====================
[10:33:20] ======================== xe_wa_gt =========================
[10:33:20] [PASSED] TIGERLAKE B0
[10:33:20] [PASSED] DG1 A0
[10:33:20] [PASSED] DG1 B0
[10:33:20] [PASSED] ALDERLAKE_S A0
[10:33:20] [PASSED] ALDERLAKE_S B0
[10:33:20] [PASSED] ALDERLAKE_S C0
[10:33:20] [PASSED] ALDERLAKE_S D0
[10:33:20] [PASSED] ALDERLAKE_P A0
[10:33:20] [PASSED] ALDERLAKE_P B0
[10:33:20] [PASSED] ALDERLAKE_P C0
[10:33:20] [PASSED] ALDERLAKE_S RPLS D0
[10:33:20] [PASSED] ALDERLAKE_P RPLU E0
[10:33:20] [PASSED] DG2 G10 C0
[10:33:20] [PASSED] DG2 G11 B1
[10:33:20] [PASSED] DG2 G12 A1
[10:33:20] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[10:33:20] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[10:33:20] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[10:33:20] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[10:33:20] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[10:33:20] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[10:33:20] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[10:33:20] ==================== [PASSED] xe_wa_gt =====================
[10:33:20] ====================== [PASSED] xe_wa ======================
[10:33:20] ============================================================
[10:33:20] Testing complete. Ran 715 tests: passed: 697, skipped: 18
[10:33:20] Elapsed time: 36.134s total, 4.276s configuring, 31.142s building, 0.687s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[10:33:20] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:33:22] 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
[10:33:46] Starting KUnit Kernel (1/1)...
[10:33:46] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:33:46] ============ drm_test_pick_cmdline (2 subtests) ============
[10:33:46] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[10:33:46] =============== drm_test_pick_cmdline_named ===============
[10:33:46] [PASSED] NTSC
[10:33:46] [PASSED] NTSC-J
[10:33:46] [PASSED] PAL
[10:33:46] [PASSED] PAL-M
[10:33:46] =========== [PASSED] drm_test_pick_cmdline_named ===========
[10:33:46] ============== [PASSED] drm_test_pick_cmdline ==============
[10:33:46] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[10:33:46] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[10:33:46] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[10:33:46] =========== drm_validate_clone_mode (2 subtests) ===========
[10:33:46] ============== drm_test_check_in_clone_mode ===============
[10:33:46] [PASSED] in_clone_mode
[10:33:46] [PASSED] not_in_clone_mode
[10:33:46] ========== [PASSED] drm_test_check_in_clone_mode ===========
[10:33:46] =============== drm_test_check_valid_clones ===============
[10:33:46] [PASSED] not_in_clone_mode
[10:33:46] [PASSED] valid_clone
[10:33:46] [PASSED] invalid_clone
[10:33:46] =========== [PASSED] drm_test_check_valid_clones ===========
[10:33:46] ============= [PASSED] drm_validate_clone_mode =============
[10:33:46] ============= drm_validate_modeset (1 subtest) =============
[10:33:46] [PASSED] drm_test_check_connector_changed_modeset
[10:33:46] ============== [PASSED] drm_validate_modeset ===============
[10:33:46] ====== drm_test_bridge_get_current_state (2 subtests) ======
[10:33:46] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[10:33:46] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[10:33:46] ======== [PASSED] drm_test_bridge_get_current_state ========
[10:33:46] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[10:33:46] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[10:33:46] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[10:33:46] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[10:33:46] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[10:33:46] ============== drm_bridge_alloc (2 subtests) ===============
[10:33:46] [PASSED] drm_test_drm_bridge_alloc_basic
[10:33:46] [PASSED] drm_test_drm_bridge_alloc_get_put
[10:33:46] ================ [PASSED] drm_bridge_alloc =================
[10:33:46] ============= drm_cmdline_parser (40 subtests) =============
[10:33:46] [PASSED] drm_test_cmdline_force_d_only
[10:33:46] [PASSED] drm_test_cmdline_force_D_only_dvi
[10:33:46] [PASSED] drm_test_cmdline_force_D_only_hdmi
[10:33:46] [PASSED] drm_test_cmdline_force_D_only_not_digital
[10:33:46] [PASSED] drm_test_cmdline_force_e_only
[10:33:46] [PASSED] drm_test_cmdline_res
[10:33:46] [PASSED] drm_test_cmdline_res_vesa
[10:33:46] [PASSED] drm_test_cmdline_res_vesa_rblank
[10:33:46] [PASSED] drm_test_cmdline_res_rblank
[10:33:46] [PASSED] drm_test_cmdline_res_bpp
[10:33:46] [PASSED] drm_test_cmdline_res_refresh
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[10:33:46] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[10:33:46] [PASSED] drm_test_cmdline_res_margins_force_on
[10:33:46] [PASSED] drm_test_cmdline_res_vesa_margins
[10:33:46] [PASSED] drm_test_cmdline_name
[10:33:46] [PASSED] drm_test_cmdline_name_bpp
[10:33:46] [PASSED] drm_test_cmdline_name_option
[10:33:46] [PASSED] drm_test_cmdline_name_bpp_option
[10:33:46] [PASSED] drm_test_cmdline_rotate_0
[10:33:46] [PASSED] drm_test_cmdline_rotate_90
[10:33:46] [PASSED] drm_test_cmdline_rotate_180
[10:33:46] [PASSED] drm_test_cmdline_rotate_270
[10:33:46] [PASSED] drm_test_cmdline_hmirror
[10:33:46] [PASSED] drm_test_cmdline_vmirror
[10:33:46] [PASSED] drm_test_cmdline_margin_options
[10:33:46] [PASSED] drm_test_cmdline_multiple_options
[10:33:46] [PASSED] drm_test_cmdline_bpp_extra_and_option
[10:33:46] [PASSED] drm_test_cmdline_extra_and_option
[10:33:46] [PASSED] drm_test_cmdline_freestanding_options
[10:33:46] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[10:33:46] [PASSED] drm_test_cmdline_panel_orientation
[10:33:46] ================ drm_test_cmdline_invalid =================
[10:33:46] [PASSED] margin_only
[10:33:46] [PASSED] interlace_only
[10:33:46] [PASSED] res_missing_x
[10:33:46] [PASSED] res_missing_y
[10:33:46] [PASSED] res_bad_y
[10:33:46] [PASSED] res_missing_y_bpp
[10:33:46] [PASSED] res_bad_bpp
[10:33:46] [PASSED] res_bad_refresh
[10:33:46] [PASSED] res_bpp_refresh_force_on_off
[10:33:46] [PASSED] res_invalid_mode
[10:33:46] [PASSED] res_bpp_wrong_place_mode
[10:33:46] [PASSED] name_bpp_refresh
[10:33:46] [PASSED] name_refresh
[10:33:46] [PASSED] name_refresh_wrong_mode
[10:33:46] [PASSED] name_refresh_invalid_mode
[10:33:46] [PASSED] rotate_multiple
[10:33:46] [PASSED] rotate_invalid_val
[10:33:46] [PASSED] rotate_truncated
[10:33:46] [PASSED] invalid_option
[10:33:46] [PASSED] invalid_tv_option
[10:33:46] [PASSED] truncated_tv_option
[10:33:46] ============ [PASSED] drm_test_cmdline_invalid =============
[10:33:46] =============== drm_test_cmdline_tv_options ===============
[10:33:46] [PASSED] NTSC
[10:33:46] [PASSED] NTSC_443
[10:33:46] [PASSED] NTSC_J
[10:33:46] [PASSED] PAL
[10:33:46] [PASSED] PAL_M
[10:33:46] [PASSED] PAL_N
[10:33:46] [PASSED] SECAM
[10:33:46] [PASSED] MONO_525
[10:33:46] [PASSED] MONO_625
[10:33:46] =========== [PASSED] drm_test_cmdline_tv_options ===========
[10:33:46] =============== [PASSED] drm_cmdline_parser ================
[10:33:46] ========== drmm_connector_hdmi_init (20 subtests) ==========
[10:33:46] [PASSED] drm_test_connector_hdmi_init_valid
[10:33:46] [PASSED] drm_test_connector_hdmi_init_bpc_8
[10:33:46] [PASSED] drm_test_connector_hdmi_init_bpc_10
[10:33:46] [PASSED] drm_test_connector_hdmi_init_bpc_12
[10:33:46] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[10:33:46] [PASSED] drm_test_connector_hdmi_init_bpc_null
[10:33:46] [PASSED] drm_test_connector_hdmi_init_formats_empty
[10:33:46] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[10:33:46] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[10:33:46] [PASSED] supported_formats=0x9 yuv420_allowed=1
[10:33:46] [PASSED] supported_formats=0x9 yuv420_allowed=0
[10:33:46] [PASSED] supported_formats=0x5 yuv420_allowed=1
[10:33:46] [PASSED] supported_formats=0x5 yuv420_allowed=0
[10:33:46] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[10:33:46] [PASSED] drm_test_connector_hdmi_init_null_ddc
[10:33:46] [PASSED] drm_test_connector_hdmi_init_null_product
[10:33:46] [PASSED] drm_test_connector_hdmi_init_null_vendor
[10:33:46] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[10:33:46] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[10:33:46] [PASSED] drm_test_connector_hdmi_init_product_valid
[10:33:46] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[10:33:46] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[10:33:46] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[10:33:46] ========= drm_test_connector_hdmi_init_type_valid =========
[10:33:46] [PASSED] HDMI-A
[10:33:46] [PASSED] HDMI-B
[10:33:46] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[10:33:46] ======== drm_test_connector_hdmi_init_type_invalid ========
[10:33:46] [PASSED] Unknown
[10:33:46] [PASSED] VGA
[10:33:46] [PASSED] DVI-I
[10:33:46] [PASSED] DVI-D
[10:33:46] [PASSED] DVI-A
[10:33:46] [PASSED] Composite
[10:33:46] [PASSED] SVIDEO
[10:33:46] [PASSED] LVDS
[10:33:46] [PASSED] Component
[10:33:46] [PASSED] DIN
[10:33:46] [PASSED] DP
[10:33:46] [PASSED] TV
[10:33:46] [PASSED] eDP
[10:33:46] [PASSED] Virtual
[10:33:46] [PASSED] DSI
[10:33:46] [PASSED] DPI
[10:33:46] [PASSED] Writeback
[10:33:46] [PASSED] SPI
[10:33:46] [PASSED] USB
[10:33:46] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[10:33:46] ============ [PASSED] drmm_connector_hdmi_init =============
[10:33:46] ============= drmm_connector_init (3 subtests) =============
[10:33:46] [PASSED] drm_test_drmm_connector_init
[10:33:46] [PASSED] drm_test_drmm_connector_init_null_ddc
[10:33:46] ========= drm_test_drmm_connector_init_type_valid =========
[10:33:46] [PASSED] Unknown
[10:33:46] [PASSED] VGA
[10:33:46] [PASSED] DVI-I
[10:33:46] [PASSED] DVI-D
[10:33:46] [PASSED] DVI-A
[10:33:46] [PASSED] Composite
[10:33:46] [PASSED] SVIDEO
[10:33:46] [PASSED] LVDS
[10:33:46] [PASSED] Component
[10:33:46] [PASSED] DIN
[10:33:46] [PASSED] DP
[10:33:46] [PASSED] HDMI-A
[10:33:46] [PASSED] HDMI-B
[10:33:46] [PASSED] TV
[10:33:46] [PASSED] eDP
[10:33:46] [PASSED] Virtual
[10:33:46] [PASSED] DSI
[10:33:46] [PASSED] DPI
[10:33:46] [PASSED] Writeback
[10:33:46] [PASSED] SPI
[10:33:46] [PASSED] USB
[10:33:46] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[10:33:46] =============== [PASSED] drmm_connector_init ===============
[10:33:46] ========= drm_connector_dynamic_init (6 subtests) ==========
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_init
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_init_properties
[10:33:46] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[10:33:46] [PASSED] Unknown
[10:33:46] [PASSED] VGA
[10:33:46] [PASSED] DVI-I
[10:33:46] [PASSED] DVI-D
[10:33:46] [PASSED] DVI-A
[10:33:46] [PASSED] Composite
[10:33:46] [PASSED] SVIDEO
[10:33:46] [PASSED] LVDS
[10:33:46] [PASSED] Component
[10:33:46] [PASSED] DIN
[10:33:46] [PASSED] DP
[10:33:46] [PASSED] HDMI-A
[10:33:46] [PASSED] HDMI-B
[10:33:46] [PASSED] TV
[10:33:46] [PASSED] eDP
[10:33:46] [PASSED] Virtual
[10:33:46] [PASSED] DSI
[10:33:46] [PASSED] DPI
[10:33:46] [PASSED] Writeback
[10:33:46] [PASSED] SPI
[10:33:46] [PASSED] USB
[10:33:46] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[10:33:46] ======== drm_test_drm_connector_dynamic_init_name =========
[10:33:46] [PASSED] Unknown
[10:33:46] [PASSED] VGA
[10:33:46] [PASSED] DVI-I
[10:33:46] [PASSED] DVI-D
[10:33:46] [PASSED] DVI-A
[10:33:46] [PASSED] Composite
[10:33:46] [PASSED] SVIDEO
[10:33:46] [PASSED] LVDS
[10:33:46] [PASSED] Component
[10:33:46] [PASSED] DIN
[10:33:46] [PASSED] DP
[10:33:46] [PASSED] HDMI-A
[10:33:46] [PASSED] HDMI-B
[10:33:46] [PASSED] TV
[10:33:46] [PASSED] eDP
[10:33:46] [PASSED] Virtual
[10:33:46] [PASSED] DSI
[10:33:46] [PASSED] DPI
[10:33:46] [PASSED] Writeback
[10:33:46] [PASSED] SPI
[10:33:46] [PASSED] USB
[10:33:46] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[10:33:46] =========== [PASSED] drm_connector_dynamic_init ============
[10:33:46] ==== drm_connector_dynamic_register_early (4 subtests) =====
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[10:33:46] ====== [PASSED] drm_connector_dynamic_register_early =======
[10:33:46] ======= drm_connector_dynamic_register (7 subtests) ========
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[10:33:46] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[10:33:46] ========= [PASSED] drm_connector_dynamic_register ==========
[10:33:46] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[10:33:46] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[10:33:46] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[10:33:46] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[10:33:46] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[10:33:46] ========== drm_test_get_tv_mode_from_name_valid ===========
[10:33:46] [PASSED] NTSC
[10:33:46] [PASSED] NTSC-443
[10:33:46] [PASSED] NTSC-J
[10:33:46] [PASSED] PAL
[10:33:46] [PASSED] PAL-M
[10:33:46] [PASSED] PAL-N
[10:33:46] [PASSED] SECAM
[10:33:46] [PASSED] Mono
[10:33:46] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[10:33:46] [PASSED] drm_test_get_tv_mode_from_name_truncated
[10:33:46] ============ [PASSED] drm_get_tv_mode_from_name ============
[10:33:46] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[10:33:46] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[10:33:46] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[10:33:46] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[10:33:46] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[10:33:46] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[10:33:46] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[10:33:46] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[10:33:46] [PASSED] VIC 96
[10:33:46] [PASSED] VIC 97
[10:33:46] [PASSED] VIC 101
[10:33:46] [PASSED] VIC 102
[10:33:46] [PASSED] VIC 106
[10:33:46] [PASSED] VIC 107
[10:33:46] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[10:33:46] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[10:33:46] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[10:33:46] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[10:33:46] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[10:33:46] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[10:33:46] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[10:33:46] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[10:33:46] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[10:33:46] [PASSED] Automatic
[10:33:46] [PASSED] Full
[10:33:46] [PASSED] Limited 16:235
[10:33:46] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[10:33:46] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[10:33:46] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[10:33:46] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[10:33:46] === drm_test_drm_hdmi_connector_get_output_format_name ====
[10:33:46] [PASSED] RGB
[10:33:46] [PASSED] YUV 4:2:0
[10:33:46] [PASSED] YUV 4:2:2
[10:33:46] [PASSED] YUV 4:4:4
[10:33:46] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[10:33:46] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[10:33:46] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[10:33:46] ============= drm_damage_helper (21 subtests) ==============
[10:33:46] [PASSED] drm_test_damage_iter_no_damage
[10:33:46] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[10:33:46] [PASSED] drm_test_damage_iter_no_damage_src_moved
[10:33:46] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[10:33:46] [PASSED] drm_test_damage_iter_no_damage_not_visible
[10:33:46] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[10:33:46] [PASSED] drm_test_damage_iter_no_damage_no_fb
[10:33:46] [PASSED] drm_test_damage_iter_simple_damage
[10:33:46] [PASSED] drm_test_damage_iter_single_damage
[10:33:46] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[10:33:46] [PASSED] drm_test_damage_iter_single_damage_outside_src
[10:33:46] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[10:33:46] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[10:33:46] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[10:33:46] [PASSED] drm_test_damage_iter_single_damage_src_moved
[10:33:46] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[10:33:46] [PASSED] drm_test_damage_iter_damage
[10:33:46] [PASSED] drm_test_damage_iter_damage_one_intersect
[10:33:46] [PASSED] drm_test_damage_iter_damage_one_outside
[10:33:46] [PASSED] drm_test_damage_iter_damage_src_moved
[10:33:46] [PASSED] drm_test_damage_iter_damage_not_visible
[10:33:46] ================ [PASSED] drm_damage_helper ================
[10:33:46] ============== drm_dp_mst_helper (3 subtests) ==============
[10:33:46] ============== drm_test_dp_mst_calc_pbn_mode ==============
[10:33:46] [PASSED] Clock 154000 BPP 30 DSC disabled
[10:33:46] [PASSED] Clock 234000 BPP 30 DSC disabled
[10:33:46] [PASSED] Clock 297000 BPP 24 DSC disabled
[10:33:46] [PASSED] Clock 332880 BPP 24 DSC enabled
[10:33:46] [PASSED] Clock 324540 BPP 24 DSC enabled
[10:33:46] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[10:33:46] ============== drm_test_dp_mst_calc_pbn_div ===============
[10:33:46] [PASSED] Link rate 2000000 lane count 4
[10:33:46] [PASSED] Link rate 2000000 lane count 2
[10:33:46] [PASSED] Link rate 2000000 lane count 1
[10:33:46] [PASSED] Link rate 1350000 lane count 4
[10:33:46] [PASSED] Link rate 1350000 lane count 2
[10:33:46] [PASSED] Link rate 1350000 lane count 1
[10:33:46] [PASSED] Link rate 1000000 lane count 4
[10:33:46] [PASSED] Link rate 1000000 lane count 2
[10:33:46] [PASSED] Link rate 1000000 lane count 1
[10:33:46] [PASSED] Link rate 810000 lane count 4
[10:33:46] [PASSED] Link rate 810000 lane count 2
[10:33:46] [PASSED] Link rate 810000 lane count 1
[10:33:46] [PASSED] Link rate 540000 lane count 4
[10:33:46] [PASSED] Link rate 540000 lane count 2
[10:33:46] [PASSED] Link rate 540000 lane count 1
[10:33:46] [PASSED] Link rate 270000 lane count 4
[10:33:46] [PASSED] Link rate 270000 lane count 2
[10:33:46] [PASSED] Link rate 270000 lane count 1
[10:33:46] [PASSED] Link rate 162000 lane count 4
[10:33:46] [PASSED] Link rate 162000 lane count 2
[10:33:46] [PASSED] Link rate 162000 lane count 1
[10:33:46] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[10:33:46] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[10:33:46] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[10:33:46] [PASSED] DP_POWER_UP_PHY with port number
[10:33:46] [PASSED] DP_POWER_DOWN_PHY with port number
[10:33:46] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[10:33:46] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[10:33:46] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[10:33:46] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[10:33:46] [PASSED] DP_QUERY_PAYLOAD with port number
[10:33:46] [PASSED] DP_QUERY_PAYLOAD with VCPI
[10:33:46] [PASSED] DP_REMOTE_DPCD_READ with port number
[10:33:46] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[10:33:46] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[10:33:46] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[10:33:46] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[10:33:46] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[10:33:46] [PASSED] DP_REMOTE_I2C_READ with port number
[10:33:46] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[10:33:46] [PASSED] DP_REMOTE_I2C_READ with transactions array
[10:33:46] [PASSED] DP_REMOTE_I2C_WRITE with port number
[10:33:46] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[10:33:46] [PASSED] DP_REMOTE_I2C_WRITE with data array
[10:33:46] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[10:33:46] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[10:33:46] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[10:33:46] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[10:33:46] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[10:33:46] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[10:33:46] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[10:33:46] ================ [PASSED] drm_dp_mst_helper ================
[10:33:46] ================== drm_exec (7 subtests) ===================
[10:33:46] [PASSED] sanitycheck
[10:33:46] [PASSED] test_lock
[10:33:46] [PASSED] test_lock_unlock
[10:33:46] [PASSED] test_duplicates
[10:33:46] [PASSED] test_prepare
[10:33:46] [PASSED] test_prepare_array
[10:33:46] [PASSED] test_multiple_loops
[10:33:46] ==================== [PASSED] drm_exec =====================
[10:33:46] =========== drm_format_helper_test (17 subtests) ===========
[10:33:46] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[10:33:46] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[10:33:46] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[10:33:46] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[10:33:46] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[10:33:46] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[10:33:46] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[10:33:46] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[10:33:46] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[10:33:46] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[10:33:46] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[10:33:46] ============== drm_test_fb_xrgb8888_to_mono ===============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[10:33:46] ==================== drm_test_fb_swab =====================
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ================ [PASSED] drm_test_fb_swab =================
[10:33:46] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[10:33:46] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[10:33:46] [PASSED] single_pixel_source_buffer
[10:33:46] [PASSED] single_pixel_clip_rectangle
[10:33:46] [PASSED] well_known_colors
[10:33:46] [PASSED] destination_pitch
[10:33:46] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[10:33:46] ================= drm_test_fb_clip_offset =================
[10:33:46] [PASSED] pass through
[10:33:46] [PASSED] horizontal offset
[10:33:46] [PASSED] vertical offset
[10:33:46] [PASSED] horizontal and vertical offset
[10:33:46] [PASSED] horizontal offset (custom pitch)
[10:33:46] [PASSED] vertical offset (custom pitch)
[10:33:46] [PASSED] horizontal and vertical offset (custom pitch)
[10:33:46] ============= [PASSED] drm_test_fb_clip_offset =============
[10:33:46] =================== drm_test_fb_memcpy ====================
[10:33:46] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[10:33:46] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[10:33:46] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[10:33:46] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[10:33:46] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[10:33:46] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[10:33:46] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[10:33:46] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[10:33:46] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[10:33:46] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[10:33:46] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[10:33:46] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[10:33:46] =============== [PASSED] drm_test_fb_memcpy ================
[10:33:46] ============= [PASSED] drm_format_helper_test ==============
[10:33:46] ================= drm_format (18 subtests) =================
[10:33:46] [PASSED] drm_test_format_block_width_invalid
[10:33:46] [PASSED] drm_test_format_block_width_one_plane
[10:33:46] [PASSED] drm_test_format_block_width_two_plane
[10:33:46] [PASSED] drm_test_format_block_width_three_plane
[10:33:46] [PASSED] drm_test_format_block_width_tiled
[10:33:46] [PASSED] drm_test_format_block_height_invalid
[10:33:46] [PASSED] drm_test_format_block_height_one_plane
[10:33:46] [PASSED] drm_test_format_block_height_two_plane
[10:33:46] [PASSED] drm_test_format_block_height_three_plane
[10:33:46] [PASSED] drm_test_format_block_height_tiled
[10:33:46] [PASSED] drm_test_format_min_pitch_invalid
[10:33:46] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[10:33:46] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[10:33:46] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[10:33:46] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[10:33:46] [PASSED] drm_test_format_min_pitch_two_plane
[10:33:46] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[10:33:46] [PASSED] drm_test_format_min_pitch_tiled
[10:33:46] =================== [PASSED] drm_format ====================
[10:33:46] ============== drm_framebuffer (10 subtests) ===============
[10:33:46] ========== drm_test_framebuffer_check_src_coords ==========
[10:33:46] [PASSED] Success: source fits into fb
[10:33:46] [PASSED] Fail: overflowing fb with x-axis coordinate
[10:33:46] [PASSED] Fail: overflowing fb with y-axis coordinate
[10:33:46] [PASSED] Fail: overflowing fb with source width
[10:33:46] [PASSED] Fail: overflowing fb with source height
[10:33:46] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[10:33:46] [PASSED] drm_test_framebuffer_cleanup
[10:33:46] =============== drm_test_framebuffer_create ===============
[10:33:46] [PASSED] ABGR8888 normal sizes
[10:33:46] [PASSED] ABGR8888 max sizes
[10:33:46] [PASSED] ABGR8888 pitch greater than min required
[10:33:46] [PASSED] ABGR8888 pitch less than min required
[10:33:46] [PASSED] ABGR8888 Invalid width
[10:33:46] [PASSED] ABGR8888 Invalid buffer handle
[10:33:46] [PASSED] No pixel format
[10:33:46] [PASSED] ABGR8888 Width 0
[10:33:46] [PASSED] ABGR8888 Height 0
[10:33:46] [PASSED] ABGR8888 Out of bound height * pitch combination
[10:33:46] [PASSED] ABGR8888 Large buffer offset
[10:33:46] [PASSED] ABGR8888 Buffer offset for inexistent plane
[10:33:46] [PASSED] ABGR8888 Invalid flag
[10:33:46] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[10:33:46] [PASSED] ABGR8888 Valid buffer modifier
[10:33:46] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[10:33:46] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[10:33:46] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[10:33:46] [PASSED] NV12 Normal sizes
[10:33:46] [PASSED] NV12 Max sizes
[10:33:46] [PASSED] NV12 Invalid pitch
[10:33:46] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[10:33:46] [PASSED] NV12 different modifier per-plane
[10:33:46] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[10:33:46] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[10:33:46] [PASSED] NV12 Modifier for inexistent plane
[10:33:46] [PASSED] NV12 Handle for inexistent plane
[10:33:46] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[10:33:46] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[10:33:46] [PASSED] YVU420 Normal sizes
[10:33:46] [PASSED] YVU420 Max sizes
[10:33:46] [PASSED] YVU420 Invalid pitch
[10:33:46] [PASSED] YVU420 Different pitches
[10:33:46] [PASSED] YVU420 Different buffer offsets/pitches
[10:33:46] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[10:33:46] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[10:33:46] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[10:33:46] [PASSED] YVU420 Valid modifier
[10:33:46] [PASSED] YVU420 Different modifiers per plane
[10:33:46] [PASSED] YVU420 Modifier for inexistent plane
[10:33:46] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[10:33:46] [PASSED] X0L2 Normal sizes
[10:33:46] [PASSED] X0L2 Max sizes
[10:33:46] [PASSED] X0L2 Invalid pitch
[10:33:46] [PASSED] X0L2 Pitch greater than minimum required
[10:33:46] [PASSED] X0L2 Handle for inexistent plane
[10:33:46] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[10:33:46] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[10:33:46] [PASSED] X0L2 Valid modifier
[10:33:46] [PASSED] X0L2 Modifier for inexistent plane
[10:33:46] =========== [PASSED] drm_test_framebuffer_create ===========
[10:33:46] [PASSED] drm_test_framebuffer_free
[10:33:46] [PASSED] drm_test_framebuffer_init
[10:33:46] [PASSED] drm_test_framebuffer_init_bad_format
[10:33:46] [PASSED] drm_test_framebuffer_init_dev_mismatch
[10:33:46] [PASSED] drm_test_framebuffer_lookup
[10:33:46] [PASSED] drm_test_framebuffer_lookup_inexistent
[10:33:46] [PASSED] drm_test_framebuffer_modifiers_not_supported
[10:33:46] ================= [PASSED] drm_framebuffer =================
[10:33:46] ================ drm_gem_shmem (8 subtests) ================
[10:33:46] [PASSED] drm_gem_shmem_test_obj_create
[10:33:46] [PASSED] drm_gem_shmem_test_obj_create_private
[10:33:46] [PASSED] drm_gem_shmem_test_pin_pages
[10:33:46] [PASSED] drm_gem_shmem_test_vmap
[10:33:46] [PASSED] drm_gem_shmem_test_get_sg_table
[10:33:46] [PASSED] drm_gem_shmem_test_get_pages_sgt
[10:33:46] [PASSED] drm_gem_shmem_test_madvise
[10:33:46] [PASSED] drm_gem_shmem_test_purge
[10:33:46] ================== [PASSED] drm_gem_shmem ==================
[10:33:46] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[10:33:46] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[10:33:46] [PASSED] Automatic
[10:33:46] [PASSED] Full
[10:33:46] [PASSED] Limited 16:235
[10:33:46] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[10:33:46] [PASSED] drm_test_check_disable_connector
[10:33:46] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[10:33:46] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[10:33:46] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[10:33:46] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[10:33:46] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[10:33:46] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[10:33:46] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[10:33:46] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[10:33:46] [PASSED] drm_test_check_output_bpc_dvi
[10:33:46] [PASSED] drm_test_check_output_bpc_format_vic_1
[10:33:46] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[10:33:46] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[10:33:46] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[10:33:46] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[10:33:46] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[10:33:46] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[10:33:46] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[10:33:46] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[10:33:46] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[10:33:46] [PASSED] drm_test_check_broadcast_rgb_value
[10:33:46] [PASSED] drm_test_check_bpc_8_value
[10:33:46] [PASSED] drm_test_check_bpc_10_value
[10:33:46] [PASSED] drm_test_check_bpc_12_value
[10:33:46] [PASSED] drm_test_check_format_value
[10:33:46] [PASSED] drm_test_check_tmds_char_value
[10:33:46] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[10:33:46] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[10:33:46] [PASSED] drm_test_check_mode_valid
[10:33:46] [PASSED] drm_test_check_mode_valid_reject
[10:33:46] [PASSED] drm_test_check_mode_valid_reject_rate
[10:33:46] [PASSED] drm_test_check_mode_valid_reject_max_clock
[10:33:46] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[10:33:46] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[10:33:46] [PASSED] drm_test_check_infoframes
[10:33:46] [PASSED] drm_test_check_reject_avi_infoframe
[10:33:46] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[10:33:46] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[10:33:46] [PASSED] drm_test_check_reject_audio_infoframe
[10:33:46] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[10:33:46] ================= drm_managed (2 subtests) =================
[10:33:46] [PASSED] drm_test_managed_release_action
[10:33:46] [PASSED] drm_test_managed_run_action
[10:33:46] =================== [PASSED] drm_managed ===================
[10:33:46] =================== drm_mm (6 subtests) ====================
[10:33:46] [PASSED] drm_test_mm_init
[10:33:46] [PASSED] drm_test_mm_debug
[10:33:46] [PASSED] drm_test_mm_align32
[10:33:46] [PASSED] drm_test_mm_align64
[10:33:46] [PASSED] drm_test_mm_lowest
[10:33:46] [PASSED] drm_test_mm_highest
[10:33:46] ===================== [PASSED] drm_mm ======================
[10:33:46] ============= drm_modes_analog_tv (5 subtests) =============
[10:33:46] [PASSED] drm_test_modes_analog_tv_mono_576i
[10:33:46] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[10:33:46] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[10:33:46] [PASSED] drm_test_modes_analog_tv_pal_576i
[10:33:46] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[10:33:46] =============== [PASSED] drm_modes_analog_tv ===============
[10:33:46] ============== drm_plane_helper (2 subtests) ===============
[10:33:46] =============== drm_test_check_plane_state ================
[10:33:46] [PASSED] clipping_simple
[10:33:46] [PASSED] clipping_rotate_reflect
[10:33:46] [PASSED] positioning_simple
[10:33:46] [PASSED] upscaling
[10:33:46] [PASSED] downscaling
[10:33:46] [PASSED] rounding1
[10:33:46] [PASSED] rounding2
[10:33:46] [PASSED] rounding3
[10:33:46] [PASSED] rounding4
[10:33:46] =========== [PASSED] drm_test_check_plane_state ============
[10:33:46] =========== drm_test_check_invalid_plane_state ============
[10:33:46] [PASSED] positioning_invalid
[10:33:46] [PASSED] upscaling_invalid
[10:33:46] [PASSED] downscaling_invalid
[10:33:46] ======= [PASSED] drm_test_check_invalid_plane_state ========
[10:33:46] ================ [PASSED] drm_plane_helper =================
[10:33:46] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[10:33:46] ====== drm_test_connector_helper_tv_get_modes_check =======
[10:33:46] [PASSED] None
[10:33:46] [PASSED] PAL
[10:33:46] [PASSED] NTSC
[10:33:46] [PASSED] Both, NTSC Default
[10:33:46] [PASSED] Both, PAL Default
[10:33:46] [PASSED] Both, NTSC Default, with PAL on command-line
[10:33:46] [PASSED] Both, PAL Default, with NTSC on command-line
[10:33:46] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[10:33:46] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[10:33:46] ================== drm_rect (9 subtests) ===================
[10:33:46] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[10:33:46] [PASSED] drm_test_rect_clip_scaled_not_clipped
[10:33:46] [PASSED] drm_test_rect_clip_scaled_clipped
[10:33:46] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[10:33:46] ================= drm_test_rect_intersect =================
[10:33:46] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[10:33:46] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[10:33:46] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[10:33:46] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[10:33:46] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[10:33:46] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[10:33:46] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[10:33:46] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[10:33:46] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[10:33:46] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[10:33:46] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[10:33:46] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[10:33:46] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[10:33:46] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[10:33:46] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[10:33:46] ============= [PASSED] drm_test_rect_intersect =============
[10:33:46] ================ drm_test_rect_calc_hscale ================
[10:33:46] [PASSED] normal use
[10:33:46] [PASSED] out of max range
[10:33:46] [PASSED] out of min range
[10:33:46] [PASSED] zero dst
[10:33:46] [PASSED] negative src
[10:33:46] [PASSED] negative dst
[10:33:46] ============ [PASSED] drm_test_rect_calc_hscale ============
[10:33:46] ================ drm_test_rect_calc_vscale ================
[10:33:46] [PASSED] normal use
[10:33:46] [PASSED] out of max range
[10:33:46] [PASSED] out of min range
[10:33:46] [PASSED] zero dst
[10:33:46] [PASSED] negative src
[10:33:46] [PASSED] negative dst
[10:33:46] ============ [PASSED] drm_test_rect_calc_vscale ============
[10:33:46] ================== drm_test_rect_rotate ===================
[10:33:46] [PASSED] reflect-x
[10:33:46] [PASSED] reflect-y
[10:33:46] [PASSED] rotate-0
[10:33:46] [PASSED] rotate-90
[10:33:46] [PASSED] rotate-180
[10:33:46] [PASSED] rotate-270
[10:33:46] ============== [PASSED] drm_test_rect_rotate ===============
[10:33:46] ================ drm_test_rect_rotate_inv =================
[10:33:46] [PASSED] reflect-x
[10:33:46] [PASSED] reflect-y
[10:33:46] [PASSED] rotate-0
[10:33:46] [PASSED] rotate-90
[10:33:46] [PASSED] rotate-180
[10:33:46] [PASSED] rotate-270
[10:33:46] ============ [PASSED] drm_test_rect_rotate_inv =============
[10:33:46] ==================== [PASSED] drm_rect =====================
[10:33:46] ============ drm_sysfb_modeset_test (1 subtest) ============
[10:33:46] ============ drm_test_sysfb_build_fourcc_list =============
[10:33:46] [PASSED] no native formats
[10:33:46] [PASSED] XRGB8888 as native format
[10:33:46] [PASSED] remove duplicates
[10:33:46] [PASSED] convert alpha formats
[10:33:46] [PASSED] random formats
[10:33:46] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[10:33:46] ============= [PASSED] drm_sysfb_modeset_test ==============
[10:33:46] ================== drm_fixp (2 subtests) ===================
[10:33:46] [PASSED] drm_test_int2fixp
[10:33:46] [PASSED] drm_test_sm2fixp
[10:33:46] ==================== [PASSED] drm_fixp =====================
[10:33:46] ============================================================
[10:33:46] Testing complete. Ran 621 tests: passed: 621
[10:33:46] Elapsed time: 25.962s total, 1.756s configuring, 24.041s building, 0.139s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[10:33:46] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:33:48] 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
[10:33:57] Starting KUnit Kernel (1/1)...
[10:33:57] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:33:57] ================= ttm_device (5 subtests) ==================
[10:33:57] [PASSED] ttm_device_init_basic
[10:33:57] [PASSED] ttm_device_init_multiple
[10:33:57] [PASSED] ttm_device_fini_basic
[10:33:57] [PASSED] ttm_device_init_no_vma_man
[10:33:57] ================== ttm_device_init_pools ==================
[10:33:57] [PASSED] No DMA allocations, no DMA32 required
[10:33:57] [PASSED] DMA allocations, DMA32 required
[10:33:57] [PASSED] No DMA allocations, DMA32 required
[10:33:57] [PASSED] DMA allocations, no DMA32 required
[10:33:57] ============== [PASSED] ttm_device_init_pools ==============
[10:33:57] =================== [PASSED] ttm_device ====================
[10:33:57] ================== ttm_pool (8 subtests) ===================
[10:33:57] ================== ttm_pool_alloc_basic ===================
[10:33:57] [PASSED] One page
[10:33:57] [PASSED] More than one page
[10:33:57] [PASSED] Above the allocation limit
[10:33:57] [PASSED] One page, with coherent DMA mappings enabled
[10:33:57] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[10:33:57] ============== [PASSED] ttm_pool_alloc_basic ===============
[10:33:57] ============== ttm_pool_alloc_basic_dma_addr ==============
[10:33:57] [PASSED] One page
[10:33:57] [PASSED] More than one page
[10:33:57] [PASSED] Above the allocation limit
[10:33:57] [PASSED] One page, with coherent DMA mappings enabled
[10:33:57] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[10:33:57] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[10:33:57] [PASSED] ttm_pool_alloc_order_caching_match
[10:33:57] [PASSED] ttm_pool_alloc_caching_mismatch
[10:33:57] [PASSED] ttm_pool_alloc_order_mismatch
[10:33:57] [PASSED] ttm_pool_free_dma_alloc
[10:33:57] [PASSED] ttm_pool_free_no_dma_alloc
[10:33:57] [PASSED] ttm_pool_fini_basic
[10:33:57] ==================== [PASSED] ttm_pool =====================
[10:33:57] ================ ttm_resource (8 subtests) =================
[10:33:57] ================= ttm_resource_init_basic =================
[10:33:57] [PASSED] Init resource in TTM_PL_SYSTEM
[10:33:57] [PASSED] Init resource in TTM_PL_VRAM
[10:33:57] [PASSED] Init resource in a private placement
[10:33:57] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[10:33:57] ============= [PASSED] ttm_resource_init_basic =============
[10:33:57] [PASSED] ttm_resource_init_pinned
[10:33:57] [PASSED] ttm_resource_fini_basic
[10:33:57] [PASSED] ttm_resource_manager_init_basic
[10:33:57] [PASSED] ttm_resource_manager_usage_basic
[10:33:57] [PASSED] ttm_resource_manager_set_used_basic
[10:33:57] [PASSED] ttm_sys_man_alloc_basic
[10:33:57] [PASSED] ttm_sys_man_free_basic
[10:33:57] ================== [PASSED] ttm_resource ===================
[10:33:57] =================== ttm_tt (15 subtests) ===================
[10:33:57] ==================== ttm_tt_init_basic ====================
[10:33:57] [PASSED] Page-aligned size
[10:33:57] [PASSED] Extra pages requested
[10:33:57] ================ [PASSED] ttm_tt_init_basic ================
[10:33:57] [PASSED] ttm_tt_init_misaligned
[10:33:57] [PASSED] ttm_tt_fini_basic
[10:33:57] [PASSED] ttm_tt_fini_sg
[10:33:57] [PASSED] ttm_tt_fini_shmem
[10:33:57] [PASSED] ttm_tt_create_basic
[10:33:57] [PASSED] ttm_tt_create_invalid_bo_type
[10:33:57] [PASSED] ttm_tt_create_ttm_exists
[10:33:57] [PASSED] ttm_tt_create_failed
[10:33:57] [PASSED] ttm_tt_destroy_basic
[10:33:57] [PASSED] ttm_tt_populate_null_ttm
[10:33:57] [PASSED] ttm_tt_populate_populated_ttm
[10:33:57] [PASSED] ttm_tt_unpopulate_basic
[10:33:57] [PASSED] ttm_tt_unpopulate_empty_ttm
[10:33:57] [PASSED] ttm_tt_swapin_basic
[10:33:57] ===================== [PASSED] ttm_tt ======================
[10:33:57] =================== ttm_bo (14 subtests) ===================
[10:33:57] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[10:33:57] [PASSED] Cannot be interrupted and sleeps
[10:33:57] [PASSED] Cannot be interrupted, locks straight away
[10:33:57] [PASSED] Can be interrupted, sleeps
[10:33:57] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[10:33:57] [PASSED] ttm_bo_reserve_locked_no_sleep
[10:33:57] [PASSED] ttm_bo_reserve_no_wait_ticket
[10:33:57] [PASSED] ttm_bo_reserve_double_resv
[10:33:57] [PASSED] ttm_bo_reserve_interrupted
[10:33:57] [PASSED] ttm_bo_reserve_deadlock
[10:33:57] [PASSED] ttm_bo_unreserve_basic
[10:33:57] [PASSED] ttm_bo_unreserve_pinned
[10:33:57] [PASSED] ttm_bo_unreserve_bulk
[10:33:57] [PASSED] ttm_bo_fini_basic
[10:33:57] [PASSED] ttm_bo_fini_shared_resv
[10:33:57] [PASSED] ttm_bo_pin_basic
[10:33:57] [PASSED] ttm_bo_pin_unpin_resource
[10:33:57] [PASSED] ttm_bo_multiple_pin_one_unpin
[10:33:57] ===================== [PASSED] ttm_bo ======================
[10:33:57] ============== ttm_bo_validate (22 subtests) ===============
[10:33:57] ============== ttm_bo_init_reserved_sys_man ===============
[10:33:57] [PASSED] Buffer object for userspace
[10:33:57] [PASSED] Kernel buffer object
[10:33:57] [PASSED] Shared buffer object
[10:33:57] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[10:33:57] ============== ttm_bo_init_reserved_mock_man ==============
[10:33:57] [PASSED] Buffer object for userspace
[10:33:57] [PASSED] Kernel buffer object
[10:33:57] [PASSED] Shared buffer object
[10:33:57] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[10:33:57] [PASSED] ttm_bo_init_reserved_resv
[10:33:57] ================== ttm_bo_validate_basic ==================
[10:33:57] [PASSED] Buffer object for userspace
[10:33:57] [PASSED] Kernel buffer object
[10:33:57] [PASSED] Shared buffer object
[10:33:57] ============== [PASSED] ttm_bo_validate_basic ==============
[10:33:57] [PASSED] ttm_bo_validate_invalid_placement
[10:33:57] ============= ttm_bo_validate_same_placement ==============
[10:33:57] [PASSED] System manager
[10:33:57] [PASSED] VRAM manager
[10:33:57] ========= [PASSED] ttm_bo_validate_same_placement ==========
[10:33:57] [PASSED] ttm_bo_validate_failed_alloc
[10:33:57] [PASSED] ttm_bo_validate_pinned
[10:33:57] [PASSED] ttm_bo_validate_busy_placement
[10:33:57] ================ ttm_bo_validate_multihop =================
[10:33:57] [PASSED] Buffer object for userspace
[10:33:57] [PASSED] Kernel buffer object
[10:33:57] [PASSED] Shared buffer object
[10:33:57] ============ [PASSED] ttm_bo_validate_multihop =============
[10:33:57] ========== ttm_bo_validate_no_placement_signaled ==========
[10:33:57] [PASSED] Buffer object in system domain, no page vector
[10:33:57] [PASSED] Buffer object in system domain with an existing page vector
[10:33:57] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[10:33:57] ======== ttm_bo_validate_no_placement_not_signaled ========
[10:33:57] [PASSED] Buffer object for userspace
[10:33:57] [PASSED] Kernel buffer object
[10:33:57] [PASSED] Shared buffer object
[10:33:57] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[10:33:57] [PASSED] ttm_bo_validate_move_fence_signaled
[10:33:57] ========= ttm_bo_validate_move_fence_not_signaled =========
[10:33:57] [PASSED] Waits for GPU
[10:33:57] [PASSED] Tries to lock straight away
[10:33:57] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[10:33:57] [PASSED] ttm_bo_validate_swapout
[10:33:57] [PASSED] ttm_bo_validate_happy_evict
[10:33:57] [PASSED] ttm_bo_validate_all_pinned_evict
[10:33:57] [PASSED] ttm_bo_validate_allowed_only_evict
[10:33:57] [PASSED] ttm_bo_validate_deleted_evict
[10:33:57] [PASSED] ttm_bo_validate_busy_domain_evict
[10:33:57] [PASSED] ttm_bo_validate_evict_gutting
[10:33:57] [PASSED] ttm_bo_validate_recrusive_evict
[10:33:57] ================= [PASSED] ttm_bo_validate =================
[10:33:57] ============================================================
[10:33:57] Testing complete. Ran 102 tests: passed: 102
[10:33:57] Elapsed time: 11.432s total, 1.654s configuring, 9.563s building, 0.180s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 17+ messages in thread* ✓ Xe.CI.BAT: success for drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (8 preceding siblings ...)
2026-06-04 10:34 ` ✓ CI.KUnit: success " Patchwork
@ 2026-06-04 11:35 ` Patchwork
2026-06-05 0:02 ` ✗ Xe.CI.FULL: failure " Patchwork
10 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-06-04 11:35 UTC (permalink / raw)
To: Arvind Yadav; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 892 bytes --]
== Series Details ==
Series: drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
URL : https://patchwork.freedesktop.org/series/161815/
State : success
== Summary ==
CI Bug Log - changes from xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452_BAT -> xe-pw-161815v3_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (13 -> 13)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* Linux: xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452 -> xe-pw-161815v3
IGT_8948: 8948
xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452: 70c7b363fab8198549bb9b82134bda0f6bda9452
xe-pw-161815v3: 161815v3
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/index.html
[-- Attachment #2: Type: text/html, Size: 1440 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread* ✗ Xe.CI.FULL: failure for drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
2026-06-04 9:50 [RFC v3 0/7] drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap Arvind Yadav
` (9 preceding siblings ...)
2026-06-04 11:35 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-06-05 0:02 ` Patchwork
10 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-06-05 0:02 UTC (permalink / raw)
To: Arvind Yadav; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 6893 bytes --]
== Series Details ==
Series: drm/xe/svm: Add MMU notifier-based madvise autoreset on munmap (rev3)
URL : https://patchwork.freedesktop.org/series/161815/
State : failure
== Summary ==
CI Bug Log - changes from xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452_FULL -> xe-pw-161815v3_FULL
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-161815v3_FULL absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-161815v3_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (2 -> 2)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-161815v3_FULL:
### IGT changes ###
#### Possible regressions ####
* igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all:
- shard-bmg: [PASS][1] -> [FAIL][2]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-6/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-6/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html
Known issues
------------
Here are the changes found in xe-pw-161815v3_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_hdr@invalid-metadata-sizes@pipe-a-hdmi-a-3-xrgb16161616f:
- shard-bmg: [PASS][3] -> [SKIP][4] ([Intel XE#7915]) +1 other test skip
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-9/igt@kms_hdr@invalid-metadata-sizes@pipe-a-hdmi-a-3-xrgb16161616f.html
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-1/igt@kms_hdr@invalid-metadata-sizes@pipe-a-hdmi-a-3-xrgb16161616f.html
* igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1:
- shard-lnl: [PASS][5] -> [FAIL][6] ([Intel XE#2142]) +1 other test fail
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-lnl-2/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-lnl-8/igt@kms_vrr@seamless-rr-switch-virtual@pipe-a-edp-1.html
* igt@xe_survivability@runtime-survivability:
- shard-bmg: [PASS][7] -> [DMESG-WARN][8] ([Intel XE#6627] / [Intel XE#7419])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-4/igt@xe_survivability@runtime-survivability.html
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-8/igt@xe_survivability@runtime-survivability.html
#### Possible fixes ####
* igt@kms_cursor_legacy@flip-vs-cursor-atomic:
- shard-bmg: [FAIL][9] ([Intel XE#7571]) -> [PASS][10]
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-9/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-1/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html
* igt@kms_hdr@static-swap@pipe-a-hdmi-a-3-xrgb2101010:
- shard-bmg: [SKIP][11] ([Intel XE#7915]) -> [PASS][12] +1 other test pass
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-8/igt@kms_hdr@static-swap@pipe-a-hdmi-a-3-xrgb2101010.html
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-9/igt@kms_hdr@static-swap@pipe-a-hdmi-a-3-xrgb2101010.html
* igt@kms_pm_backlight@fade-with-suspend:
- shard-lnl: [DMESG-WARN][13] -> [PASS][14] +1 other test pass
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-lnl-8/igt@kms_pm_backlight@fade-with-suspend.html
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-lnl-7/igt@kms_pm_backlight@fade-with-suspend.html
#### Warnings ####
* igt@kms_hdr@brightness-with-hdr:
- shard-bmg: [SKIP][15] ([Intel XE#3544] / [Intel XE#7915] / [Intel XE#7916]) -> [SKIP][16] ([Intel XE#3544] / [Intel XE#7916])
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-1/igt@kms_hdr@brightness-with-hdr.html
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-5/igt@kms_hdr@brightness-with-hdr.html
* igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f:
- shard-bmg: [SKIP][17] ([Intel XE#7915]) -> [SKIP][18] ([Intel XE#7916]) +1 other test skip
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-1/igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f.html
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-5/igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f.html
* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-bmg: [SKIP][19] ([Intel XE#2509] / [Intel XE#7437]) -> [SKIP][20] ([Intel XE#2426] / [Intel XE#5848])
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452/shard-bmg-5/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/shard-bmg-7/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[Intel XE#2142]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2142
[Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
[Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
[Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
[Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
[Intel XE#6627]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6627
[Intel XE#7419]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7419
[Intel XE#7437]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7437
[Intel XE#7571]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7571
[Intel XE#7915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7915
[Intel XE#7916]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7916
Build changes
-------------
* Linux: xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452 -> xe-pw-161815v3
IGT_8948: 8948
xe-5201-70c7b363fab8198549bb9b82134bda0f6bda9452: 70c7b363fab8198549bb9b82134bda0f6bda9452
xe-pw-161815v3: 161815v3
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-161815v3/index.html
[-- Attachment #2: Type: text/html, Size: 8098 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread