* [PATCH v2 0/3] sticky TT
@ 2026-10-07 15:36 Matthew Auld
2026-10-07 15:36 ` [PATCH v2 1/3] drm/xe/dma-buf: keep non-p2p imported buffers in system memory Matthew Auld
` (6 more replies)
0 siblings, 7 replies; 30+ messages in thread
From: Matthew Auld @ 2026-10-07 15:36 UTC (permalink / raw)
To: intel-xe
Try to fix user reported dma-buf perf issue:
https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
v2:
- The plot thickens: yes we can have ping-pong, but also p2p itself
for the window buffer shared with the compositor, which is killing
perf. Add a new patch to try to workaround this.
--
2.55.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH v2 1/3] drm/xe/dma-buf: keep non-p2p imported buffers in system memory
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
@ 2026-10-07 15:36 ` Matthew Auld
2026-10-07 15:36 ` [PATCH v2 2/3] drm/xe/vm: make PREFETCH to TT sticky Matthew Auld
` (5 subsequent siblings)
6 siblings, 0 replies; 30+ messages in thread
From: Matthew Auld @ 2026-10-07 15:36 UTC (permalink / raw)
To: intel-xe; +Cc: stable, Thomas Hellström, Matthew Brost
When an exported buffer is mapped by a foreign device lacking peer-to-peer
DMA support (such as an integrated GPU for display offload),
xe_dma_buf_map() migrates the buffer to XE_PL_TT so that system memory
pages can be accessed by the importer.
However, since commit 5c87fee3c96c ("drm/xe: Attempt to bring bos back to
VRAM after eviction"), XE_PL_TT is marked with TTM_PL_FLAG_FALLBACK in
the buffer's placement. When DMABUF_MOVE_NOTIFY was enabled by default
(meaning dynamic attachments are no longer pinned on map), the next
xe_bo_validate() during render submission sees TT as a fallback placement
and attempts to migrate the buffer back to VRAM.
On the next frame, the foreign importer accesses the buffer, requiring
another migration to TT, resulting in a continuous ping-pong between
VRAM and system memory every frame and causing severe rendering performance
degradations.
To fix this, introduce xe_bo_migrate_tt_sticky() which records a
temporary sticky placement in XE_PL_TT on successful migration. Subsequent
validations use this sticky placement to keep the buffer in system memory
until the non-p2p attachment is detached or memory pressure forces a
fallback to the default placement.
User is reporting what looks to be exactly this, with horrible
performance when DMABUF_MOVE_NOTIFY was enabled by default.
Assisted-by: LLM
Link: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
Fixes: 5c87fee3c96c ("drm/xe: Attempt to bring bos back to VRAM after eviction")
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: <stable@vger.kernel.org> # v6.12+
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/xe/xe_bo.c | 59 ++++++++++++++++++++++++++++++--
drivers/gpu/drm/xe/xe_bo.h | 3 ++
drivers/gpu/drm/xe/xe_bo_types.h | 4 +++
drivers/gpu/drm/xe/xe_dma_buf.c | 16 ++++++++-
4 files changed, 79 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 469fa4d5feb5..5065a7bac39c 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -3395,6 +3395,9 @@ int xe_bo_validate(struct xe_bo *bo, struct xe_vm *vm, bool allow_res_evict,
.no_wait_gpu = false,
.gfp_retry_mayfail = true,
};
+ struct ttm_placement *placement = bo->sticky_placement.num_placement ?
+ &bo->sticky_placement :
+ &bo->placement;
int ret;
if (xe_bo_is_pinned(bo))
@@ -3411,7 +3414,12 @@ int xe_bo_validate(struct xe_bo *bo, struct xe_vm *vm, bool allow_res_evict,
xe_vm_set_validating(vm, allow_res_evict);
trace_xe_bo_validate(bo);
xe_validation_assert_exec(xe_bo_device(bo), exec, &bo->ttm.base);
- ret = ttm_bo_validate(&bo->ttm, &bo->placement, &ctx);
+ ret = ttm_bo_validate(&bo->ttm, placement, &ctx);
+ if (ret && ret != -EINTR && ret != -ERESTARTSYS &&
+ bo->sticky_placement.num_placement) {
+ xe_bo_reset_sticky_placement(bo);
+ ret = ttm_bo_validate(&bo->ttm, &bo->placement, &ctx);
+ }
xe_vm_clear_validating(vm, allow_res_evict);
return ret;
@@ -3962,6 +3970,7 @@ int xe_bo_migrate(struct xe_bo *bo, u32 mem_type, struct ttm_operation_ctx *tctx
};
struct ttm_placement placement;
struct ttm_place requested;
+ int ret;
xe_bo_assert_held(bo);
tctx = tctx ? tctx : &ctx;
@@ -3993,7 +4002,53 @@ int xe_bo_migrate(struct xe_bo *bo, u32 mem_type, struct ttm_operation_ctx *tctx
if (!tctx->no_wait_gpu)
xe_validation_assert_exec(xe_bo_device(bo), exec, &bo->ttm.base);
- return ttm_bo_validate(&bo->ttm, &placement, tctx);
+ ret = ttm_bo_validate(&bo->ttm, &placement, tctx);
+ if (!ret)
+ xe_bo_reset_sticky_placement(bo);
+ return ret;
+}
+
+/**
+ * xe_bo_migrate_tt_sticky - Migrate an object to TT and record its placement as sticky
+ * @bo: The buffer object to migrate.
+ * @tctx: The ttm_operation_ctx to use for migration, or NULL for default.
+ * @exec: The drm_exec transaction to use for exhaustive eviction.
+ *
+ * Like xe_bo_migrate() to XE_PL_TT, but on success records the resulting placement
+ * so that subsequent validations try to keep the object in TT instead of falling
+ * back to the default placement. The stickiness is removed if validation falls
+ * back to the default placement (e.g. under memory pressure), on any non-sticky
+ * migration, or via an explicit call to xe_bo_reset_sticky_placement().
+ *
+ * Return: 0 on success. Negative error code on failure.
+ */
+int xe_bo_migrate_tt_sticky(struct xe_bo *bo,
+ struct ttm_operation_ctx *tctx,
+ struct drm_exec *exec)
+{
+ int ret;
+
+ ret = xe_bo_migrate(bo, XE_PL_TT, tctx, exec);
+ if (!ret) {
+ xe_place_from_ttm_type(XE_PL_TT, &bo->sticky_place);
+ bo->sticky_placement = (struct ttm_placement){
+ .num_placement = 1,
+ .placement = &bo->sticky_place,
+ };
+ }
+ return ret;
+}
+
+/**
+ * xe_bo_reset_sticky_placement - Reset sticky placement for an object
+ * @bo: The buffer object whose sticky placement should be cleared.
+ *
+ * Clear any sticky placement recorded by xe_bo_migrate_tt_sticky(),
+ * returning subsequent validations to the default placement.
+ */
+void xe_bo_reset_sticky_placement(struct xe_bo *bo)
+{
+ bo->sticky_placement.num_placement = 0;
}
/**
diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index 77b3a02e9b8e..1ddf3b6d4a9e 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -436,6 +436,9 @@ bool xe_bo_can_migrate(struct xe_bo *bo, u32 mem_type);
int xe_bo_migrate(struct xe_bo *bo, u32 mem_type, struct ttm_operation_ctx *ctc,
struct drm_exec *exec);
+int xe_bo_migrate_tt_sticky(struct xe_bo *bo, struct ttm_operation_ctx *ctc,
+ struct drm_exec *exec);
+void xe_bo_reset_sticky_placement(struct xe_bo *bo);
int xe_bo_evict(struct xe_bo *bo, struct drm_exec *exec);
int xe_bo_evict_pinned(struct xe_bo *bo);
diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h
index 8ec4a01a0092..253a1dba55a7 100644
--- a/drivers/gpu/drm/xe/xe_bo_types.h
+++ b/drivers/gpu/drm/xe/xe_bo_types.h
@@ -56,6 +56,10 @@ struct xe_bo {
struct ttm_place placements[XE_BO_MAX_PLACEMENTS];
/** @placement: current placement for this BO */
struct ttm_placement placement;
+ /** @sticky_placement: target placement from forced migration */
+ struct ttm_placement sticky_placement;
+ /** @sticky_place: place for sticky_placement */
+ struct ttm_place sticky_place;
/** @ggtt_node: Array of GGTT nodes if this BO is mapped in the GGTTs */
struct xe_ggtt_node *ggtt_node[XE_MAX_TILES_PER_DEVICE];
/** @vmap: iosys map of this buffer */
diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c
index 6a85b292dee7..b973579a69b8 100644
--- a/drivers/gpu/drm/xe/xe_dma_buf.c
+++ b/drivers/gpu/drm/xe/xe_dma_buf.c
@@ -59,6 +59,20 @@ static void xe_dma_buf_detach(struct dma_buf *dmabuf,
struct dma_buf_attachment *attach)
{
struct drm_gem_object *obj = attach->dmabuf->priv;
+ struct xe_bo *bo = gem_to_xe_bo(obj);
+ bool has_non_p2p = false;
+ struct dma_buf_attachment *a;
+
+ dma_resv_lock(dmabuf->resv, NULL);
+ list_for_each_entry(a, &dmabuf->attachments, node) {
+ if (!a->peer2peer) {
+ has_non_p2p = true;
+ break;
+ }
+ }
+ if (!has_non_p2p)
+ xe_bo_reset_sticky_placement(bo);
+ dma_resv_unlock(dmabuf->resv);
xe_pm_runtime_put(to_xe_device(obj->dev));
}
@@ -129,7 +143,7 @@ static struct sg_table *xe_dma_buf_map(struct dma_buf_attachment *attach,
if (!xe_bo_is_pinned(bo)) {
if (!attach->peer2peer)
- r = xe_bo_migrate(bo, XE_PL_TT, NULL, exec);
+ r = xe_bo_migrate_tt_sticky(bo, NULL, exec);
else
r = xe_bo_validate(bo, NULL, false, exec);
if (r)
--
2.55.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 2/3] drm/xe/vm: make PREFETCH to TT sticky
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
2026-10-07 15:36 ` [PATCH v2 1/3] drm/xe/dma-buf: keep non-p2p imported buffers in system memory Matthew Auld
@ 2026-10-07 15:36 ` Matthew Auld
2026-10-07 15:36 ` [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers Matthew Auld
` (4 subsequent siblings)
6 siblings, 0 replies; 30+ messages in thread
From: Matthew Auld @ 2026-10-07 15:36 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström, Matthew Brost, stable
When userspace explicitly requests DRM_XE_VM_BIND_OP_PREFETCH to system
memory (XE_PL_TT), xe_bo_migrate() moves the buffer object to TT.
However, because XE_PL_TT is marked with TTM_PL_FLAG_FALLBACK in the
buffer's default placement (introduced in commit 5c87fee3c96c ("drm/xe:
Attempt to bring bos back to VRAM after eviction")), any subsequent
validation during exec immediately migrates the buffer back to VRAM,
completely undoing the userspace prefetch request.
Use xe_bo_migrate_tt_sticky() when prefetching to XE_PL_TT so that the
buffer remains resident in system memory across subsequent validations.
Assisted-by: LLM
Reported-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Fixes: 5c87fee3c96c ("drm/xe: Attempt to bring bos back to VRAM after eviction")
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: <stable@vger.kernel.org> # v6.12+
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/xe/xe_vm.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index ef369df4aa26..093ad3e39608 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -3428,7 +3428,10 @@ static int op_lock_and_prep(struct drm_exec *exec, struct xe_vm *vm,
mem_type = region_to_mem_type[region];
}
- err = xe_bo_migrate(bo, mem_type, NULL, exec);
+ if (mem_type == XE_PL_TT)
+ err = xe_bo_migrate_tt_sticky(bo, NULL, exec);
+ else
+ err = xe_bo_migrate(bo, mem_type, NULL, exec);
}
break;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
2026-10-07 15:36 ` [PATCH v2 1/3] drm/xe/dma-buf: keep non-p2p imported buffers in system memory Matthew Auld
2026-10-07 15:36 ` [PATCH v2 2/3] drm/xe/vm: make PREFETCH to TT sticky Matthew Auld
@ 2026-10-07 15:36 ` Matthew Auld
2026-10-07 18:11 ` Thomas Hellström
2026-10-07 15:42 ` ✗ CI.checkpatch: warning for sticky TT (rev2) Patchwork
` (3 subsequent siblings)
6 siblings, 1 reply; 30+ messages in thread
From: Matthew Auld @ 2026-10-07 15:36 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström, Matthew Brost, stable
If p2p is allowed on the CPU (like on AMD), we currently permit p2p for
all exported VRAM buffers. However, in some multi-GPU setups, like with
prime rendering on a dgpu and scanout/compositor using the igpu, it
looks like the exported dma-buf window buffer can in some cases end up
using p2p.
However, user is reporting a kernel regression where performance here
massively tanks across many games/workloads, where it looks like on each
frame, the igpu is reading/sampling from VRAM over pcie for the window
buffer, since it uses p2p. p2p is currently more intended for dgpu <->
dgpu, and not so much display buffers with igpu <-> dgpu, at least for
now.
We don't currently have any hints to say "please use p2p for this
buffer, or please don't", however we can use some heuristics to try to
determine if this is likely a display buffer being exported to an igpu,
which probably never intended for p2p:
1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
tagged with this, but not always.
2. Importer being a PCI device with display, which is not xe driver.
We also rely on the existing p2p Intel CPU whitelist to stop this
happening on xe igpu. Currently p2p is only enabled for server CPUs, on
Intel. We also limit the above to dual placement buffers.
The original regression was bisected to commit 609fc8766d68 ("dma-buf:
Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
already present when enabling that knob, so this goes back even further.
User has confirmed that along with the sticky dma-buf TT placement fix,
to prevent ping-ponging, the performance is back to normal.
Assisted-by: LLM
Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: <stable@vger.kernel.org> # v6.12
---
drivers/gpu/drm/xe/xe_bo.c | 3 +-
drivers/gpu/drm/xe/xe_bo.h | 1 +
drivers/gpu/drm/xe/xe_dma_buf.c | 63 +++++++++++++++++++++++++--------
3 files changed, 51 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index 5065a7bac39c..e63437a261cb 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data,
* Display scanout is always non-coherent with the CPU cache.
*/
if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
- bo_flags |= XE_BO_FLAG_FORCE_WC;
+ bo_flags |= XE_BO_FLAG_FORCE_WC | XE_BO_FLAG_SCANOUT;
if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
@@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file *file_priv,
DRM_XE_GEM_CPU_CACHING_WC,
XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
XE_BO_FLAG_FORCE_WC |
+ XE_BO_FLAG_SCANOUT |
XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
if (IS_ERR(bo))
return PTR_ERR(bo);
diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index 1ddf3b6d4a9e..6965c2655731 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -56,6 +56,7 @@
#define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
#define XE_BO_FLAG_NO_COMPRESSION BIT(26)
#define XE_BO_FLAG_NEEDS_1G BIT(27)
+#define XE_BO_FLAG_SCANOUT BIT(28)
/* this one is trigger internally only */
#define XE_BO_FLAG_INTERNAL_TEST BIT(30)
diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c
index b973579a69b8..0a347f09cee4 100644
--- a/drivers/gpu/drm/xe/xe_dma_buf.c
+++ b/drivers/gpu/drm/xe/xe_dma_buf.c
@@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct _ddebug *desc, bool *flag)
#define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
#endif
+static void xe_dma_buf_move_notify(struct dma_buf_attachment *attach)
+{
+ struct drm_gem_object *obj = attach->importer_priv;
+ struct xe_bo *bo = gem_to_xe_bo(obj);
+ struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
+
+ XE_WARN_ON(xe_bo_evict(bo, exec));
+}
+
+static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
+ .allow_peer2peer = true,
+ .invalidate_mappings = xe_dma_buf_move_notify
+};
+
+static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
+{
+ while (dev) {
+ if (dev_is_pci(dev))
+ return to_pci_dev(dev);
+ dev = dev->parent;
+ }
+ return NULL;
+}
+
+static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment *attach)
+{
+ return attach->importer_ops == &xe_dma_buf_attach_ops;
+}
+
static int xe_dma_buf_attach(struct dma_buf *dmabuf,
struct dma_buf_attachment *attach)
{
struct drm_gem_object *obj = attach->dmabuf->priv;
+ struct xe_bo *bo = gem_to_xe_bo(obj);
bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
@@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf *dmabuf,
pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach->dev, verbose_p2p_dist) < 0)
attach->peer2peer = false;
- if (!attach->peer2peer && !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
+ if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
+ struct pci_dev *client = xe_find_parent_pci_dev(attach->dev);
+
+ /*
+ * There are perf issues with using p2p with display buffers,
+ * like with igpu (compositor) <-> dgpu (exported p2p window
+ * buffer). Probably we need some actual userspace hints. We
+ * shouldn't really assume anything. Also, note that some of
+ * these buffers are not always tagged with SCANOUT.
+ */
+ if (bo->flags & XE_BO_FLAG_SCANOUT)
+ attach->peer2peer = false;
+ else if (client && pci_is_display(client) &&
+ !xe_dma_buf_attach_is_xe_device(attach))
+ attach->peer2peer = false;
+ }
+
+ if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
return -EOPNOTSUPP;
xe_pm_runtime_get(to_xe_device(obj->dev));
@@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
return ret ? ERR_PTR(ret) : &bo->ttm.base;
}
-static void xe_dma_buf_move_notify(struct dma_buf_attachment *attach)
-{
- struct drm_gem_object *obj = attach->importer_priv;
- struct xe_bo *bo = gem_to_xe_bo(obj);
- struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
-
- XE_WARN_ON(xe_bo_evict(bo, exec));
-}
-
-static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
- .allow_peer2peer = true,
- .invalidate_mappings = xe_dma_buf_move_notify
-};
-
#if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
struct dma_buf_test_params {
--
2.55.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* ✗ CI.checkpatch: warning for sticky TT (rev2)
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
` (2 preceding siblings ...)
2026-10-07 15:36 ` [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers Matthew Auld
@ 2026-10-07 15:42 ` Patchwork
2026-10-07 15:45 ` ✓ CI.KUnit: success " Patchwork
` (2 subsequent siblings)
6 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2026-10-07 15:42 UTC (permalink / raw)
To: Matthew Auld; +Cc: intel-xe
== Series Details ==
Series: sticky TT (rev2)
URL : https://patchwork.freedesktop.org/series/175133/
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
6bef5ce5c74dc76b4ee69ab2832c0d1fd63c91c7
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 309105bf1bdc939fc486867591791428d1f96fba
Author: Matthew Auld <matthew.auld@intel.com>
Date: Wed Oct 7 16:36:09 2026 +0100
drm/xe: skip p2p for suspected display buffers
If p2p is allowed on the CPU (like on AMD), we currently permit p2p for
all exported VRAM buffers. However, in some multi-GPU setups, like with
prime rendering on a dgpu and scanout/compositor using the igpu, it
looks like the exported dma-buf window buffer can in some cases end up
using p2p.
However, user is reporting a kernel regression where performance here
massively tanks across many games/workloads, where it looks like on each
frame, the igpu is reading/sampling from VRAM over pcie for the window
buffer, since it uses p2p. p2p is currently more intended for dgpu <->
dgpu, and not so much display buffers with igpu <-> dgpu, at least for
now.
We don't currently have any hints to say "please use p2p for this
buffer, or please don't", however we can use some heuristics to try to
determine if this is likely a display buffer being exported to an igpu,
which probably never intended for p2p:
1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
tagged with this, but not always.
2. Importer being a PCI device with display, which is not xe driver.
We also rely on the existing p2p Intel CPU whitelist to stop this
happening on xe igpu. Currently p2p is only enabled for server CPUs, on
Intel. We also limit the above to dual placement buffers.
The original regression was bisected to commit 609fc8766d68 ("dma-buf:
Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
already present when enabling that knob, so this goes back even further.
User has confirmed that along with the sticky dma-buf TT placement fix,
to prevent ping-ponging, the performance is back to normal.
Assisted-by: LLM
Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: <stable@vger.kernel.org> # v6.12
+ /mt/dim checkpatch 5dc178a4563d8d2ee7fc3a81d005700cbfa04c05 drm-intel
578a7fe25c4b drm/xe/dma-buf: keep non-p2p imported buffers in system memory
e51636dd985b drm/xe/vm: make PREFETCH to TT sticky
-:21: WARNING:BAD_REPORTED_BY_LINK: Reported-by: should be immediately followed by Closes: or Link: with a URL to the report
#21:
Reported-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Fixes: 5c87fee3c96c ("drm/xe: Attempt to bring bos back to VRAM after eviction")
total: 0 errors, 1 warnings, 0 checks, 11 lines checked
309105bf1bdc drm/xe: skip p2p for suspected display buffers
^ permalink raw reply [flat|nested] 30+ messages in thread
* ✓ CI.KUnit: success for sticky TT (rev2)
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
` (3 preceding siblings ...)
2026-10-07 15:42 ` ✗ CI.checkpatch: warning for sticky TT (rev2) Patchwork
@ 2026-10-07 15:45 ` Patchwork
2026-10-07 16:46 ` ✓ Xe.CI.BAT: " Patchwork
2026-10-07 20:16 ` ✓ Xe.CI.FULL: " Patchwork
6 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2026-10-07 15:45 UTC (permalink / raw)
To: Matthew Auld; +Cc: intel-xe
== Series Details ==
Series: sticky TT (rev2)
URL : https://patchwork.freedesktop.org/series/175133/
State : success
== Summary ==
+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[15:42:55] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:43:00] 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
[15:43:21] Starting KUnit Kernel (1/1)...
[15:43:21] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:43:21] ================= gpu_buddy (14 subtests) ==================
[15:43:21] [PASSED] gpu_test_buddy_alloc_limit
[15:43:21] [PASSED] gpu_test_buddy_alloc_optimistic
[15:43:21] [PASSED] gpu_test_buddy_alloc_pessimistic
[15:43:21] [PASSED] gpu_test_buddy_alloc_pathological
[15:43:21] [PASSED] gpu_test_buddy_alloc_contiguous
[15:43:21] [PASSED] gpu_test_buddy_alloc_clear
[15:43:21] [PASSED] gpu_test_buddy_alloc_range
[15:43:21] [PASSED] gpu_test_buddy_alloc_range_bias
[15:43:22] [PASSED] gpu_test_buddy_fragmentation_performance
[15:43:23] [PASSED] gpu_test_buddy_dirty_tracker_performance
[15:43:23] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[15:43:23] [PASSED] gpu_test_buddy_offset_aligned_allocation
[15:43:23] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[15:43:23] [PASSED] gpu_test_buddy_addr_to_block
[15:43:23] ==================== [PASSED] gpu_buddy ====================
[15:43:23] ============================================================
[15:43:23] Testing complete. Ran 14 tests: passed: 14
[15:43:23] Elapsed time: 27.267s total, 4.472s configuring, 20.927s building, 1.823s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[15:43:23] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:43:25] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[15:43:59] Starting KUnit Kernel (1/1)...
[15:43:59] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:43:59] ================== guc_buf (11 subtests) ===================
[15:43:59] [PASSED] test_smallest
[15:43:59] [PASSED] test_largest
[15:43:59] [PASSED] test_granular
[15:43:59] [PASSED] test_unique
[15:43:59] [PASSED] test_overlap
[15:43:59] [PASSED] test_reusable
[15:43:59] [PASSED] test_too_big
[15:43:59] [PASSED] test_flush
[15:43:59] [PASSED] test_lookup
[15:43:59] [PASSED] test_data
[15:43:59] [PASSED] test_class
[15:43:59] ===================== [PASSED] guc_buf =====================
[15:43:59] =================== guc_dbm (7 subtests) ===================
[15:43:59] [PASSED] test_empty
[15:43:59] [PASSED] test_default
[15:43:59] ======================== test_size ========================
[15:43:59] [PASSED] 4
[15:43:59] [PASSED] 8
[15:43:59] [PASSED] 32
[15:43:59] [PASSED] 256
[15:43:59] ==================== [PASSED] test_size ====================
[15:43:59] ======================= test_reuse ========================
[15:43:59] [PASSED] 4
[15:43:59] [PASSED] 8
[15:43:59] [PASSED] 32
[15:43:59] [PASSED] 256
[15:43:59] =================== [PASSED] test_reuse ====================
[15:43:59] =================== test_range_overlap ====================
[15:43:59] [PASSED] 4
[15:43:59] [PASSED] 8
[15:43:59] [PASSED] 32
[15:43:59] [PASSED] 256
[15:43:59] =============== [PASSED] test_range_overlap ================
[15:43:59] =================== test_range_compact ====================
[15:43:59] [PASSED] 4
[15:43:59] [PASSED] 8
[15:43:59] [PASSED] 32
[15:43:59] [PASSED] 256
[15:43:59] =============== [PASSED] test_range_compact ================
[15:43:59] ==================== test_range_spare =====================
[15:43:59] [PASSED] 4
[15:43:59] [PASSED] 8
[15:43:59] [PASSED] 32
[15:43:59] [PASSED] 256
[15:43:59] ================ [PASSED] test_range_spare =================
[15:43:59] ===================== [PASSED] guc_dbm =====================
[15:43:59] =================== guc_idm (6 subtests) ===================
[15:43:59] [PASSED] bad_init
[15:43:59] [PASSED] no_init
[15:43:59] [PASSED] init_fini
[15:43:59] [PASSED] check_used
[15:43:59] [PASSED] check_quota
[15:43:59] [PASSED] check_all
[15:43:59] ===================== [PASSED] guc_idm =====================
[15:43:59] ============== guc_klv_helpers (13 subtests) ===============
[15:43:59] [PASSED] test_count
[15:43:59] [PASSED] test_encode_u32
[15:43:59] [PASSED] test_encode_u64
[15:43:59] [PASSED] test_encode_string
[15:43:59] [PASSED] test_encode_object_raw
[15:43:59] [PASSED] test_encode_object_klv
[15:43:59] [PASSED] test_encode_object_nested
[15:43:59] [PASSED] test_encode_object_basic
[15:43:59] ===================== test_decode_u16 =====================
[15:43:59] [PASSED] empty
[15:43:59] [PASSED] valid
[15:43:59] [PASSED] max
[15:43:59] [PASSED] big
[15:43:59] [PASSED] long
[15:43:59] ================= [PASSED] test_decode_u16 =================
[15:43:59] ===================== test_decode_u32 =====================
[15:43:59] [PASSED] empty
[15:43:59] [PASSED] valid
[15:43:59] [PASSED] max
[15:43:59] [PASSED] long
[15:43:59] ================= [PASSED] test_decode_u32 =================
[15:43:59] ===================== test_decode_u64 =====================
[15:43:59] [PASSED] empty
[15:43:59] [PASSED] short
[15:43:59] [PASSED] valid
[15:43:59] [PASSED] max
[15:43:59] [PASSED] long
[15:43:59] ================= [PASSED] test_decode_u64 =================
[15:43:59] ===================== test_decode_str =====================
[15:43:59] [PASSED] empty
[15:43:59] [PASSED] one
[15:43:59] [PASSED] one_trash
[15:43:59] [PASSED] two
[15:43:59] [PASSED] two_trash
[15:43:59] [PASSED] three
[15:43:59] [PASSED] dword
[15:43:59] [PASSED] four
[15:43:59] [PASSED] five
[15:43:59] [PASSED] six
[15:43:59] [PASSED] seven
[15:43:59] [PASSED] qword
[15:43:59] ================= [PASSED] test_decode_str =================
[15:43:59] [PASSED] test_print
[15:43:59] ================= [PASSED] guc_klv_helpers =================
[15:43:59] =================== xe_log (4 subtests) ====================
[15:43:59] [PASSED] demo_cper
[15:43:59] [PASSED] demo_dmesg
[15:43:59] ======================= test_dmesg ========================
[15:43:59] [PASSED] test_fatal
[15:43:59] [PASSED] test_fatal_tile
[15:43:59] [PASSED] test_fatal_gt
[15:43:59] [PASSED] test_fatal_comp
[15:43:59] [PASSED] test_fatal_comp_tile
[15:43:59] [PASSED] test_fatal_comp_gt
[15:43:59] [PASSED] test_fatal_all
[15:43:59] [PASSED] test_recoverable
[15:43:59] [PASSED] test_recoverable_tile
[15:43:59] [PASSED] test_recoverable_gt
[15:43:59] [PASSED] test_recoverable_comp
[15:43:59] [PASSED] test_recoverable_comp_tile
[15:43:59] [PASSED] test_recoverable_comp_gt
[15:43:59] [PASSED] test_recoverable_all
[15:43:59] [PASSED] test_info
[15:43:59] [PASSED] test_info_tile
[15:43:59] [PASSED] test_info_gt
[15:43:59] [PASSED] test_info_err
[15:43:59] [PASSED] test_info_comp
[15:43:59] [PASSED] test_info_comp_tile
[15:43:59] [PASSED] test_info_comp_gt
[15:43:59] [PASSED] test_info_all
[15:43:59] [PASSED] test_hw_fatal
[15:43:59] [PASSED] test_hw_recoverable
[15:43:59] [PASSED] test_hw_corrected
[15:43:59] [PASSED] test_hw_informational
[15:43:59] =================== [PASSED] test_dmesg ====================
[15:43:59] ====================== test_invalid =======================
[15:43:59] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[15:43:59] ================== [SKIPPED] test_invalid ==================
[15:43:59] ===================== [PASSED] xe_log ======================
[15:43:59] ================== no_relay (3 subtests) ===================
[15:43:59] [PASSED] xe_drops_guc2pf_if_not_ready
[15:43:59] [PASSED] xe_drops_guc2vf_if_not_ready
[15:43:59] [PASSED] xe_rejects_send_if_not_ready
[15:43:59] ==================== [PASSED] no_relay =====================
[15:43:59] ================== pf_relay (14 subtests) ==================
[15:43:59] [PASSED] pf_rejects_guc2pf_too_short
[15:43:59] [PASSED] pf_rejects_guc2pf_too_long
[15:43:59] [PASSED] pf_rejects_guc2pf_no_payload
[15:43:59] [PASSED] pf_fails_no_payload
[15:43:59] [PASSED] pf_fails_bad_origin
[15:43:59] [PASSED] pf_fails_bad_type
[15:43:59] [PASSED] pf_txn_reports_error
[15:43:59] [PASSED] pf_txn_sends_pf2guc
[15:43:59] [PASSED] pf_sends_pf2guc
[15:43:59] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[15:43:59] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[15:43:59] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[15:43:59] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[15:43:59] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[15:43:59] ==================== [PASSED] pf_relay =====================
[15:43:59] ================== vf_relay (3 subtests) ===================
[15:43:59] [PASSED] vf_rejects_guc2vf_too_short
[15:43:59] [PASSED] vf_rejects_guc2vf_too_long
[15:43:59] [PASSED] vf_rejects_guc2vf_no_payload
[15:43:59] ==================== [PASSED] vf_relay =====================
[15:43:59] ================ pf_gt_config (9 subtests) =================
[15:43:59] [PASSED] fair_contexts_1vf
[15:43:59] [PASSED] fair_doorbells_1vf
[15:43:59] [PASSED] fair_ggtt_1vf
[15:43:59] ====================== fair_vram_1vf ======================
[15:43:59] [PASSED] 3.50 GiB
[15:43:59] [PASSED] 11.5 GiB
[15:43:59] [PASSED] 15.5 GiB
[15:43:59] [PASSED] 31.5 GiB
[15:43:59] [PASSED] 63.5 GiB
[15:43:59] [PASSED] 1.91 GiB
[15:43:59] ================== [PASSED] fair_vram_1vf ==================
[15:43:59] ================ fair_vram_1vf_admin_only =================
[15:43:59] [PASSED] 3.50 GiB
[15:43:59] [PASSED] 11.5 GiB
[15:43:59] [PASSED] 15.5 GiB
[15:43:59] [PASSED] 31.5 GiB
[15:43:59] [PASSED] 63.5 GiB
[15:43:59] [PASSED] 1.91 GiB
[15:43:59] ============ [PASSED] fair_vram_1vf_admin_only =============
[15:43:59] ====================== fair_contexts ======================
[15:43:59] [PASSED] 1 VF
[15:43:59] [PASSED] 2 VFs
[15:43:59] [PASSED] 3 VFs
[15:43:59] [PASSED] 4 VFs
[15:43:59] [PASSED] 5 VFs
[15:43:59] [PASSED] 6 VFs
[15:43:59] [PASSED] 7 VFs
[15:43:59] [PASSED] 8 VFs
[15:43:59] [PASSED] 9 VFs
[15:43:59] [PASSED] 10 VFs
[15:43:59] [PASSED] 11 VFs
[15:43:59] [PASSED] 12 VFs
[15:43:59] [PASSED] 13 VFs
[15:43:59] [PASSED] 14 VFs
[15:43:59] [PASSED] 15 VFs
[15:43:59] [PASSED] 16 VFs
[15:43:59] [PASSED] 17 VFs
[15:43:59] [PASSED] 18 VFs
[15:43:59] [PASSED] 19 VFs
[15:43:59] [PASSED] 20 VFs
[15:43:59] [PASSED] 21 VFs
[15:43:59] [PASSED] 22 VFs
[15:43:59] [PASSED] 23 VFs
[15:43:59] [PASSED] 24 VFs
[15:43:59] [PASSED] 25 VFs
[15:43:59] [PASSED] 26 VFs
[15:43:59] [PASSED] 27 VFs
[15:43:59] [PASSED] 28 VFs
[15:43:59] [PASSED] 29 VFs
[15:43:59] [PASSED] 30 VFs
[15:43:59] [PASSED] 31 VFs
[15:43:59] [PASSED] 32 VFs
[15:43:59] [PASSED] 33 VFs
[15:43:59] [PASSED] 34 VFs
[15:43:59] [PASSED] 35 VFs
[15:43:59] [PASSED] 36 VFs
[15:43:59] [PASSED] 37 VFs
[15:43:59] [PASSED] 38 VFs
[15:43:59] [PASSED] 39 VFs
[15:43:59] [PASSED] 40 VFs
[15:43:59] [PASSED] 41 VFs
[15:43:59] [PASSED] 42 VFs
[15:43:59] [PASSED] 43 VFs
[15:43:59] [PASSED] 44 VFs
[15:43:59] [PASSED] 45 VFs
[15:43:59] [PASSED] 46 VFs
[15:43:59] [PASSED] 47 VFs
[15:43:59] [PASSED] 48 VFs
[15:43:59] [PASSED] 49 VFs
[15:43:59] [PASSED] 50 VFs
[15:43:59] [PASSED] 51 VFs
[15:43:59] [PASSED] 52 VFs
[15:43:59] [PASSED] 53 VFs
[15:43:59] [PASSED] 54 VFs
[15:43:59] [PASSED] 55 VFs
[15:43:59] [PASSED] 56 VFs
[15:43:59] [PASSED] 57 VFs
[15:43:59] [PASSED] 58 VFs
[15:43:59] [PASSED] 59 VFs
[15:43:59] [PASSED] 60 VFs
[15:43:59] [PASSED] 61 VFs
[15:43:59] [PASSED] 62 VFs
[15:43:59] [PASSED] 63 VFs
[15:43:59] ================== [PASSED] fair_contexts ==================
[15:43:59] ===================== fair_doorbells ======================
[15:43:59] [PASSED] 1 VF
[15:43:59] [PASSED] 2 VFs
[15:43:59] [PASSED] 3 VFs
[15:43:59] [PASSED] 4 VFs
[15:43:59] [PASSED] 5 VFs
[15:43:59] [PASSED] 6 VFs
[15:43:59] [PASSED] 7 VFs
[15:43:59] [PASSED] 8 VFs
[15:43:59] [PASSED] 9 VFs
[15:43:59] [PASSED] 10 VFs
[15:43:59] [PASSED] 11 VFs
[15:43:59] [PASSED] 12 VFs
[15:43:59] [PASSED] 13 VFs
[15:43:59] [PASSED] 14 VFs
[15:43:59] [PASSED] 15 VFs
[15:43:59] [PASSED] 16 VFs
[15:43:59] [PASSED] 17 VFs
[15:43:59] [PASSED] 18 VFs
[15:43:59] [PASSED] 19 VFs
[15:43:59] [PASSED] 20 VFs
[15:43:59] [PASSED] 21 VFs
[15:43:59] [PASSED] 22 VFs
[15:43:59] [PASSED] 23 VFs
[15:43:59] [PASSED] 24 VFs
[15:43:59] [PASSED] 25 VFs
[15:43:59] [PASSED] 26 VFs
[15:43:59] [PASSED] 27 VFs
[15:43:59] [PASSED] 28 VFs
[15:43:59] [PASSED] 29 VFs
[15:43:59] [PASSED] 30 VFs
[15:43:59] [PASSED] 31 VFs
[15:43:59] [PASSED] 32 VFs
[15:43:59] [PASSED] 33 VFs
[15:43:59] [PASSED] 34 VFs
[15:43:59] [PASSED] 35 VFs
[15:43:59] [PASSED] 36 VFs
[15:43:59] [PASSED] 37 VFs
[15:43:59] [PASSED] 38 VFs
[15:43:59] [PASSED] 39 VFs
[15:43:59] [PASSED] 40 VFs
[15:43:59] [PASSED] 41 VFs
[15:43:59] [PASSED] 42 VFs
[15:43:59] [PASSED] 43 VFs
[15:43:59] [PASSED] 44 VFs
[15:43:59] [PASSED] 45 VFs
[15:43:59] [PASSED] 46 VFs
[15:43:59] [PASSED] 47 VFs
[15:43:59] [PASSED] 48 VFs
[15:43:59] [PASSED] 49 VFs
[15:43:59] [PASSED] 50 VFs
[15:43:59] [PASSED] 51 VFs
[15:43:59] [PASSED] 52 VFs
[15:43:59] [PASSED] 53 VFs
[15:43:59] [PASSED] 54 VFs
[15:43:59] [PASSED] 55 VFs
[15:43:59] [PASSED] 56 VFs
[15:43:59] [PASSED] 57 VFs
[15:43:59] [PASSED] 58 VFs
[15:43:59] [PASSED] 59 VFs
[15:43:59] [PASSED] 60 VFs
[15:43:59] [PASSED] 61 VFs
[15:43:59] [PASSED] 62 VFs
[15:43:59] [PASSED] 63 VFs
[15:43:59] ================= [PASSED] fair_doorbells ==================
[15:43:59] ======================== fair_ggtt ========================
[15:43:59] [PASSED] 1 VF
[15:43:59] [PASSED] 2 VFs
[15:43:59] [PASSED] 3 VFs
[15:43:59] [PASSED] 4 VFs
[15:43:59] [PASSED] 5 VFs
[15:43:59] [PASSED] 6 VFs
[15:43:59] [PASSED] 7 VFs
[15:43:59] [PASSED] 8 VFs
[15:43:59] [PASSED] 9 VFs
[15:43:59] [PASSED] 10 VFs
[15:43:59] [PASSED] 11 VFs
[15:43:59] [PASSED] 12 VFs
[15:43:59] [PASSED] 13 VFs
[15:43:59] [PASSED] 14 VFs
[15:43:59] [PASSED] 15 VFs
[15:43:59] [PASSED] 16 VFs
[15:43:59] [PASSED] 17 VFs
[15:43:59] [PASSED] 18 VFs
[15:43:59] [PASSED] 19 VFs
[15:43:59] [PASSED] 20 VFs
[15:43:59] [PASSED] 21 VFs
[15:43:59] [PASSED] 22 VFs
[15:43:59] [PASSED] 23 VFs
[15:43:59] [PASSED] 24 VFs
[15:43:59] [PASSED] 25 VFs
[15:44:00] [PASSED] 26 VFs
[15:44:00] [PASSED] 27 VFs
[15:44:00] [PASSED] 28 VFs
[15:44:00] [PASSED] 29 VFs
[15:44:00] [PASSED] 30 VFs
[15:44:00] [PASSED] 31 VFs
[15:44:00] [PASSED] 32 VFs
[15:44:00] [PASSED] 33 VFs
[15:44:00] [PASSED] 34 VFs
[15:44:00] [PASSED] 35 VFs
[15:44:00] [PASSED] 36 VFs
[15:44:00] [PASSED] 37 VFs
[15:44:00] [PASSED] 38 VFs
[15:44:00] [PASSED] 39 VFs
[15:44:00] [PASSED] 40 VFs
[15:44:00] [PASSED] 41 VFs
[15:44:00] [PASSED] 42 VFs
[15:44:00] [PASSED] 43 VFs
[15:44:00] [PASSED] 44 VFs
[15:44:00] [PASSED] 45 VFs
[15:44:00] [PASSED] 46 VFs
[15:44:00] [PASSED] 47 VFs
[15:44:00] [PASSED] 48 VFs
[15:44:00] [PASSED] 49 VFs
[15:44:00] [PASSED] 50 VFs
[15:44:00] [PASSED] 51 VFs
[15:44:00] [PASSED] 52 VFs
[15:44:00] [PASSED] 53 VFs
[15:44:00] [PASSED] 54 VFs
[15:44:00] [PASSED] 55 VFs
[15:44:00] [PASSED] 56 VFs
[15:44:00] [PASSED] 57 VFs
[15:44:00] [PASSED] 58 VFs
[15:44:00] [PASSED] 59 VFs
[15:44:00] [PASSED] 60 VFs
[15:44:00] [PASSED] 61 VFs
[15:44:00] [PASSED] 62 VFs
[15:44:00] [PASSED] 63 VFs
[15:44:00] ==================== [PASSED] fair_ggtt ====================
[15:44:00] ======================== fair_vram ========================
[15:44:00] [PASSED] 1 VF
[15:44:00] [PASSED] 2 VFs
[15:44:00] [PASSED] 3 VFs
[15:44:00] [PASSED] 4 VFs
[15:44:00] [PASSED] 5 VFs
[15:44:00] [PASSED] 6 VFs
[15:44:00] [PASSED] 7 VFs
[15:44:00] [PASSED] 8 VFs
[15:44:00] [PASSED] 9 VFs
[15:44:00] [PASSED] 10 VFs
[15:44:00] [PASSED] 11 VFs
[15:44:00] [PASSED] 12 VFs
[15:44:00] [PASSED] 13 VFs
[15:44:00] [PASSED] 14 VFs
[15:44:00] [PASSED] 15 VFs
[15:44:00] [PASSED] 16 VFs
[15:44:00] [PASSED] 17 VFs
[15:44:00] [PASSED] 18 VFs
[15:44:00] [PASSED] 19 VFs
[15:44:00] [PASSED] 20 VFs
[15:44:00] [PASSED] 21 VFs
[15:44:00] [PASSED] 22 VFs
[15:44:00] [PASSED] 23 VFs
[15:44:00] [PASSED] 24 VFs
[15:44:00] [PASSED] 25 VFs
[15:44:00] [PASSED] 26 VFs
[15:44:00] [PASSED] 27 VFs
[15:44:00] [PASSED] 28 VFs
[15:44:00] [PASSED] 29 VFs
[15:44:00] [PASSED] 30 VFs
[15:44:00] [PASSED] 31 VFs
[15:44:00] [PASSED] 32 VFs
[15:44:00] [PASSED] 33 VFs
[15:44:00] [PASSED] 34 VFs
[15:44:00] [PASSED] 35 VFs
[15:44:00] [PASSED] 36 VFs
[15:44:00] [PASSED] 37 VFs
[15:44:00] [PASSED] 38 VFs
[15:44:00] [PASSED] 39 VFs
[15:44:00] [PASSED] 40 VFs
[15:44:00] [PASSED] 41 VFs
[15:44:00] [PASSED] 42 VFs
[15:44:00] [PASSED] 43 VFs
[15:44:00] [PASSED] 44 VFs
[15:44:00] [PASSED] 45 VFs
[15:44:00] [PASSED] 46 VFs
[15:44:00] [PASSED] 47 VFs
[15:44:00] [PASSED] 48 VFs
[15:44:00] [PASSED] 49 VFs
[15:44:00] [PASSED] 50 VFs
[15:44:00] [PASSED] 51 VFs
[15:44:00] [PASSED] 52 VFs
[15:44:00] [PASSED] 53 VFs
[15:44:00] [PASSED] 54 VFs
[15:44:00] [PASSED] 55 VFs
[15:44:00] [PASSED] 56 VFs
[15:44:00] [PASSED] 57 VFs
[15:44:00] [PASSED] 58 VFs
[15:44:00] [PASSED] 59 VFs
[15:44:00] [PASSED] 60 VFs
[15:44:00] [PASSED] 61 VFs
[15:44:00] [PASSED] 62 VFs
[15:44:00] [PASSED] 63 VFs
[15:44:00] ==================== [PASSED] fair_vram ====================
[15:44:00] ================== [PASSED] pf_gt_config ===================
[15:44:00] ===================== lmtt (1 subtest) =====================
[15:44:00] ======================== test_ops =========================
[15:44:00] [PASSED] 2-level
[15:44:00] [PASSED] multi-level
[15:44:00] ==================== [PASSED] test_ops =====================
[15:44:00] ====================== [PASSED] lmtt =======================
[15:44:00] ================= sriov_packet (1 subtest) =================
[15:44:00] [PASSED] test_descriptor_init
[15:44:00] ================== [PASSED] sriov_packet ===================
[15:44:00] ================= pf_service (11 subtests) =================
[15:44:00] [PASSED] pf_negotiate_any
[15:44:00] [PASSED] pf_negotiate_base_match
[15:44:00] [PASSED] pf_negotiate_base_newer
[15:44:00] [PASSED] pf_negotiate_base_next
[15:44:00] [SKIPPED] pf_negotiate_base_older (no older minor)
[15:44:00] [PASSED] pf_negotiate_base_prev
[15:44:00] [PASSED] pf_negotiate_latest_match
[15:44:00] [PASSED] pf_negotiate_latest_newer
[15:44:00] [PASSED] pf_negotiate_latest_next
[15:44:00] [SKIPPED] pf_negotiate_latest_older (no older minor)
[15:44:00] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[15:44:00] =================== [PASSED] pf_service ====================
[15:44:00] ================= xe_guc_g2g (2 subtests) ==================
[15:44:00] ============== xe_live_guc_g2g_kunit_default ==============
[15:44:00] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[15:44:00] ============== xe_live_guc_g2g_kunit_allmem ===============
[15:44:00] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[15:44:00] =================== [SKIPPED] xe_guc_g2g ===================
[15:44:00] =================== xe_mocs (2 subtests) ===================
[15:44:00] ================ xe_live_mocs_kernel_kunit ================
[15:44:00] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[15:44:00] ================ xe_live_mocs_reset_kunit =================
[15:44:00] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[15:44:00] ==================== [SKIPPED] xe_mocs =====================
[15:44:00] ================= xe_migrate (2 subtests) ==================
[15:44:00] ================= xe_migrate_sanity_kunit =================
[15:44:00] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[15:44:00] ================== xe_validate_ccs_kunit ==================
[15:44:00] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[15:44:00] =================== [SKIPPED] xe_migrate ===================
[15:44:00] ================== xe_dma_buf (1 subtest) ==================
[15:44:00] ==================== xe_dma_buf_kunit =====================
[15:44:00] ================ [SKIPPED] xe_dma_buf_kunit ================
[15:44:00] =================== [SKIPPED] xe_dma_buf ===================
[15:44:00] ================= xe_bo_shrink (1 subtest) =================
[15:44:00] =================== xe_bo_shrink_kunit ====================
[15:44:00] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[15:44:00] ================== [SKIPPED] xe_bo_shrink ==================
[15:44:00] ==================== xe_bo (2 subtests) ====================
[15:44:00] ================== xe_ccs_migrate_kunit ===================
[15:44:00] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[15:44:00] ==================== xe_bo_evict_kunit ====================
[15:44:00] =============== [SKIPPED] xe_bo_evict_kunit ================
[15:44:00] ===================== [SKIPPED] xe_bo ======================
[15:44:00] =================== xe_any (9 subtests) ====================
[15:44:00] [PASSED] test_to_xe
[15:44:00] [PASSED] test_to_dev
[15:44:00] [PASSED] test_to_pdev
[15:44:00] [PASSED] test_to_drm
[15:44:00] [PASSED] test_if_pdev
[15:44:00] [PASSED] test_if_xe
[15:44:00] [PASSED] test_if_tile
[15:44:00] [PASSED] test_if_gt
[15:44:00] [PASSED] test_to_id
[15:44:00] ===================== [PASSED] xe_any ======================
[15:44:00] ==================== args (13 subtests) ====================
[15:44:00] [PASSED] count_args_test
[15:44:00] [PASSED] call_args_example
[15:44:00] [PASSED] call_args_test
[15:44:00] [PASSED] drop_first_arg_example
[15:44:00] [PASSED] drop_first_arg_test
[15:44:00] [PASSED] first_arg_example
[15:44:00] [PASSED] first_arg_test
[15:44:00] [PASSED] last_arg_example
[15:44:00] [PASSED] last_arg_test
[15:44:00] [PASSED] pick_arg_example
[15:44:00] [PASSED] if_args_example
[15:44:00] [PASSED] if_args_test
[15:44:00] [PASSED] sep_comma_example
[15:44:00] ====================== [PASSED] args =======================
[15:44:00] =================== xe_pci (3 subtests) ====================
[15:44:00] ==================== check_graphics_ip ====================
[15:44:00] [PASSED] 12.00 Xe_LP
[15:44:00] [PASSED] 12.10 Xe_LP+
[15:44:00] [PASSED] 12.55 Xe_HPG
[15:44:00] [PASSED] 12.60 Xe_HPC
[15:44:00] [PASSED] 12.70 Xe_LPG
[15:44:00] [PASSED] 12.71 Xe_LPG
[15:44:00] [PASSED] 12.74 Xe_LPG+
[15:44:00] [PASSED] 20.01 Xe2_HPG
[15:44:00] [PASSED] 20.02 Xe2_HPG
[15:44:00] [PASSED] 20.04 Xe2_LPG
[15:44:00] [PASSED] 30.00 Xe3_LPG
[15:44:00] [PASSED] 30.01 Xe3_LPG
[15:44:00] [PASSED] 30.03 Xe3_LPG
[15:44:00] [PASSED] 30.04 Xe3_LPG
[15:44:00] [PASSED] 30.05 Xe3_LPG
[15:44:00] [PASSED] 35.10 Xe3p_LPG
[15:44:00] [PASSED] 35.11 Xe3p_XPC
[15:44:00] ================ [PASSED] check_graphics_ip ================
[15:44:00] ===================== check_media_ip ======================
[15:44:00] [PASSED] 12.00 Xe_M
[15:44:00] [PASSED] 12.55 Xe_HPM
[15:44:00] [PASSED] 13.00 Xe_LPM+
[15:44:00] [PASSED] 13.01 Xe2_HPM
[15:44:00] [PASSED] 20.00 Xe2_LPM
[15:44:00] [PASSED] 30.00 Xe3_LPM
[15:44:00] [PASSED] 30.02 Xe3_LPM
[15:44:00] [PASSED] 35.00 Xe3p_LPM
[15:44:00] [PASSED] 35.03 Xe3p_HPM
[15:44:00] ================= [PASSED] check_media_ip ==================
[15:44:00] =================== check_platform_desc ===================
[15:44:00] [PASSED] 0x9A60 (TIGERLAKE)
[15:44:00] [PASSED] 0x9A68 (TIGERLAKE)
[15:44:00] [PASSED] 0x9A70 (TIGERLAKE)
[15:44:00] [PASSED] 0x9A40 (TIGERLAKE)
[15:44:00] [PASSED] 0x9A49 (TIGERLAKE)
[15:44:00] [PASSED] 0x9A59 (TIGERLAKE)
[15:44:00] [PASSED] 0x9A78 (TIGERLAKE)
[15:44:00] [PASSED] 0x9AC0 (TIGERLAKE)
[15:44:00] [PASSED] 0x9AC9 (TIGERLAKE)
[15:44:00] [PASSED] 0x9AD9 (TIGERLAKE)
[15:44:00] [PASSED] 0x9AF8 (TIGERLAKE)
[15:44:00] [PASSED] 0x4C80 (ROCKETLAKE)
[15:44:00] [PASSED] 0x4C8A (ROCKETLAKE)
[15:44:00] [PASSED] 0x4C8B (ROCKETLAKE)
[15:44:00] [PASSED] 0x4C8C (ROCKETLAKE)
[15:44:00] [PASSED] 0x4C90 (ROCKETLAKE)
[15:44:00] [PASSED] 0x4C9A (ROCKETLAKE)
[15:44:00] [PASSED] 0x4680 (ALDERLAKE_S)
[15:44:00] [PASSED] 0x4682 (ALDERLAKE_S)
[15:44:00] [PASSED] 0x4688 (ALDERLAKE_S)
[15:44:00] [PASSED] 0x468A (ALDERLAKE_S)
[15:44:00] [PASSED] 0x468B (ALDERLAKE_S)
[15:44:00] [PASSED] 0x4690 (ALDERLAKE_S)
[15:44:00] [PASSED] 0x4692 (ALDERLAKE_S)
[15:44:00] [PASSED] 0x4693 (ALDERLAKE_S)
[15:44:00] [PASSED] 0x46A0 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46A1 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46A2 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46A3 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46A6 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46A8 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46AA (ALDERLAKE_P)
[15:44:00] [PASSED] 0x462A (ALDERLAKE_P)
[15:44:00] [PASSED] 0x4626 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x4628 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46B0 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46B1 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46B2 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46B3 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46C0 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46C1 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46C2 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46C3 (ALDERLAKE_P)
[15:44:00] [PASSED] 0x46D0 (ALDERLAKE_N)
[15:44:00] [PASSED] 0x46D1 (ALDERLAKE_N)
[15:44:00] [PASSED] 0x46D2 (ALDERLAKE_N)
[15:44:00] [PASSED] 0x46D3 (ALDERLAKE_N)
[15:44:00] [PASSED] 0x46D4 (ALDERLAKE_N)
[15:44:00] [PASSED] 0xA721 (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7A1 (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7A9 (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7AC (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7AD (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA720 (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7A0 (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7A8 (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7AA (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA7AB (ALDERLAKE_P)
[15:44:00] [PASSED] 0xA780 (ALDERLAKE_S)
[15:44:00] [PASSED] 0xA781 (ALDERLAKE_S)
[15:44:00] [PASSED] 0xA782 (ALDERLAKE_S)
[15:44:00] [PASSED] 0xA783 (ALDERLAKE_S)
[15:44:00] [PASSED] 0xA788 (ALDERLAKE_S)
[15:44:00] [PASSED] 0xA789 (ALDERLAKE_S)
[15:44:00] [PASSED] 0xA78A (ALDERLAKE_S)
[15:44:00] [PASSED] 0xA78B (ALDERLAKE_S)
[15:44:00] [PASSED] 0x4905 (DG1)
[15:44:00] [PASSED] 0x4906 (DG1)
[15:44:00] [PASSED] 0x4907 (DG1)
[15:44:00] [PASSED] 0x4908 (DG1)
[15:44:00] [PASSED] 0x4909 (DG1)
[15:44:00] [PASSED] 0x56C0 (DG2)
[15:44:00] [PASSED] 0x56C2 (DG2)
[15:44:00] [PASSED] 0x56C1 (DG2)
[15:44:00] [PASSED] 0x7D51 (METEORLAKE)
[15:44:00] [PASSED] 0x7DD1 (METEORLAKE)
[15:44:00] [PASSED] 0x7D41 (METEORLAKE)
[15:44:00] [PASSED] 0x7D67 (METEORLAKE)
[15:44:00] [PASSED] 0xB640 (METEORLAKE)
[15:44:00] [PASSED] 0x56A0 (DG2)
[15:44:00] [PASSED] 0x56A1 (DG2)
[15:44:00] [PASSED] 0x56A2 (DG2)
[15:44:00] [PASSED] 0x56BE (DG2)
[15:44:00] [PASSED] 0x56BF (DG2)
[15:44:00] [PASSED] 0x5690 (DG2)
[15:44:00] [PASSED] 0x5691 (DG2)
[15:44:00] [PASSED] 0x5692 (DG2)
[15:44:00] [PASSED] 0x56A5 (DG2)
[15:44:00] [PASSED] 0x56A6 (DG2)
[15:44:00] [PASSED] 0x56B0 (DG2)
[15:44:00] [PASSED] 0x56B1 (DG2)
[15:44:00] [PASSED] 0x56BA (DG2)
[15:44:00] [PASSED] 0x56BB (DG2)
[15:44:00] [PASSED] 0x56BC (DG2)
[15:44:00] [PASSED] 0x56BD (DG2)
[15:44:00] [PASSED] 0x5693 (DG2)
[15:44:00] [PASSED] 0x5694 (DG2)
[15:44:00] [PASSED] 0x5695 (DG2)
[15:44:00] [PASSED] 0x56A3 (DG2)
[15:44:00] [PASSED] 0x56A4 (DG2)
[15:44:00] [PASSED] 0x56B2 (DG2)
[15:44:00] [PASSED] 0x56B3 (DG2)
[15:44:00] [PASSED] 0x5696 (DG2)
[15:44:00] [PASSED] 0x5697 (DG2)
[15:44:00] [PASSED] 0xB69 (PVC)
[15:44:00] [PASSED] 0xB6E (PVC)
[15:44:00] [PASSED] 0xBD4 (PVC)
[15:44:00] [PASSED] 0xBD5 (PVC)
[15:44:00] [PASSED] 0xBD6 (PVC)
[15:44:00] [PASSED] 0xBD7 (PVC)
[15:44:00] [PASSED] 0xBD8 (PVC)
[15:44:00] [PASSED] 0xBD9 (PVC)
[15:44:00] [PASSED] 0xBDA (PVC)
[15:44:00] [PASSED] 0xBDB (PVC)
[15:44:00] [PASSED] 0xBE0 (PVC)
[15:44:00] [PASSED] 0xBE1 (PVC)
[15:44:00] [PASSED] 0xBE5 (PVC)
[15:44:00] [PASSED] 0x7D40 (METEORLAKE)
[15:44:00] [PASSED] 0x7D45 (METEORLAKE)
[15:44:00] [PASSED] 0x7D55 (METEORLAKE)
[15:44:00] [PASSED] 0x7D60 (METEORLAKE)
[15:44:00] [PASSED] 0x7DD5 (METEORLAKE)
[15:44:00] [PASSED] 0x6420 (LUNARLAKE)
[15:44:00] [PASSED] 0x64A0 (LUNARLAKE)
[15:44:00] [PASSED] 0x64B0 (LUNARLAKE)
[15:44:00] [PASSED] 0xE202 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE209 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE20B (BATTLEMAGE)
[15:44:00] [PASSED] 0xE20C (BATTLEMAGE)
[15:44:00] [PASSED] 0xE20D (BATTLEMAGE)
[15:44:00] [PASSED] 0xE210 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE211 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE212 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE216 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE220 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE221 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE222 (BATTLEMAGE)
[15:44:00] [PASSED] 0xE223 (BATTLEMAGE)
[15:44:00] [PASSED] 0xB080 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB081 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB082 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB083 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB084 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB085 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB086 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB087 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB08F (PANTHERLAKE)
[15:44:00] [PASSED] 0xB090 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB0A0 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB0A1 (PANTHERLAKE)
[15:44:00] [PASSED] 0xB0B0 (PANTHERLAKE)
[15:44:00] [PASSED] 0xFD80 (PANTHERLAKE)
[15:44:00] [PASSED] 0xFD81 (PANTHERLAKE)
[15:44:00] [PASSED] 0xD740 (NOVALAKE_S)
[15:44:00] [PASSED] 0xD741 (NOVALAKE_S)
[15:44:00] [PASSED] 0xD742 (NOVALAKE_S)
[15:44:00] [PASSED] 0xD743 (NOVALAKE_S)
[15:44:00] [PASSED] 0xD745 (NOVALAKE_S)
[15:44:00] [PASSED] 0xD74A (NOVALAKE_S)
[15:44:00] [PASSED] 0xD74B (NOVALAKE_S)
[15:44:00] [PASSED] 0x674C (CRESCENTISLAND)
[15:44:00] [PASSED] 0x674D (CRESCENTISLAND)
[15:44:00] [PASSED] 0x674E (CRESCENTISLAND)
[15:44:00] [PASSED] 0x674F (CRESCENTISLAND)
[15:44:00] [PASSED] 0x6750 (CRESCENTISLAND)
[15:44:00] [PASSED] 0x6751 (CRESCENTISLAND)
[15:44:00] [PASSED] 0xD750 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD751 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD752 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD753 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD754 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD755 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD756 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD757 (NOVALAKE_P)
[15:44:00] [PASSED] 0xD75F (NOVALAKE_P)
[15:44:00] =============== [PASSED] check_platform_desc ===============
[15:44:00] ===================== [PASSED] xe_pci ======================
[15:44:00] ============= xe_rtp_tables_test (5 subtests) ==============
[15:44:00] ================== xe_rtp_table_gt_test ===================
[15:44:00] [PASSED] gt_was/14011060649
[15:44:00] [PASSED] gt_was/14011059788
[15:44:00] [PASSED] gt_was/14015795083
[15:44:00] [PASSED] gt_was/16021867713
[15:44:00] [PASSED] gt_was/14019449301
[15:44:00] [PASSED] gt_was/16028005424
[15:44:00] [PASSED] gt_was/14026578760
[15:44:00] [PASSED] gt_was/1409420604
[15:44:00] [PASSED] gt_was/1408615072
[15:44:00] [PASSED] gt_was/22010523718
[15:44:00] [PASSED] gt_was/14011006942
[15:44:00] [PASSED] gt_was/14014830051
[15:44:00] [PASSED] gt_was/18018781329
[15:44:00] [PASSED] gt_was/1509235366
[15:44:00] [PASSED] gt_was/18018781329
[15:44:00] [PASSED] gt_was/16016694945
[15:44:00] [PASSED] gt_was/14018575942
[15:44:00] [PASSED] gt_was/22016670082
[15:44:00] [PASSED] gt_was/22016670082
[15:44:00] [PASSED] gt_was/14017421178
[15:44:00] [PASSED] gt_was/16025250150
[15:44:00] [PASSED] gt_was/14021871409
[15:44:00] [PASSED] gt_was/16021865536
[15:44:00] [PASSED] gt_was/14021486841
[15:44:00] [PASSED] gt_was/14025160223
[15:44:00] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[15:44:00] [PASSED] gt_was/14025635424
[15:44:00] [PASSED] gt_was/16028005424
[15:44:00] ============== [PASSED] xe_rtp_table_gt_test ===============
[15:44:00] ================== xe_rtp_table_gt_test ===================
[15:44:00] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[15:44:00] [PASSED] gt_tunings/Tuning: 32B Access Enable
[15:44:00] [PASSED] gt_tunings/Tuning: L3 cache
[15:44:00] [PASSED] gt_tunings/Tuning: L3 cache - media
[15:44:00] [PASSED] gt_tunings/Tuning: Compression Overfetch
[15:44:00] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[15:44:00] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[15:44:00] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[15:44:00] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[15:44:00] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[15:44:00] [PASSED] gt_tunings/Tuning: Stateless compression control
[15:44:00] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[15:44:00] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[15:44:00] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[15:44:00] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[15:44:00] [PASSED] gt_tunings/Tuning: Force All Non-Compressible Memory Reads to be 256B Overfetches
[15:44:00] ============== [PASSED] xe_rtp_table_gt_test ===============
[15:44:00] ================== xe_rtp_table_oob_test ==================
[15:44:00] [PASSED] oob_was/1607983814
[15:44:00] [PASSED] oob_was/16010904313
[15:44:00] [PASSED] oob_was/18022495364
[15:44:00] [PASSED] oob_was/22012773006
[15:44:00] [PASSED] oob_was/14014475959
[15:44:00] [PASSED] oob_was/22011391025
[15:44:00] [PASSED] oob_was/22012727170
[15:44:00] [PASSED] oob_was/22012727685
[15:44:00] [PASSED] oob_was/22016596838
[15:44:00] [PASSED] oob_was/18020744125
[15:44:00] [PASSED] oob_was/1409600907
[15:44:00] [PASSED] oob_was/22014953428
[15:44:00] [PASSED] oob_was/16017236439
[15:44:00] [PASSED] oob_was/14019821291
[15:44:00] [PASSED] oob_was/14015076503
[15:44:00] [PASSED] oob_was/22016122933
[15:44:00] [PASSED] oob_was/14018913170
[15:44:00] [PASSED] oob_was/14018094691
[15:44:00] [PASSED] oob_was/18024947630
[15:44:00] [PASSED] oob_was/16022287689
[15:44:00] [PASSED] oob_was/13011645652
[15:44:00] [PASSED] oob_was/14022293748
[15:44:00] [PASSED] oob_was/22019794406
[15:44:00] [PASSED] oob_was/22019338487
[15:44:00] [PASSED] oob_was/16023588340
[15:44:00] [PASSED] oob_was/14019789679
[15:44:00] [PASSED] oob_was/14022866841
[15:44:00] [PASSED] oob_was/16021333562
[15:44:00] [PASSED] oob_was/14016712196
[15:44:00] [PASSED] oob_was/14015568240
[15:44:00] [PASSED] oob_was/18013179988
[15:44:00] [PASSED] oob_was/1508761755
[15:44:00] [PASSED] oob_was/16023105232
[15:44:00] [PASSED] oob_was/16026508708
[15:44:00] [PASSED] oob_was/14020001231
[15:44:00] [PASSED] oob_was/16023683509
[15:44:00] [PASSED] oob_was/14025515070
[15:44:00] [PASSED] oob_was/15015404425_disable
[15:44:00] [PASSED] oob_was/16026007364
[15:44:00] [PASSED] oob_was/14020316580
[15:44:00] [PASSED] oob_was/14025883347
[15:44:00] [PASSED] oob_was/16029380221
[15:44:00] [PASSED] oob_was/22022079272
[15:44:00] [PASSED] oob_was/16029897822
[15:44:00] [PASSED] oob_was/14027054324
[15:44:00] [PASSED] oob_was/14025941587
[15:44:00] [PASSED] oob_was/16030224309
[15:44:00] ============== [PASSED] xe_rtp_table_oob_test ==============
[15:44:00] ================ xe_rtp_table_dev_oob_test ================
[15:44:00] [PASSED] device_oob_was/22010954014
[15:44:00] [PASSED] device_oob_was/15015404425
[15:44:00] [PASSED] device_oob_was/22019338487_display
[15:44:00] [PASSED] device_oob_was/14022085890
[15:44:00] [PASSED] device_oob_was/14026539277
[15:44:00] [PASSED] device_oob_was/14026633728
[15:44:00] [PASSED] device_oob_was/14026746987
[15:44:00] [PASSED] device_oob_was/14026779378
[15:44:00] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[15:44:00] ========== xe_rtp_table_missing_upper_bound_test ==========
[15:44:00] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[15:44:00] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[15:44:00] [PASSED] register_whitelist/1806527549
[15:44:00] [PASSED] register_whitelist/allow_read_ctx_timestamp
[15:44:00] [PASSED] register_whitelist/allow_read_queue_timestamp
[15:44:00] [PASSED] register_whitelist/16014440446
[15:44:00] [PASSED] register_whitelist/16017236439
[15:44:00] [PASSED] register_whitelist/16020183090
[15:44:00] [PASSED] register_whitelist/14024997852
[15:44:00] [PASSED] register_whitelist/14024997852
[15:44:00] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[15:44:00] =============== [PASSED] xe_rtp_tables_test ================
[15:44:00] =================== xe_rtp (3 subtests) ====================
[15:44:00] =================== xe_rtp_rules_tests ====================
[15:44:00] [PASSED] no
[15:44:00] [PASSED] yes
[15:44:00] [PASSED] no-and-no
[15:44:00] [PASSED] no-and-yes
[15:44:00] [PASSED] yes-and-no
[15:44:00] [PASSED] yes-and-yes
[15:44:00] [PASSED] no-or-no
[15:44:00] [PASSED] no-or-yes
[15:44:00] [PASSED] yes-or-no
[15:44:00] [PASSED] yes-or-yes
[15:44:00] [PASSED] no-yes-or-yes-no
[15:44:00] [PASSED] no-yes-or-yes-yes
[15:44:00] [PASSED] yes-yes-or-no-yes
[15:44:00] [PASSED] yes-yes-or-yes-yes
[15:44:00] [PASSED] no-no-or-yes-or-no
[15:44:00] [PASSED] or
[15:44:00] [PASSED] or-yes
[15:44:00] [PASSED] or-no
[15:44:00] [PASSED] yes-or
[15:44:00] [PASSED] no-or
[15:44:00] [PASSED] no-or-or-yes
[15:44:00] [PASSED] yes-or-or-no
[15:44:00] [PASSED] no-or-or-no
[15:44:00] [PASSED] missing-context-engine-class
[15:44:00] [PASSED] missing-context-engine-class-or-yes
[15:44:00] [PASSED] missing-context-engine-class-or-or-yes
[15:44:00] =============== [PASSED] xe_rtp_rules_tests ================
[15:44:00] =============== xe_rtp_process_to_sr_tests ================
[15:44:00] [PASSED] coalesce-same-reg
[15:44:00] [PASSED] coalesce-same-reg-literal-and-func
[15:44:00] [PASSED] no-match-no-add
[15:44:00] [PASSED] two-regs-two-entries
[15:44:00] [PASSED] clr-one-set-other
[15:44:00] [PASSED] set-field
[15:44:00] [PASSED] conflict-duplicate
[15:44:00] [PASSED] conflict-not-disjoint
[15:44:00] [PASSED] conflict-not-disjoint-literal-and-func
[15:44:00] [PASSED] conflict-reg-type
[15:44:00] [PASSED] bad-mcr-reg-forced-to-regular
[15:44:00] [PASSED] bad-regular-reg-forced-to-mcr
[15:44:00] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[15:44:00] ================== xe_rtp_process_tests ===================
[15:44:00] [PASSED] active1
[15:44:00] [PASSED] active2
[15:44:00] [PASSED] active-inactive
[15:44:00] [PASSED] inactive-active
[15:44:00] [PASSED] inactive-active-inactive
[15:44:00] [PASSED] inactive-inactive-inactive
[15:44:00] ============== [PASSED] xe_rtp_process_tests ===============
[15:44:00] ===================== [PASSED] xe_rtp ======================
[15:44:00] ==================== xe_wa (1 subtest) =====================
[15:44:00] ======================== xe_wa_gt =========================
[15:44:00] [PASSED] TIGERLAKE B0
[15:44:00] [PASSED] DG1 A0
[15:44:00] [PASSED] DG1 B0
[15:44:00] [PASSED] ALDERLAKE_S A0
[15:44:00] [PASSED] ALDERLAKE_S B0
[15:44:00] [PASSED] ALDERLAKE_S C0
[15:44:00] [PASSED] ALDERLAKE_S D0
[15:44:00] [PASSED] ALDERLAKE_P A0
[15:44:00] [PASSED] ALDERLAKE_P B0
[15:44:00] [PASSED] ALDERLAKE_P C0
[15:44:00] [PASSED] ALDERLAKE_S RPLS D0
[15:44:00] [PASSED] ALDERLAKE_P RPLU E0
[15:44:00] [PASSED] DG2 G10 C0
[15:44:00] [PASSED] DG2 G11 B1
[15:44:00] [PASSED] DG2 G12 A1
[15:44:00] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[15:44:00] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[15:44:00] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[15:44:00] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[15:44:00] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[15:44:00] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[15:44:00] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[15:44:00] ==================== [PASSED] xe_wa_gt =====================
[15:44:00] ====================== [PASSED] xe_wa ======================
[15:44:00] ============================================================
[15:44:00] Testing complete. Ran 821 tests: passed: 793, skipped: 28
[15:44:00] Elapsed time: 37.009s total, 1.891s configuring, 34.401s building, 0.710s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[15:44:00] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:44:02] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[15:44:27] Starting KUnit Kernel (1/1)...
[15:44:27] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:44:27] ============ drm_test_pick_cmdline (2 subtests) ============
[15:44:27] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[15:44:27] =============== drm_test_pick_cmdline_named ===============
[15:44:27] [PASSED] NTSC
[15:44:27] [PASSED] NTSC-J
[15:44:27] [PASSED] PAL
[15:44:27] [PASSED] PAL-M
[15:44:27] =========== [PASSED] drm_test_pick_cmdline_named ===========
[15:44:27] ============== [PASSED] drm_test_pick_cmdline ==============
[15:44:27] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[15:44:27] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[15:44:27] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[15:44:27] =========== drm_validate_clone_mode (2 subtests) ===========
[15:44:27] ============== drm_test_check_in_clone_mode ===============
[15:44:27] [PASSED] in_clone_mode
[15:44:27] [PASSED] not_in_clone_mode
[15:44:27] ========== [PASSED] drm_test_check_in_clone_mode ===========
[15:44:27] =============== drm_test_check_valid_clones ===============
[15:44:27] [PASSED] not_in_clone_mode
[15:44:27] [PASSED] valid_clone
[15:44:27] [PASSED] invalid_clone
[15:44:27] =========== [PASSED] drm_test_check_valid_clones ===========
[15:44:27] ============= [PASSED] drm_validate_clone_mode =============
[15:44:27] ============= drm_validate_modeset (1 subtest) =============
[15:44:27] [PASSED] drm_test_check_connector_changed_modeset
[15:44:27] ============== [PASSED] drm_validate_modeset ===============
[15:44:27] ====== drm_test_bridge_get_current_state (1 subtest) =======
[15:44:27] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[15:44:27] ======== [PASSED] drm_test_bridge_get_current_state ========
[15:44:27] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[15:44:27] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[15:44:27] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[15:44:27] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts
[15:44:27] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[15:44:27] ============== drm_bridge_alloc (2 subtests) ===============
[15:44:27] [PASSED] drm_test_drm_bridge_alloc_basic
[15:44:27] [PASSED] drm_test_drm_bridge_alloc_get_put
[15:44:27] ================ [PASSED] drm_bridge_alloc =================
[15:44:27] ============= drm_bridge_bus_fmt (5 subtests) ==============
[15:44:27] [PASSED] drm_test_bridge_rgb_yuv_rgb
[15:44:27] [PASSED] drm_test_bridge_must_convert_to_yuv444
[15:44:27] [PASSED] drm_test_bridge_hdmi_auto_rgb
[15:44:27] [PASSED] drm_test_bridge_auto_first
[15:44:27] [PASSED] drm_test_bridge_rgb_yuv_no_path
[15:44:27] =============== [PASSED] drm_bridge_bus_fmt ================
[15:44:27] ============= drm_cmdline_parser (40 subtests) =============
[15:44:27] [PASSED] drm_test_cmdline_force_d_only
[15:44:27] [PASSED] drm_test_cmdline_force_D_only_dvi
[15:44:27] [PASSED] drm_test_cmdline_force_D_only_hdmi
[15:44:27] [PASSED] drm_test_cmdline_force_D_only_not_digital
[15:44:27] [PASSED] drm_test_cmdline_force_e_only
[15:44:27] [PASSED] drm_test_cmdline_res
[15:44:27] [PASSED] drm_test_cmdline_res_vesa
[15:44:27] [PASSED] drm_test_cmdline_res_vesa_rblank
[15:44:27] [PASSED] drm_test_cmdline_res_rblank
[15:44:27] [PASSED] drm_test_cmdline_res_bpp
[15:44:27] [PASSED] drm_test_cmdline_res_refresh
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[15:44:27] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[15:44:27] [PASSED] drm_test_cmdline_res_margins_force_on
[15:44:27] [PASSED] drm_test_cmdline_res_vesa_margins
[15:44:27] [PASSED] drm_test_cmdline_name
[15:44:27] [PASSED] drm_test_cmdline_name_bpp
[15:44:27] [PASSED] drm_test_cmdline_name_option
[15:44:27] [PASSED] drm_test_cmdline_name_bpp_option
[15:44:27] [PASSED] drm_test_cmdline_rotate_0
[15:44:27] [PASSED] drm_test_cmdline_rotate_90
[15:44:27] [PASSED] drm_test_cmdline_rotate_180
[15:44:27] [PASSED] drm_test_cmdline_rotate_270
[15:44:27] [PASSED] drm_test_cmdline_hmirror
[15:44:27] [PASSED] drm_test_cmdline_vmirror
[15:44:27] [PASSED] drm_test_cmdline_margin_options
[15:44:27] [PASSED] drm_test_cmdline_multiple_options
[15:44:27] [PASSED] drm_test_cmdline_bpp_extra_and_option
[15:44:27] [PASSED] drm_test_cmdline_extra_and_option
[15:44:27] [PASSED] drm_test_cmdline_freestanding_options
[15:44:27] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[15:44:27] [PASSED] drm_test_cmdline_panel_orientation
[15:44:27] ================ drm_test_cmdline_invalid =================
[15:44:27] [PASSED] margin_only
[15:44:27] [PASSED] interlace_only
[15:44:27] [PASSED] res_missing_x
[15:44:27] [PASSED] res_missing_y
[15:44:27] [PASSED] res_bad_y
[15:44:27] [PASSED] res_missing_y_bpp
[15:44:27] [PASSED] res_bad_bpp
[15:44:27] [PASSED] res_bad_refresh
[15:44:27] [PASSED] res_bpp_refresh_force_on_off
[15:44:27] [PASSED] res_invalid_mode
[15:44:27] [PASSED] res_bpp_wrong_place_mode
[15:44:27] [PASSED] name_bpp_refresh
[15:44:27] [PASSED] name_refresh
[15:44:27] [PASSED] name_refresh_wrong_mode
[15:44:27] [PASSED] name_refresh_invalid_mode
[15:44:27] [PASSED] rotate_multiple
[15:44:27] [PASSED] rotate_invalid_val
[15:44:27] [PASSED] rotate_truncated
[15:44:27] [PASSED] invalid_option
[15:44:27] [PASSED] invalid_tv_option
[15:44:27] [PASSED] truncated_tv_option
[15:44:27] ============ [PASSED] drm_test_cmdline_invalid =============
[15:44:27] =============== drm_test_cmdline_tv_options ===============
[15:44:27] [PASSED] NTSC
[15:44:27] [PASSED] NTSC_443
[15:44:27] [PASSED] NTSC_J
[15:44:27] [PASSED] PAL
[15:44:27] [PASSED] PAL_M
[15:44:27] [PASSED] PAL_N
[15:44:27] [PASSED] SECAM
[15:44:27] [PASSED] MONO_525
[15:44:27] [PASSED] MONO_625
[15:44:27] =========== [PASSED] drm_test_cmdline_tv_options ===========
[15:44:27] =============== [PASSED] drm_cmdline_parser ================
[15:44:27] ========== drmm_connector_hdmi_init (20 subtests) ==========
[15:44:27] [PASSED] drm_test_connector_hdmi_init_valid
[15:44:27] [PASSED] drm_test_connector_hdmi_init_bpc_8
[15:44:27] [PASSED] drm_test_connector_hdmi_init_bpc_10
[15:44:27] [PASSED] drm_test_connector_hdmi_init_bpc_12
[15:44:27] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[15:44:27] [PASSED] drm_test_connector_hdmi_init_bpc_null
[15:44:27] [PASSED] drm_test_connector_hdmi_init_formats_empty
[15:44:27] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[15:44:27] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[15:44:27] [PASSED] supported_formats=0x9 yuv420_allowed=1
[15:44:27] [PASSED] supported_formats=0x9 yuv420_allowed=0
[15:44:27] [PASSED] supported_formats=0x5 yuv420_allowed=1
[15:44:27] [PASSED] supported_formats=0x5 yuv420_allowed=0
[15:44:27] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[15:44:27] [PASSED] drm_test_connector_hdmi_init_null_ddc
[15:44:27] [PASSED] drm_test_connector_hdmi_init_null_product
[15:44:27] [PASSED] drm_test_connector_hdmi_init_null_vendor
[15:44:27] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[15:44:27] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[15:44:27] [PASSED] drm_test_connector_hdmi_init_product_valid
[15:44:27] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[15:44:27] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[15:44:27] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[15:44:27] ========= drm_test_connector_hdmi_init_type_valid =========
[15:44:27] [PASSED] HDMI-A
[15:44:27] [PASSED] HDMI-B
[15:44:27] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[15:44:27] ======== drm_test_connector_hdmi_init_type_invalid ========
[15:44:27] [PASSED] Unknown
[15:44:27] [PASSED] VGA
[15:44:27] [PASSED] DVI-I
[15:44:27] [PASSED] DVI-D
[15:44:27] [PASSED] DVI-A
[15:44:27] [PASSED] Composite
[15:44:27] [PASSED] SVIDEO
[15:44:27] [PASSED] LVDS
[15:44:27] [PASSED] Component
[15:44:27] [PASSED] DIN
[15:44:27] [PASSED] DP
[15:44:27] [PASSED] TV
[15:44:27] [PASSED] eDP
[15:44:27] [PASSED] Virtual
[15:44:27] [PASSED] DSI
[15:44:27] [PASSED] DPI
[15:44:27] [PASSED] Writeback
[15:44:27] [PASSED] SPI
[15:44:27] [PASSED] USB
[15:44:27] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[15:44:27] ============ [PASSED] drmm_connector_hdmi_init =============
[15:44:27] ============= drmm_connector_init (3 subtests) =============
[15:44:27] [PASSED] drm_test_drmm_connector_init
[15:44:27] [PASSED] drm_test_drmm_connector_init_null_ddc
[15:44:27] ========= drm_test_drmm_connector_init_type_valid =========
[15:44:27] [PASSED] Unknown
[15:44:27] [PASSED] VGA
[15:44:27] [PASSED] DVI-I
[15:44:27] [PASSED] DVI-D
[15:44:27] [PASSED] DVI-A
[15:44:27] [PASSED] Composite
[15:44:27] [PASSED] SVIDEO
[15:44:27] [PASSED] LVDS
[15:44:27] [PASSED] Component
[15:44:27] [PASSED] DIN
[15:44:27] [PASSED] DP
[15:44:27] [PASSED] HDMI-A
[15:44:27] [PASSED] HDMI-B
[15:44:27] [PASSED] TV
[15:44:27] [PASSED] eDP
[15:44:27] [PASSED] Virtual
[15:44:27] [PASSED] DSI
[15:44:27] [PASSED] DPI
[15:44:27] [PASSED] Writeback
[15:44:27] [PASSED] SPI
[15:44:27] [PASSED] USB
[15:44:27] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[15:44:27] =============== [PASSED] drmm_connector_init ===============
[15:44:27] ========= drm_connector_dynamic_init (6 subtests) ==========
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_init
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_init_properties
[15:44:27] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[15:44:27] [PASSED] Unknown
[15:44:27] [PASSED] VGA
[15:44:27] [PASSED] DVI-I
[15:44:27] [PASSED] DVI-D
[15:44:27] [PASSED] DVI-A
[15:44:27] [PASSED] Composite
[15:44:27] [PASSED] SVIDEO
[15:44:27] [PASSED] LVDS
[15:44:27] [PASSED] Component
[15:44:27] [PASSED] DIN
[15:44:27] [PASSED] DP
[15:44:27] [PASSED] HDMI-A
[15:44:27] [PASSED] HDMI-B
[15:44:27] [PASSED] TV
[15:44:27] [PASSED] eDP
[15:44:27] [PASSED] Virtual
[15:44:27] [PASSED] DSI
[15:44:27] [PASSED] DPI
[15:44:27] [PASSED] Writeback
[15:44:27] [PASSED] SPI
[15:44:27] [PASSED] USB
[15:44:27] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[15:44:27] ======== drm_test_drm_connector_dynamic_init_name =========
[15:44:27] [PASSED] Unknown
[15:44:27] [PASSED] VGA
[15:44:27] [PASSED] DVI-I
[15:44:27] [PASSED] DVI-D
[15:44:27] [PASSED] DVI-A
[15:44:27] [PASSED] Composite
[15:44:27] [PASSED] SVIDEO
[15:44:27] [PASSED] LVDS
[15:44:27] [PASSED] Component
[15:44:27] [PASSED] DIN
[15:44:27] [PASSED] DP
[15:44:27] [PASSED] HDMI-A
[15:44:27] [PASSED] HDMI-B
[15:44:27] [PASSED] TV
[15:44:27] [PASSED] eDP
[15:44:27] [PASSED] Virtual
[15:44:27] [PASSED] DSI
[15:44:27] [PASSED] DPI
[15:44:27] [PASSED] Writeback
[15:44:27] [PASSED] SPI
[15:44:27] [PASSED] USB
[15:44:27] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[15:44:27] =========== [PASSED] drm_connector_dynamic_init ============
[15:44:27] ==== drm_connector_dynamic_register_early (4 subtests) =====
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[15:44:27] ====== [PASSED] drm_connector_dynamic_register_early =======
[15:44:27] ======= drm_connector_dynamic_register (7 subtests) ========
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[15:44:27] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[15:44:27] ========= [PASSED] drm_connector_dynamic_register ==========
[15:44:27] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[15:44:27] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[15:44:27] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[15:44:27] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[15:44:27] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[15:44:27] ========== drm_test_get_tv_mode_from_name_valid ===========
[15:44:27] [PASSED] NTSC
[15:44:27] [PASSED] NTSC-443
[15:44:27] [PASSED] NTSC-J
[15:44:27] [PASSED] PAL
[15:44:27] [PASSED] PAL-M
[15:44:27] [PASSED] PAL-N
[15:44:27] [PASSED] SECAM
[15:44:27] [PASSED] Mono
[15:44:27] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[15:44:27] [PASSED] drm_test_get_tv_mode_from_name_truncated
[15:44:27] ============ [PASSED] drm_get_tv_mode_from_name ============
[15:44:27] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[15:44:27] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[15:44:27] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[15:44:27] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[15:44:27] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[15:44:27] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[15:44:27] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[15:44:27] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[15:44:27] [PASSED] VIC 96
[15:44:27] [PASSED] VIC 97
[15:44:27] [PASSED] VIC 101
[15:44:27] [PASSED] VIC 102
[15:44:27] [PASSED] VIC 106
[15:44:27] [PASSED] VIC 107
[15:44:27] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[15:44:27] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[15:44:27] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[15:44:27] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[15:44:27] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[15:44:27] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[15:44:27] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[15:44:27] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[15:44:27] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[15:44:27] [PASSED] Automatic
[15:44:27] [PASSED] Full
[15:44:27] [PASSED] Limited 16:235
[15:44:27] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[15:44:27] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[15:44:27] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[15:44:27] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[15:44:27] === drm_test_drm_hdmi_connector_get_output_format_name ====
[15:44:27] [PASSED] RGB
[15:44:27] [PASSED] YUV 4:2:0
[15:44:27] [PASSED] YUV 4:2:2
[15:44:27] [PASSED] YUV 4:4:4
[15:44:27] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[15:44:27] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[15:44:27] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[15:44:27] ============= drm_damage_helper (21 subtests) ==============
[15:44:27] [PASSED] drm_test_damage_iter_no_damage
[15:44:27] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[15:44:27] [PASSED] drm_test_damage_iter_no_damage_src_moved
[15:44:27] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[15:44:27] [PASSED] drm_test_damage_iter_no_damage_not_visible
[15:44:27] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[15:44:27] [PASSED] drm_test_damage_iter_no_damage_no_fb
[15:44:27] [PASSED] drm_test_damage_iter_simple_damage
[15:44:27] [PASSED] drm_test_damage_iter_single_damage
[15:44:27] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[15:44:27] [PASSED] drm_test_damage_iter_single_damage_outside_src
[15:44:27] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[15:44:27] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[15:44:27] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[15:44:27] [PASSED] drm_test_damage_iter_single_damage_src_moved
[15:44:27] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[15:44:27] [PASSED] drm_test_damage_iter_damage
[15:44:27] [PASSED] drm_test_damage_iter_damage_one_intersect
[15:44:27] [PASSED] drm_test_damage_iter_damage_one_outside
[15:44:27] [PASSED] drm_test_damage_iter_damage_src_moved
[15:44:27] [PASSED] drm_test_damage_iter_damage_not_visible
[15:44:27] ================ [PASSED] drm_damage_helper ================
[15:44:27] ============== drm_dp_mst_helper (3 subtests) ==============
[15:44:27] ============== drm_test_dp_mst_calc_pbn_mode ==============
[15:44:27] [PASSED] Clock 154000 BPP 30 DSC disabled
[15:44:27] [PASSED] Clock 234000 BPP 30 DSC disabled
[15:44:27] [PASSED] Clock 297000 BPP 24 DSC disabled
[15:44:27] [PASSED] Clock 332880 BPP 24 DSC enabled
[15:44:27] [PASSED] Clock 324540 BPP 24 DSC enabled
[15:44:27] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[15:44:27] ============== drm_test_dp_mst_calc_pbn_div ===============
[15:44:27] [PASSED] Link rate 2000000 lane count 4
[15:44:27] [PASSED] Link rate 2000000 lane count 2
[15:44:27] [PASSED] Link rate 2000000 lane count 1
[15:44:27] [PASSED] Link rate 1350000 lane count 4
[15:44:27] [PASSED] Link rate 1350000 lane count 2
[15:44:27] [PASSED] Link rate 1350000 lane count 1
[15:44:27] [PASSED] Link rate 1000000 lane count 4
[15:44:27] [PASSED] Link rate 1000000 lane count 2
[15:44:27] [PASSED] Link rate 1000000 lane count 1
[15:44:27] [PASSED] Link rate 810000 lane count 4
[15:44:27] [PASSED] Link rate 810000 lane count 2
[15:44:27] [PASSED] Link rate 810000 lane count 1
[15:44:27] [PASSED] Link rate 540000 lane count 4
[15:44:27] [PASSED] Link rate 540000 lane count 2
[15:44:27] [PASSED] Link rate 540000 lane count 1
[15:44:27] [PASSED] Link rate 270000 lane count 4
[15:44:27] [PASSED] Link rate 270000 lane count 2
[15:44:27] [PASSED] Link rate 270000 lane count 1
[15:44:27] [PASSED] Link rate 162000 lane count 4
[15:44:27] [PASSED] Link rate 162000 lane count 2
[15:44:27] [PASSED] Link rate 162000 lane count 1
[15:44:27] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[15:44:27] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[15:44:27] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[15:44:27] [PASSED] DP_POWER_UP_PHY with port number
[15:44:27] [PASSED] DP_POWER_DOWN_PHY with port number
[15:44:27] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[15:44:27] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[15:44:27] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[15:44:27] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[15:44:27] [PASSED] DP_QUERY_PAYLOAD with port number
[15:44:27] [PASSED] DP_QUERY_PAYLOAD with VCPI
[15:44:27] [PASSED] DP_REMOTE_DPCD_READ with port number
[15:44:27] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[15:44:27] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[15:44:27] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[15:44:27] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[15:44:27] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[15:44:27] [PASSED] DP_REMOTE_I2C_READ with port number
[15:44:27] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[15:44:27] [PASSED] DP_REMOTE_I2C_READ with transactions array
[15:44:27] [PASSED] DP_REMOTE_I2C_WRITE with port number
[15:44:27] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[15:44:27] [PASSED] DP_REMOTE_I2C_WRITE with data array
[15:44:27] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[15:44:27] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[15:44:27] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[15:44:27] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[15:44:27] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[15:44:27] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[15:44:27] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[15:44:27] ================ [PASSED] drm_dp_mst_helper ================
[15:44:27] ================== drm_exec (7 subtests) ===================
[15:44:27] [PASSED] sanitycheck
[15:44:27] [PASSED] test_lock
[15:44:27] [PASSED] test_lock_unlock
[15:44:27] [PASSED] test_duplicates
[15:44:27] [PASSED] test_prepare
[15:44:27] [PASSED] test_prepare_array
[15:44:27] [PASSED] test_multiple_loops
[15:44:27] ==================== [PASSED] drm_exec =====================
[15:44:27] =========== drm_format_helper_test (17 subtests) ===========
[15:44:27] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[15:44:27] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[15:44:27] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[15:44:27] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[15:44:27] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[15:44:27] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[15:44:27] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[15:44:27] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[15:44:27] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[15:44:27] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[15:44:27] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[15:44:27] ============== drm_test_fb_xrgb8888_to_mono ===============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[15:44:27] ==================== drm_test_fb_swab =====================
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ================ [PASSED] drm_test_fb_swab =================
[15:44:27] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[15:44:27] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[15:44:27] [PASSED] single_pixel_source_buffer
[15:44:27] [PASSED] single_pixel_clip_rectangle
[15:44:27] [PASSED] well_known_colors
[15:44:27] [PASSED] destination_pitch
[15:44:27] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[15:44:27] ================= drm_test_fb_clip_offset =================
[15:44:27] [PASSED] pass through
[15:44:27] [PASSED] horizontal offset
[15:44:27] [PASSED] vertical offset
[15:44:27] [PASSED] horizontal and vertical offset
[15:44:27] [PASSED] horizontal offset (custom pitch)
[15:44:27] [PASSED] vertical offset (custom pitch)
[15:44:27] [PASSED] horizontal and vertical offset (custom pitch)
[15:44:27] ============= [PASSED] drm_test_fb_clip_offset =============
[15:44:27] =================== drm_test_fb_memcpy ====================
[15:44:27] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[15:44:27] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[15:44:27] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[15:44:27] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[15:44:27] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[15:44:27] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[15:44:27] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[15:44:27] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[15:44:27] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[15:44:27] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[15:44:27] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[15:44:27] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[15:44:27] =============== [PASSED] drm_test_fb_memcpy ================
[15:44:27] ============= [PASSED] drm_format_helper_test ==============
[15:44:27] ================= drm_format (18 subtests) =================
[15:44:27] [PASSED] drm_test_format_block_width_invalid
[15:44:27] [PASSED] drm_test_format_block_width_one_plane
[15:44:27] [PASSED] drm_test_format_block_width_two_plane
[15:44:27] [PASSED] drm_test_format_block_width_three_plane
[15:44:27] [PASSED] drm_test_format_block_width_tiled
[15:44:27] [PASSED] drm_test_format_block_height_invalid
[15:44:27] [PASSED] drm_test_format_block_height_one_plane
[15:44:27] [PASSED] drm_test_format_block_height_two_plane
[15:44:27] [PASSED] drm_test_format_block_height_three_plane
[15:44:27] [PASSED] drm_test_format_block_height_tiled
[15:44:27] [PASSED] drm_test_format_min_pitch_invalid
[15:44:27] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[15:44:27] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[15:44:27] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[15:44:27] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[15:44:27] [PASSED] drm_test_format_min_pitch_two_plane
[15:44:27] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[15:44:27] [PASSED] drm_test_format_min_pitch_tiled
[15:44:27] =================== [PASSED] drm_format ====================
[15:44:27] ============== drm_framebuffer (10 subtests) ===============
[15:44:27] ========== drm_test_framebuffer_check_src_coords ==========
[15:44:27] [PASSED] Success: source fits into fb
[15:44:27] [PASSED] Fail: overflowing fb with x-axis coordinate
[15:44:27] [PASSED] Fail: overflowing fb with y-axis coordinate
[15:44:27] [PASSED] Fail: overflowing fb with source width
[15:44:27] [PASSED] Fail: overflowing fb with source height
[15:44:27] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[15:44:27] [PASSED] drm_test_framebuffer_cleanup
[15:44:27] =============== drm_test_framebuffer_create ===============
[15:44:27] [PASSED] ABGR8888 normal sizes
[15:44:27] [PASSED] ABGR8888 max sizes
[15:44:27] [PASSED] ABGR8888 pitch greater than min required
[15:44:27] [PASSED] ABGR8888 pitch less than min required
[15:44:27] [PASSED] ABGR8888 Invalid width
[15:44:27] [PASSED] ABGR8888 Invalid buffer handle
[15:44:27] [PASSED] No pixel format
[15:44:27] [PASSED] ABGR8888 Width 0
[15:44:27] [PASSED] ABGR8888 Height 0
[15:44:27] [PASSED] ABGR8888 Out of bound height * pitch combination
[15:44:27] [PASSED] ABGR8888 Large buffer offset
[15:44:27] [PASSED] ABGR8888 Buffer offset for inexistent plane
[15:44:27] [PASSED] ABGR8888 Invalid flag
[15:44:27] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[15:44:27] [PASSED] ABGR8888 Valid buffer modifier
[15:44:27] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[15:44:27] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[15:44:27] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[15:44:27] [PASSED] NV12 Normal sizes
[15:44:27] [PASSED] NV12 Max sizes
[15:44:27] [PASSED] NV12 Invalid pitch
[15:44:27] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[15:44:27] [PASSED] NV12 different modifier per-plane
[15:44:27] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[15:44:27] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[15:44:27] [PASSED] NV12 Modifier for inexistent plane
[15:44:27] [PASSED] NV12 Handle for inexistent plane
[15:44:27] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[15:44:27] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[15:44:27] [PASSED] YVU420 Normal sizes
[15:44:27] [PASSED] YVU420 Max sizes
[15:44:27] [PASSED] YVU420 Invalid pitch
[15:44:27] [PASSED] YVU420 Different pitches
[15:44:27] [PASSED] YVU420 Different buffer offsets/pitches
[15:44:27] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[15:44:27] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[15:44:27] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[15:44:27] [PASSED] YVU420 Valid modifier
[15:44:27] [PASSED] YVU420 Different modifiers per plane
[15:44:27] [PASSED] YVU420 Modifier for inexistent plane
[15:44:27] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[15:44:27] [PASSED] X0L2 Normal sizes
[15:44:27] [PASSED] X0L2 Max sizes
[15:44:27] [PASSED] X0L2 Invalid pitch
[15:44:27] [PASSED] X0L2 Pitch greater than minimum required
[15:44:27] [PASSED] X0L2 Handle for inexistent plane
[15:44:27] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[15:44:27] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[15:44:27] [PASSED] X0L2 Valid modifier
[15:44:27] [PASSED] X0L2 Modifier for inexistent plane
[15:44:27] =========== [PASSED] drm_test_framebuffer_create ===========
[15:44:27] [PASSED] drm_test_framebuffer_free
[15:44:27] [PASSED] drm_test_framebuffer_init
[15:44:27] [PASSED] drm_test_framebuffer_init_bad_format
[15:44:27] [PASSED] drm_test_framebuffer_init_dev_mismatch
[15:44:27] [PASSED] drm_test_framebuffer_lookup
[15:44:27] [PASSED] drm_test_framebuffer_lookup_inexistent
[15:44:27] [PASSED] drm_test_framebuffer_modifiers_not_supported
[15:44:27] ================= [PASSED] drm_framebuffer =================
[15:44:27] ================ drm_gem_shmem (8 subtests) ================
[15:44:27] [PASSED] drm_gem_shmem_test_obj_create
[15:44:27] [PASSED] drm_gem_shmem_test_obj_create_private
[15:44:27] [PASSED] drm_gem_shmem_test_pin_pages
[15:44:27] [PASSED] drm_gem_shmem_test_vmap
[15:44:27] [PASSED] drm_gem_shmem_test_get_sg_table
[15:44:27] [PASSED] drm_gem_shmem_test_get_pages_sgt
[15:44:27] [PASSED] drm_gem_shmem_test_madvise
[15:44:27] [PASSED] drm_gem_shmem_test_purge
[15:44:27] ================== [PASSED] drm_gem_shmem ==================
[15:44:27] === drm_atomic_helper_connector_hdmi_check (29 subtests) ===
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[15:44:27] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[15:44:27] [PASSED] Automatic
[15:44:27] [PASSED] Full
[15:44:27] [PASSED] Limited 16:235
[15:44:27] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[15:44:27] [PASSED] drm_test_check_disable_connector
[15:44:27] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[15:44:27] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[15:44:27] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[15:44:27] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[15:44:27] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[15:44:27] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[15:44:27] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[15:44:27] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[15:44:27] [PASSED] drm_test_check_output_bpc_dvi
[15:44:27] [PASSED] drm_test_check_output_bpc_format_vic_1
[15:44:27] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[15:44:27] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[15:44:27] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[15:44:27] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[15:44:27] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[15:44:27] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[15:44:27] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[15:44:27] ============ drm_test_check_hdmi_color_format =============
[15:44:27] [PASSED] AUTO -> RGB
[15:44:27] [PASSED] YCBCR422 -> YUV422
[15:44:27] [PASSED] YCBCR420 -> YUV420
[15:44:27] [PASSED] YCBCR444 -> YUV444
[15:44:27] [PASSED] RGB -> RGB
[15:44:27] ======== [PASSED] drm_test_check_hdmi_color_format =========
[15:44:27] ======== drm_test_check_hdmi_color_format_420_only ========
[15:44:27] [PASSED] RGB should fail
[15:44:27] [PASSED] YUV444 should fail
[15:44:27] [PASSED] YUV422 should fail
[15:44:27] [PASSED] YUV420 should work
[15:44:27] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ====
[15:44:27] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[15:44:27] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[15:44:27] [PASSED] drm_test_check_broadcast_rgb_value
[15:44:27] [PASSED] drm_test_check_bpc_8_value
[15:44:27] [PASSED] drm_test_check_bpc_10_value
[15:44:27] [PASSED] drm_test_check_bpc_12_value
[15:44:27] [PASSED] drm_test_check_format_value
[15:44:27] [PASSED] drm_test_check_tmds_char_value
[15:44:27] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[15:44:27] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) =
[15:44:27] [PASSED] drm_test_check_mode_valid
[15:44:27] [PASSED] drm_test_check_mode_valid_reject
[15:44:27] [PASSED] drm_test_check_mode_valid_reject_rate
[15:44:27] [PASSED] drm_test_check_mode_valid_reject_max_clock
[15:44:27] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock
[15:44:27] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector
[15:44:27] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb
[15:44:27] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[15:44:27] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[15:44:27] [PASSED] drm_test_check_infoframes
[15:44:27] [PASSED] drm_test_check_reject_avi_infoframe
[15:44:27] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[15:44:27] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[15:44:27] [PASSED] drm_test_check_reject_audio_infoframe
[15:44:27] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[15:44:27] ================= drm_managed (2 subtests) =================
[15:44:27] [PASSED] drm_test_managed_release_action
[15:44:27] [PASSED] drm_test_managed_run_action
[15:44:27] =================== [PASSED] drm_managed ===================
[15:44:27] =================== drm_mm (6 subtests) ====================
[15:44:27] [PASSED] drm_test_mm_init
[15:44:27] [PASSED] drm_test_mm_debug
[15:44:27] [PASSED] drm_test_mm_align32
[15:44:27] [PASSED] drm_test_mm_align64
[15:44:27] [PASSED] drm_test_mm_lowest
[15:44:27] [PASSED] drm_test_mm_highest
[15:44:27] ===================== [PASSED] drm_mm ======================
[15:44:27] ============= drm_modes_analog_tv (5 subtests) =============
[15:44:27] [PASSED] drm_test_modes_analog_tv_mono_576i
[15:44:27] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[15:44:27] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[15:44:27] [PASSED] drm_test_modes_analog_tv_pal_576i
[15:44:27] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[15:44:27] =============== [PASSED] drm_modes_analog_tv ===============
[15:44:27] ============== drm_panic_helper (3 subtests) ===============
[15:44:27] ============= drm_test_panic_screen_user_map ==============
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[15:44:27] ========= [PASSED] drm_test_panic_screen_user_map ==========
[15:44:27] ============= drm_test_panic_screen_user_page =============
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[15:44:27] ========= [PASSED] drm_test_panic_screen_user_page =========
[15:44:27] ========== drm_test_panic_screen_user_set_pixel ===========
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[15:44:27] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[15:44:27] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[15:44:27] ====== [PASSED] drm_test_panic_screen_user_set_pixel =======
[15:44:27] ================ [PASSED] drm_panic_helper =================
[15:44:27] ============== drm_plane_helper (2 subtests) ===============
[15:44:27] =============== drm_test_check_plane_state ================
[15:44:27] [PASSED] clipping_simple
[15:44:27] [PASSED] clipping_rotate_reflect
[15:44:27] [PASSED] positioning_simple
[15:44:27] [PASSED] upscaling
[15:44:27] [PASSED] downscaling
[15:44:27] [PASSED] rounding1
[15:44:27] [PASSED] rounding2
[15:44:27] [PASSED] rounding3
[15:44:27] [PASSED] rounding4
[15:44:27] =========== [PASSED] drm_test_check_plane_state ============
[15:44:27] =========== drm_test_check_invalid_plane_state ============
[15:44:27] [PASSED] positioning_invalid
[15:44:27] [PASSED] upscaling_invalid
[15:44:27] [PASSED] downscaling_invalid
[15:44:27] ======= [PASSED] drm_test_check_invalid_plane_state ========
[15:44:27] ================ [PASSED] drm_plane_helper =================
[15:44:27] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[15:44:27] ====== drm_test_connector_helper_tv_get_modes_check =======
[15:44:27] [PASSED] None
[15:44:27] [PASSED] PAL
[15:44:27] [PASSED] NTSC
[15:44:27] [PASSED] Both, NTSC Default
[15:44:27] [PASSED] Both, PAL Default
[15:44:27] [PASSED] Both, NTSC Default, with PAL on command-line
[15:44:27] [PASSED] Both, PAL Default, with NTSC on command-line
[15:44:27] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[15:44:27] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[15:44:27] ================== drm_rect (9 subtests) ===================
[15:44:27] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[15:44:27] [PASSED] drm_test_rect_clip_scaled_not_clipped
[15:44:27] [PASSED] drm_test_rect_clip_scaled_clipped
[15:44:27] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[15:44:27] ================= drm_test_rect_intersect =================
[15:44:27] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[15:44:27] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[15:44:27] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[15:44:27] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[15:44:27] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[15:44:27] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[15:44:27] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[15:44:27] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[15:44:27] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[15:44:27] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[15:44:27] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[15:44:27] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[15:44:27] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[15:44:27] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[15:44:27] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[15:44:27] ============= [PASSED] drm_test_rect_intersect =============
[15:44:27] ================ drm_test_rect_calc_hscale ================
[15:44:27] [PASSED] normal use
[15:44:27] [PASSED] out of max range
[15:44:27] [PASSED] out of min range
[15:44:27] [PASSED] zero dst
[15:44:27] [PASSED] negative src
[15:44:27] [PASSED] negative dst
[15:44:27] ============ [PASSED] drm_test_rect_calc_hscale ============
[15:44:27] ================ drm_test_rect_calc_vscale ================
[15:44:27] [PASSED] normal use
[15:44:27] [PASSED] out of max range
[15:44:27] [PASSED] out of min range
[15:44:27] [PASSED] zero dst
[15:44:27] [PASSED] negative src
[15:44:27] [PASSED] negative dst
[15:44:27] ============ [PASSED] drm_test_rect_calc_vscale ============
[15:44:27] ================== drm_test_rect_rotate ===================
[15:44:27] [PASSED] reflect-x
[15:44:27] [PASSED] reflect-y
[15:44:27] [PASSED] rotate-0
[15:44:27] [PASSED] rotate-90
[15:44:27] [PASSED] rotate-180
[15:44:27] [PASSED] rotate-270
[15:44:27] ============== [PASSED] drm_test_rect_rotate ===============
[15:44:27] ================ drm_test_rect_rotate_inv =================
[15:44:27] [PASSED] reflect-x
[15:44:27] [PASSED] reflect-y
[15:44:27] [PASSED] rotate-0
[15:44:27] [PASSED] rotate-90
[15:44:27] [PASSED] rotate-180
[15:44:27] [PASSED] rotate-270
[15:44:27] ============ [PASSED] drm_test_rect_rotate_inv =============
[15:44:27] ==================== [PASSED] drm_rect =====================
[15:44:27] ============ drm_sysfb_modeset_test (1 subtest) ============
[15:44:27] ============ drm_test_sysfb_build_fourcc_list =============
[15:44:27] [PASSED] no native formats
[15:44:27] [PASSED] XRGB8888 as native format
[15:44:27] [PASSED] remove duplicates
[15:44:27] [PASSED] convert alpha formats
[15:44:27] [PASSED] random formats
[15:44:27] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[15:44:27] ============= [PASSED] drm_sysfb_modeset_test ==============
[15:44:27] ================== drm_fixp (2 subtests) ===================
[15:44:27] [PASSED] drm_test_int2fixp
[15:44:27] [PASSED] drm_test_sm2fixp
[15:44:27] ==================== [PASSED] drm_fixp =====================
[15:44:27] ============================================================
[15:44:27] Testing complete. Ran 667 tests: passed: 667
[15:44:27] Elapsed time: 27.410s total, 1.900s configuring, 25.040s building, 0.419s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[15:44:27] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:44:29] 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
[15:44:39] Starting KUnit Kernel (1/1)...
[15:44:39] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:44:40] ================= ttm_device (5 subtests) ==================
[15:44:40] [PASSED] ttm_device_init_basic
[15:44:40] [PASSED] ttm_device_init_multiple
[15:44:40] [PASSED] ttm_device_fini_basic
[15:44:40] [PASSED] ttm_device_init_no_vma_man
[15:44:40] ================== ttm_device_init_pools ==================
[15:44:40] [PASSED] No DMA allocations, no DMA32 required
[15:44:40] [PASSED] DMA allocations, DMA32 required
[15:44:40] [PASSED] No DMA allocations, DMA32 required
[15:44:40] [PASSED] DMA allocations, no DMA32 required
[15:44:40] ============== [PASSED] ttm_device_init_pools ==============
[15:44:40] =================== [PASSED] ttm_device ====================
[15:44:40] ================== ttm_pool (8 subtests) ===================
[15:44:40] ================== ttm_pool_alloc_basic ===================
[15:44:40] [PASSED] One page
[15:44:40] [PASSED] More than one page
[15:44:40] [PASSED] Above the allocation limit
[15:44:40] [PASSED] One page, with coherent DMA mappings enabled
[15:44:40] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[15:44:40] ============== [PASSED] ttm_pool_alloc_basic ===============
[15:44:40] ============== ttm_pool_alloc_basic_dma_addr ==============
[15:44:40] [PASSED] One page
[15:44:40] [PASSED] More than one page
[15:44:40] [PASSED] Above the allocation limit
[15:44:40] [PASSED] One page, with coherent DMA mappings enabled
[15:44:40] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[15:44:40] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[15:44:40] [PASSED] ttm_pool_alloc_order_caching_match
[15:44:40] [PASSED] ttm_pool_alloc_caching_mismatch
[15:44:40] [PASSED] ttm_pool_alloc_order_mismatch
[15:44:40] [PASSED] ttm_pool_free_dma_alloc
[15:44:40] [PASSED] ttm_pool_free_no_dma_alloc
[15:44:40] [PASSED] ttm_pool_fini_basic
[15:44:40] ==================== [PASSED] ttm_pool =====================
[15:44:40] ================ ttm_resource (8 subtests) =================
[15:44:40] ================= ttm_resource_init_basic =================
[15:44:40] [PASSED] Init resource in TTM_PL_SYSTEM
[15:44:40] [PASSED] Init resource in TTM_PL_VRAM
[15:44:40] [PASSED] Init resource in a private placement
[15:44:40] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[15:44:40] ============= [PASSED] ttm_resource_init_basic =============
[15:44:40] [PASSED] ttm_resource_init_pinned
[15:44:40] [PASSED] ttm_resource_fini_basic
[15:44:40] [PASSED] ttm_resource_manager_init_basic
[15:44:40] [PASSED] ttm_resource_manager_usage_basic
[15:44:40] [PASSED] ttm_resource_manager_set_used_basic
[15:44:40] [PASSED] ttm_sys_man_alloc_basic
[15:44:40] [PASSED] ttm_sys_man_free_basic
[15:44:40] ================== [PASSED] ttm_resource ===================
[15:44:40] =================== ttm_tt (15 subtests) ===================
[15:44:40] ==================== ttm_tt_init_basic ====================
[15:44:40] [PASSED] Page-aligned size
[15:44:40] [PASSED] Extra pages requested
[15:44:40] ================ [PASSED] ttm_tt_init_basic ================
[15:44:40] [PASSED] ttm_tt_init_misaligned
[15:44:40] [PASSED] ttm_tt_fini_basic
[15:44:40] [PASSED] ttm_tt_fini_sg
[15:44:40] [PASSED] ttm_tt_fini_shmem
[15:44:40] [PASSED] ttm_tt_create_basic
[15:44:40] [PASSED] ttm_tt_create_invalid_bo_type
[15:44:40] [PASSED] ttm_tt_create_ttm_exists
[15:44:40] [PASSED] ttm_tt_create_failed
[15:44:40] [PASSED] ttm_tt_destroy_basic
[15:44:40] [PASSED] ttm_tt_populate_null_ttm
[15:44:40] [PASSED] ttm_tt_populate_populated_ttm
[15:44:40] [PASSED] ttm_tt_unpopulate_basic
[15:44:40] [PASSED] ttm_tt_unpopulate_empty_ttm
[15:44:40] [PASSED] ttm_tt_swapin_basic
[15:44:40] ===================== [PASSED] ttm_tt ======================
[15:44:40] =================== ttm_bo (14 subtests) ===================
[15:44:40] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[15:44:40] [PASSED] Cannot be interrupted and sleeps
[15:44:40] [PASSED] Cannot be interrupted, locks straight away
[15:44:40] [PASSED] Can be interrupted, sleeps
[15:44:40] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[15:44:40] [PASSED] ttm_bo_reserve_locked_no_sleep
[15:44:40] [PASSED] ttm_bo_reserve_no_wait_ticket
[15:44:40] [PASSED] ttm_bo_reserve_double_resv
[15:44:40] [PASSED] ttm_bo_reserve_interrupted
[15:44:40] [PASSED] ttm_bo_reserve_deadlock
[15:44:40] [PASSED] ttm_bo_unreserve_basic
[15:44:40] [PASSED] ttm_bo_unreserve_pinned
[15:44:40] [PASSED] ttm_bo_unreserve_bulk
[15:44:40] [PASSED] ttm_bo_fini_basic
[15:44:40] [PASSED] ttm_bo_fini_shared_resv
[15:44:40] [PASSED] ttm_bo_pin_basic
[15:44:40] [PASSED] ttm_bo_pin_unpin_resource
[15:44:40] [PASSED] ttm_bo_multiple_pin_one_unpin
[15:44:40] ===================== [PASSED] ttm_bo ======================
[15:44:40] ============== ttm_bo_validate (22 subtests) ===============
[15:44:40] ============== ttm_bo_init_reserved_sys_man ===============
[15:44:40] [PASSED] Buffer object for userspace
[15:44:40] [PASSED] Kernel buffer object
[15:44:40] [PASSED] Shared buffer object
[15:44:40] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[15:44:40] ============== ttm_bo_init_reserved_mock_man ==============
[15:44:40] [PASSED] Buffer object for userspace
[15:44:40] [PASSED] Kernel buffer object
[15:44:40] [PASSED] Shared buffer object
[15:44:40] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[15:44:40] [PASSED] ttm_bo_init_reserved_resv
[15:44:40] ================== ttm_bo_validate_basic ==================
[15:44:40] [PASSED] Buffer object for userspace
[15:44:40] [PASSED] Kernel buffer object
[15:44:40] [PASSED] Shared buffer object
[15:44:40] ============== [PASSED] ttm_bo_validate_basic ==============
[15:44:40] [PASSED] ttm_bo_validate_invalid_placement
[15:44:40] ============= ttm_bo_validate_same_placement ==============
[15:44:40] [PASSED] System manager
[15:44:40] [PASSED] VRAM manager
[15:44:40] ========= [PASSED] ttm_bo_validate_same_placement ==========
[15:44:40] [PASSED] ttm_bo_validate_failed_alloc
[15:44:40] [PASSED] ttm_bo_validate_pinned
[15:44:40] [PASSED] ttm_bo_validate_busy_placement
[15:44:40] ================ ttm_bo_validate_multihop =================
[15:44:40] [PASSED] Buffer object for userspace
[15:44:40] [PASSED] Kernel buffer object
[15:44:40] [PASSED] Shared buffer object
[15:44:40] ============ [PASSED] ttm_bo_validate_multihop =============
[15:44:40] ========== ttm_bo_validate_no_placement_signaled ==========
[15:44:40] [PASSED] Buffer object in system domain, no page vector
[15:44:40] [PASSED] Buffer object in system domain with an existing page vector
[15:44:40] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[15:44:40] ======== ttm_bo_validate_no_placement_not_signaled ========
[15:44:40] [PASSED] Buffer object for userspace
[15:44:40] [PASSED] Kernel buffer object
[15:44:40] [PASSED] Shared buffer object
[15:44:40] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[15:44:40] [PASSED] ttm_bo_validate_move_fence_signaled
[15:44:40] ========= ttm_bo_validate_move_fence_not_signaled =========
[15:44:40] [PASSED] Waits for GPU
[15:44:40] [PASSED] Tries to lock straight away
[15:44:40] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[15:44:40] [PASSED] ttm_bo_validate_swapout
[15:44:40] [PASSED] ttm_bo_validate_happy_evict
[15:44:40] [PASSED] ttm_bo_validate_all_pinned_evict
[15:44:40] [PASSED] ttm_bo_validate_allowed_only_evict
[15:44:40] [PASSED] ttm_bo_validate_deleted_evict
[15:44:40] [PASSED] ttm_bo_validate_busy_domain_evict
[15:44:40] [PASSED] ttm_bo_validate_evict_gutting
[15:44:40] [PASSED] ttm_bo_validate_recrusive_evict
[15:44:40] ================= [PASSED] ttm_bo_validate =================
[15:44:40] ============================================================
[15:44:40] Testing complete. Ran 102 tests: passed: 102
[15:44:40] Elapsed time: 12.271s total, 1.915s configuring, 10.140s building, 0.181s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[15:44:40] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:44:42] 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
[15:44:50] Starting KUnit Kernel (1/1)...
[15:44:50] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:44:51] =============== dma-buf-fence (12 subtests) ================
[15:44:51] [PASSED] test_sanitycheck
[15:44:51] [PASSED] test_signaling
[15:44:51] [PASSED] test_add_callback
[15:44:51] [PASSED] test_late_add_callback
[15:44:51] [PASSED] test_rm_callback
[15:44:51] [PASSED] test_late_rm_callback
[15:44:51] [PASSED] test_status
[15:44:51] [PASSED] test_error
[15:44:51] [PASSED] test_wait
[15:44:51] [PASSED] test_wait_timeout
[15:44:51] [PASSED] test_stub
[15:44:51] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[15:44:51] ================== [PASSED] dma-buf-fence ==================
[15:44:51] ============ dma-buf-fence-chain (11 subtests) =============
[15:44:51] [PASSED] test_sanitycheck
[15:44:51] [PASSED] test_find_seqno
[15:44:51] [PASSED] test_find_signaled
[15:44:51] [PASSED] test_find_out_of_order
[15:44:56] [PASSED] test_find_gap
[15:44:56] [PASSED] test_find_race
[15:44:56] [PASSED] test_signal_forward
[15:44:56] [PASSED] test_signal_backward
[15:44:56] [PASSED] test_wait_forward
[15:44:56] [PASSED] test_wait_backward
[15:44:56] [PASSED] test_wait_random
[15:44:56] =============== [PASSED] dma-buf-fence-chain ===============
[15:44:56] ============ dma-buf-fence-unwrap (10 subtests) ============
[15:44:56] [PASSED] test_sanitycheck
[15:44:56] [PASSED] test_unwrap_array
[15:44:56] [PASSED] test_unwrap_chain
[15:44:56] [PASSED] test_unwrap_chain_array
[15:44:56] [PASSED] test_unwrap_merge
[15:44:56] [PASSED] test_unwrap_merge_duplicate
[15:44:56] [PASSED] test_unwrap_merge_seqno
[15:44:56] [PASSED] test_unwrap_merge_order
[15:44:56] [PASSED] test_unwrap_merge_complex
[15:44:56] [PASSED] test_unwrap_merge_complex_seqno
[15:44:56] ============== [PASSED] dma-buf-fence-unwrap ===============
[15:44:56] ================ dma-buf-resv (5 subtests) =================
[15:44:56] [PASSED] test_sanitycheck
[15:44:56] ===================== test_signaling ======================
[15:44:56] [PASSED] kernel
[15:44:56] [PASSED] write
[15:44:56] [PASSED] read
[15:44:56] [PASSED] bookkeep
[15:44:56] ================= [PASSED] test_signaling ==================
[15:44:56] ====================== test_for_each ======================
[15:44:56] [PASSED] kernel
[15:44:56] [PASSED] write
[15:44:56] [PASSED] read
[15:44:56] [PASSED] bookkeep
[15:44:56] ================== [PASSED] test_for_each ==================
[15:44:56] ================= test_for_each_unlocked ==================
[15:44:56] [PASSED] kernel
[15:44:56] [PASSED] write
[15:44:56] [PASSED] read
[15:44:56] [PASSED] bookkeep
[15:44:56] ============= [PASSED] test_for_each_unlocked ==============
[15:44:56] ===================== test_get_fences =====================
[15:44:56] [PASSED] kernel
[15:44:56] [PASSED] write
[15:44:56] [PASSED] read
[15:44:56] [PASSED] bookkeep
[15:44:56] ================= [PASSED] test_get_fences =================
[15:44:56] ================== [PASSED] dma-buf-resv ===================
[15:44:56] ============================================================
[15:44:56] Testing complete. Ran 50 tests: passed: 49, skipped: 1
[15:44:56] Elapsed time: 16.045s total, 1.870s configuring, 8.804s building, 5.357s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 30+ messages in thread
* ✓ Xe.CI.BAT: success for sticky TT (rev2)
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
` (4 preceding siblings ...)
2026-10-07 15:45 ` ✓ CI.KUnit: success " Patchwork
@ 2026-10-07 16:46 ` Patchwork
2026-10-07 20:16 ` ✓ Xe.CI.FULL: " Patchwork
6 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2026-10-07 16:46 UTC (permalink / raw)
To: Matthew Auld; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 977 bytes --]
== Series Details ==
Series: sticky TT (rev2)
URL : https://patchwork.freedesktop.org/series/175133/
State : success
== Summary ==
CI Bug Log - changes from xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05_BAT -> xe-pw-175133v2_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (15 -> 15)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* IGT: IGT_9132 -> IGT_9133
* Linux: xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05 -> xe-pw-175133v2
IGT_9132: 9132
IGT_9133: 87159cf671a3bf9e04bd46442ef1a358481a66f4 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05: 5dc178a4563d8d2ee7fc3a81d005700cbfa04c05
xe-pw-175133v2: 175133v2
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/index.html
[-- Attachment #2: Type: text/html, Size: 1539 bytes --]
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-07 15:36 ` [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers Matthew Auld
@ 2026-10-07 18:11 ` Thomas Hellström
2026-10-08 9:46 ` Matthew Auld
0 siblings, 1 reply; 30+ messages in thread
From: Thomas Hellström @ 2026-10-07 18:11 UTC (permalink / raw)
To: Matthew Auld, intel-xe; +Cc: Matthew Brost, stable
On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
> for
> all exported VRAM buffers. However, in some multi-GPU setups, like
> with
> prime rendering on a dgpu and scanout/compositor using the igpu, it
> looks like the exported dma-buf window buffer can in some cases end
> up
> using p2p.
>
> However, user is reporting a kernel regression where performance here
> massively tanks across many games/workloads, where it looks like on
> each
> frame, the igpu is reading/sampling from VRAM over pcie for the
> window
> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
> >
> dgpu, and not so much display buffers with igpu <-> dgpu, at least
> for
> now.
>
> We don't currently have any hints to say "please use p2p for this
> buffer, or please don't", however we can use some heuristics to try
> to
> determine if this is likely a display buffer being exported to an
> igpu,
> which probably never intended for p2p:
>
> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
> tagged with this, but not always.
>
> 2. Importer being a PCI device with display, which is not xe driver.
>
> We also rely on the existing p2p Intel CPU whitelist to stop this
> happening on xe igpu. Currently p2p is only enabled for server CPUs,
> on
> Intel. We also limit the above to dual placement buffers.
>
> The original regression was bisected to commit 609fc8766d68 ("dma-
> buf:
> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
> already present when enabling that knob, so this goes back even
> further.
>
> User has confirmed that along with the sticky dma-buf TT placement
> fix,
> to prevent ping-ponging, the performance is back to normal.
>
Actually, I think this needs to be fixed on the importer side. Until we
have some some user-space hints, I don't think the exporter should
second-guess. Most sane solution IMO is if igfx importers could just
not advertise pcie p2p support?
Thanks,
Thomas
> Assisted-by: LLM
> Closes:
> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
> GPUs")
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: <stable@vger.kernel.org> # v6.12
> ---
> drivers/gpu/drm/xe/xe_bo.c | 3 +-
> drivers/gpu/drm/xe/xe_bo.h | 1 +
> drivers/gpu/drm/xe/xe_dma_buf.c | 63 +++++++++++++++++++++++++------
> --
> 3 files changed, 51 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index 5065a7bac39c..e63437a261cb 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
> void *data,
> * Display scanout is always non-coherent with the CPU
> cache.
> */
> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
> - bo_flags |= XE_BO_FLAG_FORCE_WC;
> + bo_flags |= XE_BO_FLAG_FORCE_WC |
> XE_BO_FLAG_SCANOUT;
>
> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
> *file_priv,
> DRM_XE_GEM_CPU_CACHING_WC,
>
> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
> XE_BO_FLAG_FORCE_WC |
> + XE_BO_FLAG_SCANOUT |
> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
> if (IS_ERR(bo))
> return PTR_ERR(bo);
> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
> index 1ddf3b6d4a9e..6965c2655731 100644
> --- a/drivers/gpu/drm/xe/xe_bo.h
> +++ b/drivers/gpu/drm/xe/xe_bo.h
> @@ -56,6 +56,7 @@
> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
> #define XE_BO_FLAG_NEEDS_1G BIT(27)
> +#define XE_BO_FLAG_SCANOUT BIT(28)
>
> /* this one is trigger internally only */
> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
> b/drivers/gpu/drm/xe/xe_dma_buf.c
> index b973579a69b8..0a347f09cee4 100644
> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
> _ddebug *desc, bool *flag)
> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
> #endif
>
> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
> *attach)
> +{
> + struct drm_gem_object *obj = attach->importer_priv;
> + struct xe_bo *bo = gem_to_xe_bo(obj);
> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
> +
> + XE_WARN_ON(xe_bo_evict(bo, exec));
> +}
> +
> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
> + .allow_peer2peer = true,
> + .invalidate_mappings = xe_dma_buf_move_notify
> +};
> +
> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
> +{
> + while (dev) {
> + if (dev_is_pci(dev))
> + return to_pci_dev(dev);
> + dev = dev->parent;
> + }
> + return NULL;
> +}
> +
> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
> *attach)
> +{
> + return attach->importer_ops == &xe_dma_buf_attach_ops;
> +}
> +
> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
> struct dma_buf_attachment *attach)
> {
> struct drm_gem_object *obj = attach->dmabuf->priv;
> + struct xe_bo *bo = gem_to_xe_bo(obj);
> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>
> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
> *dmabuf,
> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
> >dev, verbose_p2p_dist) < 0)
> attach->peer2peer = false;
>
> - if (!attach->peer2peer &&
> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
> + struct pci_dev *client =
> xe_find_parent_pci_dev(attach->dev);
> +
> + /*
> + * There are perf issues with using p2p with display
> buffers,
> + * like with igpu (compositor) <-> dgpu (exported
> p2p window
> + * buffer). Probably we need some actual userspace
> hints. We
> + * shouldn't really assume anything. Also, note that
> some of
> + * these buffers are not always tagged with SCANOUT.
> + */
> + if (bo->flags & XE_BO_FLAG_SCANOUT)
> + attach->peer2peer = false;
> + else if (client && pci_is_display(client) &&
> + !xe_dma_buf_attach_is_xe_device(attach))
> + attach->peer2peer = false;
> + }
> +
> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
> return -EOPNOTSUPP;
>
> xe_pm_runtime_get(to_xe_device(obj->dev));
> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
> struct dma_buf *dma_buf)
> return ret ? ERR_PTR(ret) : &bo->ttm.base;
> }
>
> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
> *attach)
> -{
> - struct drm_gem_object *obj = attach->importer_priv;
> - struct xe_bo *bo = gem_to_xe_bo(obj);
> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
> -
> - XE_WARN_ON(xe_bo_evict(bo, exec));
> -}
> -
> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
> - .allow_peer2peer = true,
> - .invalidate_mappings = xe_dma_buf_move_notify
> -};
> -
> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>
> struct dma_buf_test_params {
^ permalink raw reply [flat|nested] 30+ messages in thread
* ✓ Xe.CI.FULL: success for sticky TT (rev2)
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
` (5 preceding siblings ...)
2026-10-07 16:46 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-10-07 20:16 ` Patchwork
6 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2026-10-07 20:16 UTC (permalink / raw)
To: Matthew Auld; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 56930 bytes --]
== Series Details ==
Series: sticky TT (rev2)
URL : https://patchwork.freedesktop.org/series/175133/
State : success
== Summary ==
CI Bug Log - changes from xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05_FULL -> xe-pw-175133v2_FULL
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (3 -> 3)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in xe-pw-175133v2_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@intel_hwmon@hwmon-read:
- shard-ptl: NOTRUN -> [SKIP][1] ([Intel XE#7225])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-2/igt@intel_hwmon@hwmon-read.html
* igt@kms_async_flips@async-flip-suspend-resume:
- shard-ptl: [PASS][2] -> [ABORT][3] ([Intel XE#9394]) +1 other test abort
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-7/igt@kms_async_flips@async-flip-suspend-resume.html
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-8/igt@kms_async_flips@async-flip-suspend-resume.html
* igt@kms_big_fb@4-tiled-32bpp-rotate-90:
- shard-ptl: NOTRUN -> [SKIP][4] ([Intel XE#5901]) +1 other test skip
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@kms_big_fb@4-tiled-32bpp-rotate-90.html
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip:
- shard-lnl: NOTRUN -> [SKIP][5] ([Intel XE#1407])
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
* igt@kms_big_fb@y-tiled-16bpp-rotate-180:
- shard-bmg: NOTRUN -> [SKIP][6] ([Intel XE#1124]) +5 other tests skip
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@kms_big_fb@y-tiled-16bpp-rotate-180.html
- shard-ptl: NOTRUN -> [SKIP][7] ([Intel XE#5808]) +3 other tests skip
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-6/igt@kms_big_fb@y-tiled-16bpp-rotate-180.html
* igt@kms_big_fb@y-tiled-32bpp-rotate-90:
- shard-lnl: NOTRUN -> [SKIP][8] ([Intel XE#1124]) +1 other test skip
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-6/igt@kms_big_fb@y-tiled-32bpp-rotate-90.html
* igt@kms_bw@linear-tiling-2-displays-target-3840x2160p:
- shard-bmg: NOTRUN -> [SKIP][9] ([Intel XE#367]) +2 other tests skip
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-5/igt@kms_bw@linear-tiling-2-displays-target-3840x2160p.html
* igt@kms_bw@linear-tiling-3-displays-target-3840x2160p:
- shard-ptl: NOTRUN -> [SKIP][10] ([Intel XE#367])
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@kms_bw@linear-tiling-3-displays-target-3840x2160p.html
* igt@kms_ccs@bad-pixel-format-yf-tiled-ccs:
- shard-ptl: NOTRUN -> [SKIP][11] ([Intel XE#5822]) +1 other test skip
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-3/igt@kms_ccs@bad-pixel-format-yf-tiled-ccs.html
* igt@kms_ccs@bad-rotation-90-4-tiled-bmg-ccs@pipe-c-edp-1:
- shard-ptl: NOTRUN -> [SKIP][12] ([Intel XE#5823] / [Intel XE#6918]) +4 other tests skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-8/igt@kms_ccs@bad-rotation-90-4-tiled-bmg-ccs@pipe-c-edp-1.html
* igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs:
- shard-bmg: NOTRUN -> [SKIP][13] ([Intel XE#2887]) +6 other tests skip
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [SKIP][14] ([Intel XE#2652]) +3 other tests skip
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-2/igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs@pipe-a-dp-2.html
* igt@kms_chamelium_audio@hdmi-audio-edid:
- shard-bmg: NOTRUN -> [SKIP][15] ([Intel XE#2252]) +3 other tests skip
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-5/igt@kms_chamelium_audio@hdmi-audio-edid.html
* igt@kms_chamelium_color@ctm-negative:
- shard-ptl: NOTRUN -> [SKIP][16] ([Intel XE#5824])
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@kms_chamelium_color@ctm-negative.html
* igt@kms_chamelium_color@degamma:
- shard-bmg: NOTRUN -> [SKIP][17] ([Intel XE#2325] / [Intel XE#7358])
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@kms_chamelium_color@degamma.html
* igt@kms_chamelium_color_pipeline@plane-fixed-matrix-yuv-rgb-bt709-lut1d:
- shard-bmg: NOTRUN -> [SKIP][18] ([Intel XE#7358])
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@kms_chamelium_color_pipeline@plane-fixed-matrix-yuv-rgb-bt709-lut1d.html
* igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe:
- shard-ptl: NOTRUN -> [SKIP][19] ([Intel XE#2252]) +2 other tests skip
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe.html
* igt@kms_content_protection@atomic@pipe-a-dp-1:
- shard-bmg: NOTRUN -> [FAIL][20] ([Intel XE#3304])
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@kms_content_protection@atomic@pipe-a-dp-1.html
* igt@kms_content_protection@lic-type-0:
- shard-ptl: NOTRUN -> [SKIP][21] ([Intel XE#7642]) +1 other test skip
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-8/igt@kms_content_protection@lic-type-0.html
* igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][22] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374]) +2 other tests fail
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html
* igt@kms_cursor_crc@cursor-onscreen-512x512:
- shard-bmg: NOTRUN -> [SKIP][23] ([Intel XE#2321] / [Intel XE#7355])
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@kms_cursor_crc@cursor-onscreen-512x512.html
* igt@kms_cursor_crc@cursor-random-512x170:
- shard-lnl: NOTRUN -> [SKIP][24] ([Intel XE#2321] / [Intel XE#7355])
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@kms_cursor_crc@cursor-random-512x170.html
* igt@kms_cursor_crc@cursor-rapid-movement-32x32:
- shard-bmg: NOTRUN -> [SKIP][25] ([Intel XE#2320])
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html
- shard-ptl: NOTRUN -> [SKIP][26] ([Intel XE#5900])
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-8/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html
* igt@kms_cursor_legacy@cursorb-vs-flipb-legacy:
- shard-lnl: NOTRUN -> [SKIP][27] ([Intel XE#309] / [Intel XE#7343])
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@kms_cursor_legacy@cursorb-vs-flipb-legacy.html
* igt@kms_dp_link_training@non-uhbr-sst-direct-train:
- shard-ptl: NOTRUN -> [SKIP][28] ([Intel XE#9534])
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-3/igt@kms_dp_link_training@non-uhbr-sst-direct-train.html
* igt@kms_dp_link_training@uhbr-sst-direct-train:
- shard-bmg: NOTRUN -> [SKIP][29] ([Intel XE#9529])
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@kms_dp_link_training@uhbr-sst-direct-train.html
* igt@kms_dsc@dsc-fractional-bpp:
- shard-bmg: NOTRUN -> [SKIP][30] ([Intel XE#8265])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@kms_dsc@dsc-fractional-bpp.html
* igt@kms_flip@2x-blocking-absolute-wf_vblank:
- shard-ptl: NOTRUN -> [SKIP][31] ([Intel XE#2316]) +1 other test skip
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-7/igt@kms_flip@2x-blocking-absolute-wf_vblank.html
* igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1:
- shard-lnl: [PASS][32] -> [FAIL][33] ([Intel XE#301] / [Intel XE#3149])
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible@c-edp1.html
* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling:
- shard-ptl: NOTRUN -> [SKIP][34] ([Intel XE#7178]) +1 other test skip
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-2/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling:
- shard-bmg: NOTRUN -> [SKIP][35] ([Intel XE#7178] / [Intel XE#7351])
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-yuv-linear-to-32bpp-yuv-linear-reflect-x:
- shard-bmg: NOTRUN -> [SKIP][36] ([Intel XE#7179])
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@kms_flip_scaled_crc@flip-32bpp-yuv-linear-to-32bpp-yuv-linear-reflect-x.html
* igt@kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-fullscreen:
- shard-bmg: NOTRUN -> [SKIP][37] ([Intel XE#2311]) +21 other tests skip
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-fullscreen.html
* igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff:
- shard-lnl: NOTRUN -> [SKIP][38] ([Intel XE#656] / [Intel XE#7905]) +2 other tests skip
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-cur-indfb-onoff.html
* igt@kms_frontbuffer_tracking@drrs-abgr161616f-draw-blt:
- shard-lnl: NOTRUN -> [SKIP][39] ([Intel XE#7061] / [Intel XE#7356])
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@kms_frontbuffer_tracking@drrs-abgr161616f-draw-blt.html
* igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-blt:
- shard-bmg: NOTRUN -> [SKIP][40] ([Intel XE#7061] / [Intel XE#7356])
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-2/igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-blt.html
- shard-ptl: NOTRUN -> [SKIP][41] ([Intel XE#7061] / [Intel XE#7356]) +1 other test skip
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-2/igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-blt.html
* igt@kms_frontbuffer_tracking@drrshdr-1p-primscrn-pri-indfb-draw-blt:
- shard-ptl: NOTRUN -> [SKIP][42] ([Intel XE#6312]) +3 other tests skip
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-3/igt@kms_frontbuffer_tracking@drrshdr-1p-primscrn-pri-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-onoff:
- shard-lnl: NOTRUN -> [SKIP][43] ([Intel XE#6312] / [Intel XE#651]) +1 other test skip
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-spr-indfb-onoff.html
* igt@kms_frontbuffer_tracking@fbcdrrs-indfb-scaledprimary:
- shard-ptl: NOTRUN -> [SKIP][44] ([Intel XE#5800] / [Intel XE#6312]) +3 other tests skip
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-7/igt@kms_frontbuffer_tracking@fbcdrrs-indfb-scaledprimary.html
* igt@kms_frontbuffer_tracking@fbchdr-1p-offscreen-pri-shrfb-draw-mmap-wc:
- shard-lnl: NOTRUN -> [SKIP][45] ([Intel XE#7865]) +1 other test skip
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@kms_frontbuffer_tracking@fbchdr-1p-offscreen-pri-shrfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbchdr-argb161616f-draw-render:
- shard-bmg: NOTRUN -> [SKIP][46] ([Intel XE#7061]) +2 other tests skip
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-8/igt@kms_frontbuffer_tracking@fbchdr-argb161616f-draw-render.html
* igt@kms_frontbuffer_tracking@fbcpsr-indfb-scaledprimary:
- shard-bmg: NOTRUN -> [SKIP][47] ([Intel XE#2313]) +28 other tests skip
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-indfb-scaledprimary.html
* igt@kms_frontbuffer_tracking@fbcpsr-tiling-y:
- shard-bmg: NOTRUN -> [SKIP][48] ([Intel XE#2352] / [Intel XE#7399])
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcpsr-tiling-y.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-cur-indfb-draw-render:
- shard-lnl: NOTRUN -> [SKIP][49] ([Intel XE#7905]) +2 other tests skip
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-cur-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-pri-shrfb-draw-mmap-wc:
- shard-ptl: NOTRUN -> [SKIP][50] ([Intel XE#5812]) +16 other tests skip
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-3/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-pri-shrfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@pipe-fbc-rte:
- shard-bmg: NOTRUN -> [SKIP][51] ([Intel XE#4141]) +6 other tests skip
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html
* igt@kms_frontbuffer_tracking@psrhdr-1p-offscreen-pri-shrfb-draw-blt:
- shard-ptl: NOTRUN -> [SKIP][52] ([Intel XE#7865]) +4 other tests skip
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-1/igt@kms_frontbuffer_tracking@psrhdr-1p-offscreen-pri-shrfb-draw-blt.html
* igt@kms_frontbuffer_tracking@psrhdr-abgr161616f-draw-blt:
- shard-ptl: NOTRUN -> [SKIP][53] ([Intel XE#7061])
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-1/igt@kms_frontbuffer_tracking@psrhdr-abgr161616f-draw-blt.html
* igt@kms_joiner@invalid-modeset-ultra-joiner:
- shard-ptl: NOTRUN -> [SKIP][54] ([Intel XE#6900])
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-8/igt@kms_joiner@invalid-modeset-ultra-joiner.html
* igt@kms_plane@pixel-format-x-tiled-modifier-source-clamping:
- shard-ptl: NOTRUN -> [SKIP][55] ([Intel XE#7283]) +2 other tests skip
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-6/igt@kms_plane@pixel-format-x-tiled-modifier-source-clamping.html
* igt@kms_plane@pixel-format-y-tiled-ccs-modifier-source-clamping:
- shard-lnl: NOTRUN -> [SKIP][56] ([Intel XE#7283])
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@kms_plane@pixel-format-y-tiled-ccs-modifier-source-clamping.html
* igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier:
- shard-bmg: NOTRUN -> [SKIP][57] ([Intel XE#7283]) +2 other tests skip
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-8/igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier.html
* igt@kms_plane_multiple@2x-tiling-y:
- shard-bmg: NOTRUN -> [SKIP][58] ([Intel XE#5021] / [Intel XE#7377])
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-8/igt@kms_plane_multiple@2x-tiling-y.html
* igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75:
- shard-ptl: NOTRUN -> [SKIP][59] ([Intel XE#6886]) +4 other tests skip
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-2/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-75.html
* igt@kms_pm_backlight@brightness-with-dpms:
- shard-bmg: NOTRUN -> [SKIP][60] ([Intel XE#2938] / [Intel XE#7376] / [Intel XE#7760])
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-4/igt@kms_pm_backlight@brightness-with-dpms.html
* igt@kms_pm_dc@dc5-dpms:
- shard-lnl: [PASS][61] -> [FAIL][62] ([Intel XE#8399])
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-4/igt@kms_pm_dc@dc5-dpms.html
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-3/igt@kms_pm_dc@dc5-dpms.html
* igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf:
- shard-bmg: NOTRUN -> [SKIP][63] ([Intel XE#1489]) +3 other tests skip
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-2/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf.html
* igt@kms_psr2_su@frontbuffer-xrgb8888:
- shard-lnl: NOTRUN -> [SKIP][64] ([Intel XE#1128] / [Intel XE#7413])
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@kms_psr2_su@frontbuffer-xrgb8888.html
* igt@kms_psr2_su@page_flip-nv12:
- shard-bmg: NOTRUN -> [SKIP][65] ([Intel XE#2387] / [Intel XE#7429])
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@kms_psr2_su@page_flip-nv12.html
* igt@kms_psr@fbc-psr2-dpms:
- shard-ptl: NOTRUN -> [SKIP][66] ([Intel XE#1406] / [Intel XE#5835]) +1 other test skip
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-2/igt@kms_psr@fbc-psr2-dpms.html
* igt@kms_psr@fbc-psr2-sprite-blt:
- shard-bmg: NOTRUN -> [SKIP][67] ([Intel XE#2234] / [Intel XE#2850]) +5 other tests skip
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@kms_psr@fbc-psr2-sprite-blt.html
* igt@kms_psr@pr-sprite-blt:
- shard-ptl: NOTRUN -> [SKIP][68] ([Intel XE#1406])
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@kms_psr@pr-sprite-blt.html
* igt@kms_rotation_crc@primary-rotation-270:
- shard-bmg: NOTRUN -> [SKIP][69] ([Intel XE#3904] / [Intel XE#7342]) +2 other tests skip
[69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-2/igt@kms_rotation_crc@primary-rotation-270.html
- shard-ptl: NOTRUN -> [SKIP][70] ([Intel XE#5821]) +2 other tests skip
[70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-2/igt@kms_rotation_crc@primary-rotation-270.html
* igt@kms_scaling_modes@scaling-mode-full-aspect:
- shard-bmg: NOTRUN -> [SKIP][71] ([Intel XE#2413])
[71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@kms_scaling_modes@scaling-mode-full-aspect.html
* igt@kms_sharpness_filter@filter-basic:
- shard-bmg: NOTRUN -> [SKIP][72] ([Intel XE#6503]) +1 other test skip
[72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@kms_sharpness_filter@filter-basic.html
* igt@kms_vblank@ts-continuation-suspend:
- shard-ptl: [PASS][73] -> [ABORT][74] ([Intel XE#9375]) +1 other test abort
[73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-8/igt@kms_vblank@ts-continuation-suspend.html
[74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-3/igt@kms_vblank@ts-continuation-suspend.html
* igt@kms_vrr@flip-basic-fastset:
- shard-ptl: [PASS][75] -> [FAIL][76] ([Intel XE#4227] / [Intel XE#7397]) +2 other tests fail
[75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-1/igt@kms_vrr@flip-basic-fastset.html
[76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-8/igt@kms_vrr@flip-basic-fastset.html
* igt@kms_vrr@flip-basic-fastset@pipe-a-edp-1:
- shard-ptl: [PASS][77] -> [FAIL][78] ([Intel XE#6293] / [Intel XE#7397])
[77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-1/igt@kms_vrr@flip-basic-fastset@pipe-a-edp-1.html
[78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-8/igt@kms_vrr@flip-basic-fastset@pipe-a-edp-1.html
* igt@kms_vrr@flip-suspend:
- shard-bmg: NOTRUN -> [SKIP][79] ([Intel XE#1499] / [Intel XE#9271])
[79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@kms_vrr@flip-suspend.html
* igt@kms_vrr@lobf-dc3co:
- shard-bmg: NOTRUN -> [SKIP][80] ([Intel XE#8397])
[80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@kms_vrr@lobf-dc3co.html
* igt@xe_configfs@ctx-restore-post-bb:
- shard-bmg: [PASS][81] -> [ABORT][82] ([Intel XE#9463]) +1 other test abort
[81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-5/igt@xe_configfs@ctx-restore-post-bb.html
[82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-4/igt@xe_configfs@ctx-restore-post-bb.html
* igt@xe_evict@evict-large-cm:
- shard-ptl: NOTRUN -> [SKIP][83] ([Intel XE#5764]) +1 other test skip
[83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-1/igt@xe_evict@evict-large-cm.html
* igt@xe_evict@evict-mixed-many-threads-small:
- shard-bmg: [PASS][84] -> [INCOMPLETE][85] ([Intel XE#6321] / [Intel XE#8355]) +1 other test incomplete
[84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-10/igt@xe_evict@evict-mixed-many-threads-small.html
[85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@xe_evict@evict-mixed-many-threads-small.html
* igt@xe_evict@evict-mixed-threads-small-multi-queue:
- shard-bmg: NOTRUN -> [SKIP][86] ([Intel XE#8370])
[86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-9/igt@xe_evict@evict-mixed-threads-small-multi-queue.html
* igt@xe_evict_ccs@evict-overcommit-parallel-instantfree-reopen:
- shard-lnl: NOTRUN -> [SKIP][87] ([Intel XE#6540] / [Intel XE#688])
[87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@xe_evict_ccs@evict-overcommit-parallel-instantfree-reopen.html
* igt@xe_exec_balancer@once-cm-virtual-userptr-invalidate:
- shard-lnl: NOTRUN -> [SKIP][88] ([Intel XE#7482])
[88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@xe_exec_balancer@once-cm-virtual-userptr-invalidate.html
* igt@xe_exec_balancer@twice-cm-parallel-basic:
- shard-ptl: NOTRUN -> [SKIP][89] ([Intel XE#7482]) +1 other test skip
[89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@xe_exec_balancer@twice-cm-parallel-basic.html
* igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate:
- shard-bmg: NOTRUN -> [SKIP][90] ([Intel XE#2322] / [Intel XE#7372]) +3 other tests skip
[90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-2/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate.html
- shard-ptl: NOTRUN -> [SKIP][91] ([Intel XE#5575] / [Intel XE#7484]) +2 other tests skip
[91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-4/igt@xe_exec_basic@multigpu-once-bindexecqueue-userptr-invalidate.html
* igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr:
- shard-bmg: NOTRUN -> [SKIP][92] ([Intel XE#8374]) +5 other tests skip
[92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-4/igt@xe_exec_fault_mode@many-execqueues-multi-queue-userptr.html
* igt@xe_exec_fault_mode@many-multi-queue-userptr-imm:
- shard-ptl: NOTRUN -> [SKIP][93] ([Intel XE#8374]) +3 other tests skip
[93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-4/igt@xe_exec_fault_mode@many-multi-queue-userptr-imm.html
* igt@xe_exec_multi_queue@few-execs-preempt-mode-fault-priority:
- shard-bmg: NOTRUN -> [SKIP][94] ([Intel XE#8364]) +6 other tests skip
[94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@xe_exec_multi_queue@few-execs-preempt-mode-fault-priority.html
* igt@xe_exec_multi_queue@few-execs-preempt-mode-fault-userptr-invalidate:
- shard-lnl: NOTRUN -> [SKIP][95] ([Intel XE#8364])
[95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-3/igt@xe_exec_multi_queue@few-execs-preempt-mode-fault-userptr-invalidate.html
* igt@xe_exec_multi_queue@max-queues-preempt-mode-userptr:
- shard-ptl: NOTRUN -> [SKIP][96] ([Intel XE#8364]) +3 other tests skip
[96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-4/igt@xe_exec_multi_queue@max-queues-preempt-mode-userptr.html
* igt@xe_exec_reset@multi-queue-cat-error-on-secondary:
- shard-bmg: NOTRUN -> [SKIP][97] ([Intel XE#8369])
[97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-10/igt@xe_exec_reset@multi-queue-cat-error-on-secondary.html
- shard-ptl: NOTRUN -> [SKIP][98] ([Intel XE#8369])
[98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-3/igt@xe_exec_reset@multi-queue-cat-error-on-secondary.html
* igt@xe_exec_threads@threads-multi-queue-basic:
- shard-ptl: NOTRUN -> [SKIP][99] ([Intel XE#8378])
[99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-2/igt@xe_exec_threads@threads-multi-queue-basic.html
* igt@xe_exec_threads@threads-multi-queue-mixed-userptr:
- shard-bmg: NOTRUN -> [SKIP][100] ([Intel XE#8378]) +3 other tests skip
[100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-5/igt@xe_exec_threads@threads-multi-queue-mixed-userptr.html
* igt@xe_gpgpu_fill@offset-4x4:
- shard-bmg: NOTRUN -> [SKIP][101] ([Intel XE#7954])
[101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@xe_gpgpu_fill@offset-4x4.html
* igt@xe_madvise@atomic-global:
- shard-lnl: NOTRUN -> [SKIP][102] ([Intel XE#7980])
[102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@xe_madvise@atomic-global.html
* igt@xe_mmap@small-bar:
- shard-ptl: NOTRUN -> [SKIP][103] ([Intel XE#5867])
[103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-1/igt@xe_mmap@small-bar.html
* igt@xe_multigpu_svm@mgpu-pagefault-basic:
- shard-bmg: NOTRUN -> [SKIP][104] ([Intel XE#6964]) +1 other test skip
[104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-4/igt@xe_multigpu_svm@mgpu-pagefault-basic.html
- shard-ptl: NOTRUN -> [SKIP][105] ([Intel XE#6964])
[105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@xe_multigpu_svm@mgpu-pagefault-basic.html
* igt@xe_page_reclaim@pat-index-xd:
- shard-ptl: NOTRUN -> [SKIP][106] ([Intel XE#7793])
[106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-6/igt@xe_page_reclaim@pat-index-xd.html
- shard-bmg: NOTRUN -> [SKIP][107] ([Intel XE#7793])
[107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@xe_page_reclaim@pat-index-xd.html
* igt@xe_pat@pat-sw-hw-compare:
- shard-bmg: NOTRUN -> [FAIL][108] ([Intel XE#7695])
[108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@xe_pat@pat-sw-hw-compare.html
* igt@xe_pat@xa-app-transient-media-on:
- shard-bmg: NOTRUN -> [SKIP][109] ([Intel XE#7590])
[109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-3/igt@xe_pat@xa-app-transient-media-on.html
* igt@xe_pm@d3cold-basic-exec:
- shard-bmg: NOTRUN -> [SKIP][110] ([Intel XE#2284] / [Intel XE#7370])
[110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@xe_pm@d3cold-basic-exec.html
* igt@xe_pm@d3cold-multiple-execs:
- shard-lnl: NOTRUN -> [SKIP][111] ([Intel XE#2284] / [Intel XE#366] / [Intel XE#7370])
[111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-8/igt@xe_pm@d3cold-multiple-execs.html
* igt@xe_pm@s3-d3hot-basic-exec:
- shard-ptl: NOTRUN -> [SKIP][112] ([Intel XE#6867])
[112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-7/igt@xe_pm@s3-d3hot-basic-exec.html
* igt@xe_pm@s4-mocs:
- shard-ptl: [PASS][113] -> [ABORT][114] ([Intel XE#9362]) +4 other tests abort
[113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-8/igt@xe_pm@s4-mocs.html
[114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-3/igt@xe_pm@s4-mocs.html
* igt@xe_pm@s4-multiple-execs:
- shard-bmg: [PASS][115] -> [ABORT][116] ([Intel XE#9362])
[115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-1/igt@xe_pm@s4-multiple-execs.html
[116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-6/igt@xe_pm@s4-multiple-execs.html
* igt@xe_prefetch_fault@l2-prefetch-fault-svm:
- shard-bmg: NOTRUN -> [SKIP][117] ([Intel XE#8815])
[117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@xe_prefetch_fault@l2-prefetch-fault-svm.html
* igt@xe_pxp@display-black-pxp-fb:
- shard-bmg: NOTRUN -> [SKIP][118] ([Intel XE#4733] / [Intel XE#7417]) +1 other test skip
[118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-3/igt@xe_pxp@display-black-pxp-fb.html
* igt@xe_pxp@pxp-stale-bo-bind-post-suspend:
- shard-ptl: NOTRUN -> [ABORT][119] ([Intel XE#9362]) +1 other test abort
[119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-6/igt@xe_pxp@pxp-stale-bo-bind-post-suspend.html
* igt@xe_query@multigpu-query-config:
- shard-ptl: NOTRUN -> [SKIP][120] ([Intel XE#6019]) +1 other test skip
[120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-1/igt@xe_query@multigpu-query-config.html
* igt@xe_query@multigpu-query-invalid-cs-cycles:
- shard-bmg: NOTRUN -> [SKIP][121] ([Intel XE#944])
[121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@xe_query@multigpu-query-invalid-cs-cycles.html
* igt@xe_query@multigpu-query-invalid-query:
- shard-lnl: NOTRUN -> [SKIP][122] ([Intel XE#944])
[122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@xe_query@multigpu-query-invalid-query.html
* igt@xe_sriov_auto_provisioning@selfconfig-basic:
- shard-lnl: NOTRUN -> [SKIP][123] ([Intel XE#4130] / [Intel XE#7366])
[123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@xe_sriov_auto_provisioning@selfconfig-basic.html
* igt@xe_survivability@runtime-survivability:
- shard-lnl: NOTRUN -> [SKIP][124] ([Intel XE#8415])
[124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@xe_survivability@runtime-survivability.html
#### Possible fixes ####
* igt@kms_async_flips@async-flip-suspend-resume:
- shard-bmg: [DMESG-WARN][125] ([Intel XE#9365] / [Intel XE#9428]) -> [PASS][126]
[125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-3/igt@kms_async_flips@async-flip-suspend-resume.html
[126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@kms_async_flips@async-flip-suspend-resume.html
* igt@kms_async_flips@async-flip-suspend-resume@pipe-c-hdmi-a-3:
- shard-bmg: [DMESG-WARN][127] ([Intel XE#9365]) -> [PASS][128] +1 other test pass
[127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-3/igt@kms_async_flips@async-flip-suspend-resume@pipe-c-hdmi-a-3.html
[128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-7/igt@kms_async_flips@async-flip-suspend-resume@pipe-c-hdmi-a-3.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-bmg: [DMESG-WARN][129] ([Intel XE#9365] / [Intel XE#9482]) -> [PASS][130]
[129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-5/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
[130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-5/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
* igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
- shard-bmg: [FAIL][131] ([Intel XE#7809]) -> [PASS][132]
[131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-9/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
[132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-ptl: [ABORT][133] ([Intel XE#9362]) -> [PASS][134] +1 other test pass
[133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-8/igt@kms_flip@flip-vs-suspend-interruptible.html
[134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-7/igt@kms_flip@flip-vs-suspend-interruptible.html
* igt@kms_hdmi_audio_bw@audio-bw-hblank160:
- shard-bmg: [FAIL][135] ([Intel XE#9313]) -> [PASS][136]
[135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-1/igt@kms_hdmi_audio_bw@audio-bw-hblank160.html
[136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@kms_hdmi_audio_bw@audio-bw-hblank160.html
* igt@kms_hdr@invalid-hdr:
- shard-bmg: [SKIP][137] ([Intel XE#1503]) -> [PASS][138]
[137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-10/igt@kms_hdr@invalid-hdr.html
[138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-8/igt@kms_hdr@invalid-hdr.html
* igt@kms_pm_dc@dc5-psr-suspend-resume:
- shard-lnl: [FAIL][139] ([Intel XE#8399]) -> [PASS][140]
[139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-5/igt@kms_pm_dc@dc5-psr-suspend-resume.html
[140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@kms_pm_dc@dc5-psr-suspend-resume.html
* igt@kms_vrr@cmrr-video-mode:
- shard-ptl: [FAIL][141] -> [PASS][142] +1 other test pass
[141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-5/igt@kms_vrr@cmrr-video-mode.html
[142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-1/igt@kms_vrr@cmrr-video-mode.html
* igt@kms_vrr@flip-dpms@pipe-a-edp-1:
- shard-ptl: [FAIL][143] ([Intel XE#4227] / [Intel XE#7397]) -> [PASS][144] +1 other test pass
[143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-ptl-6/igt@kms_vrr@flip-dpms@pipe-a-edp-1.html
[144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-ptl-5/igt@kms_vrr@flip-dpms@pipe-a-edp-1.html
* igt@xe_compute_preempt@compute-preempt-many-vram-evict@engine-drm_xe_engine_class_compute:
- shard-bmg: [ABORT][145] ([Intel XE#9481]) -> [PASS][146] +1 other test pass
[145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-7/igt@xe_compute_preempt@compute-preempt-many-vram-evict@engine-drm_xe_engine_class_compute.html
[146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@xe_compute_preempt@compute-preempt-many-vram-evict@engine-drm_xe_engine_class_compute.html
* igt@xe_compute_preempt@compute-preempt-many@engine-drm_xe_engine_class_compute:
- shard-lnl: [ABORT][147] -> [PASS][148] +1 other test pass
[147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-3/igt@xe_compute_preempt@compute-preempt-many@engine-drm_xe_engine_class_compute.html
[148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@xe_compute_preempt@compute-preempt-many@engine-drm_xe_engine_class_compute.html
* igt@xe_exec_fault_mode@atomic-many:
- shard-bmg: [FAIL][149] ([Intel XE#8578]) -> [PASS][150]
[149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-6/igt@xe_exec_fault_mode@atomic-many.html
[150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-3/igt@xe_exec_fault_mode@atomic-many.html
* igt@xe_module_load@load:
- shard-lnl: ([PASS][151], [PASS][152], [PASS][153], [PASS][154], [PASS][155], [PASS][156], [PASS][157], [PASS][158], [PASS][159], [PASS][160], [PASS][161], [PASS][162], [SKIP][163], [PASS][164], [PASS][165], [PASS][166], [PASS][167], [PASS][168], [PASS][169], [PASS][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174], [PASS][175], [PASS][176]) ([Intel XE#378] / [Intel XE#7405]) -> ([PASS][177], [PASS][178], [PASS][179], [PASS][180], [PASS][181], [PASS][182], [PASS][183], [PASS][184], [PASS][185], [PASS][186], [PASS][187], [PASS][188], [PASS][189], [PASS][190], [PASS][191], [PASS][192], [PASS][193], [PASS][194], [PASS][195], [PASS][196], [PASS][197], [PASS][198], [PASS][199], [PASS][200], [PASS][201])
[151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-1/igt@xe_module_load@load.html
[152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-5/igt@xe_module_load@load.html
[153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-4/igt@xe_module_load@load.html
[154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-4/igt@xe_module_load@load.html
[155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-1/igt@xe_module_load@load.html
[156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-1/igt@xe_module_load@load.html
[157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-8/igt@xe_module_load@load.html
[158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-8/igt@xe_module_load@load.html
[159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-5/igt@xe_module_load@load.html
[160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-2/igt@xe_module_load@load.html
[161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-4/igt@xe_module_load@load.html
[162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-6/igt@xe_module_load@load.html
[163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-5/igt@xe_module_load@load.html
[164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-5/igt@xe_module_load@load.html
[165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-3/igt@xe_module_load@load.html
[166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-7/igt@xe_module_load@load.html
[167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-2/igt@xe_module_load@load.html
[168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-6/igt@xe_module_load@load.html
[169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-6/igt@xe_module_load@load.html
[170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-8/igt@xe_module_load@load.html
[171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-7/igt@xe_module_load@load.html
[172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-7/igt@xe_module_load@load.html
[173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-3/igt@xe_module_load@load.html
[174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-2/igt@xe_module_load@load.html
[175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-2/igt@xe_module_load@load.html
[176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-3/igt@xe_module_load@load.html
[177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@xe_module_load@load.html
[178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-1/igt@xe_module_load@load.html
[179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-3/igt@xe_module_load@load.html
[180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@xe_module_load@load.html
[181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-1/igt@xe_module_load@load.html
[182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@xe_module_load@load.html
[183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-6/igt@xe_module_load@load.html
[184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-6/igt@xe_module_load@load.html
[185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-8/igt@xe_module_load@load.html
[186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-8/igt@xe_module_load@load.html
[187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-1/igt@xe_module_load@load.html
[188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@xe_module_load@load.html
[189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-3/igt@xe_module_load@load.html
[190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-5/igt@xe_module_load@load.html
[191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-5/igt@xe_module_load@load.html
[192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-5/igt@xe_module_load@load.html
[193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-8/igt@xe_module_load@load.html
[194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@xe_module_load@load.html
[195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-7/igt@xe_module_load@load.html
[196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-1/igt@xe_module_load@load.html
[197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@xe_module_load@load.html
[198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@xe_module_load@load.html
[199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@xe_module_load@load.html
[200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-4/igt@xe_module_load@load.html
[201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-3/igt@xe_module_load@load.html
* igt@xe_pm@s4-basic-exec:
- shard-lnl: [DMESG-WARN][202] ([Intel XE#7727]) -> [PASS][203] +1 other test pass
[202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-7/igt@xe_pm@s4-basic-exec.html
[203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-1/igt@xe_pm@s4-basic-exec.html
#### Warnings ####
* igt@kms_flip@flip-vs-expired-vblank-interruptible:
- shard-lnl: [FAIL][204] ([Intel XE#301]) -> [FAIL][205] ([Intel XE#301] / [Intel XE#3149])
[204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
[205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-bmg: [FAIL][206] ([Intel XE#1729] / [Intel XE#7424]) -> [SKIP][207] ([Intel XE#2426] / [Intel XE#5848])
[206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern.html
[207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-2/igt@kms_tiled_display@basic-test-pattern.html
* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-bmg: [SKIP][208] ([Intel XE#2426] / [Intel XE#5848]) -> [SKIP][209] ([Intel XE#2509] / [Intel XE#7437])
[208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05/shard-bmg-7/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1128]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1128
[Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
[Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
[Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
[Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
[Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
[Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
[Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
[Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
[Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
[Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
[Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
[Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
[Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
[Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
[Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
[Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
[Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
[Intel XE#2352]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2352
[Intel XE#2387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2387
[Intel XE#2413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2413
[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#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
[Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
[Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
[Intel XE#2938]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2938
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
[Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
[Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
[Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
[Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
[Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
[Intel XE#4227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4227
[Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
[Intel XE#5021]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5021
[Intel XE#5575]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5575
[Intel XE#5764]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5764
[Intel XE#5800]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5800
[Intel XE#5808]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5808
[Intel XE#5812]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5812
[Intel XE#5821]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5821
[Intel XE#5822]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5822
[Intel XE#5823]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5823
[Intel XE#5824]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5824
[Intel XE#5835]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5835
[Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
[Intel XE#5867]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5867
[Intel XE#5900]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5900
[Intel XE#5901]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5901
[Intel XE#6019]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6019
[Intel XE#6293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6293
[Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
[Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
[Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#6540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6540
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#6867]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6867
[Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
[Intel XE#6886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6886
[Intel XE#6900]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6900
[Intel XE#6918]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6918
[Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
[Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
[Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
[Intel XE#7179]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7179
[Intel XE#7225]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7225
[Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
[Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342
[Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343
[Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
[Intel XE#7355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7355
[Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
[Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
[Intel XE#7366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7366
[Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
[Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
[Intel XE#7374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7374
[Intel XE#7376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7376
[Intel XE#7377]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7377
[Intel XE#7397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7397
[Intel XE#7399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7399
[Intel XE#7405]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7405
[Intel XE#7413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7413
[Intel XE#7417]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7417
[Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424
[Intel XE#7429]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7429
[Intel XE#7437]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7437
[Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
[Intel XE#7484]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7484
[Intel XE#7590]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7590
[Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
[Intel XE#7695]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7695
[Intel XE#7727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7727
[Intel XE#7760]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7760
[Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
[Intel XE#7809]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7809
[Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
[Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
[Intel XE#7954]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7954
[Intel XE#7980]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7980
[Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
[Intel XE#8355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8355
[Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
[Intel XE#8369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8369
[Intel XE#8370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8370
[Intel XE#8374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8374
[Intel XE#8378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8378
[Intel XE#8397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8397
[Intel XE#8399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8399
[Intel XE#8415]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8415
[Intel XE#8578]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8578
[Intel XE#8815]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8815
[Intel XE#9271]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9271
[Intel XE#9313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9313
[Intel XE#9362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9362
[Intel XE#9365]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9365
[Intel XE#9375]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9375
[Intel XE#9394]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9394
[Intel XE#9428]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9428
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
[Intel XE#9463]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9463
[Intel XE#9481]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9481
[Intel XE#9482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9482
[Intel XE#9529]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9529
[Intel XE#9534]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9534
Build changes
-------------
* IGT: IGT_9132 -> IGT_9133
* Linux: xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05 -> xe-pw-175133v2
IGT_9132: 9132
IGT_9133: 87159cf671a3bf9e04bd46442ef1a358481a66f4 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5901-5dc178a4563d8d2ee7fc3a81d005700cbfa04c05: 5dc178a4563d8d2ee7fc3a81d005700cbfa04c05
xe-pw-175133v2: 175133v2
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-175133v2/index.html
[-- Attachment #2: Type: text/html, Size: 63923 bytes --]
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-07 18:11 ` Thomas Hellström
@ 2026-10-08 9:46 ` Matthew Auld
2026-10-08 9:55 ` Christian König
2026-10-08 14:40 ` Simon Richter
0 siblings, 2 replies; 30+ messages in thread
From: Matthew Auld @ 2026-10-08 9:46 UTC (permalink / raw)
To: Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König, Christian König
On 07/10/2026 19:11, Thomas Hellström wrote:
> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>> for
>> all exported VRAM buffers. However, in some multi-GPU setups, like
>> with
>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>> looks like the exported dma-buf window buffer can in some cases end
>> up
>> using p2p.
>>
>> However, user is reporting a kernel regression where performance here
>> massively tanks across many games/workloads, where it looks like on
>> each
>> frame, the igpu is reading/sampling from VRAM over pcie for the
>> window
>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>
>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>> for
>> now.
>>
>> We don't currently have any hints to say "please use p2p for this
>> buffer, or please don't", however we can use some heuristics to try
>> to
>> determine if this is likely a display buffer being exported to an
>> igpu,
>> which probably never intended for p2p:
>>
>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>> tagged with this, but not always.
>>
>> 2. Importer being a PCI device with display, which is not xe driver.
>>
>> We also rely on the existing p2p Intel CPU whitelist to stop this
>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>> on
>> Intel. We also limit the above to dual placement buffers.
>>
>> The original regression was bisected to commit 609fc8766d68 ("dma-
>> buf:
>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>> already present when enabling that knob, so this goes back even
>> further.
>>
>> User has confirmed that along with the sticky dma-buf TT placement
>> fix,
>> to prevent ping-ponging, the performance is back to normal.
>>
>
> Actually, I think this needs to be fixed on the importer side. Until we
> have some some user-space hints, I don't think the exporter should
> second-guess. Most sane solution IMO is if igfx importers could just
> not advertise pcie p2p support?
Yeah, not sure tbh. I'm not a huge fan of this patch either. But you
could argue that the SCANOUT flag is already a good implicit hint/signal
on the exporter side, but unfortunately there were some games where this
did not reliably work. The other implicit hint/signal is perhaps the
dual placement angle. For example, in compute-runtime, it might be that
they use VRAM-only if they want p2p? AFAICT mesa for us always uses a
dual placement or just system memory for these types of buffers.
Christian, do you have any thoughts here? We have a kernel perf
regression after DMABUF_MOVE_NOTIFY was made the default after updating
to a new kernel. The gist is that this then turned on the p2p paths,
with a multi-GPU setup with an AMD igpu/APU and Xe dgpu doing prime
rendering. From the user bug report it sounds like the dgpu linear
window buffer exported to the compositor (igpu) is dual placement VRAM +
TT, and so this now attempts to keep that memory in VRAM instead of
moving it. Compositor then uses p2p to access it. It works but
performance falls off a massive cliff here.
Perhaps Intel Mesa side should use tt-only for this type buffer (?), but
since this is a kernel regression I was hoping we could fix this on the
kernel side.
Some questions:
1. Do you know what is the general story with p2p between igpu and dgpu?
Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped?
It clearly seems to work though.
2. If this is legit, do you guys then also prevent p2p with display
buffers? Are you just doing that at the Mesa level, or is there some
magic in the kernel also?
>
> Thanks,
> Thomas
>
>> Assisted-by: LLM
>> Closes:
>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>> GPUs")
>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>> Cc: Matthew Brost <matthew.brost@intel.com>
>> Cc: <stable@vger.kernel.org> # v6.12
>> ---
>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 +++++++++++++++++++++++++------
>> --
>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>> index 5065a7bac39c..e63437a261cb 100644
>> --- a/drivers/gpu/drm/xe/xe_bo.c
>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>> void *data,
>> * Display scanout is always non-coherent with the CPU
>> cache.
>> */
>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>> XE_BO_FLAG_SCANOUT;
>>
>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>> *file_priv,
>> DRM_XE_GEM_CPU_CACHING_WC,
>>
>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>> XE_BO_FLAG_FORCE_WC |
>> + XE_BO_FLAG_SCANOUT |
>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>> if (IS_ERR(bo))
>> return PTR_ERR(bo);
>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>> index 1ddf3b6d4a9e..6965c2655731 100644
>> --- a/drivers/gpu/drm/xe/xe_bo.h
>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>> @@ -56,6 +56,7 @@
>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>
>> /* this one is trigger internally only */
>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>> index b973579a69b8..0a347f09cee4 100644
>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>> _ddebug *desc, bool *flag)
>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>> #endif
>>
>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>> *attach)
>> +{
>> + struct drm_gem_object *obj = attach->importer_priv;
>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>> +
>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>> +}
>> +
>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>> + .allow_peer2peer = true,
>> + .invalidate_mappings = xe_dma_buf_move_notify
>> +};
>> +
>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>> +{
>> + while (dev) {
>> + if (dev_is_pci(dev))
>> + return to_pci_dev(dev);
>> + dev = dev->parent;
>> + }
>> + return NULL;
>> +}
>> +
>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>> *attach)
>> +{
>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>> +}
>> +
>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>> struct dma_buf_attachment *attach)
>> {
>> struct drm_gem_object *obj = attach->dmabuf->priv;
>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>
>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>> *dmabuf,
>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>> dev, verbose_p2p_dist) < 0)
>> attach->peer2peer = false;
>>
>> - if (!attach->peer2peer &&
>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>> + struct pci_dev *client =
>> xe_find_parent_pci_dev(attach->dev);
>> +
>> + /*
>> + * There are perf issues with using p2p with display
>> buffers,
>> + * like with igpu (compositor) <-> dgpu (exported
>> p2p window
>> + * buffer). Probably we need some actual userspace
>> hints. We
>> + * shouldn't really assume anything. Also, note that
>> some of
>> + * these buffers are not always tagged with SCANOUT.
>> + */
>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>> + attach->peer2peer = false;
>> + else if (client && pci_is_display(client) &&
>> + !xe_dma_buf_attach_is_xe_device(attach))
>> + attach->peer2peer = false;
>> + }
>> +
>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>> return -EOPNOTSUPP;
>>
>> xe_pm_runtime_get(to_xe_device(obj->dev));
>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>> struct dma_buf *dma_buf)
>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>> }
>>
>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>> *attach)
>> -{
>> - struct drm_gem_object *obj = attach->importer_priv;
>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>> -
>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>> -}
>> -
>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>> - .allow_peer2peer = true,
>> - .invalidate_mappings = xe_dma_buf_move_notify
>> -};
>> -
>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>
>> struct dma_buf_test_params {
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-08 9:46 ` Matthew Auld
@ 2026-10-08 9:55 ` Christian König
2026-10-08 11:17 ` Matthew Auld
2026-10-08 14:40 ` Simon Richter
1 sibling, 1 reply; 30+ messages in thread
From: Christian König @ 2026-10-08 9:55 UTC (permalink / raw)
To: Matthew Auld, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 10/8/26 11:46, Matthew Auld wrote:
> On 07/10/2026 19:11, Thomas Hellström wrote:
>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>>> for
>>> all exported VRAM buffers. However, in some multi-GPU setups, like
>>> with
>>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>>> looks like the exported dma-buf window buffer can in some cases end
>>> up
>>> using p2p.
>>>
>>> However, user is reporting a kernel regression where performance here
>>> massively tanks across many games/workloads, where it looks like on
>>> each
>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>> window
>>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>>
>>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>>> for
>>> now.
>>>
>>> We don't currently have any hints to say "please use p2p for this
>>> buffer, or please don't", however we can use some heuristics to try
>>> to
>>> determine if this is likely a display buffer being exported to an
>>> igpu,
>>> which probably never intended for p2p:
>>>
>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>>> tagged with this, but not always.
>>>
>>> 2. Importer being a PCI device with display, which is not xe driver.
>>>
>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>>> on
>>> Intel. We also limit the above to dual placement buffers.
>>>
>>> The original regression was bisected to commit 609fc8766d68 ("dma-
>>> buf:
>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>> already present when enabling that knob, so this goes back even
>>> further.
>>>
>>> User has confirmed that along with the sticky dma-buf TT placement
>>> fix,
>>> to prevent ping-ponging, the performance is back to normal.
>>>
>>
>> Actually, I think this needs to be fixed on the importer side. Until we
>> have some some user-space hints, I don't think the exporter should
>> second-guess. Most sane solution IMO is if igfx importers could just
>> not advertise pcie p2p support?
>
> Yeah, not sure tbh. I'm not a huge fan of this patch either. But you could argue that the SCANOUT flag is already a good implicit hint/signal on the exporter side, but unfortunately there were some games where this did not reliably work. The other implicit hint/signal is perhaps the dual placement angle. For example, in compute-runtime, it might be that they use VRAM-only if they want p2p? AFAICT mesa for us always uses a dual placement or just system memory for these types of buffers.
>
> Christian, do you have any thoughts here? We have a kernel perf regression after DMABUF_MOVE_NOTIFY was made the default after updating to a new kernel. The gist is that this then turned on the p2p paths, with a multi-GPU setup with an AMD igpu/APU and Xe dgpu doing prime rendering. From the user bug report it sounds like the dgpu linear window buffer exported to the compositor (igpu) is dual placement VRAM + TT, and so this now attempts to keep that memory in VRAM instead of moving it. Compositor then uses p2p to access it. It works but performance falls off a massive cliff here.
>
> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>
> Some questions:
>
> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>
> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
Regards,
Christian.
>
>>
>> Thanks,
>> Thomas
>>
>>> Assisted-by: LLM
>>> Closes:
>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>> GPUs")
>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>> Cc: <stable@vger.kernel.org> # v6.12
>>> ---
>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 +++++++++++++++++++++++++------
>>> --
>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>> index 5065a7bac39c..e63437a261cb 100644
>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>> void *data,
>>> * Display scanout is always non-coherent with the CPU
>>> cache.
>>> */
>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>> XE_BO_FLAG_SCANOUT;
>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>> *file_priv,
>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>
>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>> XE_BO_FLAG_FORCE_WC |
>>> + XE_BO_FLAG_SCANOUT |
>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>> if (IS_ERR(bo))
>>> return PTR_ERR(bo);
>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>> @@ -56,6 +56,7 @@
>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>> /* this one is trigger internally only */
>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>> index b973579a69b8..0a347f09cee4 100644
>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>> _ddebug *desc, bool *flag)
>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>> #endif
>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>> *attach)
>>> +{
>>> + struct drm_gem_object *obj = attach->importer_priv;
>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>> +
>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>> +}
>>> +
>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>> + .allow_peer2peer = true,
>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>> +};
>>> +
>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>> +{
>>> + while (dev) {
>>> + if (dev_is_pci(dev))
>>> + return to_pci_dev(dev);
>>> + dev = dev->parent;
>>> + }
>>> + return NULL;
>>> +}
>>> +
>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>> *attach)
>>> +{
>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>> +}
>>> +
>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>> struct dma_buf_attachment *attach)
>>> {
>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>> *dmabuf,
>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>> dev, verbose_p2p_dist) < 0)
>>> attach->peer2peer = false;
>>> - if (!attach->peer2peer &&
>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>> + struct pci_dev *client =
>>> xe_find_parent_pci_dev(attach->dev);
>>> +
>>> + /*
>>> + * There are perf issues with using p2p with display
>>> buffers,
>>> + * like with igpu (compositor) <-> dgpu (exported
>>> p2p window
>>> + * buffer). Probably we need some actual userspace
>>> hints. We
>>> + * shouldn't really assume anything. Also, note that
>>> some of
>>> + * these buffers are not always tagged with SCANOUT.
>>> + */
>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>> + attach->peer2peer = false;
>>> + else if (client && pci_is_display(client) &&
>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>> + attach->peer2peer = false;
>>> + }
>>> +
>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>> return -EOPNOTSUPP;
>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>> struct dma_buf *dma_buf)
>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>> }
>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>> *attach)
>>> -{
>>> - struct drm_gem_object *obj = attach->importer_priv;
>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>> -
>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>> -}
>>> -
>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>> - .allow_peer2peer = true,
>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>> -};
>>> -
>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>> struct dma_buf_test_params {
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-08 9:55 ` Christian König
@ 2026-10-08 11:17 ` Matthew Auld
2026-10-09 9:16 ` Matthew Auld
0 siblings, 1 reply; 30+ messages in thread
From: Matthew Auld @ 2026-10-08 11:17 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 08/10/2026 10:55, Christian König wrote:
> On 10/8/26 11:46, Matthew Auld wrote:
>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>>>> for
>>>> all exported VRAM buffers. However, in some multi-GPU setups, like
>>>> with
>>>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>>>> looks like the exported dma-buf window buffer can in some cases end
>>>> up
>>>> using p2p.
>>>>
>>>> However, user is reporting a kernel regression where performance here
>>>> massively tanks across many games/workloads, where it looks like on
>>>> each
>>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>>> window
>>>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>>>
>>>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>>>> for
>>>> now.
>>>>
>>>> We don't currently have any hints to say "please use p2p for this
>>>> buffer, or please don't", however we can use some heuristics to try
>>>> to
>>>> determine if this is likely a display buffer being exported to an
>>>> igpu,
>>>> which probably never intended for p2p:
>>>>
>>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>>>> tagged with this, but not always.
>>>>
>>>> 2. Importer being a PCI device with display, which is not xe driver.
>>>>
>>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>>>> on
>>>> Intel. We also limit the above to dual placement buffers.
>>>>
>>>> The original regression was bisected to commit 609fc8766d68 ("dma-
>>>> buf:
>>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>>> already present when enabling that knob, so this goes back even
>>>> further.
>>>>
>>>> User has confirmed that along with the sticky dma-buf TT placement
>>>> fix,
>>>> to prevent ping-ponging, the performance is back to normal.
>>>>
>>>
>>> Actually, I think this needs to be fixed on the importer side. Until we
>>> have some some user-space hints, I don't think the exporter should
>>> second-guess. Most sane solution IMO is if igfx importers could just
>>> not advertise pcie p2p support?
>>
>> Yeah, not sure tbh. I'm not a huge fan of this patch either. But you could argue that the SCANOUT flag is already a good implicit hint/signal on the exporter side, but unfortunately there were some games where this did not reliably work. The other implicit hint/signal is perhaps the dual placement angle. For example, in compute-runtime, it might be that they use VRAM-only if they want p2p? AFAICT mesa for us always uses a dual placement or just system memory for these types of buffers.
>>
>> Christian, do you have any thoughts here? We have a kernel perf regression after DMABUF_MOVE_NOTIFY was made the default after updating to a new kernel. The gist is that this then turned on the p2p paths, with a multi-GPU setup with an AMD igpu/APU and Xe dgpu doing prime rendering. From the user bug report it sounds like the dgpu linear window buffer exported to the compositor (igpu) is dual placement VRAM + TT, and so this now attempts to keep that memory in VRAM instead of moving it. Compositor then uses p2p to access it. It works but performance falls off a massive cliff here.
>>
>> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>>
>> Some questions:
>>
>> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>>
>> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
>
> If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
Ideas on how do that? Could we do something like allow_peer2peer = false
in amdgpu_gem_prime_import() if this is an APU device, or further check
if the exporter side is not amdgpu, like APU + Xe?
>
> At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
>
> And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
AFAICT on Intel iGPUs it will currently always end up with peer2peer =
false on attach. Not 100% sure if direct scanout was happening on the
p2p buffer itself, for the user report.
>
> Regards,
> Christian.
>
>>
>>>
>>> Thanks,
>>> Thomas
>>>
>>>> Assisted-by: LLM
>>>> Closes:
>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>> GPUs")
>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>> ---
>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 +++++++++++++++++++++++++------
>>>> --
>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>> index 5065a7bac39c..e63437a261cb 100644
>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>> void *data,
>>>> * Display scanout is always non-coherent with the CPU
>>>> cache.
>>>> */
>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>> XE_BO_FLAG_SCANOUT;
>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>> *file_priv,
>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>
>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>> XE_BO_FLAG_FORCE_WC |
>>>> + XE_BO_FLAG_SCANOUT |
>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>> if (IS_ERR(bo))
>>>> return PTR_ERR(bo);
>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>> @@ -56,6 +56,7 @@
>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>> /* this one is trigger internally only */
>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>> index b973579a69b8..0a347f09cee4 100644
>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>> _ddebug *desc, bool *flag)
>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>> #endif
>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>> *attach)
>>>> +{
>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>> +
>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>> +}
>>>> +
>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>> + .allow_peer2peer = true,
>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>> +};
>>>> +
>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>> +{
>>>> + while (dev) {
>>>> + if (dev_is_pci(dev))
>>>> + return to_pci_dev(dev);
>>>> + dev = dev->parent;
>>>> + }
>>>> + return NULL;
>>>> +}
>>>> +
>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>> *attach)
>>>> +{
>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>> +}
>>>> +
>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>> struct dma_buf_attachment *attach)
>>>> {
>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>> *dmabuf,
>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>> dev, verbose_p2p_dist) < 0)
>>>> attach->peer2peer = false;
>>>> - if (!attach->peer2peer &&
>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>> + struct pci_dev *client =
>>>> xe_find_parent_pci_dev(attach->dev);
>>>> +
>>>> + /*
>>>> + * There are perf issues with using p2p with display
>>>> buffers,
>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>> p2p window
>>>> + * buffer). Probably we need some actual userspace
>>>> hints. We
>>>> + * shouldn't really assume anything. Also, note that
>>>> some of
>>>> + * these buffers are not always tagged with SCANOUT.
>>>> + */
>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>> + attach->peer2peer = false;
>>>> + else if (client && pci_is_display(client) &&
>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>> + attach->peer2peer = false;
>>>> + }
>>>> +
>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>> return -EOPNOTSUPP;
>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>> struct dma_buf *dma_buf)
>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>> }
>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>> *attach)
>>>> -{
>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>> -
>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>> -}
>>>> -
>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>> - .allow_peer2peer = true,
>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>> -};
>>>> -
>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>> struct dma_buf_test_params {
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-08 9:46 ` Matthew Auld
2026-10-08 9:55 ` Christian König
@ 2026-10-08 14:40 ` Simon Richter
2026-10-08 16:22 ` Matthew Auld
1 sibling, 1 reply; 30+ messages in thread
From: Simon Richter @ 2026-10-08 14:40 UTC (permalink / raw)
To: intel-xe
[-- Attachment #1.1: Type: text/plain, Size: 1006 bytes --]
Hi,
On 10/8/26 18:46, Matthew Auld wrote:
> From the user bug report it sounds like the dgpu linear
> window buffer exported to the compositor (igpu) is dual placement VRAM +
> TT, and so this now attempts to keep that memory in VRAM instead of
> moving it. Compositor then uses p2p to access it. It works but
> performance falls off a massive cliff here.
Is that because it is using external memory as a texture source, or
because copy operations are slow for some reason?
If it is for a texture, the client should say so explicitly during the
import, e.g. a Vulkan[1] client would give a
VkExternalMemoryImageCreateInfo pointer in pNext, and fill out usage as
VK_IMAGE_USAGE_SAMPLED_BIT.
I think this would be the ideal point to either make sure the image ends
up in host memory, or reject it so the compositor can detect that this
is not a good texture source, and insert an extra transfer.
Simon
[1] Presumably, other graphics APIs have something similar.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-08 14:40 ` Simon Richter
@ 2026-10-08 16:22 ` Matthew Auld
0 siblings, 0 replies; 30+ messages in thread
From: Matthew Auld @ 2026-10-08 16:22 UTC (permalink / raw)
To: Simon Richter, intel-xe
Hi,
On 08/10/2026 15:40, Simon Richter wrote:
> Hi,
>
> On 10/8/26 18:46, Matthew Auld wrote:
>
>> From the user bug report it sounds like the dgpu linear window buffer
>> exported to the compositor (igpu) is dual placement VRAM + TT, and so
>> this now attempts to keep that memory in VRAM instead of moving it.
>> Compositor then uses p2p to access it. It works but performance falls
>> off a massive cliff here.
>
> Is that because it is using external memory as a texture source, or
> because copy operations are slow for some reason?
Not sure tbh.
>
> If it is for a texture, the client should say so explicitly during the
> import, e.g. a Vulkan[1] client would give a
> VkExternalMemoryImageCreateInfo pointer in pNext, and fill out usage as
> VK_IMAGE_USAGE_SAMPLED_BIT.
>
> I think this would be the ideal point to either make sure the image ends
> up in host memory, or reject it so the compositor can detect that this
> is not a good texture source, and insert an extra transfer.
I think user reported that Vulkan was unaffected, it's just OpenGL. From
kernel pov, we don't really know if we are actually meant to use p2p, or
move to system memory, since we are lacking any kind of hint. This is
maybe a miss. We just end up with a valid looking buffer with a dual
placement that gets exported to amdgpu. On amd CPUs they allow p2p, even
for igpu. So when user updated their kernel version, where the
MOVE_NOTIFY config got removed and enabled by default this suddenly gave
them the p2p path with buffer staying in VRAM, whereas before the buffer
would have been correctly moved to system memory by the kernel.
>
> Simon
>
> [1] Presumably, other graphics APIs have something similar.
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-08 11:17 ` Matthew Auld
@ 2026-10-09 9:16 ` Matthew Auld
2026-10-09 9:26 ` Christian König
0 siblings, 1 reply; 30+ messages in thread
From: Matthew Auld @ 2026-10-09 9:16 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 08/10/2026 12:17, Matthew Auld wrote:
> On 08/10/2026 10:55, Christian König wrote:
>> On 10/8/26 11:46, Matthew Auld wrote:
>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>>>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>>>>> for
>>>>> all exported VRAM buffers. However, in some multi-GPU setups, like
>>>>> with
>>>>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>>>>> looks like the exported dma-buf window buffer can in some cases end
>>>>> up
>>>>> using p2p.
>>>>>
>>>>> However, user is reporting a kernel regression where performance here
>>>>> massively tanks across many games/workloads, where it looks like on
>>>>> each
>>>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>>>> window
>>>>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>>>>
>>>>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>>>>> for
>>>>> now.
>>>>>
>>>>> We don't currently have any hints to say "please use p2p for this
>>>>> buffer, or please don't", however we can use some heuristics to try
>>>>> to
>>>>> determine if this is likely a display buffer being exported to an
>>>>> igpu,
>>>>> which probably never intended for p2p:
>>>>>
>>>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>>>>> tagged with this, but not always.
>>>>>
>>>>> 2. Importer being a PCI device with display, which is not xe
>>>>> driver.
>>>>>
>>>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>>>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>>>>> on
>>>>> Intel. We also limit the above to dual placement buffers.
>>>>>
>>>>> The original regression was bisected to commit 609fc8766d68 ("dma-
>>>>> buf:
>>>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>>>> already present when enabling that knob, so this goes back even
>>>>> further.
>>>>>
>>>>> User has confirmed that along with the sticky dma-buf TT placement
>>>>> fix,
>>>>> to prevent ping-ponging, the performance is back to normal.
>>>>>
>>>>
>>>> Actually, I think this needs to be fixed on the importer side. Until we
>>>> have some some user-space hints, I don't think the exporter should
>>>> second-guess. Most sane solution IMO is if igfx importers could just
>>>> not advertise pcie p2p support?
>>>
>>> Yeah, not sure tbh. I'm not a huge fan of this patch either. But you
>>> could argue that the SCANOUT flag is already a good implicit hint/
>>> signal on the exporter side, but unfortunately there were some games
>>> where this did not reliably work. The other implicit hint/signal is
>>> perhaps the dual placement angle. For example, in compute-runtime, it
>>> might be that they use VRAM-only if they want p2p? AFAICT mesa for us
>>> always uses a dual placement or just system memory for these types of
>>> buffers.
>>>
>>> Christian, do you have any thoughts here? We have a kernel perf
>>> regression after DMABUF_MOVE_NOTIFY was made the default after
>>> updating to a new kernel. The gist is that this then turned on the
>>> p2p paths, with a multi-GPU setup with an AMD igpu/APU and Xe dgpu
>>> doing prime rendering. From the user bug report it sounds like the
>>> dgpu linear window buffer exported to the compositor (igpu) is dual
>>> placement VRAM + TT, and so this now attempts to keep that memory in
>>> VRAM instead of moving it. Compositor then uses p2p to access it. It
>>> works but performance falls off a massive cliff here.
>>>
>>> Perhaps Intel Mesa side should use tt-only for this type buffer (?),
>>> but since this is a kernel regression I was hoping we could fix this
>>> on the kernel side.
>>>
>>> Some questions:
>>>
>>> 1. Do you know what is the general story with p2p between igpu and
>>> dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be
>>> dropped? It clearly seems to work though.
>>>
>>> 2. If this is legit, do you guys then also prevent p2p with display
>>> buffers? Are you just doing that at the Mesa level, or is there some
>>> magic in the kernel also?
>>
>> If I understand that correctly that the igpu is the importer and the
>> dgpu is the exporter then yeah Thomas is right that definately needs
>> to be fixed on the importer side.
>
> Ideas on how do that? Could we do something like allow_peer2peer = false
> in amdgpu_gem_prime_import() if this is an APU device, or further check
> if the exporter side is not amdgpu, like APU + Xe?
For example:
https://gitlab.freedesktop.org/mwa/kernel/-/commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
Is that something you would accept?
>
>>
>> At least for AMD APUs we clearly support P2P both as exporter and
>> importer, but what isn't supported is to scan out over P2P. We
>> explicitely reject that inside DC/DAL.
>>
>> And I'm pretty sure that you should do that as well. I'm actually
>> really suprised that this works technically and doesn't cause
>> corruption or anything.
>
> AFAICT on Intel iGPUs it will currently always end up with peer2peer =
> false on attach. Not 100% sure if direct scanout was happening on the
> p2p buffer itself, for the user report.
>
>>
>> Regards,
>> Christian.
>>
>>>
>>>>
>>>> Thanks,
>>>> Thomas
>>>>
>>>>> Assisted-by: LLM
>>>>> Closes:
>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>>> GPUs")
>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>> ---
>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++++++
>>>>> +------
>>>>> --
>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>>> void *data,
>>>>> * Display scanout is always non-coherent with the CPU
>>>>> cache.
>>>>> */
>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>> XE_BO_FLAG_SCANOUT;
>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>> *file_priv,
>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>> XE_BO_FLAG_FORCE_WC |
>>>>> + XE_BO_FLAG_SCANOUT |
>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>> if (IS_ERR(bo))
>>>>> return PTR_ERR(bo);
>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>> @@ -56,6 +56,7 @@
>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>> /* this one is trigger internally only */
>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>> _ddebug *desc, bool *flag)
>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>> #endif
>>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>> *attach)
>>>>> +{
>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>> +
>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>> +}
>>>>> +
>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>> + .allow_peer2peer = true,
>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>> +};
>>>>> +
>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>>> +{
>>>>> + while (dev) {
>>>>> + if (dev_is_pci(dev))
>>>>> + return to_pci_dev(dev);
>>>>> + dev = dev->parent;
>>>>> + }
>>>>> + return NULL;
>>>>> +}
>>>>> +
>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>>> *attach)
>>>>> +{
>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>> +}
>>>>> +
>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>> struct dma_buf_attachment *attach)
>>>>> {
>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>> *dmabuf,
>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>>> dev, verbose_p2p_dist) < 0)
>>>>> attach->peer2peer = false;
>>>>> - if (!attach->peer2peer &&
>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>> + struct pci_dev *client =
>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>> +
>>>>> + /*
>>>>> + * There are perf issues with using p2p with display
>>>>> buffers,
>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>> p2p window
>>>>> + * buffer). Probably we need some actual userspace
>>>>> hints. We
>>>>> + * shouldn't really assume anything. Also, note that
>>>>> some of
>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>> + */
>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>> + attach->peer2peer = false;
>>>>> + else if (client && pci_is_display(client) &&
>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>> + attach->peer2peer = false;
>>>>> + }
>>>>> +
>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>> return -EOPNOTSUPP;
>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>>> struct dma_buf *dma_buf)
>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>> }
>>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>> *attach)
>>>>> -{
>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>> -
>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>> -}
>>>>> -
>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>> - .allow_peer2peer = true,
>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>> -};
>>>>> -
>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>> struct dma_buf_test_params {
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-09 9:16 ` Matthew Auld
@ 2026-10-09 9:26 ` Christian König
2026-10-09 10:29 ` Matthew Auld
0 siblings, 1 reply; 30+ messages in thread
From: Christian König @ 2026-10-09 9:26 UTC (permalink / raw)
To: Matthew Auld, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 10/9/26 11:16, Matthew Auld wrote:
> On 08/10/2026 12:17, Matthew Auld wrote:
>> On 08/10/2026 10:55, Christian König wrote:
>>> On 10/8/26 11:46, Matthew Auld wrote:
>>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>>>>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>>>>>> for
>>>>>> all exported VRAM buffers. However, in some multi-GPU setups, like
>>>>>> with
>>>>>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>>>>>> looks like the exported dma-buf window buffer can in some cases end
>>>>>> up
>>>>>> using p2p.
>>>>>>
>>>>>> However, user is reporting a kernel regression where performance here
>>>>>> massively tanks across many games/workloads, where it looks like on
>>>>>> each
>>>>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>>>>> window
>>>>>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>>>>>
>>>>>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>>>>>> for
>>>>>> now.
>>>>>>
>>>>>> We don't currently have any hints to say "please use p2p for this
>>>>>> buffer, or please don't", however we can use some heuristics to try
>>>>>> to
>>>>>> determine if this is likely a display buffer being exported to an
>>>>>> igpu,
>>>>>> which probably never intended for p2p:
>>>>>>
>>>>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>>>>>> tagged with this, but not always.
>>>>>>
>>>>>> 2. Importer being a PCI device with display, which is not xe driver.
>>>>>>
>>>>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>>>>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>>>>>> on
>>>>>> Intel. We also limit the above to dual placement buffers.
>>>>>>
>>>>>> The original regression was bisected to commit 609fc8766d68 ("dma-
>>>>>> buf:
>>>>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>>>>> already present when enabling that knob, so this goes back even
>>>>>> further.
>>>>>>
>>>>>> User has confirmed that along with the sticky dma-buf TT placement
>>>>>> fix,
>>>>>> to prevent ping-ponging, the performance is back to normal.
>>>>>>
>>>>>
>>>>> Actually, I think this needs to be fixed on the importer side. Until we
>>>>> have some some user-space hints, I don't think the exporter should
>>>>> second-guess. Most sane solution IMO is if igfx importers could just
>>>>> not advertise pcie p2p support?
>>>>
>>>> Yeah, not sure tbh. I'm not a huge fan of this patch either. But you could argue that the SCANOUT flag is already a good implicit hint/ signal on the exporter side, but unfortunately there were some games where this did not reliably work. The other implicit hint/signal is perhaps the dual placement angle. For example, in compute-runtime, it might be that they use VRAM-only if they want p2p? AFAICT mesa for us always uses a dual placement or just system memory for these types of buffers.
>>>>
>>>> Christian, do you have any thoughts here? We have a kernel perf regression after DMABUF_MOVE_NOTIFY was made the default after updating to a new kernel. The gist is that this then turned on the p2p paths, with a multi-GPU setup with an AMD igpu/APU and Xe dgpu doing prime rendering. From the user bug report it sounds like the dgpu linear window buffer exported to the compositor (igpu) is dual placement VRAM + TT, and so this now attempts to keep that memory in VRAM instead of moving it. Compositor then uses p2p to access it. It works but performance falls off a massive cliff here.
>>>>
>>>> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>>>>
>>>> Some questions:
>>>>
>>>> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>>>>
>>>> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
>>>
>>> If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
>>
>> Ideas on how do that? Could we do something like allow_peer2peer = false in amdgpu_gem_prime_import() if this is an APU device, or further check if the exporter side is not amdgpu, like APU + Xe?
>
> For example: https://gitlab.freedesktop.org/mwa/kernel/-/commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
>
> Is that something you would accept?
No, you misunderstood me. Enabling P2P is perfectly fine for APUs and mandatory for a couple of customer projects.
The buffer should just be rejected from scanout in the display code and on the AMDGPU side we already do that if I'm not completely mistaken.
Userspace has fallback path that when a DRM atomic requests fails for an imported buffer it falls back to copying the buffer first.
Regards,
Christian.
>>
>>>
>>> At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
>>>
>>> And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
>>
>> AFAICT on Intel iGPUs it will currently always end up with peer2peer = false on attach. Not 100% sure if direct scanout was happening on the p2p buffer itself, for the user report.
>>
>>>
>>> Regards,
>>> Christian.
>>>
>>>>
>>>>>
>>>>> Thanks,
>>>>> Thomas
>>>>>
>>>>>> Assisted-by: LLM
>>>>>> Closes:
>>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>>>> GPUs")
>>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>>> ---
>>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++++++ +------
>>>>>> --
>>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>>>> void *data,
>>>>>> * Display scanout is always non-coherent with the CPU
>>>>>> cache.
>>>>>> */
>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>>> XE_BO_FLAG_SCANOUT;
>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>>> *file_priv,
>>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>>> XE_BO_FLAG_FORCE_WC |
>>>>>> + XE_BO_FLAG_SCANOUT |
>>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>>> if (IS_ERR(bo))
>>>>>> return PTR_ERR(bo);
>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>>> @@ -56,6 +56,7 @@
>>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>>> /* this one is trigger internally only */
>>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>>> _ddebug *desc, bool *flag)
>>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>>> #endif
>>>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>> *attach)
>>>>>> +{
>>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>> +
>>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>> +}
>>>>>> +
>>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>> + .allow_peer2peer = true,
>>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>>> +};
>>>>>> +
>>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>>>> +{
>>>>>> + while (dev) {
>>>>>> + if (dev_is_pci(dev))
>>>>>> + return to_pci_dev(dev);
>>>>>> + dev = dev->parent;
>>>>>> + }
>>>>>> + return NULL;
>>>>>> +}
>>>>>> +
>>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>>>> *attach)
>>>>>> +{
>>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>>> +}
>>>>>> +
>>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>>> struct dma_buf_attachment *attach)
>>>>>> {
>>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>>> *dmabuf,
>>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>>>> dev, verbose_p2p_dist) < 0)
>>>>>> attach->peer2peer = false;
>>>>>> - if (!attach->peer2peer &&
>>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>>> + struct pci_dev *client =
>>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>>> +
>>>>>> + /*
>>>>>> + * There are perf issues with using p2p with display
>>>>>> buffers,
>>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>>> p2p window
>>>>>> + * buffer). Probably we need some actual userspace
>>>>>> hints. We
>>>>>> + * shouldn't really assume anything. Also, note that
>>>>>> some of
>>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>>> + */
>>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>>> + attach->peer2peer = false;
>>>>>> + else if (client && pci_is_display(client) &&
>>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>>> + attach->peer2peer = false;
>>>>>> + }
>>>>>> +
>>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>>> return -EOPNOTSUPP;
>>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>>>> struct dma_buf *dma_buf)
>>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>>> }
>>>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>> *attach)
>>>>>> -{
>>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>> -
>>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>> -}
>>>>>> -
>>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>> - .allow_peer2peer = true,
>>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>>> -};
>>>>>> -
>>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>>> struct dma_buf_test_params {
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-09 9:26 ` Christian König
@ 2026-10-09 10:29 ` Matthew Auld
2026-10-09 11:38 ` Christian König
0 siblings, 1 reply; 30+ messages in thread
From: Matthew Auld @ 2026-10-09 10:29 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 09/10/2026 10:26, Christian König wrote:
> On 10/9/26 11:16, Matthew Auld wrote:
>> On 08/10/2026 12:17, Matthew Auld wrote:
>>> On 08/10/2026 10:55, Christian König wrote:
>>>> On 10/8/26 11:46, Matthew Auld wrote:
>>>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>>>>>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>>>>>>> for
>>>>>>> all exported VRAM buffers. However, in some multi-GPU setups, like
>>>>>>> with
>>>>>>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>>>>>>> looks like the exported dma-buf window buffer can in some cases end
>>>>>>> up
>>>>>>> using p2p.
>>>>>>>
>>>>>>> However, user is reporting a kernel regression where performance here
>>>>>>> massively tanks across many games/workloads, where it looks like on
>>>>>>> each
>>>>>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>>>>>> window
>>>>>>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>>>>>>
>>>>>>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>>>>>>> for
>>>>>>> now.
>>>>>>>
>>>>>>> We don't currently have any hints to say "please use p2p for this
>>>>>>> buffer, or please don't", however we can use some heuristics to try
>>>>>>> to
>>>>>>> determine if this is likely a display buffer being exported to an
>>>>>>> igpu,
>>>>>>> which probably never intended for p2p:
>>>>>>>
>>>>>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>>>>>>> tagged with this, but not always.
>>>>>>>
>>>>>>> 2. Importer being a PCI device with display, which is not xe driver.
>>>>>>>
>>>>>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>>>>>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>>>>>>> on
>>>>>>> Intel. We also limit the above to dual placement buffers.
>>>>>>>
>>>>>>> The original regression was bisected to commit 609fc8766d68 ("dma-
>>>>>>> buf:
>>>>>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>>>>>> already present when enabling that knob, so this goes back even
>>>>>>> further.
>>>>>>>
>>>>>>> User has confirmed that along with the sticky dma-buf TT placement
>>>>>>> fix,
>>>>>>> to prevent ping-ponging, the performance is back to normal.
>>>>>>>
>>>>>>
>>>>>> Actually, I think this needs to be fixed on the importer side. Until we
>>>>>> have some some user-space hints, I don't think the exporter should
>>>>>> second-guess. Most sane solution IMO is if igfx importers could just
>>>>>> not advertise pcie p2p support?
>>>>>
>>>>> Yeah, not sure tbh. I'm not a huge fan of this patch either. But you could argue that the SCANOUT flag is already a good implicit hint/ signal on the exporter side, but unfortunately there were some games where this did not reliably work. The other implicit hint/signal is perhaps the dual placement angle. For example, in compute-runtime, it might be that they use VRAM-only if they want p2p? AFAICT mesa for us always uses a dual placement or just system memory for these types of buffers.
>>>>>
>>>>> Christian, do you have any thoughts here? We have a kernel perf regression after DMABUF_MOVE_NOTIFY was made the default after updating to a new kernel. The gist is that this then turned on the p2p paths, with a multi-GPU setup with an AMD igpu/APU and Xe dgpu doing prime rendering. From the user bug report it sounds like the dgpu linear window buffer exported to the compositor (igpu) is dual placement VRAM + TT, and so this now attempts to keep that memory in VRAM instead of moving it. Compositor then uses p2p to access it. It works but performance falls off a massive cliff here.
>>>>>
>>>>> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>>>>>
>>>>> Some questions:
>>>>>
>>>>> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>>>>>
>>>>> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
>>>>
>>>> If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
>>>
>>> Ideas on how do that? Could we do something like allow_peer2peer = false in amdgpu_gem_prime_import() if this is an APU device, or further check if the exporter side is not amdgpu, like APU + Xe?
>>
>> For example: https://gitlab.freedesktop.org/mwa/kernel/-/commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
>>
>> Is that something you would accept?
>
> No, you misunderstood me. Enabling P2P is perfectly fine for APUs and mandatory for a couple of customer projects.
>
> The buffer should just be rejected from scanout in the display code and on the AMDGPU side we already do that if I'm not completely mistaken.
Reporter confirmed seeing the issue in windowed mode also. So I don't
think it's just a case of rejecting from scanout?
>
> Userspace has fallback path that when a DRM atomic requests fails for an imported buffer it falls back to copying the buffer first.
>
> Regards,
> Christian.
>>>
>>>>
>>>> At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
>>>>
>>>> And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
>>>
>>> AFAICT on Intel iGPUs it will currently always end up with peer2peer = false on attach. Not 100% sure if direct scanout was happening on the p2p buffer itself, for the user report.
>>>
>>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> Thomas
>>>>>>
>>>>>>> Assisted-by: LLM
>>>>>>> Closes:
>>>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>>>>> GPUs")
>>>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>>>> ---
>>>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++++++ +------
>>>>>>> --
>>>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>>>
>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>>>>> void *data,
>>>>>>> * Display scanout is always non-coherent with the CPU
>>>>>>> cache.
>>>>>>> */
>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>>>> XE_BO_FLAG_SCANOUT;
>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>>>> *file_priv,
>>>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>>>> XE_BO_FLAG_FORCE_WC |
>>>>>>> + XE_BO_FLAG_SCANOUT |
>>>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>>>> if (IS_ERR(bo))
>>>>>>> return PTR_ERR(bo);
>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>> @@ -56,6 +56,7 @@
>>>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>>>> /* this one is trigger internally only */
>>>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>>>> _ddebug *desc, bool *flag)
>>>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>>>> #endif
>>>>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>> *attach)
>>>>>>> +{
>>>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>> +
>>>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>> +}
>>>>>>> +
>>>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>> + .allow_peer2peer = true,
>>>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>> +};
>>>>>>> +
>>>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>>>>> +{
>>>>>>> + while (dev) {
>>>>>>> + if (dev_is_pci(dev))
>>>>>>> + return to_pci_dev(dev);
>>>>>>> + dev = dev->parent;
>>>>>>> + }
>>>>>>> + return NULL;
>>>>>>> +}
>>>>>>> +
>>>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>>>>> *attach)
>>>>>>> +{
>>>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>>>> +}
>>>>>>> +
>>>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>>>> struct dma_buf_attachment *attach)
>>>>>>> {
>>>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>>>> *dmabuf,
>>>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>>>>> dev, verbose_p2p_dist) < 0)
>>>>>>> attach->peer2peer = false;
>>>>>>> - if (!attach->peer2peer &&
>>>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>>>> + struct pci_dev *client =
>>>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>>>> +
>>>>>>> + /*
>>>>>>> + * There are perf issues with using p2p with display
>>>>>>> buffers,
>>>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>>>> p2p window
>>>>>>> + * buffer). Probably we need some actual userspace
>>>>>>> hints. We
>>>>>>> + * shouldn't really assume anything. Also, note that
>>>>>>> some of
>>>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>>>> + */
>>>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>>>> + attach->peer2peer = false;
>>>>>>> + else if (client && pci_is_display(client) &&
>>>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>>>> + attach->peer2peer = false;
>>>>>>> + }
>>>>>>> +
>>>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>>>> return -EOPNOTSUPP;
>>>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>>>>> struct dma_buf *dma_buf)
>>>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>>>> }
>>>>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>> *attach)
>>>>>>> -{
>>>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>> -
>>>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>> -}
>>>>>>> -
>>>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>> - .allow_peer2peer = true,
>>>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>> -};
>>>>>>> -
>>>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>>>> struct dma_buf_test_params {
>>>>>
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-09 10:29 ` Matthew Auld
@ 2026-10-09 11:38 ` Christian König
2026-10-09 13:02 ` Matthew Auld
2026-10-09 13:06 ` Thomas Hellström
0 siblings, 2 replies; 30+ messages in thread
From: Christian König @ 2026-10-09 11:38 UTC (permalink / raw)
To: Matthew Auld, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 10/9/26 12:29, Matthew Auld wrote:
> On 09/10/2026 10:26, Christian König wrote:
>> On 10/9/26 11:16, Matthew Auld wrote:
>>> On 08/10/2026 12:17, Matthew Auld wrote:
>>>> On 08/10/2026 10:55, Christian König wrote:
>>>>> On 10/8/26 11:46, Matthew Auld wrote:
>>>>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>>>>>>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>>>>>>>> for
>>>>>>>> all exported VRAM buffers. However, in some multi-GPU setups, like
>>>>>>>> with
>>>>>>>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>>>>>>>> looks like the exported dma-buf window buffer can in some cases end
>>>>>>>> up
>>>>>>>> using p2p.
>>>>>>>>
>>>>>>>> However, user is reporting a kernel regression where performance here
>>>>>>>> massively tanks across many games/workloads, where it looks like on
>>>>>>>> each
>>>>>>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>>>>>>> window
>>>>>>>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>>>>>>>
>>>>>>>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>>>>>>>> for
>>>>>>>> now.
>>>>>>>>
>>>>>>>> We don't currently have any hints to say "please use p2p for this
>>>>>>>> buffer, or please don't", however we can use some heuristics to try
>>>>>>>> to
>>>>>>>> determine if this is likely a display buffer being exported to an
>>>>>>>> igpu,
>>>>>>>> which probably never intended for p2p:
>>>>>>>>
>>>>>>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>>>>>>>> tagged with this, but not always.
>>>>>>>>
>>>>>>>> 2. Importer being a PCI device with display, which is not xe driver.
>>>>>>>>
>>>>>>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>>>>>>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>>>>>>>> on
>>>>>>>> Intel. We also limit the above to dual placement buffers.
>>>>>>>>
>>>>>>>> The original regression was bisected to commit 609fc8766d68 ("dma-
>>>>>>>> buf:
>>>>>>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>>>>>>> already present when enabling that knob, so this goes back even
>>>>>>>> further.
>>>>>>>>
>>>>>>>> User has confirmed that along with the sticky dma-buf TT placement
>>>>>>>> fix,
>>>>>>>> to prevent ping-ponging, the performance is back to normal.
>>>>>>>>
>>>>>>>
>>>>>>> Actually, I think this needs to be fixed on the importer side. Until we
>>>>>>> have some some user-space hints, I don't think the exporter should
>>>>>>> second-guess. Most sane solution IMO is if igfx importers could just
>>>>>>> not advertise pcie p2p support?
>>>>>>
>>>>>> Yeah, not sure tbh. I'm not a huge fan of this patch either. But you could argue that the SCANOUT flag is already a good implicit hint/ signal on the exporter side, but unfortunately there were some games where this did not reliably work. The other implicit hint/signal is perhaps the dual placement angle. For example, in compute-runtime, it might be that they use VRAM-only if they want p2p? AFAICT mesa for us always uses a dual placement or just system memory for these types of buffers.
>>>>>>
>>>>>> Christian, do you have any thoughts here? We have a kernel perf regression after DMABUF_MOVE_NOTIFY was made the default after updating to a new kernel. The gist is that this then turned on the p2p paths, with a multi-GPU setup with an AMD igpu/APU and Xe dgpu doing prime rendering. From the user bug report it sounds like the dgpu linear window buffer exported to the compositor (igpu) is dual placement VRAM + TT, and so this now attempts to keep that memory in VRAM instead of moving it. Compositor then uses p2p to access it. It works but performance falls off a massive cliff here.
>>>>>>
>>>>>> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>>>>>>
>>>>>> Some questions:
>>>>>>
>>>>>> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>>>>>>
>>>>>> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
>>>>>
>>>>> If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
>>>>
>>>> Ideas on how do that? Could we do something like allow_peer2peer = false in amdgpu_gem_prime_import() if this is an APU device, or further check if the exporter side is not amdgpu, like APU + Xe?
>>>
>>> For example: https://gitlab.freedesktop.org/mwa/kernel/-/commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
>>>
>>> Is that something you would accept?
>>
>> No, you misunderstood me. Enabling P2P is perfectly fine for APUs and mandatory for a couple of customer projects.
>>
>> The buffer should just be rejected from scanout in the display code and on the AMDGPU side we already do that if I'm not completely mistaken.
>
> Reporter confirmed seeing the issue in windowed mode also. So I don't think it's just a case of rejecting from scanout?
Then I don't understand what the problem is.
When the dGPU renders and the iGPU displays you have only two possibilities, either the dGPU pushes the frames over the bus or the iGPU pulls the frames over the bus. Both should be equaly slow or fast, so what exactly is the expectation here?
The only thing you need to avoid is that the iGPU starts to scan out over the PCIe bus directly, cause then the frame is pulled over the bus multiple times (if that actually works correctly).
Do you have a link to the original bug report? I was only added later to the discussion so I don't have that.
Regards,
Christian.
>
>>
>> Userspace has fallback path that when a DRM atomic requests fails for an imported buffer it falls back to copying the buffer first.
>>
>> Regards,
>> Christian.
>>>>
>>>>>
>>>>> At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
>>>>>
>>>>> And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
>>>>
>>>> AFAICT on Intel iGPUs it will currently always end up with peer2peer = false on attach. Not 100% sure if direct scanout was happening on the p2p buffer itself, for the user report.
>>>>
>>>>>
>>>>> Regards,
>>>>> Christian.
>>>>>
>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Thomas
>>>>>>>
>>>>>>>> Assisted-by: LLM
>>>>>>>> Closes:
>>>>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>>>>>> GPUs")
>>>>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>>>>> ---
>>>>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++++++ +------
>>>>>>>> --
>>>>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>>>>>> void *data,
>>>>>>>> * Display scanout is always non-coherent with the CPU
>>>>>>>> cache.
>>>>>>>> */
>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>>>>> XE_BO_FLAG_SCANOUT;
>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>>>>> *file_priv,
>>>>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>>>>> XE_BO_FLAG_FORCE_WC |
>>>>>>>> + XE_BO_FLAG_SCANOUT |
>>>>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>>>>> if (IS_ERR(bo))
>>>>>>>> return PTR_ERR(bo);
>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>> @@ -56,6 +56,7 @@
>>>>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>>>>> /* this one is trigger internally only */
>>>>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>>>>> _ddebug *desc, bool *flag)
>>>>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>>>>> #endif
>>>>>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>> *attach)
>>>>>>>> +{
>>>>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>> +
>>>>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>> + .allow_peer2peer = true,
>>>>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>> +};
>>>>>>>> +
>>>>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>>>>>> +{
>>>>>>>> + while (dev) {
>>>>>>>> + if (dev_is_pci(dev))
>>>>>>>> + return to_pci_dev(dev);
>>>>>>>> + dev = dev->parent;
>>>>>>>> + }
>>>>>>>> + return NULL;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>>>>>> *attach)
>>>>>>>> +{
>>>>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>>>>> struct dma_buf_attachment *attach)
>>>>>>>> {
>>>>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>>>>> *dmabuf,
>>>>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>>>>>> dev, verbose_p2p_dist) < 0)
>>>>>>>> attach->peer2peer = false;
>>>>>>>> - if (!attach->peer2peer &&
>>>>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>>>>> + struct pci_dev *client =
>>>>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>>>>> +
>>>>>>>> + /*
>>>>>>>> + * There are perf issues with using p2p with display
>>>>>>>> buffers,
>>>>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>>>>> p2p window
>>>>>>>> + * buffer). Probably we need some actual userspace
>>>>>>>> hints. We
>>>>>>>> + * shouldn't really assume anything. Also, note that
>>>>>>>> some of
>>>>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>>>>> + */
>>>>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>>>>> + attach->peer2peer = false;
>>>>>>>> + else if (client && pci_is_display(client) &&
>>>>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>>>>> + attach->peer2peer = false;
>>>>>>>> + }
>>>>>>>> +
>>>>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>>>>> return -EOPNOTSUPP;
>>>>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>>>>>> struct dma_buf *dma_buf)
>>>>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>>>>> }
>>>>>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>> *attach)
>>>>>>>> -{
>>>>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>> -
>>>>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>> -}
>>>>>>>> -
>>>>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>> - .allow_peer2peer = true,
>>>>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>> -};
>>>>>>>> -
>>>>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>>>>> struct dma_buf_test_params {
>>>>>>
>>>>>
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-09 11:38 ` Christian König
@ 2026-10-09 13:02 ` Matthew Auld
2026-10-13 8:51 ` Matthew Auld
2026-10-09 13:06 ` Thomas Hellström
1 sibling, 1 reply; 30+ messages in thread
From: Matthew Auld @ 2026-10-09 13:02 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 09/10/2026 12:38, Christian König wrote:
> On 10/9/26 12:29, Matthew Auld wrote:
>> On 09/10/2026 10:26, Christian König wrote:
>>> On 10/9/26 11:16, Matthew Auld wrote:
>>>> On 08/10/2026 12:17, Matthew Auld wrote:
>>>>> On 08/10/2026 10:55, Christian König wrote:
>>>>>> On 10/8/26 11:46, Matthew Auld wrote:
>>>>>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>>>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>>>>>>>> If p2p is allowed on the CPU (like on AMD), we currently permit p2p
>>>>>>>>> for
>>>>>>>>> all exported VRAM buffers. However, in some multi-GPU setups, like
>>>>>>>>> with
>>>>>>>>> prime rendering on a dgpu and scanout/compositor using the igpu, it
>>>>>>>>> looks like the exported dma-buf window buffer can in some cases end
>>>>>>>>> up
>>>>>>>>> using p2p.
>>>>>>>>>
>>>>>>>>> However, user is reporting a kernel regression where performance here
>>>>>>>>> massively tanks across many games/workloads, where it looks like on
>>>>>>>>> each
>>>>>>>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>>>>>>>> window
>>>>>>>>> buffer, since it uses p2p. p2p is currently more intended for dgpu <-
>>>>>>>>>>
>>>>>>>>> dgpu, and not so much display buffers with igpu <-> dgpu, at least
>>>>>>>>> for
>>>>>>>>> now.
>>>>>>>>>
>>>>>>>>> We don't currently have any hints to say "please use p2p for this
>>>>>>>>> buffer, or please don't", however we can use some heuristics to try
>>>>>>>>> to
>>>>>>>>> determine if this is likely a display buffer being exported to an
>>>>>>>>> igpu,
>>>>>>>>> which probably never intended for p2p:
>>>>>>>>>
>>>>>>>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers usually get
>>>>>>>>> tagged with this, but not always.
>>>>>>>>>
>>>>>>>>> 2. Importer being a PCI device with display, which is not xe driver.
>>>>>>>>>
>>>>>>>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>>>>>>>> happening on xe igpu. Currently p2p is only enabled for server CPUs,
>>>>>>>>> on
>>>>>>>>> Intel. We also limit the above to dual placement buffers.
>>>>>>>>>
>>>>>>>>> The original regression was bisected to commit 609fc8766d68 ("dma-
>>>>>>>>> buf:
>>>>>>>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>>>>>>>> already present when enabling that knob, so this goes back even
>>>>>>>>> further.
>>>>>>>>>
>>>>>>>>> User has confirmed that along with the sticky dma-buf TT placement
>>>>>>>>> fix,
>>>>>>>>> to prevent ping-ponging, the performance is back to normal.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Actually, I think this needs to be fixed on the importer side. Until we
>>>>>>>> have some some user-space hints, I don't think the exporter should
>>>>>>>> second-guess. Most sane solution IMO is if igfx importers could just
>>>>>>>> not advertise pcie p2p support?
>>>>>>>
>>>>>>> Yeah, not sure tbh. I'm not a huge fan of this patch either. But you could argue that the SCANOUT flag is already a good implicit hint/ signal on the exporter side, but unfortunately there were some games where this did not reliably work. The other implicit hint/signal is perhaps the dual placement angle. For example, in compute-runtime, it might be that they use VRAM-only if they want p2p? AFAICT mesa for us always uses a dual placement or just system memory for these types of buffers.
>>>>>>>
>>>>>>> Christian, do you have any thoughts here? We have a kernel perf regression after DMABUF_MOVE_NOTIFY was made the default after updating to a new kernel. The gist is that this then turned on the p2p paths, with a multi-GPU setup with an AMD igpu/APU and Xe dgpu doing prime rendering. From the user bug report it sounds like the dgpu linear window buffer exported to the compositor (igpu) is dual placement VRAM + TT, and so this now attempts to keep that memory in VRAM instead of moving it. Compositor then uses p2p to access it. It works but performance falls off a massive cliff here.
>>>>>>>
>>>>>>> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>>>>>>>
>>>>>>> Some questions:
>>>>>>>
>>>>>>> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>>>>>>>
>>>>>>> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
>>>>>>
>>>>>> If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
>>>>>
>>>>> Ideas on how do that? Could we do something like allow_peer2peer = false in amdgpu_gem_prime_import() if this is an APU device, or further check if the exporter side is not amdgpu, like APU + Xe?
>>>>
>>>> For example: https://gitlab.freedesktop.org/mwa/kernel/-/commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
>>>>
>>>> Is that something you would accept?
>>>
>>> No, you misunderstood me. Enabling P2P is perfectly fine for APUs and mandatory for a couple of customer projects.
>>>
>>> The buffer should just be rejected from scanout in the display code and on the AMDGPU side we already do that if I'm not completely mistaken.
>>
>> Reporter confirmed seeing the issue in windowed mode also. So I don't think it's just a case of rejecting from scanout?
>
> Then I don't understand what the problem is.
>
> When the dGPU renders and the iGPU displays you have only two possibilities, either the dGPU pushes the frames over the bus or the iGPU pulls the frames over the bus. Both should be equaly slow or fast, so what exactly is the expectation here?
I assume the AMD APU/iGPU is sampling/reading from the p2p window buffer
every frame.
Expectation is that buffer rather gets moved from VRAM to system memory
when mapping the buffer with dma-buf, where it stays, and never
negotiated to use p2p in the first place. I don't think p2p is really
valid here.
What happened is that user updated their kernel and due to the
MOVE_NOTIFY config getting removed and enabled by default on newer
kernels this suddenly started negotiating p2p for things like the window
buffer AFAICT, instead of moving it to system memory and keeping it
there. On previous kernel versions the buffer would just get moved and
pinned in system memory. From user pov this is a kernel regression,
given the perf they are now getting.
On AMD CPUs you allow p2p for everything. On Intel iGPUs we currently
ban p2p. Maybe there is bigger question here for what is the story for
p2p and iGPU? Should it really be blanket allowed like this? Should it
not be opt-in with some userspace hints or something?
The other important part is that even when you move to system memory,
it's no longer pinned (MOVE_NOTIFY) so can you now can also get violent
ping-ponging, which is addressed in the first patch in this series.
>
> The only thing you need to avoid is that the iGPU starts to scan out over the PCIe bus directly, cause then the frame is pulled over the bus multiple times (if that actually works correctly).
>
> Do you have a link to the original bug report? I was only added later to the discussion so I don't have that.
https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>
> Regards,
> Christian.
>
>>
>>>
>>> Userspace has fallback path that when a DRM atomic requests fails for an imported buffer it falls back to copying the buffer first.
>>>
>>> Regards,
>>> Christian.
>>>>>
>>>>>>
>>>>>> At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
>>>>>>
>>>>>> And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
>>>>>
>>>>> AFAICT on Intel iGPUs it will currently always end up with peer2peer = false on attach. Not 100% sure if direct scanout was happening on the p2p buffer itself, for the user report.
>>>>>
>>>>>>
>>>>>> Regards,
>>>>>> Christian.
>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Thomas
>>>>>>>>
>>>>>>>>> Assisted-by: LLM
>>>>>>>>> Closes:
>>>>>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>>>>>>> GPUs")
>>>>>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>>>>>> ---
>>>>>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++++++ +------
>>>>>>>>> --
>>>>>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>>>>>
>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>>>>>>> void *data,
>>>>>>>>> * Display scanout is always non-coherent with the CPU
>>>>>>>>> cache.
>>>>>>>>> */
>>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>>>>>> XE_BO_FLAG_SCANOUT;
>>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>>>>>> *file_priv,
>>>>>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>>>>>> XE_BO_FLAG_FORCE_WC |
>>>>>>>>> + XE_BO_FLAG_SCANOUT |
>>>>>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>>>>>> if (IS_ERR(bo))
>>>>>>>>> return PTR_ERR(bo);
>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>> @@ -56,6 +56,7 @@
>>>>>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>>>>>> /* this one is trigger internally only */
>>>>>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>>>>>> _ddebug *desc, bool *flag)
>>>>>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>>>>>> #endif
>>>>>>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>>> *attach)
>>>>>>>>> +{
>>>>>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>> +
>>>>>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>> +}
>>>>>>>>> +
>>>>>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>> + .allow_peer2peer = true,
>>>>>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>> +};
>>>>>>>>> +
>>>>>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>>>>>>> +{
>>>>>>>>> + while (dev) {
>>>>>>>>> + if (dev_is_pci(dev))
>>>>>>>>> + return to_pci_dev(dev);
>>>>>>>>> + dev = dev->parent;
>>>>>>>>> + }
>>>>>>>>> + return NULL;
>>>>>>>>> +}
>>>>>>>>> +
>>>>>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>>>>>>> *attach)
>>>>>>>>> +{
>>>>>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>>>>>> +}
>>>>>>>>> +
>>>>>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>>>>>> struct dma_buf_attachment *attach)
>>>>>>>>> {
>>>>>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>>>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>>>>>> *dmabuf,
>>>>>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>>>>>>> dev, verbose_p2p_dist) < 0)
>>>>>>>>> attach->peer2peer = false;
>>>>>>>>> - if (!attach->peer2peer &&
>>>>>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>>>>>> + struct pci_dev *client =
>>>>>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>>>>>> +
>>>>>>>>> + /*
>>>>>>>>> + * There are perf issues with using p2p with display
>>>>>>>>> buffers,
>>>>>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>>>>>> p2p window
>>>>>>>>> + * buffer). Probably we need some actual userspace
>>>>>>>>> hints. We
>>>>>>>>> + * shouldn't really assume anything. Also, note that
>>>>>>>>> some of
>>>>>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>>>>>> + */
>>>>>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>> + else if (client && pci_is_display(client) &&
>>>>>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>> + }
>>>>>>>>> +
>>>>>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>>>>>> return -EOPNOTSUPP;
>>>>>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>>>>>>> struct dma_buf *dma_buf)
>>>>>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>>>>>> }
>>>>>>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>>> *attach)
>>>>>>>>> -{
>>>>>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>> -
>>>>>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>> -}
>>>>>>>>> -
>>>>>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>> - .allow_peer2peer = true,
>>>>>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>> -};
>>>>>>>>> -
>>>>>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>>>>>> struct dma_buf_test_params {
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-09 11:38 ` Christian König
2026-10-09 13:02 ` Matthew Auld
@ 2026-10-09 13:06 ` Thomas Hellström
1 sibling, 0 replies; 30+ messages in thread
From: Thomas Hellström @ 2026-10-09 13:06 UTC (permalink / raw)
To: Christian König, Matthew Auld, intel-xe
Cc: Matthew Brost, stable, Christian König
On Fri, 2026-10-09 at 13:38 +0200, Christian König wrote:
> On 10/9/26 12:29, Matthew Auld wrote:
> > On 09/10/2026 10:26, Christian König wrote:
> > > On 10/9/26 11:16, Matthew Auld wrote:
> > > > On 08/10/2026 12:17, Matthew Auld wrote:
> > > > > On 08/10/2026 10:55, Christian König wrote:
> > > > > > On 10/8/26 11:46, Matthew Auld wrote:
> > > > > > > On 07/10/2026 19:11, Thomas Hellström wrote:
> > > > > > > > On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
> > > > > > > > > If p2p is allowed on the CPU (like on AMD), we
> > > > > > > > > currently permit p2p
> > > > > > > > > for
> > > > > > > > > all exported VRAM buffers. However, in some multi-GPU
> > > > > > > > > setups, like
> > > > > > > > > with
> > > > > > > > > prime rendering on a dgpu and scanout/compositor
> > > > > > > > > using the igpu, it
> > > > > > > > > looks like the exported dma-buf window buffer can in
> > > > > > > > > some cases end
> > > > > > > > > up
> > > > > > > > > using p2p.
> > > > > > > > >
> > > > > > > > > However, user is reporting a kernel regression where
> > > > > > > > > performance here
> > > > > > > > > massively tanks across many games/workloads, where it
> > > > > > > > > looks like on
> > > > > > > > > each
> > > > > > > > > frame, the igpu is reading/sampling from VRAM over
> > > > > > > > > pcie for the
> > > > > > > > > window
> > > > > > > > > buffer, since it uses p2p. p2p is currently more
> > > > > > > > > intended for dgpu <-
> > > > > > > > > >
> > > > > > > > > dgpu, and not so much display buffers with igpu <->
> > > > > > > > > dgpu, at least
> > > > > > > > > for
> > > > > > > > > now.
> > > > > > > > >
> > > > > > > > > We don't currently have any hints to say "please use
> > > > > > > > > p2p for this
> > > > > > > > > buffer, or please don't", however we can use some
> > > > > > > > > heuristics to try
> > > > > > > > > to
> > > > > > > > > determine if this is likely a display buffer being
> > > > > > > > > exported to an
> > > > > > > > > igpu,
> > > > > > > > > which probably never intended for p2p:
> > > > > > > > >
> > > > > > > > > 1. FLAG_SCANOUT being set on the buffer. Window
> > > > > > > > > buffers usually get
> > > > > > > > > tagged with this, but not always.
> > > > > > > > >
> > > > > > > > > 2. Importer being a PCI device with display,
> > > > > > > > > which is not xe driver.
> > > > > > > > >
> > > > > > > > > We also rely on the existing p2p Intel CPU whitelist
> > > > > > > > > to stop this
> > > > > > > > > happening on xe igpu. Currently p2p is only enabled
> > > > > > > > > for server CPUs,
> > > > > > > > > on
> > > > > > > > > Intel. We also limit the above to dual placement
> > > > > > > > > buffers.
> > > > > > > > >
> > > > > > > > > The original regression was bisected to commit
> > > > > > > > > 609fc8766d68 ("dma-
> > > > > > > > > buf:
> > > > > > > > > Always build with DMABUF_MOVE_NOTIFY"), however the
> > > > > > > > > behaviour was
> > > > > > > > > already present when enabling that knob, so this goes
> > > > > > > > > back even
> > > > > > > > > further.
> > > > > > > > >
> > > > > > > > > User has confirmed that along with the sticky dma-buf
> > > > > > > > > TT placement
> > > > > > > > > fix,
> > > > > > > > > to prevent ping-ponging, the performance is back to
> > > > > > > > > normal.
> > > > > > > > >
> > > > > > > >
> > > > > > > > Actually, I think this needs to be fixed on the
> > > > > > > > importer side. Until we
> > > > > > > > have some some user-space hints, I don't think the
> > > > > > > > exporter should
> > > > > > > > second-guess. Most sane solution IMO is if igfx
> > > > > > > > importers could just
> > > > > > > > not advertise pcie p2p support?
> > > > > > >
> > > > > > > Yeah, not sure tbh. I'm not a huge fan of this patch
> > > > > > > either. But you could argue that the SCANOUT flag is
> > > > > > > already a good implicit hint/ signal on the exporter
> > > > > > > side, but unfortunately there were some games where this
> > > > > > > did not reliably work. The other implicit hint/signal is
> > > > > > > perhaps the dual placement angle. For example, in
> > > > > > > compute-runtime, it might be that they use VRAM-only if
> > > > > > > they want p2p? AFAICT mesa for us always uses a dual
> > > > > > > placement or just system memory for these types of
> > > > > > > buffers.
> > > > > > >
> > > > > > > Christian, do you have any thoughts here? We have a
> > > > > > > kernel perf regression after DMABUF_MOVE_NOTIFY was made
> > > > > > > the default after updating to a new kernel. The gist is
> > > > > > > that this then turned on the p2p paths, with a multi-GPU
> > > > > > > setup with an AMD igpu/APU and Xe dgpu doing prime
> > > > > > > rendering. From the user bug report it sounds like the
> > > > > > > dgpu linear window buffer exported to the compositor
> > > > > > > (igpu) is dual placement VRAM + TT, and so this now
> > > > > > > attempts to keep that memory in VRAM instead of moving
> > > > > > > it. Compositor then uses p2p to access it. It works but
> > > > > > > performance falls off a massive cliff here.
> > > > > > >
> > > > > > > Perhaps Intel Mesa side should use tt-only for this type
> > > > > > > buffer (?), but since this is a kernel regression I was
> > > > > > > hoping we could fix this on the kernel side.
> > > > > > >
> > > > > > > Some questions:
> > > > > > >
> > > > > > > 1. Do you know what is the general story with p2p between
> > > > > > > igpu and dgpu? Is this a legit thing? For igpus/APUs,
> > > > > > > advertising p2p can't be dropped? It clearly seems to
> > > > > > > work though.
> > > > > > >
> > > > > > > 2. If this is legit, do you guys then also prevent p2p
> > > > > > > with display buffers? Are you just doing that at the Mesa
> > > > > > > level, or is there some magic in the kernel also?
> > > > > >
> > > > > > If I understand that correctly that the igpu is the
> > > > > > importer and the dgpu is the exporter then yeah Thomas is
> > > > > > right that definately needs to be fixed on the importer
> > > > > > side.
> > > > >
> > > > > Ideas on how do that? Could we do something like
> > > > > allow_peer2peer = false in amdgpu_gem_prime_import() if this
> > > > > is an APU device, or further check if the exporter side is
> > > > > not amdgpu, like APU + Xe?
> > > >
> > > > For example:
> > > > https://gitlab.freedesktop.org/mwa/kernel/-/commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
> > > >
> > > > Is that something you would accept?
> > >
> > > No, you misunderstood me. Enabling P2P is perfectly fine for APUs
> > > and mandatory for a couple of customer projects.
> > >
> > > The buffer should just be rejected from scanout in the display
> > > code and on the AMDGPU side we already do that if I'm not
> > > completely mistaken.
> >
> > Reporter confirmed seeing the issue in windowed mode also. So I
> > don't think it's just a case of rejecting from scanout?
>
> Then I don't understand what the problem is.
>
> When the dGPU renders and the iGPU displays you have only two
> possibilities, either the dGPU pushes the frames over the bus or the
> iGPU pulls the frames over the bus. Both should be equaly slow or
> fast, so what exactly is the expectation here?
I think PCIe reads, even p2p can be agonizingly slow. From my
understanding writes are posted whereas reads are not. The reading
/Thomas
>
> The only thing you need to avoid is that the iGPU starts to scan out
> over the PCIe bus directly, cause then the frame is pulled over the
> bus multiple times (if that actually works correctly).
>
> Do you have a link to the original bug report? I was only added later
> to the discussion so I don't have that.
>
> Regards,
> Christian.
>
> >
> > >
> > > Userspace has fallback path that when a DRM atomic requests fails
> > > for an imported buffer it falls back to copying the buffer first.
> > >
> > > Regards,
> > > Christian.
> > > > >
> > > > > >
> > > > > > At least for AMD APUs we clearly support P2P both as
> > > > > > exporter and importer, but what isn't supported is to scan
> > > > > > out over P2P. We explicitely reject that inside DC/DAL.
> > > > > >
> > > > > > And I'm pretty sure that you should do that as well. I'm
> > > > > > actually really suprised that this works technically and
> > > > > > doesn't cause corruption or anything.
> > > > >
> > > > > AFAICT on Intel iGPUs it will currently always end up with
> > > > > peer2peer = false on attach. Not 100% sure if direct scanout
> > > > > was happening on the p2p buffer itself, for the user report.
> > > > >
> > > > > >
> > > > > > Regards,
> > > > > > Christian.
> > > > > >
> > > > > > >
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > > Thomas
> > > > > > > >
> > > > > > > > > Assisted-by: LLM
> > > > > > > > > Closes:
> > > > > > > > > https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
> > > > > > > > > Signed-off-by: Matthew Auld <matthew.auld@intel.com>
> > > > > > > > > Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM
> > > > > > > > > driver for Intel
> > > > > > > > > GPUs")
> > > > > > > > > Cc: Thomas Hellström
> > > > > > > > > <thomas.hellstrom@linux.intel.com>
> > > > > > > > > Cc: Matthew Brost <matthew.brost@intel.com>
> > > > > > > > > Cc: <stable@vger.kernel.org> # v6.12
> > > > > > > > > ---
> > > > > > > > > drivers/gpu/drm/xe/xe_bo.c | 3 +-
> > > > > > > > > drivers/gpu/drm/xe/xe_bo.h | 1 +
> > > > > > > > > drivers/gpu/drm/xe/xe_dma_buf.c | 63
> > > > > > > > > ++++++++++++++++++++++++ +------
> > > > > > > > > --
> > > > > > > > > 3 files changed, 51 insertions(+), 16 deletions(-
> > > > > > > > > )
> > > > > > > > >
> > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_bo.c
> > > > > > > > > b/drivers/gpu/drm/xe/xe_bo.c
> > > > > > > > > index 5065a7bac39c..e63437a261cb 100644
> > > > > > > > > --- a/drivers/gpu/drm/xe/xe_bo.c
> > > > > > > > > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > > > > > > > > @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct
> > > > > > > > > drm_device *dev,
> > > > > > > > > void *data,
> > > > > > > > > * Display scanout is always non-coherent
> > > > > > > > > with the CPU
> > > > > > > > > cache.
> > > > > > > > > */
> > > > > > > > > if (args->flags &
> > > > > > > > > DRM_XE_GEM_CREATE_FLAG_SCANOUT)
> > > > > > > > > - bo_flags |= XE_BO_FLAG_FORCE_WC;
> > > > > > > > > + bo_flags |= XE_BO_FLAG_FORCE_WC |
> > > > > > > > > XE_BO_FLAG_SCANOUT;
> > > > > > > > > if (args->flags &
> > > > > > > > > DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
> > > > > > > > > if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) <
> > > > > > > > > 20))
> > > > > > > > > @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct
> > > > > > > > > drm_file
> > > > > > > > > *file_priv,
> > > > > > > > > DRM_XE_GEM_CPU_CACHING_WC,
> > > > > > > > > XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe))
> > > > > > > > > |
> > > > > > > > > XE_BO_FLAG_FORCE_WC |
> > > > > > > > > + XE_BO_FLAG_SCANOUT |
> > > > > > > > > XE_BO_FLAG_NEEDS_CPU_ACCESS,
> > > > > > > > > NULL);
> > > > > > > > > if (IS_ERR(bo))
> > > > > > > > > return PTR_ERR(bo);
> > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_bo.h
> > > > > > > > > b/drivers/gpu/drm/xe/xe_bo.h
> > > > > > > > > index 1ddf3b6d4a9e..6965c2655731 100644
> > > > > > > > > --- a/drivers/gpu/drm/xe/xe_bo.h
> > > > > > > > > +++ b/drivers/gpu/drm/xe/xe_bo.h
> > > > > > > > > @@ -56,6 +56,7 @@
> > > > > > > > > #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
> > > > > > > > > #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
> > > > > > > > > #define XE_BO_FLAG_NEEDS_1G BIT(27)
> > > > > > > > > +#define XE_BO_FLAG_SCANOUT BIT(28)
> > > > > > > > > /* this one is trigger internally only */
> > > > > > > > > #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
> > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
> > > > > > > > > b/drivers/gpu/drm/xe/xe_dma_buf.c
> > > > > > > > > index b973579a69b8..0a347f09cee4 100644
> > > > > > > > > --- a/drivers/gpu/drm/xe/xe_dma_buf.c
> > > > > > > > > +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
> > > > > > > > > @@ -36,10 +36,40 @@ static void
> > > > > > > > > xe_ddebug_flip_bool(const struct
> > > > > > > > > _ddebug *desc, bool *flag)
> > > > > > > > > #define xe_dma_buf_p2p_debug_flip(flag) do { }
> > > > > > > > > while (0)
> > > > > > > > > #endif
> > > > > > > > > +static void xe_dma_buf_move_notify(struct
> > > > > > > > > dma_buf_attachment
> > > > > > > > > *attach)
> > > > > > > > > +{
> > > > > > > > > + struct drm_gem_object *obj = attach-
> > > > > > > > > >importer_priv;
> > > > > > > > > + struct xe_bo *bo = gem_to_xe_bo(obj);
> > > > > > > > > + struct drm_exec *exec =
> > > > > > > > > XE_VALIDATION_UNSUPPORTED;
> > > > > > > > > +
> > > > > > > > > + XE_WARN_ON(xe_bo_evict(bo, exec));
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > > +static const struct dma_buf_attach_ops
> > > > > > > > > xe_dma_buf_attach_ops = {
> > > > > > > > > + .allow_peer2peer = true,
> > > > > > > > > + .invalidate_mappings = xe_dma_buf_move_notify
> > > > > > > > > +};
> > > > > > > > > +
> > > > > > > > > +static struct pci_dev *xe_find_parent_pci_dev(struct
> > > > > > > > > device *dev)
> > > > > > > > > +{
> > > > > > > > > + while (dev) {
> > > > > > > > > + if (dev_is_pci(dev))
> > > > > > > > > + return to_pci_dev(dev);
> > > > > > > > > + dev = dev->parent;
> > > > > > > > > + }
> > > > > > > > > + return NULL;
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > > +static bool xe_dma_buf_attach_is_xe_device(struct
> > > > > > > > > dma_buf_attachment
> > > > > > > > > *attach)
> > > > > > > > > +{
> > > > > > > > > + return attach->importer_ops ==
> > > > > > > > > &xe_dma_buf_attach_ops;
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > > static int xe_dma_buf_attach(struct dma_buf
> > > > > > > > > *dmabuf,
> > > > > > > > > struct dma_buf_attachment
> > > > > > > > > *attach)
> > > > > > > > > {
> > > > > > > > > struct drm_gem_object *obj = attach->dmabuf-
> > > > > > > > > >priv;
> > > > > > > > > + struct xe_bo *bo = gem_to_xe_bo(obj);
> > > > > > > > > bool verbose_p2p_dist =
> > > > > > > > > drm_debug_enabled(DRM_UT_DRIVER);
> > > > > > > > >
> > > > > > > > > xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
> > > > > > > > > @@ -48,7 +78,24 @@ static int
> > > > > > > > > xe_dma_buf_attach(struct dma_buf
> > > > > > > > > *dmabuf,
> > > > > > > > > pci_p2pdma_distance(to_pci_dev(obj->dev-
> > > > > > > > > >dev), attach-
> > > > > > > > > > dev, verbose_p2p_dist) < 0)
> > > > > > > > > attach->peer2peer = false;
> > > > > > > > > - if (!attach->peer2peer &&
> > > > > > > > > !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
> > > > > > > > > + if (attach->peer2peer && xe_bo_can_migrate(bo,
> > > > > > > > > XE_PL_TT)) {
> > > > > > > > > + struct pci_dev *client =
> > > > > > > > > xe_find_parent_pci_dev(attach->dev);
> > > > > > > > > +
> > > > > > > > > + /*
> > > > > > > > > + * There are perf issues with using p2p with
> > > > > > > > > display
> > > > > > > > > buffers,
> > > > > > > > > + * like with igpu (compositor) <-> dgpu
> > > > > > > > > (exported
> > > > > > > > > p2p window
> > > > > > > > > + * buffer). Probably we need some actual
> > > > > > > > > userspace
> > > > > > > > > hints. We
> > > > > > > > > + * shouldn't really assume anything. Also,
> > > > > > > > > note that
> > > > > > > > > some of
> > > > > > > > > + * these buffers are not always tagged with
> > > > > > > > > SCANOUT.
> > > > > > > > > + */
> > > > > > > > > + if (bo->flags & XE_BO_FLAG_SCANOUT)
> > > > > > > > > + attach->peer2peer = false;
> > > > > > > > > + else if (client && pci_is_display(client) &&
> > > > > > > > > +
> > > > > > > > > !xe_dma_buf_attach_is_xe_device(attach))
> > > > > > > > > + attach->peer2peer = false;
> > > > > > > > > + }
> > > > > > > > > +
> > > > > > > > > + if (!attach->peer2peer && !xe_bo_can_migrate(bo,
> > > > > > > > > XE_PL_TT))
> > > > > > > > > return -EOPNOTSUPP;
> > > > > > > > > xe_pm_runtime_get(to_xe_device(obj->dev));
> > > > > > > > > @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct
> > > > > > > > > drm_device *dev,
> > > > > > > > > struct dma_buf *dma_buf)
> > > > > > > > > return ret ? ERR_PTR(ret) : &bo->ttm.base;
> > > > > > > > > }
> > > > > > > > > -static void xe_dma_buf_move_notify(struct
> > > > > > > > > dma_buf_attachment
> > > > > > > > > *attach)
> > > > > > > > > -{
> > > > > > > > > - struct drm_gem_object *obj = attach-
> > > > > > > > > >importer_priv;
> > > > > > > > > - struct xe_bo *bo = gem_to_xe_bo(obj);
> > > > > > > > > - struct drm_exec *exec =
> > > > > > > > > XE_VALIDATION_UNSUPPORTED;
> > > > > > > > > -
> > > > > > > > > - XE_WARN_ON(xe_bo_evict(bo, exec));
> > > > > > > > > -}
> > > > > > > > > -
> > > > > > > > > -static const struct dma_buf_attach_ops
> > > > > > > > > xe_dma_buf_attach_ops = {
> > > > > > > > > - .allow_peer2peer = true,
> > > > > > > > > - .invalidate_mappings = xe_dma_buf_move_notify
> > > > > > > > > -};
> > > > > > > > > -
> > > > > > > > > #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
> > > > > > > > > struct dma_buf_test_params {
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-09 13:02 ` Matthew Auld
@ 2026-10-13 8:51 ` Matthew Auld
2026-10-13 9:10 ` Christian König
0 siblings, 1 reply; 30+ messages in thread
From: Matthew Auld @ 2026-10-13 8:51 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 09/10/2026 14:02, Matthew Auld wrote:
> On 09/10/2026 12:38, Christian König wrote:
>> On 10/9/26 12:29, Matthew Auld wrote:
>>> On 09/10/2026 10:26, Christian König wrote:
>>>> On 10/9/26 11:16, Matthew Auld wrote:
>>>>> On 08/10/2026 12:17, Matthew Auld wrote:
>>>>>> On 08/10/2026 10:55, Christian König wrote:
>>>>>>> On 10/8/26 11:46, Matthew Auld wrote:
>>>>>>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>>>>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
>>>>>>>>>> If p2p is allowed on the CPU (like on AMD), we currently
>>>>>>>>>> permit p2p
>>>>>>>>>> for
>>>>>>>>>> all exported VRAM buffers. However, in some multi-GPU setups,
>>>>>>>>>> like
>>>>>>>>>> with
>>>>>>>>>> prime rendering on a dgpu and scanout/compositor using the
>>>>>>>>>> igpu, it
>>>>>>>>>> looks like the exported dma-buf window buffer can in some
>>>>>>>>>> cases end
>>>>>>>>>> up
>>>>>>>>>> using p2p.
>>>>>>>>>>
>>>>>>>>>> However, user is reporting a kernel regression where
>>>>>>>>>> performance here
>>>>>>>>>> massively tanks across many games/workloads, where it looks
>>>>>>>>>> like on
>>>>>>>>>> each
>>>>>>>>>> frame, the igpu is reading/sampling from VRAM over pcie for the
>>>>>>>>>> window
>>>>>>>>>> buffer, since it uses p2p. p2p is currently more intended for
>>>>>>>>>> dgpu <-
>>>>>>>>>>>
>>>>>>>>>> dgpu, and not so much display buffers with igpu <-> dgpu, at
>>>>>>>>>> least
>>>>>>>>>> for
>>>>>>>>>> now.
>>>>>>>>>>
>>>>>>>>>> We don't currently have any hints to say "please use p2p for this
>>>>>>>>>> buffer, or please don't", however we can use some heuristics
>>>>>>>>>> to try
>>>>>>>>>> to
>>>>>>>>>> determine if this is likely a display buffer being exported to an
>>>>>>>>>> igpu,
>>>>>>>>>> which probably never intended for p2p:
>>>>>>>>>>
>>>>>>>>>> 1. FLAG_SCANOUT being set on the buffer. Window buffers
>>>>>>>>>> usually get
>>>>>>>>>> tagged with this, but not always.
>>>>>>>>>>
>>>>>>>>>> 2. Importer being a PCI device with display, which is not
>>>>>>>>>> xe driver.
>>>>>>>>>>
>>>>>>>>>> We also rely on the existing p2p Intel CPU whitelist to stop this
>>>>>>>>>> happening on xe igpu. Currently p2p is only enabled for server
>>>>>>>>>> CPUs,
>>>>>>>>>> on
>>>>>>>>>> Intel. We also limit the above to dual placement buffers.
>>>>>>>>>>
>>>>>>>>>> The original regression was bisected to commit 609fc8766d68
>>>>>>>>>> ("dma-
>>>>>>>>>> buf:
>>>>>>>>>> Always build with DMABUF_MOVE_NOTIFY"), however the behaviour was
>>>>>>>>>> already present when enabling that knob, so this goes back even
>>>>>>>>>> further.
>>>>>>>>>>
>>>>>>>>>> User has confirmed that along with the sticky dma-buf TT
>>>>>>>>>> placement
>>>>>>>>>> fix,
>>>>>>>>>> to prevent ping-ponging, the performance is back to normal.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Actually, I think this needs to be fixed on the importer side.
>>>>>>>>> Until we
>>>>>>>>> have some some user-space hints, I don't think the exporter should
>>>>>>>>> second-guess. Most sane solution IMO is if igfx importers could
>>>>>>>>> just
>>>>>>>>> not advertise pcie p2p support?
>>>>>>>>
>>>>>>>> Yeah, not sure tbh. I'm not a huge fan of this patch either. But
>>>>>>>> you could argue that the SCANOUT flag is already a good implicit
>>>>>>>> hint/ signal on the exporter side, but unfortunately there were
>>>>>>>> some games where this did not reliably work. The other implicit
>>>>>>>> hint/signal is perhaps the dual placement angle. For example, in
>>>>>>>> compute-runtime, it might be that they use VRAM-only if they
>>>>>>>> want p2p? AFAICT mesa for us always uses a dual placement or
>>>>>>>> just system memory for these types of buffers.
>>>>>>>>
>>>>>>>> Christian, do you have any thoughts here? We have a kernel perf
>>>>>>>> regression after DMABUF_MOVE_NOTIFY was made the default after
>>>>>>>> updating to a new kernel. The gist is that this then turned on
>>>>>>>> the p2p paths, with a multi-GPU setup with an AMD igpu/APU and
>>>>>>>> Xe dgpu doing prime rendering. From the user bug report it
>>>>>>>> sounds like the dgpu linear window buffer exported to the
>>>>>>>> compositor (igpu) is dual placement VRAM + TT, and so this now
>>>>>>>> attempts to keep that memory in VRAM instead of moving it.
>>>>>>>> Compositor then uses p2p to access it. It works but performance
>>>>>>>> falls off a massive cliff here.
>>>>>>>>
>>>>>>>> Perhaps Intel Mesa side should use tt-only for this type buffer
>>>>>>>> (?), but since this is a kernel regression I was hoping we could
>>>>>>>> fix this on the kernel side.
>>>>>>>>
>>>>>>>> Some questions:
>>>>>>>>
>>>>>>>> 1. Do you know what is the general story with p2p between igpu
>>>>>>>> and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p
>>>>>>>> can't be dropped? It clearly seems to work though.
>>>>>>>>
>>>>>>>> 2. If this is legit, do you guys then also prevent p2p with
>>>>>>>> display buffers? Are you just doing that at the Mesa level, or
>>>>>>>> is there some magic in the kernel also?
>>>>>>>
>>>>>>> If I understand that correctly that the igpu is the importer and
>>>>>>> the dgpu is the exporter then yeah Thomas is right that
>>>>>>> definately needs to be fixed on the importer side.
>>>>>>
>>>>>> Ideas on how do that? Could we do something like allow_peer2peer =
>>>>>> false in amdgpu_gem_prime_import() if this is an APU device, or
>>>>>> further check if the exporter side is not amdgpu, like APU + Xe?
>>>>>
>>>>> For example: https://gitlab.freedesktop.org/mwa/kernel/-/
>>>>> commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
>>>>>
>>>>> Is that something you would accept?
>>>>
>>>> No, you misunderstood me. Enabling P2P is perfectly fine for APUs
>>>> and mandatory for a couple of customer projects.
>>>>
>>>> The buffer should just be rejected from scanout in the display code
>>>> and on the AMDGPU side we already do that if I'm not completely
>>>> mistaken.
>>>
>>> Reporter confirmed seeing the issue in windowed mode also. So I don't
>>> think it's just a case of rejecting from scanout?
>>
>> Then I don't understand what the problem is.
>>
>> When the dGPU renders and the iGPU displays you have only two
>> possibilities, either the dGPU pushes the frames over the bus or the
>> iGPU pulls the frames over the bus. Both should be equaly slow or
>> fast, so what exactly is the expectation here?
>
> I assume the AMD APU/iGPU is sampling/reading from the p2p window buffer
> every frame.
>
> Expectation is that buffer rather gets moved from VRAM to system memory
> when mapping the buffer with dma-buf, where it stays, and never
> negotiated to use p2p in the first place. I don't think p2p is really
> valid here.
>
> What happened is that user updated their kernel and due to the
> MOVE_NOTIFY config getting removed and enabled by default on newer
> kernels this suddenly started negotiating p2p for things like the window
> buffer AFAICT, instead of moving it to system memory and keeping it
> there. On previous kernel versions the buffer would just get moved and
> pinned in system memory. From user pov this is a kernel regression,
> given the perf they are now getting.
>
> On AMD CPUs you allow p2p for everything. On Intel iGPUs we currently
> ban p2p. Maybe there is bigger question here for what is the story for
> p2p and iGPU? Should it really be blanket allowed like this? Should it
> not be opt-in with some userspace hints or something?
>
> The other important part is that even when you move to system memory,
> it's no longer pinned (MOVE_NOTIFY) so can you now can also get violent
> ping-ponging, which is addressed in the first patch in this series.
>
>>
>> The only thing you need to avoid is that the iGPU starts to scan out
>> over the PCIe bus directly, cause then the frame is pulled over the
>> bus multiple times (if that actually works correctly).
>>
>> Do you have a link to the original bug report? I was only added later
>> to the discussion so I don't have that.
>
> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
Christian, did you get a chance to look at this? Any further thoughts?
>
>>
>> Regards,
>> Christian.
>>
>>>
>>>>
>>>> Userspace has fallback path that when a DRM atomic requests fails
>>>> for an imported buffer it falls back to copying the buffer first.
>>>>
>>>> Regards,
>>>> Christian.
>>>>>>
>>>>>>>
>>>>>>> At least for AMD APUs we clearly support P2P both as exporter and
>>>>>>> importer, but what isn't supported is to scan out over P2P. We
>>>>>>> explicitely reject that inside DC/DAL.
>>>>>>>
>>>>>>> And I'm pretty sure that you should do that as well. I'm actually
>>>>>>> really suprised that this works technically and doesn't cause
>>>>>>> corruption or anything.
>>>>>>
>>>>>> AFAICT on Intel iGPUs it will currently always end up with
>>>>>> peer2peer = false on attach. Not 100% sure if direct scanout was
>>>>>> happening on the p2p buffer itself, for the user report.
>>>>>>
>>>>>>>
>>>>>>> Regards,
>>>>>>> Christian.
>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Thomas
>>>>>>>>>
>>>>>>>>>> Assisted-by: LLM
>>>>>>>>>> Closes:
>>>>>>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>>>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>>>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for
>>>>>>>>>> Intel
>>>>>>>>>> GPUs")
>>>>>>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>>>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>>>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>>>>>>> ---
>>>>>>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>>>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>>>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++
>>>>>>>>>> ++++ +------
>>>>>>>>>> --
>>>>>>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>>>>>>
>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/
>>>>>>>>>> xe_bo.c
>>>>>>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct
>>>>>>>>>> drm_device *dev,
>>>>>>>>>> void *data,
>>>>>>>>>> * Display scanout is always non-coherent with the CPU
>>>>>>>>>> cache.
>>>>>>>>>> */
>>>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>>>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>>>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>>>>>>> XE_BO_FLAG_SCANOUT;
>>>>>>>>>> if (args->flags &
>>>>>>>>>> DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>>>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>>>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>>>>>>> *file_priv,
>>>>>>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>>>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>>>>>>> XE_BO_FLAG_FORCE_WC |
>>>>>>>>>> + XE_BO_FLAG_SCANOUT |
>>>>>>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>>>>>>> if (IS_ERR(bo))
>>>>>>>>>> return PTR_ERR(bo);
>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/
>>>>>>>>>> xe_bo.h
>>>>>>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>>> @@ -56,6 +56,7 @@
>>>>>>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>>>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>>>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>>>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>>>>>>> /* this one is trigger internally only */
>>>>>>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>>>>>>> _ddebug *desc, bool *flag)
>>>>>>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>>>>>>> #endif
>>>>>>>>>> +static void xe_dma_buf_move_notify(struct
>>>>>>>>>> dma_buf_attachment
>>>>>>>>>> *attach)
>>>>>>>>>> +{
>>>>>>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>>> +
>>>>>>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>>> +}
>>>>>>>>>> +
>>>>>>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>>> + .allow_peer2peer = true,
>>>>>>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>>> +};
>>>>>>>>>> +
>>>>>>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device
>>>>>>>>>> *dev)
>>>>>>>>>> +{
>>>>>>>>>> + while (dev) {
>>>>>>>>>> + if (dev_is_pci(dev))
>>>>>>>>>> + return to_pci_dev(dev);
>>>>>>>>>> + dev = dev->parent;
>>>>>>>>>> + }
>>>>>>>>>> + return NULL;
>>>>>>>>>> +}
>>>>>>>>>> +
>>>>>>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct
>>>>>>>>>> dma_buf_attachment
>>>>>>>>>> *attach)
>>>>>>>>>> +{
>>>>>>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>>>>>>> +}
>>>>>>>>>> +
>>>>>>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>>>>>>> struct dma_buf_attachment *attach)
>>>>>>>>>> {
>>>>>>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>> bool verbose_p2p_dist =
>>>>>>>>>> drm_debug_enabled(DRM_UT_DRIVER);
>>>>>>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>>>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>>>>>>> *dmabuf,
>>>>>>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev),
>>>>>>>>>> attach-
>>>>>>>>>>> dev, verbose_p2p_dist) < 0)
>>>>>>>>>> attach->peer2peer = false;
>>>>>>>>>> - if (!attach->peer2peer &&
>>>>>>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>>>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>>>>>>> + struct pci_dev *client =
>>>>>>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>>>>>>> +
>>>>>>>>>> + /*
>>>>>>>>>> + * There are perf issues with using p2p with display
>>>>>>>>>> buffers,
>>>>>>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>>>>>>> p2p window
>>>>>>>>>> + * buffer). Probably we need some actual userspace
>>>>>>>>>> hints. We
>>>>>>>>>> + * shouldn't really assume anything. Also, note that
>>>>>>>>>> some of
>>>>>>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>>>>>>> + */
>>>>>>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>>> + else if (client && pci_is_display(client) &&
>>>>>>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>>> + }
>>>>>>>>>> +
>>>>>>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>>>>>>> return -EOPNOTSUPP;
>>>>>>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>>>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device
>>>>>>>>>> *dev,
>>>>>>>>>> struct dma_buf *dma_buf)
>>>>>>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>>>>>>> }
>>>>>>>>>> -static void xe_dma_buf_move_notify(struct
>>>>>>>>>> dma_buf_attachment
>>>>>>>>>> *attach)
>>>>>>>>>> -{
>>>>>>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>>> -
>>>>>>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>>> -}
>>>>>>>>>> -
>>>>>>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>>> - .allow_peer2peer = true,
>>>>>>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>>> -};
>>>>>>>>>> -
>>>>>>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>>>>>>> struct dma_buf_test_params {
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 8:51 ` Matthew Auld
@ 2026-10-13 9:10 ` Christian König
2026-10-13 9:18 ` Thomas Hellström
2026-10-13 9:40 ` Matthew Auld
0 siblings, 2 replies; 30+ messages in thread
From: Christian König @ 2026-10-13 9:10 UTC (permalink / raw)
To: Matthew Auld, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 10/13/26 10:51, Matthew Auld wrote:
> On 09/10/2026 14:02, Matthew Auld wrote:
>> On 09/10/2026 12:38, Christian König wrote:
>>> On 10/9/26 12:29, Matthew Auld wrote:
>>>> On 09/10/2026 10:26, Christian König wrote:
>>>>> On 10/9/26 11:16, Matthew Auld wrote:
>>>>>> On 08/10/2026 12:17, Matthew Auld wrote:
>>>>>>> On 08/10/2026 10:55, Christian König wrote:
>>>>>>>> On 10/8/26 11:46, Matthew Auld wrote:
>>>>>>>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>>>>>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
....
>>>>>>>>> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>>>>>>>>>
>>>>>>>>> Some questions:
>>>>>>>>>
>>>>>>>>> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>>>>>>>>>
>>>>>>>>> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
>>>>>>>>
>>>>>>>> If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
>>>>>>>
>>>>>>> Ideas on how do that? Could we do something like allow_peer2peer = false in amdgpu_gem_prime_import() if this is an APU device, or further check if the exporter side is not amdgpu, like APU + Xe?
>>>>>>
>>>>>> For example: https://gitlab.freedesktop.org/mwa/kernel/-/ commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
>>>>>>
>>>>>> Is that something you would accept?
>>>>>
>>>>> No, you misunderstood me. Enabling P2P is perfectly fine for APUs and mandatory for a couple of customer projects.
>>>>>
>>>>> The buffer should just be rejected from scanout in the display code and on the AMDGPU side we already do that if I'm not completely mistaken.
>>>>
>>>> Reporter confirmed seeing the issue in windowed mode also. So I don't think it's just a case of rejecting from scanout?
>>>
>>> Then I don't understand what the problem is.
>>>
>>> When the dGPU renders and the iGPU displays you have only two possibilities, either the dGPU pushes the frames over the bus or the iGPU pulls the frames over the bus. Both should be equaly slow or fast, so what exactly is the expectation here?
>>
>> I assume the AMD APU/iGPU is sampling/reading from the p2p window buffer every frame.
That is not possible. The HW can't do this and because of this we should have a check for that in the DAL/DC code.
It could be that this check doesn't work and because of low resolution and/or not busy PCIe it somehow works, but that would then clearly not be intended behavior.
What could also be is that the frame is pulled over the PCIe bus using the SDMA multiple times, but that would then be a bug in userspace somewhere.
>> Expectation is that buffer rather gets moved from VRAM to system memory when mapping the buffer with dma-buf, where it stays, and never negotiated to use p2p in the first place. I don't think p2p is really valid here.
No, that is incorrect. When P2P is available it should be used, it's just that AMDs APUs can't scanout over P2P.
>> What happened is that user updated their kernel and due to the MOVE_NOTIFY config getting removed and enabled by default on newer kernels this suddenly started negotiating p2p for things like the window buffer AFAICT, instead of moving it to system memory and keeping it there. On previous kernel versions the buffer would just get moved and pinned in system memory. From user pov this is a kernel regression, given the perf they are now getting.
>>
>> On AMD CPUs you allow p2p for everything. On Intel iGPUs we currently ban p2p. Maybe there is bigger question here for what is the story for p2p and iGPU? Should it really be blanket allowed like this? Should it not be opt-in with some userspace hints or something?
Again no, P2P is mandatory for APUs. We have basically tons of customers using that with AMD dGPU and AMD iGPU and that works fine.
>>
>> The other important part is that even when you move to system memory, it's no longer pinned (MOVE_NOTIFY) so can you now can also get violent ping-ponging, which is addressed in the first patch in this series.
Yeah that is something which we have seen before as well. That should definately be prevented by the kernel.
Does that patch help with the performance?
>>
>>>
>>> The only thing you need to avoid is that the iGPU starts to scan out over the PCIe bus directly, cause then the frame is pulled over the bus multiple times (if that actually works correctly).
>>>
>>> Do you have a link to the original bug report? I was only added later to the discussion so I don't have that.
>>
>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>
> Christian, did you get a chance to look at this? Any further thoughts?
Sorry for the delay, I'm quite busy at the moment with AMD internal things and preparing a presentation for FOSDEM.
Regards,
Christian.
>
>>
>>>
>>> Regards,
>>> Christian.
>>>
>>>>
>>>>>
>>>>> Userspace has fallback path that when a DRM atomic requests fails for an imported buffer it falls back to copying the buffer first.
>>>>>
>>>>> Regards,
>>>>> Christian.
>>>>>>>
>>>>>>>>
>>>>>>>> At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
>>>>>>>>
>>>>>>>> And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
>>>>>>>
>>>>>>> AFAICT on Intel iGPUs it will currently always end up with peer2peer = false on attach. Not 100% sure if direct scanout was happening on the p2p buffer itself, for the user report.
>>>>>>>
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Christian.
>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Thomas
>>>>>>>>>>
>>>>>>>>>>> Assisted-by: LLM
>>>>>>>>>>> Closes:
>>>>>>>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>>>>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>>>>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>>>>>>>>> GPUs")
>>>>>>>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>>>>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>>>>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>>>>>>>> ---
>>>>>>>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>>>>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>>>>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++ ++++ +------
>>>>>>>>>>> --
>>>>>>>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>>>>>>>
>>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/ xe_bo.c
>>>>>>>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>>>>>>>>> void *data,
>>>>>>>>>>> * Display scanout is always non-coherent with the CPU
>>>>>>>>>>> cache.
>>>>>>>>>>> */
>>>>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>>>>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>>>>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>>>>>>>> XE_BO_FLAG_SCANOUT;
>>>>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>>>>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>>>>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>>>>>>>> *file_priv,
>>>>>>>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>>>>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>>>>>>>> XE_BO_FLAG_FORCE_WC |
>>>>>>>>>>> + XE_BO_FLAG_SCANOUT |
>>>>>>>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>>>>>>>> if (IS_ERR(bo))
>>>>>>>>>>> return PTR_ERR(bo);
>>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/ xe_bo.h
>>>>>>>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>>>> @@ -56,6 +56,7 @@
>>>>>>>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>>>>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>>>>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>>>>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>>>>>>>> /* this one is trigger internally only */
>>>>>>>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>>>>>>>> _ddebug *desc, bool *flag)
>>>>>>>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>>>>>>>> #endif
>>>>>>>>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>>>>> *attach)
>>>>>>>>>>> +{
>>>>>>>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>>>> +
>>>>>>>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>>>> +}
>>>>>>>>>>> +
>>>>>>>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>>>> + .allow_peer2peer = true,
>>>>>>>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>>>> +};
>>>>>>>>>>> +
>>>>>>>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>>>>>>>>> +{
>>>>>>>>>>> + while (dev) {
>>>>>>>>>>> + if (dev_is_pci(dev))
>>>>>>>>>>> + return to_pci_dev(dev);
>>>>>>>>>>> + dev = dev->parent;
>>>>>>>>>>> + }
>>>>>>>>>>> + return NULL;
>>>>>>>>>>> +}
>>>>>>>>>>> +
>>>>>>>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>>>>>>>>> *attach)
>>>>>>>>>>> +{
>>>>>>>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>>>>>>>> +}
>>>>>>>>>>> +
>>>>>>>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>>>>>>>> struct dma_buf_attachment *attach)
>>>>>>>>>>> {
>>>>>>>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>>>>>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>>>>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>>>>>>>> *dmabuf,
>>>>>>>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>>>>>>>>> dev, verbose_p2p_dist) < 0)
>>>>>>>>>>> attach->peer2peer = false;
>>>>>>>>>>> - if (!attach->peer2peer &&
>>>>>>>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>>>>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>>>>>>>> + struct pci_dev *client =
>>>>>>>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>>>>>>>> +
>>>>>>>>>>> + /*
>>>>>>>>>>> + * There are perf issues with using p2p with display
>>>>>>>>>>> buffers,
>>>>>>>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>>>>>>>> p2p window
>>>>>>>>>>> + * buffer). Probably we need some actual userspace
>>>>>>>>>>> hints. We
>>>>>>>>>>> + * shouldn't really assume anything. Also, note that
>>>>>>>>>>> some of
>>>>>>>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>>>>>>>> + */
>>>>>>>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>>>> + else if (client && pci_is_display(client) &&
>>>>>>>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>>>> + }
>>>>>>>>>>> +
>>>>>>>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>>>>>>>> return -EOPNOTSUPP;
>>>>>>>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>>>>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>>>>>>>>> struct dma_buf *dma_buf)
>>>>>>>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>>>>>>>> }
>>>>>>>>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>>>>> *attach)
>>>>>>>>>>> -{
>>>>>>>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>>>> -
>>>>>>>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>>>> -}
>>>>>>>>>>> -
>>>>>>>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>>>> - .allow_peer2peer = true,
>>>>>>>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>>>> -};
>>>>>>>>>>> -
>>>>>>>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>>>>>>>> struct dma_buf_test_params {
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 9:10 ` Christian König
@ 2026-10-13 9:18 ` Thomas Hellström
2026-10-13 9:55 ` Christian König
2026-10-13 9:40 ` Matthew Auld
1 sibling, 1 reply; 30+ messages in thread
From: Thomas Hellström @ 2026-10-13 9:18 UTC (permalink / raw)
To: Christian König, Matthew Auld, intel-xe
Cc: Matthew Brost, stable, Christian König
On Tue, 2026-10-13 at 11:10 +0200, Christian König wrote:
> On 10/13/26 10:51, Matthew Auld wrote:
> > On 09/10/2026 14:02, Matthew Auld wrote:
> > > On 09/10/2026 12:38, Christian König wrote:
> > > > On 10/9/26 12:29, Matthew Auld wrote:
> > > > > On 09/10/2026 10:26, Christian König wrote:
> > > > > > On 10/9/26 11:16, Matthew Auld wrote:
> > > > > > > On 08/10/2026 12:17, Matthew Auld wrote:
> > > > > > > > On 08/10/2026 10:55, Christian König wrote:
> > > > > > > > > On 10/8/26 11:46, Matthew Auld wrote:
> > > > > > > > > > On 07/10/2026 19:11, Thomas Hellström wrote:
> > > > > > > > > > > On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld
> > > > > > > > > > > wrote:
> ....
> > > > > > > > > > Perhaps Intel Mesa side should use tt-only for this
> > > > > > > > > > type buffer (?), but since this is a kernel
> > > > > > > > > > regression I was hoping we could fix this on the
> > > > > > > > > > kernel side.
> > > > > > > > > >
> > > > > > > > > > Some questions:
> > > > > > > > > >
> > > > > > > > > > 1. Do you know what is the general story with p2p
> > > > > > > > > > between igpu and dgpu? Is this a legit thing? For
> > > > > > > > > > igpus/APUs, advertising p2p can't be dropped? It
> > > > > > > > > > clearly seems to work though.
> > > > > > > > > >
> > > > > > > > > > 2. If this is legit, do you guys then also prevent
> > > > > > > > > > p2p with display buffers? Are you just doing that
> > > > > > > > > > at the Mesa level, or is there some magic in the
> > > > > > > > > > kernel also?
> > > > > > > > >
> > > > > > > > > If I understand that correctly that the igpu is the
> > > > > > > > > importer and the dgpu is the exporter then yeah
> > > > > > > > > Thomas is right that definately needs to be fixed on
> > > > > > > > > the importer side.
> > > > > > > >
> > > > > > > > Ideas on how do that? Could we do something like
> > > > > > > > allow_peer2peer = false in amdgpu_gem_prime_import() if
> > > > > > > > this is an APU device, or further check if the exporter
> > > > > > > > side is not amdgpu, like APU + Xe?
> > > > > > >
> > > > > > > For example:
> > > > > > > https://gitlab.freedesktop.org/mwa/kernel/-/ commit/7ec86
> > > > > > > c68b42655b4bb85ee90af434a617e7bec8c
> > > > > > >
> > > > > > > Is that something you would accept?
> > > > > >
> > > > > > No, you misunderstood me. Enabling P2P is perfectly fine
> > > > > > for APUs and mandatory for a couple of customer projects.
> > > > > >
> > > > > > The buffer should just be rejected from scanout in the
> > > > > > display code and on the AMDGPU side we already do that if
> > > > > > I'm not completely mistaken.
> > > > >
> > > > > Reporter confirmed seeing the issue in windowed mode also. So
> > > > > I don't think it's just a case of rejecting from scanout?
> > > >
> > > > Then I don't understand what the problem is.
> > > >
> > > > When the dGPU renders and the iGPU displays you have only two
> > > > possibilities, either the dGPU pushes the frames over the bus
> > > > or the iGPU pulls the frames over the bus. Both should be
> > > > equaly slow or fast, so what exactly is the expectation here?
> > >
> > > I assume the AMD APU/iGPU is sampling/reading from the p2p window
> > > buffer every frame.
>
> That is not possible. The HW can't do this and because of this we
> should have a check for that in the DAL/DC code.
>
Couldn't the issue be that the compositor, running on the amd iGPU
blits from the dma-buf rather than scans out from it? And the scanout
is not the shared buffer at all?
/Thomas
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 9:10 ` Christian König
2026-10-13 9:18 ` Thomas Hellström
@ 2026-10-13 9:40 ` Matthew Auld
2026-10-13 11:50 ` Christian König
1 sibling, 1 reply; 30+ messages in thread
From: Matthew Auld @ 2026-10-13 9:40 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 13/10/2026 10:10, Christian König wrote:
> On 10/13/26 10:51, Matthew Auld wrote:
>> On 09/10/2026 14:02, Matthew Auld wrote:
>>> On 09/10/2026 12:38, Christian König wrote:
>>>> On 10/9/26 12:29, Matthew Auld wrote:
>>>>> On 09/10/2026 10:26, Christian König wrote:
>>>>>> On 10/9/26 11:16, Matthew Auld wrote:
>>>>>>> On 08/10/2026 12:17, Matthew Auld wrote:
>>>>>>>> On 08/10/2026 10:55, Christian König wrote:
>>>>>>>>> On 10/8/26 11:46, Matthew Auld wrote:
>>>>>>>>>> On 07/10/2026 19:11, Thomas Hellström wrote:
>>>>>>>>>>> On Wed, 2026-10-07 at 16:36 +0100, Matthew Auld wrote:
> ....
>>>>>>>>>> Perhaps Intel Mesa side should use tt-only for this type buffer (?), but since this is a kernel regression I was hoping we could fix this on the kernel side.
>>>>>>>>>>
>>>>>>>>>> Some questions:
>>>>>>>>>>
>>>>>>>>>> 1. Do you know what is the general story with p2p between igpu and dgpu? Is this a legit thing? For igpus/APUs, advertising p2p can't be dropped? It clearly seems to work though.
>>>>>>>>>>
>>>>>>>>>> 2. If this is legit, do you guys then also prevent p2p with display buffers? Are you just doing that at the Mesa level, or is there some magic in the kernel also?
>>>>>>>>>
>>>>>>>>> If I understand that correctly that the igpu is the importer and the dgpu is the exporter then yeah Thomas is right that definately needs to be fixed on the importer side.
>>>>>>>>
>>>>>>>> Ideas on how do that? Could we do something like allow_peer2peer = false in amdgpu_gem_prime_import() if this is an APU device, or further check if the exporter side is not amdgpu, like APU + Xe?
>>>>>>>
>>>>>>> For example: https://gitlab.freedesktop.org/mwa/kernel/-/ commit/7ec86c68b42655b4bb85ee90af434a617e7bec8c
>>>>>>>
>>>>>>> Is that something you would accept?
>>>>>>
>>>>>> No, you misunderstood me. Enabling P2P is perfectly fine for APUs and mandatory for a couple of customer projects.
>>>>>>
>>>>>> The buffer should just be rejected from scanout in the display code and on the AMDGPU side we already do that if I'm not completely mistaken.
>>>>>
>>>>> Reporter confirmed seeing the issue in windowed mode also. So I don't think it's just a case of rejecting from scanout?
>>>>
>>>> Then I don't understand what the problem is.
>>>>
>>>> When the dGPU renders and the iGPU displays you have only two possibilities, either the dGPU pushes the frames over the bus or the iGPU pulls the frames over the bus. Both should be equaly slow or fast, so what exactly is the expectation here?
>>>
>>> I assume the AMD APU/iGPU is sampling/reading from the p2p window buffer every frame.
>
> That is not possible. The HW can't do this and because of this we should have a check for that in the DAL/DC code.
Yeah, I don't doubt it, but this was also without full-screen, so
scanout buffer will be native on amdgpu AFAIK. I assume here mutter or
so samples the window/texture from a shader over pcie.
>
> It could be that this check doesn't work and because of low resolution and/or not busy PCIe it somehow works, but that would then clearly not be intended behavior.
>
> What could also be is that the frame is pulled over the PCIe bus using the SDMA multiple times, but that would then be a bug in userspace somewhere.
>
>>> Expectation is that buffer rather gets moved from VRAM to system memory when mapping the buffer with dma-buf, where it stays, and never negotiated to use p2p in the first place. I don't think p2p is really valid here.
>
> No, that is incorrect. When P2P is available it should be used, it's just that AMDs APUs can't scanout over P2P.
>
>>> What happened is that user updated their kernel and due to the MOVE_NOTIFY config getting removed and enabled by default on newer kernels this suddenly started negotiating p2p for things like the window buffer AFAICT, instead of moving it to system memory and keeping it there. On previous kernel versions the buffer would just get moved and pinned in system memory. From user pov this is a kernel regression, given the perf they are now getting.
>>>
>>> On AMD CPUs you allow p2p for everything. On Intel iGPUs we currently ban p2p. Maybe there is bigger question here for what is the story for p2p and iGPU? Should it really be blanket allowed like this? Should it not be opt-in with some userspace hints or something?
>
> Again no, P2P is mandatory for APUs. We have basically tons of customers using that with AMD dGPU and AMD iGPU and that works fine.
>
>>>
>>> The other important part is that even when you move to system memory, it's no longer pinned (MOVE_NOTIFY) so can you now can also get violent ping-ponging, which is addressed in the first patch in this series.
>
> Yeah that is something which we have seen before as well. That should definately be prevented by the kernel.
>
> Does that patch help with the performance?
Mostly it's p2p that is the big killer. Series gives much as 10x FPS
jump, if we stop negotiating p2p for the window buffer and prevent
ping-ponging.
For example, in GravityMark, we go from ~18 FPS -> ~180 FPS, which
matches the previous performance the user was getting. The ping-ponging
hurts, but from the reports it looked like it was only in some games and
not as severe as p2p. User confirmed this with CONFIG_PCI_P2PDMA=n, and
that fixed most of the workloads. Adding the ping-pong fix then fixes
everything.
>
>>>
>>>>
>>>> The only thing you need to avoid is that the iGPU starts to scan out over the PCIe bus directly, cause then the frame is pulled over the bus multiple times (if that actually works correctly).
>>>>
>>>> Do you have a link to the original bug report? I was only added later to the discussion so I don't have that.
>>>
>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>
>> Christian, did you get a chance to look at this? Any further thoughts?
>
> Sorry for the delay, I'm quite busy at the moment with AMD internal things and preparing a presentation for FOSDEM.
No worries.
>
> Regards,
> Christian.
>
>>
>>>
>>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>>
>>>>>>
>>>>>> Userspace has fallback path that when a DRM atomic requests fails for an imported buffer it falls back to copying the buffer first.
>>>>>>
>>>>>> Regards,
>>>>>> Christian.
>>>>>>>>
>>>>>>>>>
>>>>>>>>> At least for AMD APUs we clearly support P2P both as exporter and importer, but what isn't supported is to scan out over P2P. We explicitely reject that inside DC/DAL.
>>>>>>>>>
>>>>>>>>> And I'm pretty sure that you should do that as well. I'm actually really suprised that this works technically and doesn't cause corruption or anything.
>>>>>>>>
>>>>>>>> AFAICT on Intel iGPUs it will currently always end up with peer2peer = false on attach. Not 100% sure if direct scanout was happening on the p2p buffer itself, for the user report.
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Christian.
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Thomas
>>>>>>>>>>>
>>>>>>>>>>>> Assisted-by: LLM
>>>>>>>>>>>> Closes:
>>>>>>>>>>>> https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/9415
>>>>>>>>>>>> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
>>>>>>>>>>>> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel
>>>>>>>>>>>> GPUs")
>>>>>>>>>>>> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>>>>>>>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>>>>>>>>> Cc: <stable@vger.kernel.org> # v6.12
>>>>>>>>>>>> ---
>>>>>>>>>>>> drivers/gpu/drm/xe/xe_bo.c | 3 +-
>>>>>>>>>>>> drivers/gpu/drm/xe/xe_bo.h | 1 +
>>>>>>>>>>>> drivers/gpu/drm/xe/xe_dma_buf.c | 63 ++++++++++++++++++++ ++++ +------
>>>>>>>>>>>> --
>>>>>>>>>>>> 3 files changed, 51 insertions(+), 16 deletions(-)
>>>>>>>>>>>>
>>>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/ xe_bo.c
>>>>>>>>>>>> index 5065a7bac39c..e63437a261cb 100644
>>>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>>>>>>>>> @@ -3658,7 +3658,7 @@ int xe_gem_create_ioctl(struct drm_device *dev,
>>>>>>>>>>>> void *data,
>>>>>>>>>>>> * Display scanout is always non-coherent with the CPU
>>>>>>>>>>>> cache.
>>>>>>>>>>>> */
>>>>>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
>>>>>>>>>>>> - bo_flags |= XE_BO_FLAG_FORCE_WC;
>>>>>>>>>>>> + bo_flags |= XE_BO_FLAG_FORCE_WC |
>>>>>>>>>>>> XE_BO_FLAG_SCANOUT;
>>>>>>>>>>>> if (args->flags & DRM_XE_GEM_CREATE_FLAG_NO_COMPRESSION) {
>>>>>>>>>>>> if (XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20))
>>>>>>>>>>>> @@ -4228,6 +4228,7 @@ int xe_bo_dumb_create(struct drm_file
>>>>>>>>>>>> *file_priv,
>>>>>>>>>>>> DRM_XE_GEM_CPU_CACHING_WC,
>>>>>>>>>>>> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) |
>>>>>>>>>>>> XE_BO_FLAG_FORCE_WC |
>>>>>>>>>>>> + XE_BO_FLAG_SCANOUT |
>>>>>>>>>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL);
>>>>>>>>>>>> if (IS_ERR(bo))
>>>>>>>>>>>> return PTR_ERR(bo);
>>>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/ xe_bo.h
>>>>>>>>>>>> index 1ddf3b6d4a9e..6965c2655731 100644
>>>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_bo.h
>>>>>>>>>>>> @@ -56,6 +56,7 @@
>>>>>>>>>>>> #define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
>>>>>>>>>>>> #define XE_BO_FLAG_NO_COMPRESSION BIT(26)
>>>>>>>>>>>> #define XE_BO_FLAG_NEEDS_1G BIT(27)
>>>>>>>>>>>> +#define XE_BO_FLAG_SCANOUT BIT(28)
>>>>>>>>>>>> /* this one is trigger internally only */
>>>>>>>>>>>> #define XE_BO_FLAG_INTERNAL_TEST BIT(30)
>>>>>>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>>> b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>>> index b973579a69b8..0a347f09cee4 100644
>>>>>>>>>>>> --- a/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>>> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c
>>>>>>>>>>>> @@ -36,10 +36,40 @@ static void xe_ddebug_flip_bool(const struct
>>>>>>>>>>>> _ddebug *desc, bool *flag)
>>>>>>>>>>>> #define xe_dma_buf_p2p_debug_flip(flag) do { } while (0)
>>>>>>>>>>>> #endif
>>>>>>>>>>>> +static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>>>>>> *attach)
>>>>>>>>>>>> +{
>>>>>>>>>>>> + struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>>>> + struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>>>>> +
>>>>>>>>>>>> + XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>>>>> +}
>>>>>>>>>>>> +
>>>>>>>>>>>> +static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>>>>> + .allow_peer2peer = true,
>>>>>>>>>>>> + .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>>>>> +};
>>>>>>>>>>>> +
>>>>>>>>>>>> +static struct pci_dev *xe_find_parent_pci_dev(struct device *dev)
>>>>>>>>>>>> +{
>>>>>>>>>>>> + while (dev) {
>>>>>>>>>>>> + if (dev_is_pci(dev))
>>>>>>>>>>>> + return to_pci_dev(dev);
>>>>>>>>>>>> + dev = dev->parent;
>>>>>>>>>>>> + }
>>>>>>>>>>>> + return NULL;
>>>>>>>>>>>> +}
>>>>>>>>>>>> +
>>>>>>>>>>>> +static bool xe_dma_buf_attach_is_xe_device(struct dma_buf_attachment
>>>>>>>>>>>> *attach)
>>>>>>>>>>>> +{
>>>>>>>>>>>> + return attach->importer_ops == &xe_dma_buf_attach_ops;
>>>>>>>>>>>> +}
>>>>>>>>>>>> +
>>>>>>>>>>>> static int xe_dma_buf_attach(struct dma_buf *dmabuf,
>>>>>>>>>>>> struct dma_buf_attachment *attach)
>>>>>>>>>>>> {
>>>>>>>>>>>> struct drm_gem_object *obj = attach->dmabuf->priv;
>>>>>>>>>>>> + struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>>>> bool verbose_p2p_dist = drm_debug_enabled(DRM_UT_DRIVER);
>>>>>>>>>>>> xe_dma_buf_p2p_debug_flip(&verbose_p2p_dist);
>>>>>>>>>>>> @@ -48,7 +78,24 @@ static int xe_dma_buf_attach(struct dma_buf
>>>>>>>>>>>> *dmabuf,
>>>>>>>>>>>> pci_p2pdma_distance(to_pci_dev(obj->dev->dev), attach-
>>>>>>>>>>>>> dev, verbose_p2p_dist) < 0)
>>>>>>>>>>>> attach->peer2peer = false;
>>>>>>>>>>>> - if (!attach->peer2peer &&
>>>>>>>>>>>> !xe_bo_can_migrate(gem_to_xe_bo(obj), XE_PL_TT))
>>>>>>>>>>>> + if (attach->peer2peer && xe_bo_can_migrate(bo, XE_PL_TT)) {
>>>>>>>>>>>> + struct pci_dev *client =
>>>>>>>>>>>> xe_find_parent_pci_dev(attach->dev);
>>>>>>>>>>>> +
>>>>>>>>>>>> + /*
>>>>>>>>>>>> + * There are perf issues with using p2p with display
>>>>>>>>>>>> buffers,
>>>>>>>>>>>> + * like with igpu (compositor) <-> dgpu (exported
>>>>>>>>>>>> p2p window
>>>>>>>>>>>> + * buffer). Probably we need some actual userspace
>>>>>>>>>>>> hints. We
>>>>>>>>>>>> + * shouldn't really assume anything. Also, note that
>>>>>>>>>>>> some of
>>>>>>>>>>>> + * these buffers are not always tagged with SCANOUT.
>>>>>>>>>>>> + */
>>>>>>>>>>>> + if (bo->flags & XE_BO_FLAG_SCANOUT)
>>>>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>>>>> + else if (client && pci_is_display(client) &&
>>>>>>>>>>>> + !xe_dma_buf_attach_is_xe_device(attach))
>>>>>>>>>>>> + attach->peer2peer = false;
>>>>>>>>>>>> + }
>>>>>>>>>>>> +
>>>>>>>>>>>> + if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT))
>>>>>>>>>>>> return -EOPNOTSUPP;
>>>>>>>>>>>> xe_pm_runtime_get(to_xe_device(obj->dev));
>>>>>>>>>>>> @@ -349,20 +396,6 @@ xe_dma_buf_create_obj(struct drm_device *dev,
>>>>>>>>>>>> struct dma_buf *dma_buf)
>>>>>>>>>>>> return ret ? ERR_PTR(ret) : &bo->ttm.base;
>>>>>>>>>>>> }
>>>>>>>>>>>> -static void xe_dma_buf_move_notify(struct dma_buf_attachment
>>>>>>>>>>>> *attach)
>>>>>>>>>>>> -{
>>>>>>>>>>>> - struct drm_gem_object *obj = attach->importer_priv;
>>>>>>>>>>>> - struct xe_bo *bo = gem_to_xe_bo(obj);
>>>>>>>>>>>> - struct drm_exec *exec = XE_VALIDATION_UNSUPPORTED;
>>>>>>>>>>>> -
>>>>>>>>>>>> - XE_WARN_ON(xe_bo_evict(bo, exec));
>>>>>>>>>>>> -}
>>>>>>>>>>>> -
>>>>>>>>>>>> -static const struct dma_buf_attach_ops xe_dma_buf_attach_ops = {
>>>>>>>>>>>> - .allow_peer2peer = true,
>>>>>>>>>>>> - .invalidate_mappings = xe_dma_buf_move_notify
>>>>>>>>>>>> -};
>>>>>>>>>>>> -
>>>>>>>>>>>> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
>>>>>>>>>>>> struct dma_buf_test_params {
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 9:18 ` Thomas Hellström
@ 2026-10-13 9:55 ` Christian König
2026-10-13 10:16 ` Thomas Hellström
0 siblings, 1 reply; 30+ messages in thread
From: Christian König @ 2026-10-13 9:55 UTC (permalink / raw)
To: Thomas Hellström, Matthew Auld, intel-xe
Cc: Matthew Brost, stable, Christian König
On 10/13/26 11:18, Thomas Hellström wrote:
...
>>>>>>>>> Ideas on how do that? Could we do something like
>>>>>>>>> allow_peer2peer = false in amdgpu_gem_prime_import() if
>>>>>>>>> this is an APU device, or further check if the exporter
>>>>>>>>> side is not amdgpu, like APU + Xe?
>>>>>>>>
>>>>>>>> For example:
>>>>>>>> https://gitlab.freedesktop.org/mwa/kernel/-/ commit/7ec86
>>>>>>>> c68b42655b4bb85ee90af434a617e7bec8c
>>>>>>>>
>>>>>>>> Is that something you would accept?
>>>>>>>
>>>>>>> No, you misunderstood me. Enabling P2P is perfectly fine
>>>>>>> for APUs and mandatory for a couple of customer projects.
>>>>>>>
>>>>>>> The buffer should just be rejected from scanout in the
>>>>>>> display code and on the AMDGPU side we already do that if
>>>>>>> I'm not completely mistaken.
>>>>>>
>>>>>> Reporter confirmed seeing the issue in windowed mode also. So
>>>>>> I don't think it's just a case of rejecting from scanout?
>>>>>
>>>>> Then I don't understand what the problem is.
>>>>>
>>>>> When the dGPU renders and the iGPU displays you have only two
>>>>> possibilities, either the dGPU pushes the frames over the bus
>>>>> or the iGPU pulls the frames over the bus. Both should be
>>>>> equaly slow or fast, so what exactly is the expectation here?
>>>>
>>>> I assume the AMD APU/iGPU is sampling/reading from the p2p window
>>>> buffer every frame.
>>
>> That is not possible. The HW can't do this and because of this we
>> should have a check for that in the DAL/DC code.
>>
> Couldn't the issue be that the compositor, running on the amd iGPU
> blits from the dma-buf rather than scans out from it? And the scanout
> is not the shared buffer at all?
Yeah that is possible, but that should only happen when there is some change.
When the iGPU reads the buffer only once then that isn't really problematic, it's actually exactly what should happen.
It only becomes problematic when the buffer is read multiple times to construct multiple frames, either because the compositor does something unexpected or we really start to scanout from the buffer.
Regards,
Christian.
>
> /Thomas
>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 9:55 ` Christian König
@ 2026-10-13 10:16 ` Thomas Hellström
2026-10-13 11:45 ` Christian König
0 siblings, 1 reply; 30+ messages in thread
From: Thomas Hellström @ 2026-10-13 10:16 UTC (permalink / raw)
To: Christian König, Matthew Auld, intel-xe
Cc: Matthew Brost, stable, Christian König
On Tue, 2026-10-13 at 11:55 +0200, Christian König wrote:
> On 10/13/26 11:18, Thomas Hellström wrote:
> ...
> > > > > > > > > > Ideas on how do that? Could we do something like
> > > > > > > > > > allow_peer2peer = false in
> > > > > > > > > > amdgpu_gem_prime_import() if
> > > > > > > > > > this is an APU device, or further check if the
> > > > > > > > > > exporter
> > > > > > > > > > side is not amdgpu, like APU + Xe?
> > > > > > > > >
> > > > > > > > > For example:
> > > > > > > > > https://gitlab.freedesktop.org/mwa/kernel/-/ commit/7
> > > > > > > > > ec86
> > > > > > > > > c68b42655b4bb85ee90af434a617e7bec8c
> > > > > > > > >
> > > > > > > > > Is that something you would accept?
> > > > > > > >
> > > > > > > > No, you misunderstood me. Enabling P2P is perfectly
> > > > > > > > fine
> > > > > > > > for APUs and mandatory for a couple of customer
> > > > > > > > projects.
> > > > > > > >
> > > > > > > > The buffer should just be rejected from scanout in the
> > > > > > > > display code and on the AMDGPU side we already do that
> > > > > > > > if
> > > > > > > > I'm not completely mistaken.
> > > > > > >
> > > > > > > Reporter confirmed seeing the issue in windowed mode
> > > > > > > also. So
> > > > > > > I don't think it's just a case of rejecting from scanout?
> > > > > >
> > > > > > Then I don't understand what the problem is.
> > > > > >
> > > > > > When the dGPU renders and the iGPU displays you have only
> > > > > > two
> > > > > > possibilities, either the dGPU pushes the frames over the
> > > > > > bus
> > > > > > or the iGPU pulls the frames over the bus. Both should be
> > > > > > equaly slow or fast, so what exactly is the expectation
> > > > > > here?
> > > > >
> > > > > I assume the AMD APU/iGPU is sampling/reading from the p2p
> > > > > window
> > > > > buffer every frame.
> > >
> > > That is not possible. The HW can't do this and because of this we
> > > should have a check for that in the DAL/DC code.
> > >
> > Couldn't the issue be that the compositor, running on the amd iGPU
> > blits from the dma-buf rather than scans out from it? And the
> > scanout
> > is not the shared buffer at all?
>
> Yeah that is possible, but that should only happen when there is some
> change.
>
> When the iGPU reads the buffer only once then that isn't really
> problematic, it's actually exactly what should happen.
>
> It only becomes problematic when the buffer is read multiple times to
> construct multiple frames, either because the compositor does
> something unexpected or we really start to scanout from the buffer.
But in windowed mode (and perhaps even fullscreen?) the compositor
blits repeatedly over PCI each frame from the dma-buf?
/Thomas
>
> Regards,
> Christian.
>
> >
> > /Thomas
> >
> >
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 10:16 ` Thomas Hellström
@ 2026-10-13 11:45 ` Christian König
2026-10-13 12:36 ` Matthew Auld
0 siblings, 1 reply; 30+ messages in thread
From: Christian König @ 2026-10-13 11:45 UTC (permalink / raw)
To: Thomas Hellström, Matthew Auld, intel-xe
Cc: Matthew Brost, stable, Christian König
On 10/13/26 12:16, Thomas Hellström wrote:
> On Tue, 2026-10-13 at 11:55 +0200, Christian König wrote:
>> On 10/13/26 11:18, Thomas Hellström wrote:
>> ...
>>>>>>>>>>> Ideas on how do that? Could we do something like
>>>>>>>>>>> allow_peer2peer = false in
>>>>>>>>>>> amdgpu_gem_prime_import() if
>>>>>>>>>>> this is an APU device, or further check if the
>>>>>>>>>>> exporter
>>>>>>>>>>> side is not amdgpu, like APU + Xe?
>>>>>>>>>>
>>>>>>>>>> For example:
>>>>>>>>>> https://gitlab.freedesktop.org/mwa/kernel/-/ commit/7
>>>>>>>>>> ec86
>>>>>>>>>> c68b42655b4bb85ee90af434a617e7bec8c
>>>>>>>>>>
>>>>>>>>>> Is that something you would accept?
>>>>>>>>>
>>>>>>>>> No, you misunderstood me. Enabling P2P is perfectly
>>>>>>>>> fine
>>>>>>>>> for APUs and mandatory for a couple of customer
>>>>>>>>> projects.
>>>>>>>>>
>>>>>>>>> The buffer should just be rejected from scanout in the
>>>>>>>>> display code and on the AMDGPU side we already do that
>>>>>>>>> if
>>>>>>>>> I'm not completely mistaken.
>>>>>>>>
>>>>>>>> Reporter confirmed seeing the issue in windowed mode
>>>>>>>> also. So
>>>>>>>> I don't think it's just a case of rejecting from scanout?
>>>>>>>
>>>>>>> Then I don't understand what the problem is.
>>>>>>>
>>>>>>> When the dGPU renders and the iGPU displays you have only
>>>>>>> two
>>>>>>> possibilities, either the dGPU pushes the frames over the
>>>>>>> bus
>>>>>>> or the iGPU pulls the frames over the bus. Both should be
>>>>>>> equaly slow or fast, so what exactly is the expectation
>>>>>>> here?
>>>>>>
>>>>>> I assume the AMD APU/iGPU is sampling/reading from the p2p
>>>>>> window
>>>>>> buffer every frame.
>>>>
>>>> That is not possible. The HW can't do this and because of this we
>>>> should have a check for that in the DAL/DC code.
>>>>
>>> Couldn't the issue be that the compositor, running on the amd iGPU
>>> blits from the dma-buf rather than scans out from it? And the
>>> scanout
>>> is not the shared buffer at all?
>>
>> Yeah that is possible, but that should only happen when there is some
>> change.
>>
>> When the iGPU reads the buffer only once then that isn't really
>> problematic, it's actually exactly what should happen.
>>
>> It only becomes problematic when the buffer is read multiple times to
>> construct multiple frames, either because the compositor does
>> something unexpected or we really start to scanout from the buffer.
>
> But in windowed mode (and perhaps even fullscreen?) the compositor
> blits repeatedly over PCI each frame from the dma-buf?
It usually doesn't.
In fullscreen mode using the buffer directly for scanout in an atomic commit should be rejected by the kernel because the HW can't do this.
The fallback path then copies the buffer content to a locally allocated buffer exactly once and then display that new buffer.
I'm not 100% sure what happens in windowed mode for the specific compositor the end user is using. What could be is that when the compositor gets buffers from multiple applications that it composes multiple times over PCIe, but it is unlikely that this will cause problems. You would need something like game/test running on dGPU and glxgears without vblank sync on the iGPU.
AMD uses basically exactly that setup in the Tesla infotainment system for example and it works perfectly fine there.
I have not the slightest idea what's going wrong here.
Regards,
Christian.
>
> /Thomas
>
>
>
>>
>> Regards,
>> Christian.
>>
>>>
>>> /Thomas
>>>
>>>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 9:40 ` Matthew Auld
@ 2026-10-13 11:50 ` Christian König
2026-10-13 13:15 ` Matthew Auld
0 siblings, 1 reply; 30+ messages in thread
From: Christian König @ 2026-10-13 11:50 UTC (permalink / raw)
To: Matthew Auld, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 10/13/26 11:40, Matthew Auld wrote:
...>>
>> It could be that this check doesn't work and because of low resolution and/or not busy PCIe it somehow works, but that would then clearly not be intended behavior.
>>
>> What could also be is that the frame is pulled over the PCIe bus using the SDMA multiple times, but that would then be a bug in userspace somewhere.
>>
>>>> Expectation is that buffer rather gets moved from VRAM to system memory when mapping the buffer with dma-buf, where it stays, and never negotiated to use p2p in the first place. I don't think p2p is really valid here.
>>
>> No, that is incorrect. When P2P is available it should be used, it's just that AMDs APUs can't scanout over P2P.
>>
>>>> What happened is that user updated their kernel and due to the MOVE_NOTIFY config getting removed and enabled by default on newer kernels this suddenly started negotiating p2p for things like the window buffer AFAICT, instead of moving it to system memory and keeping it there. On previous kernel versions the buffer would just get moved and pinned in system memory. From user pov this is a kernel regression, given the perf they are now getting.
>>>>
>>>> On AMD CPUs you allow p2p for everything. On Intel iGPUs we currently ban p2p. Maybe there is bigger question here for what is the story for p2p and iGPU? Should it really be blanket allowed like this? Should it not be opt-in with some userspace hints or something?
>>
>> Again no, P2P is mandatory for APUs. We have basically tons of customers using that with AMD dGPU and AMD iGPU and that works fine.
>>
>>>>
>>>> The other important part is that even when you move to system memory, it's no longer pinned (MOVE_NOTIFY) so can you now can also get violent ping-ponging, which is addressed in the first patch in this series.
>>
>> Yeah that is something which we have seen before as well. That should definately be prevented by the kernel.
>>
>> Does that patch help with the performance?
>
> Mostly it's p2p that is the big killer. Series gives much as 10x FPS jump, if we stop negotiating p2p for the window buffer and prevent ping-ponging.
>
> For example, in GravityMark, we go from ~18 FPS -> ~180 FPS, which matches the previous performance the user was getting. The ping-ponging hurts, but from the reports it looked like it was only in some games and not as severe as p2p. User confirmed this with CONFIG_PCI_P2PDMA=n, and that fixed most of the workloads. Adding the ping-pong fix then fixes everything.
In that case I have not the slightest idea what going wrong here.
The only difference with P2P enabled I can see is that the buffer is pulled over the PCIe bus by the iGPU instead of pushed by the dGPU.
As I wrote in Thomas reply as well AMD uses exactly that setup with an dGPU and iGPU in the infotainment system found in Teslas and that works rather well as far as I know.
Regards,
Christian.
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 11:45 ` Christian König
@ 2026-10-13 12:36 ` Matthew Auld
0 siblings, 0 replies; 30+ messages in thread
From: Matthew Auld @ 2026-10-13 12:36 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 13/10/2026 12:45, Christian König wrote:
> On 10/13/26 12:16, Thomas Hellström wrote:
>> On Tue, 2026-10-13 at 11:55 +0200, Christian König wrote:
>>> On 10/13/26 11:18, Thomas Hellström wrote:
>>> ...
>>>>>>>>>>>> Ideas on how do that? Could we do something like
>>>>>>>>>>>> allow_peer2peer = false in
>>>>>>>>>>>> amdgpu_gem_prime_import() if
>>>>>>>>>>>> this is an APU device, or further check if the
>>>>>>>>>>>> exporter
>>>>>>>>>>>> side is not amdgpu, like APU + Xe?
>>>>>>>>>>>
>>>>>>>>>>> For example:
>>>>>>>>>>> https://gitlab.freedesktop.org/mwa/kernel/-/ commit/7
>>>>>>>>>>> ec86
>>>>>>>>>>> c68b42655b4bb85ee90af434a617e7bec8c
>>>>>>>>>>>
>>>>>>>>>>> Is that something you would accept?
>>>>>>>>>>
>>>>>>>>>> No, you misunderstood me. Enabling P2P is perfectly
>>>>>>>>>> fine
>>>>>>>>>> for APUs and mandatory for a couple of customer
>>>>>>>>>> projects.
>>>>>>>>>>
>>>>>>>>>> The buffer should just be rejected from scanout in the
>>>>>>>>>> display code and on the AMDGPU side we already do that
>>>>>>>>>> if
>>>>>>>>>> I'm not completely mistaken.
>>>>>>>>>
>>>>>>>>> Reporter confirmed seeing the issue in windowed mode
>>>>>>>>> also. So
>>>>>>>>> I don't think it's just a case of rejecting from scanout?
>>>>>>>>
>>>>>>>> Then I don't understand what the problem is.
>>>>>>>>
>>>>>>>> When the dGPU renders and the iGPU displays you have only
>>>>>>>> two
>>>>>>>> possibilities, either the dGPU pushes the frames over the
>>>>>>>> bus
>>>>>>>> or the iGPU pulls the frames over the bus. Both should be
>>>>>>>> equaly slow or fast, so what exactly is the expectation
>>>>>>>> here?
>>>>>>>
>>>>>>> I assume the AMD APU/iGPU is sampling/reading from the p2p
>>>>>>> window
>>>>>>> buffer every frame.
>>>>>
>>>>> That is not possible. The HW can't do this and because of this we
>>>>> should have a check for that in the DAL/DC code.
>>>>>
>>>> Couldn't the issue be that the compositor, running on the amd iGPU
>>>> blits from the dma-buf rather than scans out from it? And the
>>>> scanout
>>>> is not the shared buffer at all?
>>>
>>> Yeah that is possible, but that should only happen when there is some
>>> change.
>>>
>>> When the iGPU reads the buffer only once then that isn't really
>>> problematic, it's actually exactly what should happen.
>>>
>>> It only becomes problematic when the buffer is read multiple times to
>>> construct multiple frames, either because the compositor does
>>> something unexpected or we really start to scanout from the buffer.
>>
>> But in windowed mode (and perhaps even fullscreen?) the compositor
>> blits repeatedly over PCI each frame from the dma-buf?
>
> It usually doesn't.
>
> In fullscreen mode using the buffer directly for scanout in an atomic commit should be rejected by the kernel because the HW can't do this.
>
> The fallback path then copies the buffer content to a locally allocated buffer exactly once and then display that new buffer.
>
> I'm not 100% sure what happens in windowed mode for the specific compositor the end user is using. What could be is that when the compositor gets buffers from multiple applications that it composes multiple times over PCIe, but it is unlikely that this will cause problems. You would need something like game/test running on dGPU and glxgears without vblank sync on the iGPU.
>
> AMD uses basically exactly that setup in the Tesla infotainment system for example and it works perfectly fine there.
>
> I have not the slightest idea what's going wrong here.
My rough mental model here (could be waaaay wrong), is that dgpu is
constantly rendering into a private VRAM buffer, and then copying that
to a linear buffer which is the window buffer exported to the
compositor. Display is plugged into the igpu. DRI_PRIME=1 is used for
the game (like GravityMark) to the do rendering on the dgpu.
In windowed mode, every frame the compositor needs to somehow sample the
exported window/texture from a shader, like in mutter. In this flow the
igpu is still using native buffer for the actual scanout.
That exported window buffer is using a flexible placement, so it could
technically go in VRAM or system memory. But I don't think p2p was on
the bingo cards here for Intel. So if you suddenly negotiate p2p instead
of moving it, it now stays in VRAM. So igpu is now constantly reading
over pcie every frame, which is extremely slow it seems, for the user.
Other thing is that when I tried to repro this locally, I used xe igpu +
xe dgpu, and manually forcing p2p in the kernel. When I traced it with
bpf I just see the private VRAM buffer sitting there, and the exported
window buffer as system memory. So no p2p. There was also no ping-pong,
so it must mean that the exported window buffer is NOT flexible
placement in this multi-GPU setup.
So it could potentially be specific to some cross-driver flow with
OpenGL, like with amd + intel, where you can end up with the flexible
placement for the exported window buffer on some multi-GPU setups. Not
100% sure though.
>
> Regards,
> Christian.
>
>
>
>>
>> /Thomas
>>
>>
>>
>>>
>>> Regards,
>>> Christian.
>>>
>>>>
>>>> /Thomas
>>>>
>>>>
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers
2026-10-13 11:50 ` Christian König
@ 2026-10-13 13:15 ` Matthew Auld
0 siblings, 0 replies; 30+ messages in thread
From: Matthew Auld @ 2026-10-13 13:15 UTC (permalink / raw)
To: Christian König, Thomas Hellström, intel-xe
Cc: Matthew Brost, stable, Christian König
On 13/10/2026 12:50, Christian König wrote:
> On 10/13/26 11:40, Matthew Auld wrote:
> ...>>
>>> It could be that this check doesn't work and because of low resolution and/or not busy PCIe it somehow works, but that would then clearly not be intended behavior.
>>>
>>> What could also be is that the frame is pulled over the PCIe bus using the SDMA multiple times, but that would then be a bug in userspace somewhere.
>>>
>>>>> Expectation is that buffer rather gets moved from VRAM to system memory when mapping the buffer with dma-buf, where it stays, and never negotiated to use p2p in the first place. I don't think p2p is really valid here.
>>>
>>> No, that is incorrect. When P2P is available it should be used, it's just that AMDs APUs can't scanout over P2P.
>>>
>>>>> What happened is that user updated their kernel and due to the MOVE_NOTIFY config getting removed and enabled by default on newer kernels this suddenly started negotiating p2p for things like the window buffer AFAICT, instead of moving it to system memory and keeping it there. On previous kernel versions the buffer would just get moved and pinned in system memory. From user pov this is a kernel regression, given the perf they are now getting.
>>>>>
>>>>> On AMD CPUs you allow p2p for everything. On Intel iGPUs we currently ban p2p. Maybe there is bigger question here for what is the story for p2p and iGPU? Should it really be blanket allowed like this? Should it not be opt-in with some userspace hints or something?
>>>
>>> Again no, P2P is mandatory for APUs. We have basically tons of customers using that with AMD dGPU and AMD iGPU and that works fine.
>>>
>>>>>
>>>>> The other important part is that even when you move to system memory, it's no longer pinned (MOVE_NOTIFY) so can you now can also get violent ping-ponging, which is addressed in the first patch in this series.
>>>
>>> Yeah that is something which we have seen before as well. That should definately be prevented by the kernel.
>>>
>>> Does that patch help with the performance?
>>
>> Mostly it's p2p that is the big killer. Series gives much as 10x FPS jump, if we stop negotiating p2p for the window buffer and prevent ping-ponging.
>>
>> For example, in GravityMark, we go from ~18 FPS -> ~180 FPS, which matches the previous performance the user was getting. The ping-ponging hurts, but from the reports it looked like it was only in some games and not as severe as p2p. User confirmed this with CONFIG_PCI_P2PDMA=n, and that fixed most of the workloads. Adding the ping-pong fix then fixes everything.
>
> In that case I have not the slightest idea what going wrong here.
>
> The only difference with P2P enabled I can see is that the buffer is pulled over the PCIe bus by the iGPU instead of pushed by the dGPU.
As Thomas way saying, reads can be very slow, but writes are much
faster, at least for pcie on this hw?
>
> As I wrote in Thomas reply as well AMD uses exactly that setup with an dGPU and iGPU in the infotainment system found in Teslas and that works rather well as far as I know.
So do you use p2p for stuff like window buffers, where you constantly
read over pcie every frame? And is it just on this setup, or is this
more generally with any amd igpu + amd dgpu combo with upstream? Like
with DRI_PRIME=1 with a game on the dgpu? There is no perf concern if
you use p2p for this on your hw? If not, then I guess this is specific
to our hw.
>
> Regards,
> Christian.
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2026-10-13 13:15 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-07 15:36 [PATCH v2 0/3] sticky TT Matthew Auld
2026-10-07 15:36 ` [PATCH v2 1/3] drm/xe/dma-buf: keep non-p2p imported buffers in system memory Matthew Auld
2026-10-07 15:36 ` [PATCH v2 2/3] drm/xe/vm: make PREFETCH to TT sticky Matthew Auld
2026-10-07 15:36 ` [PATCH v2 3/3] drm/xe: skip p2p for suspected display buffers Matthew Auld
2026-10-07 18:11 ` Thomas Hellström
2026-10-08 9:46 ` Matthew Auld
2026-10-08 9:55 ` Christian König
2026-10-08 11:17 ` Matthew Auld
2026-10-09 9:16 ` Matthew Auld
2026-10-09 9:26 ` Christian König
2026-10-09 10:29 ` Matthew Auld
2026-10-09 11:38 ` Christian König
2026-10-09 13:02 ` Matthew Auld
2026-10-13 8:51 ` Matthew Auld
2026-10-13 9:10 ` Christian König
2026-10-13 9:18 ` Thomas Hellström
2026-10-13 9:55 ` Christian König
2026-10-13 10:16 ` Thomas Hellström
2026-10-13 11:45 ` Christian König
2026-10-13 12:36 ` Matthew Auld
2026-10-13 9:40 ` Matthew Auld
2026-10-13 11:50 ` Christian König
2026-10-13 13:15 ` Matthew Auld
2026-10-09 13:06 ` Thomas Hellström
2026-10-08 14:40 ` Simon Richter
2026-10-08 16:22 ` Matthew Auld
2026-10-07 15:42 ` ✗ CI.checkpatch: warning for sticky TT (rev2) Patchwork
2026-10-07 15:45 ` ✓ CI.KUnit: success " Patchwork
2026-10-07 16:46 ` ✓ Xe.CI.BAT: " Patchwork
2026-10-07 20:16 ` ✓ Xe.CI.FULL: " Patchwork
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.