* [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation
@ 2026-01-29 8:27 Brian Nguyen
2026-01-29 8:27 ` [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func Brian Nguyen
` (4 more replies)
0 siblings, 5 replies; 16+ messages in thread
From: Brian Nguyen @ 2026-01-29 8:27 UTC (permalink / raw)
To: intel-xe; +Cc: matthew.d.roper, Brian Nguyen
The check using xe_child->base.children was insufficient in determining
if a pte was a leaf node. So explicitly check for if a pte is a leaf
through the bit checks.
Fixes: b912138df299 ("drm/xe: Create page reclaim list on unbind")
v2:
- Remove old assert. (Matt R)
Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
---
drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c
index 6703a7049227..b73a356d0fa1 100644
--- a/drivers/gpu/drm/xe/xe_pt.c
+++ b/drivers/gpu/drm/xe/xe_pt.c
@@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t offset,
XE_WARN_ON(!*child);
XE_WARN_ON(!level);
- /* Check for leaf node */
+ /* Optimistically check for leaf node, may not be guaranteed from children alone */
if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk->prl) &&
(!xe_child->base.children || !xe_child->base.children[first])) {
struct iosys_map *leaf_map = &xe_child->bo->vmap;
@@ -1675,10 +1675,13 @@ static int xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t offset,
break;
}
- /* Ensure it is a defined page */
- xe_tile_assert(xe_walk->tile,
- xe_child->level == 0 ||
- (pte & (XE_PTE_PS64 | XE_PDE_PS_2M | XE_PDPE_PS_1G)));
+ /*
+ * The check for xe_pt's children is insufficient to determine leaf.
+ * If not leaf, break out and continue in next page walk level.
+ */
+ if (xe_child->level > 0 &&
+ !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | XE_PDPE_PS_1G)))
+ break;
/* An entry should be added for 64KB but contigious 4K have XE_PTE_PS64 */
if (pte & XE_PTE_PS64)
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func 2026-01-29 8:27 [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation Brian Nguyen @ 2026-01-29 8:27 ` Brian Nguyen 2026-01-29 21:40 ` Lin, Shuicheng ` (2 more replies) 2026-01-29 9:14 ` ✓ CI.KUnit: success for series starting with [1/2] drm/xe: Skip over non leaf pte for PRL generation Patchwork ` (3 subsequent siblings) 4 siblings, 3 replies; 16+ messages in thread From: Brian Nguyen @ 2026-01-29 8:27 UTC (permalink / raw) To: intel-xe; +Cc: matthew.d.roper, Brian Nguyen Originally, page reclamation is handled by the same fence as tlb invalidation and uses its seqno, so there was no reason to separate out the handlers. However in hindsight, for readability, and possible future changes, it seems more beneficial to move this all out to its own function. Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> --- drivers/gpu/drm/xe/xe_guc_ct.c | 23 ++++++++--------------- drivers/gpu/drm/xe/xe_page_reclaim.c | 20 ++++++++++++++++++++ drivers/gpu/drm/xe/xe_page_reclaim.h | 3 +++ 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c index dfbf76037b04..3d69314170f8 100644 --- a/drivers/gpu/drm/xe/xe_guc_ct.c +++ b/drivers/gpu/drm/xe/xe_guc_ct.c @@ -31,6 +31,7 @@ #include "xe_guc_submit.h" #include "xe_guc_tlb_inval.h" #include "xe_map.h" +#include "xe_page_reclaim.h" #include "xe_pm.h" #include "xe_sriov_vf.h" #include "xe_trace_guc.h" @@ -1604,17 +1605,11 @@ static int process_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len) ret = xe_guc_pagefault_handler(guc, payload, adj_len); break; case XE_GUC_ACTION_TLB_INVALIDATION_DONE: - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: - /* - * Page reclamation is an extension of TLB invalidation. Both - * operations share the same seqno and fence. When either - * action completes, we need to signal the corresponding - * fence. Since the handling logic (lookup fence by seqno, - * fence signalling) is identical, we use the same handler - * for both G2H events. - */ ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len); break; + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: + ret = xe_guc_page_reclaim_done_handler(guc, payload, adj_len); + break; case XE_GUC_ACTION_GUC2PF_RELAY_FROM_VF: ret = xe_guc_relay_process_guc2pf(&guc->relay, hxg, hxg_len); break; @@ -1822,15 +1817,13 @@ static void g2h_fast_path(struct xe_guc_ct *ct, u32 *msg, u32 len) ret = xe_guc_pagefault_handler(guc, payload, adj_len); break; case XE_GUC_ACTION_TLB_INVALIDATION_DONE: - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: - /* - * Seqno and fence handling of page reclamation and TLB - * invalidation is identical, so we can use the same handler - * for both actions. - */ __g2h_release_space(ct, len); ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len); break; + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: + __g2h_release_space(ct, len); + ret = xe_guc_page_reclaim_done_handler(guc, payload, adj_len); + break; default: xe_gt_warn(gt, "NOT_POSSIBLE"); } diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.c b/drivers/gpu/drm/xe/xe_page_reclaim.c index e13c71a89da2..60b0fda59ce3 100644 --- a/drivers/gpu/drm/xe/xe_page_reclaim.c +++ b/drivers/gpu/drm/xe/xe_page_reclaim.c @@ -11,6 +11,7 @@ #include "xe_page_reclaim.h" #include "xe_gt_stats.h" +#include "xe_guc_tlb_inval.h" #include "xe_macros.h" #include "xe_pat.h" #include "xe_sa.h" @@ -130,3 +131,22 @@ int xe_page_reclaim_list_alloc_entries(struct xe_page_reclaim_list *prl) return page ? 0 : -ENOMEM; } + +/** + * xe_guc_page_reclaim_done_handler() - Page reclaim done handler + * @guc: guc + * @msg: message indicating page reclamation done + * @len: length of message + * + * Page reclamation is an extension of TLB invalidation. Both + * operations share the same seqno and fence. When either + * action completes, we need to signal the corresponding + * fence. Since the handling logic is currently identical, this + * function delegates to the TLB invalidation handler. + * + * Return: 0 on success, -EPROTO for malformed messages. + */ +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 len) +{ + return xe_guc_tlb_inval_done_handler(guc, msg, len); +} diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.h b/drivers/gpu/drm/xe/xe_page_reclaim.h index 3dd103e37beb..0412611f3af7 100644 --- a/drivers/gpu/drm/xe/xe_page_reclaim.h +++ b/drivers/gpu/drm/xe/xe_page_reclaim.h @@ -20,6 +20,7 @@ struct xe_tlb_inval; struct xe_tlb_inval_fence; struct xe_tile; struct xe_gt; +struct xe_guc; struct xe_vma; struct xe_guc_page_reclaim_entry { @@ -122,4 +123,6 @@ static inline void xe_page_reclaim_entries_put(struct xe_guc_page_reclaim_entry put_page(virt_to_page(entries)); } +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 len); + #endif /* _XE_PAGE_RECLAIM_H_ */ -- 2.43.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* RE: [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func 2026-01-29 8:27 ` [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func Brian Nguyen @ 2026-01-29 21:40 ` Lin, Shuicheng 2026-02-23 22:45 ` Summers, Stuart 2026-02-23 22:51 ` Matthew Brost 2 siblings, 0 replies; 16+ messages in thread From: Lin, Shuicheng @ 2026-01-29 21:40 UTC (permalink / raw) To: Nguyen, Brian3, intel-xe@lists.freedesktop.org Cc: Roper, Matthew D, Nguyen, Brian3 On Thu, Jan 29, 2026 12:28 AM Brian Nguyen wrote: > Originally, page reclamation is handled by the same fence as tlb invalidation > and uses its seqno, so there was no reason to separate out the handlers. > However in hindsight, for readability, and possible future changes, it seems > more beneficial to move this all out to its own function. > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> LGTM. Reviewed-by: Shuicheng Lin <shuicheng.lin@intel.com> > --- > drivers/gpu/drm/xe/xe_guc_ct.c | 23 ++++++++--------------- > drivers/gpu/drm/xe/xe_page_reclaim.c | 20 ++++++++++++++++++++ > drivers/gpu/drm/xe/xe_page_reclaim.h | 3 +++ > 3 files changed, 31 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c > b/drivers/gpu/drm/xe/xe_guc_ct.c index dfbf76037b04..3d69314170f8 > 100644 > --- a/drivers/gpu/drm/xe/xe_guc_ct.c > +++ b/drivers/gpu/drm/xe/xe_guc_ct.c > @@ -31,6 +31,7 @@ > #include "xe_guc_submit.h" > #include "xe_guc_tlb_inval.h" > #include "xe_map.h" > +#include "xe_page_reclaim.h" > #include "xe_pm.h" > #include "xe_sriov_vf.h" > #include "xe_trace_guc.h" > @@ -1604,17 +1605,11 @@ static int process_g2h_msg(struct xe_guc_ct *ct, > u32 *msg, u32 len) > ret = xe_guc_pagefault_handler(guc, payload, adj_len); > break; > case XE_GUC_ACTION_TLB_INVALIDATION_DONE: > - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > - /* > - * Page reclamation is an extension of TLB invalidation. Both > - * operations share the same seqno and fence. When either > - * action completes, we need to signal the corresponding > - * fence. Since the handling logic (lookup fence by seqno, > - * fence signalling) is identical, we use the same handler > - * for both G2H events. > - */ > ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len); > break; > + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > + ret = xe_guc_page_reclaim_done_handler(guc, payload, > adj_len); > + break; > case XE_GUC_ACTION_GUC2PF_RELAY_FROM_VF: > ret = xe_guc_relay_process_guc2pf(&guc->relay, hxg, > hxg_len); > break; > @@ -1822,15 +1817,13 @@ static void g2h_fast_path(struct xe_guc_ct *ct, > u32 *msg, u32 len) > ret = xe_guc_pagefault_handler(guc, payload, adj_len); > break; > case XE_GUC_ACTION_TLB_INVALIDATION_DONE: > - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > - /* > - * Seqno and fence handling of page reclamation and TLB > - * invalidation is identical, so we can use the same handler > - * for both actions. > - */ > __g2h_release_space(ct, len); > ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len); > break; > + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > + __g2h_release_space(ct, len); > + ret = xe_guc_page_reclaim_done_handler(guc, payload, > adj_len); > + break; > default: > xe_gt_warn(gt, "NOT_POSSIBLE"); > } > diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.c > b/drivers/gpu/drm/xe/xe_page_reclaim.c > index e13c71a89da2..60b0fda59ce3 100644 > --- a/drivers/gpu/drm/xe/xe_page_reclaim.c > +++ b/drivers/gpu/drm/xe/xe_page_reclaim.c > @@ -11,6 +11,7 @@ > #include "xe_page_reclaim.h" > > #include "xe_gt_stats.h" > +#include "xe_guc_tlb_inval.h" > #include "xe_macros.h" > #include "xe_pat.h" > #include "xe_sa.h" > @@ -130,3 +131,22 @@ int xe_page_reclaim_list_alloc_entries(struct > xe_page_reclaim_list *prl) > > return page ? 0 : -ENOMEM; > } > + > +/** > + * xe_guc_page_reclaim_done_handler() - Page reclaim done handler > + * @guc: guc > + * @msg: message indicating page reclamation done > + * @len: length of message > + * > + * Page reclamation is an extension of TLB invalidation. Both > + * operations share the same seqno and fence. When either > + * action completes, we need to signal the corresponding > + * fence. Since the handling logic is currently identical, this > + * function delegates to the TLB invalidation handler. > + * > + * Return: 0 on success, -EPROTO for malformed messages. > + */ > +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 > +len) { > + return xe_guc_tlb_inval_done_handler(guc, msg, len); } > diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.h > b/drivers/gpu/drm/xe/xe_page_reclaim.h > index 3dd103e37beb..0412611f3af7 100644 > --- a/drivers/gpu/drm/xe/xe_page_reclaim.h > +++ b/drivers/gpu/drm/xe/xe_page_reclaim.h > @@ -20,6 +20,7 @@ struct xe_tlb_inval; > struct xe_tlb_inval_fence; > struct xe_tile; > struct xe_gt; > +struct xe_guc; > struct xe_vma; > > struct xe_guc_page_reclaim_entry { > @@ -122,4 +123,6 @@ static inline void xe_page_reclaim_entries_put(struct > xe_guc_page_reclaim_entry > put_page(virt_to_page(entries)); > } > > +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 > +len); > + > #endif /* _XE_PAGE_RECLAIM_H_ */ > -- > 2.43.0 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func 2026-01-29 8:27 ` [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func Brian Nguyen 2026-01-29 21:40 ` Lin, Shuicheng @ 2026-02-23 22:45 ` Summers, Stuart 2026-02-23 22:51 ` Matthew Brost 2 siblings, 0 replies; 16+ messages in thread From: Summers, Stuart @ 2026-02-23 22:45 UTC (permalink / raw) To: intel-xe@lists.freedesktop.org, Nguyen, Brian3; +Cc: Roper, Matthew D On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > Originally, page reclamation is handled by the same fence as tlb > invalidation and uses its seqno, so there was no reason to separate > out > the handlers. However in hindsight, for readability, and possible > future changes, it seems more beneficial to move this all out to its > own > function. > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> Reviewed-by: Stuart Summers <stuart.summers@intel.com> > --- > drivers/gpu/drm/xe/xe_guc_ct.c | 23 ++++++++--------------- > drivers/gpu/drm/xe/xe_page_reclaim.c | 20 ++++++++++++++++++++ > drivers/gpu/drm/xe/xe_page_reclaim.h | 3 +++ > 3 files changed, 31 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c > b/drivers/gpu/drm/xe/xe_guc_ct.c > index dfbf76037b04..3d69314170f8 100644 > --- a/drivers/gpu/drm/xe/xe_guc_ct.c > +++ b/drivers/gpu/drm/xe/xe_guc_ct.c > @@ -31,6 +31,7 @@ > #include "xe_guc_submit.h" > #include "xe_guc_tlb_inval.h" > #include "xe_map.h" > +#include "xe_page_reclaim.h" > #include "xe_pm.h" > #include "xe_sriov_vf.h" > #include "xe_trace_guc.h" > @@ -1604,17 +1605,11 @@ static int process_g2h_msg(struct xe_guc_ct > *ct, u32 *msg, u32 len) > ret = xe_guc_pagefault_handler(guc, payload, > adj_len); > break; > case XE_GUC_ACTION_TLB_INVALIDATION_DONE: > - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > - /* > - * Page reclamation is an extension of TLB > invalidation. Both > - * operations share the same seqno and fence. When > either > - * action completes, we need to signal the > corresponding > - * fence. Since the handling logic (lookup fence by > seqno, > - * fence signalling) is identical, we use the same > handler > - * for both G2H events. > - */ > ret = xe_guc_tlb_inval_done_handler(guc, payload, > adj_len); > break; > + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > + ret = xe_guc_page_reclaim_done_handler(guc, payload, > adj_len); > + break; > case XE_GUC_ACTION_GUC2PF_RELAY_FROM_VF: > ret = xe_guc_relay_process_guc2pf(&guc->relay, hxg, > hxg_len); > break; > @@ -1822,15 +1817,13 @@ static void g2h_fast_path(struct xe_guc_ct > *ct, u32 *msg, u32 len) > ret = xe_guc_pagefault_handler(guc, payload, > adj_len); > break; > case XE_GUC_ACTION_TLB_INVALIDATION_DONE: > - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > - /* > - * Seqno and fence handling of page reclamation and > TLB > - * invalidation is identical, so we can use the same > handler > - * for both actions. > - */ > __g2h_release_space(ct, len); > ret = xe_guc_tlb_inval_done_handler(guc, payload, > adj_len); > break; > + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > + __g2h_release_space(ct, len); > + ret = xe_guc_page_reclaim_done_handler(guc, payload, > adj_len); > + break; > default: > xe_gt_warn(gt, "NOT_POSSIBLE"); > } > diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.c > b/drivers/gpu/drm/xe/xe_page_reclaim.c > index e13c71a89da2..60b0fda59ce3 100644 > --- a/drivers/gpu/drm/xe/xe_page_reclaim.c > +++ b/drivers/gpu/drm/xe/xe_page_reclaim.c > @@ -11,6 +11,7 @@ > #include "xe_page_reclaim.h" > > #include "xe_gt_stats.h" > +#include "xe_guc_tlb_inval.h" > #include "xe_macros.h" > #include "xe_pat.h" > #include "xe_sa.h" > @@ -130,3 +131,22 @@ int xe_page_reclaim_list_alloc_entries(struct > xe_page_reclaim_list *prl) > > return page ? 0 : -ENOMEM; > } > + > +/** > + * xe_guc_page_reclaim_done_handler() - Page reclaim done handler > + * @guc: guc > + * @msg: message indicating page reclamation done > + * @len: length of message > + * > + * Page reclamation is an extension of TLB invalidation. Both > + * operations share the same seqno and fence. When either > + * action completes, we need to signal the corresponding > + * fence. Since the handling logic is currently identical, this > + * function delegates to the TLB invalidation handler. > + * > + * Return: 0 on success, -EPROTO for malformed messages. > + */ > +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, > u32 len) > +{ > + return xe_guc_tlb_inval_done_handler(guc, msg, len); > +} > diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.h > b/drivers/gpu/drm/xe/xe_page_reclaim.h > index 3dd103e37beb..0412611f3af7 100644 > --- a/drivers/gpu/drm/xe/xe_page_reclaim.h > +++ b/drivers/gpu/drm/xe/xe_page_reclaim.h > @@ -20,6 +20,7 @@ struct xe_tlb_inval; > struct xe_tlb_inval_fence; > struct xe_tile; > struct xe_gt; > +struct xe_guc; > struct xe_vma; > > struct xe_guc_page_reclaim_entry { > @@ -122,4 +123,6 @@ static inline void > xe_page_reclaim_entries_put(struct xe_guc_page_reclaim_entry > put_page(virt_to_page(entries)); > } > > +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, > u32 len); > + > #endif /* _XE_PAGE_RECLAIM_H_ */ ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func 2026-01-29 8:27 ` [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func Brian Nguyen 2026-01-29 21:40 ` Lin, Shuicheng 2026-02-23 22:45 ` Summers, Stuart @ 2026-02-23 22:51 ` Matthew Brost 2 siblings, 0 replies; 16+ messages in thread From: Matthew Brost @ 2026-02-23 22:51 UTC (permalink / raw) To: Brian Nguyen; +Cc: intel-xe, matthew.d.roper On Thu, Jan 29, 2026 at 08:27:58AM +0000, Brian Nguyen wrote: > Originally, page reclamation is handled by the same fence as tlb > invalidation and uses its seqno, so there was no reason to separate out > the handlers. However in hindsight, for readability, and possible > future changes, it seems more beneficial to move this all out to its own > function. > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> Reviewed-by: Matthew Brost <matthew.brost@intel.com> > --- > drivers/gpu/drm/xe/xe_guc_ct.c | 23 ++++++++--------------- > drivers/gpu/drm/xe/xe_page_reclaim.c | 20 ++++++++++++++++++++ > drivers/gpu/drm/xe/xe_page_reclaim.h | 3 +++ > 3 files changed, 31 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c > index dfbf76037b04..3d69314170f8 100644 > --- a/drivers/gpu/drm/xe/xe_guc_ct.c > +++ b/drivers/gpu/drm/xe/xe_guc_ct.c > @@ -31,6 +31,7 @@ > #include "xe_guc_submit.h" > #include "xe_guc_tlb_inval.h" > #include "xe_map.h" > +#include "xe_page_reclaim.h" > #include "xe_pm.h" > #include "xe_sriov_vf.h" > #include "xe_trace_guc.h" > @@ -1604,17 +1605,11 @@ static int process_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len) > ret = xe_guc_pagefault_handler(guc, payload, adj_len); > break; > case XE_GUC_ACTION_TLB_INVALIDATION_DONE: > - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > - /* > - * Page reclamation is an extension of TLB invalidation. Both > - * operations share the same seqno and fence. When either > - * action completes, we need to signal the corresponding > - * fence. Since the handling logic (lookup fence by seqno, > - * fence signalling) is identical, we use the same handler > - * for both G2H events. > - */ > ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len); > break; > + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > + ret = xe_guc_page_reclaim_done_handler(guc, payload, adj_len); > + break; > case XE_GUC_ACTION_GUC2PF_RELAY_FROM_VF: > ret = xe_guc_relay_process_guc2pf(&guc->relay, hxg, hxg_len); > break; > @@ -1822,15 +1817,13 @@ static void g2h_fast_path(struct xe_guc_ct *ct, u32 *msg, u32 len) > ret = xe_guc_pagefault_handler(guc, payload, adj_len); > break; > case XE_GUC_ACTION_TLB_INVALIDATION_DONE: > - case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > - /* > - * Seqno and fence handling of page reclamation and TLB > - * invalidation is identical, so we can use the same handler > - * for both actions. > - */ > __g2h_release_space(ct, len); > ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len); > break; > + case XE_GUC_ACTION_PAGE_RECLAMATION_DONE: > + __g2h_release_space(ct, len); > + ret = xe_guc_page_reclaim_done_handler(guc, payload, adj_len); > + break; > default: > xe_gt_warn(gt, "NOT_POSSIBLE"); > } > diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.c b/drivers/gpu/drm/xe/xe_page_reclaim.c > index e13c71a89da2..60b0fda59ce3 100644 > --- a/drivers/gpu/drm/xe/xe_page_reclaim.c > +++ b/drivers/gpu/drm/xe/xe_page_reclaim.c > @@ -11,6 +11,7 @@ > #include "xe_page_reclaim.h" > > #include "xe_gt_stats.h" > +#include "xe_guc_tlb_inval.h" > #include "xe_macros.h" > #include "xe_pat.h" > #include "xe_sa.h" > @@ -130,3 +131,22 @@ int xe_page_reclaim_list_alloc_entries(struct xe_page_reclaim_list *prl) > > return page ? 0 : -ENOMEM; > } > + > +/** > + * xe_guc_page_reclaim_done_handler() - Page reclaim done handler > + * @guc: guc > + * @msg: message indicating page reclamation done > + * @len: length of message > + * > + * Page reclamation is an extension of TLB invalidation. Both > + * operations share the same seqno and fence. When either > + * action completes, we need to signal the corresponding > + * fence. Since the handling logic is currently identical, this > + * function delegates to the TLB invalidation handler. > + * > + * Return: 0 on success, -EPROTO for malformed messages. > + */ > +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 len) > +{ > + return xe_guc_tlb_inval_done_handler(guc, msg, len); > +} > diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.h b/drivers/gpu/drm/xe/xe_page_reclaim.h > index 3dd103e37beb..0412611f3af7 100644 > --- a/drivers/gpu/drm/xe/xe_page_reclaim.h > +++ b/drivers/gpu/drm/xe/xe_page_reclaim.h > @@ -20,6 +20,7 @@ struct xe_tlb_inval; > struct xe_tlb_inval_fence; > struct xe_tile; > struct xe_gt; > +struct xe_guc; > struct xe_vma; > > struct xe_guc_page_reclaim_entry { > @@ -122,4 +123,6 @@ static inline void xe_page_reclaim_entries_put(struct xe_guc_page_reclaim_entry > put_page(virt_to_page(entries)); > } > > +int xe_guc_page_reclaim_done_handler(struct xe_guc *guc, u32 *msg, u32 len); > + > #endif /* _XE_PAGE_RECLAIM_H_ */ > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 16+ messages in thread
* ✓ CI.KUnit: success for series starting with [1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-01-29 8:27 [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation Brian Nguyen 2026-01-29 8:27 ` [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func Brian Nguyen @ 2026-01-29 9:14 ` Patchwork 2026-01-29 9:48 ` ✓ Xe.CI.BAT: " Patchwork ` (2 subsequent siblings) 4 siblings, 0 replies; 16+ messages in thread From: Patchwork @ 2026-01-29 9:14 UTC (permalink / raw) To: Brian Nguyen; +Cc: intel-xe == Series Details == Series: series starting with [1/2] drm/xe: Skip over non leaf pte for PRL generation URL : https://patchwork.freedesktop.org/series/160817/ State : success == Summary == + trap cleanup EXIT + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [09:13:13] Configuring KUnit Kernel ... Generating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [09:13:17] 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 [09:13:48] Starting KUnit Kernel (1/1)... [09:13:48] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [09:13:49] ================== guc_buf (11 subtests) =================== [09:13:49] [PASSED] test_smallest [09:13:49] [PASSED] test_largest [09:13:49] [PASSED] test_granular [09:13:49] [PASSED] test_unique [09:13:49] [PASSED] test_overlap [09:13:49] [PASSED] test_reusable [09:13:49] [PASSED] test_too_big [09:13:49] [PASSED] test_flush [09:13:49] [PASSED] test_lookup [09:13:49] [PASSED] test_data [09:13:49] [PASSED] test_class [09:13:49] ===================== [PASSED] guc_buf ===================== [09:13:49] =================== guc_dbm (7 subtests) =================== [09:13:49] [PASSED] test_empty [09:13:49] [PASSED] test_default [09:13:49] ======================== test_size ======================== [09:13:49] [PASSED] 4 [09:13:49] [PASSED] 8 [09:13:49] [PASSED] 32 [09:13:49] [PASSED] 256 [09:13:49] ==================== [PASSED] test_size ==================== [09:13:49] ======================= test_reuse ======================== [09:13:49] [PASSED] 4 [09:13:49] [PASSED] 8 [09:13:49] [PASSED] 32 [09:13:49] [PASSED] 256 [09:13:49] =================== [PASSED] test_reuse ==================== [09:13:49] =================== test_range_overlap ==================== [09:13:49] [PASSED] 4 [09:13:49] [PASSED] 8 [09:13:49] [PASSED] 32 [09:13:49] [PASSED] 256 [09:13:49] =============== [PASSED] test_range_overlap ================ [09:13:49] =================== test_range_compact ==================== [09:13:49] [PASSED] 4 [09:13:49] [PASSED] 8 [09:13:49] [PASSED] 32 [09:13:49] [PASSED] 256 [09:13:49] =============== [PASSED] test_range_compact ================ [09:13:49] ==================== test_range_spare ===================== [09:13:49] [PASSED] 4 [09:13:49] [PASSED] 8 [09:13:49] [PASSED] 32 [09:13:49] [PASSED] 256 [09:13:49] ================ [PASSED] test_range_spare ================= [09:13:49] ===================== [PASSED] guc_dbm ===================== [09:13:49] =================== guc_idm (6 subtests) =================== [09:13:49] [PASSED] bad_init [09:13:49] [PASSED] no_init [09:13:49] [PASSED] init_fini [09:13:49] [PASSED] check_used [09:13:49] [PASSED] check_quota [09:13:49] [PASSED] check_all [09:13:49] ===================== [PASSED] guc_idm ===================== [09:13:49] ================== no_relay (3 subtests) =================== [09:13:49] [PASSED] xe_drops_guc2pf_if_not_ready [09:13:49] [PASSED] xe_drops_guc2vf_if_not_ready [09:13:49] [PASSED] xe_rejects_send_if_not_ready [09:13:49] ==================== [PASSED] no_relay ===================== [09:13:49] ================== pf_relay (14 subtests) ================== [09:13:49] [PASSED] pf_rejects_guc2pf_too_short [09:13:49] [PASSED] pf_rejects_guc2pf_too_long [09:13:49] [PASSED] pf_rejects_guc2pf_no_payload [09:13:49] [PASSED] pf_fails_no_payload [09:13:49] [PASSED] pf_fails_bad_origin [09:13:49] [PASSED] pf_fails_bad_type [09:13:49] [PASSED] pf_txn_reports_error [09:13:49] [PASSED] pf_txn_sends_pf2guc [09:13:49] [PASSED] pf_sends_pf2guc [09:13:49] [SKIPPED] pf_loopback_nop [09:13:49] [SKIPPED] pf_loopback_echo [09:13:49] [SKIPPED] pf_loopback_fail [09:13:49] [SKIPPED] pf_loopback_busy [09:13:49] [SKIPPED] pf_loopback_retry [09:13:49] ==================== [PASSED] pf_relay ===================== [09:13:49] ================== vf_relay (3 subtests) =================== [09:13:49] [PASSED] vf_rejects_guc2vf_too_short [09:13:49] [PASSED] vf_rejects_guc2vf_too_long [09:13:49] [PASSED] vf_rejects_guc2vf_no_payload [09:13:49] ==================== [PASSED] vf_relay ===================== [09:13:49] ================ pf_gt_config (6 subtests) ================= [09:13:49] [PASSED] fair_contexts_1vf [09:13:49] [PASSED] fair_doorbells_1vf [09:13:49] [PASSED] fair_ggtt_1vf [09:13:49] ====================== fair_contexts ====================== [09:13:49] [PASSED] 1 VF [09:13:49] [PASSED] 2 VFs [09:13:49] [PASSED] 3 VFs [09:13:49] [PASSED] 4 VFs [09:13:49] [PASSED] 5 VFs [09:13:49] [PASSED] 6 VFs [09:13:49] [PASSED] 7 VFs [09:13:49] [PASSED] 8 VFs [09:13:49] [PASSED] 9 VFs [09:13:49] [PASSED] 10 VFs [09:13:49] [PASSED] 11 VFs [09:13:49] [PASSED] 12 VFs [09:13:49] [PASSED] 13 VFs [09:13:49] [PASSED] 14 VFs [09:13:49] [PASSED] 15 VFs [09:13:49] [PASSED] 16 VFs [09:13:49] [PASSED] 17 VFs [09:13:49] [PASSED] 18 VFs [09:13:49] [PASSED] 19 VFs [09:13:49] [PASSED] 20 VFs [09:13:49] [PASSED] 21 VFs [09:13:49] [PASSED] 22 VFs [09:13:49] [PASSED] 23 VFs [09:13:49] [PASSED] 24 VFs [09:13:49] [PASSED] 25 VFs [09:13:49] [PASSED] 26 VFs [09:13:49] [PASSED] 27 VFs [09:13:49] [PASSED] 28 VFs [09:13:49] [PASSED] 29 VFs [09:13:49] [PASSED] 30 VFs [09:13:49] [PASSED] 31 VFs [09:13:49] [PASSED] 32 VFs [09:13:49] [PASSED] 33 VFs [09:13:49] [PASSED] 34 VFs [09:13:49] [PASSED] 35 VFs [09:13:49] [PASSED] 36 VFs [09:13:49] [PASSED] 37 VFs [09:13:49] [PASSED] 38 VFs [09:13:49] [PASSED] 39 VFs [09:13:49] [PASSED] 40 VFs [09:13:49] [PASSED] 41 VFs [09:13:49] [PASSED] 42 VFs [09:13:49] [PASSED] 43 VFs [09:13:49] [PASSED] 44 VFs [09:13:49] [PASSED] 45 VFs [09:13:49] [PASSED] 46 VFs [09:13:49] [PASSED] 47 VFs [09:13:49] [PASSED] 48 VFs [09:13:49] [PASSED] 49 VFs [09:13:49] [PASSED] 50 VFs [09:13:49] [PASSED] 51 VFs [09:13:49] [PASSED] 52 VFs [09:13:49] [PASSED] 53 VFs [09:13:49] [PASSED] 54 VFs [09:13:49] [PASSED] 55 VFs [09:13:49] [PASSED] 56 VFs [09:13:49] [PASSED] 57 VFs [09:13:49] [PASSED] 58 VFs [09:13:49] [PASSED] 59 VFs [09:13:49] [PASSED] 60 VFs [09:13:49] [PASSED] 61 VFs [09:13:49] [PASSED] 62 VFs [09:13:49] [PASSED] 63 VFs [09:13:49] ================== [PASSED] fair_contexts ================== [09:13:49] ===================== fair_doorbells ====================== [09:13:49] [PASSED] 1 VF [09:13:49] [PASSED] 2 VFs [09:13:49] [PASSED] 3 VFs [09:13:49] [PASSED] 4 VFs [09:13:49] [PASSED] 5 VFs [09:13:49] [PASSED] 6 VFs [09:13:49] [PASSED] 7 VFs [09:13:49] [PASSED] 8 VFs [09:13:49] [PASSED] 9 VFs [09:13:49] [PASSED] 10 VFs [09:13:49] [PASSED] 11 VFs [09:13:49] [PASSED] 12 VFs [09:13:49] [PASSED] 13 VFs [09:13:49] [PASSED] 14 VFs [09:13:49] [PASSED] 15 VFs [09:13:49] [PASSED] 16 VFs [09:13:49] [PASSED] 17 VFs [09:13:49] [PASSED] 18 VFs [09:13:49] [PASSED] 19 VFs [09:13:49] [PASSED] 20 VFs [09:13:49] [PASSED] 21 VFs [09:13:49] [PASSED] 22 VFs [09:13:49] [PASSED] 23 VFs [09:13:49] [PASSED] 24 VFs [09:13:49] [PASSED] 25 VFs [09:13:49] [PASSED] 26 VFs [09:13:49] [PASSED] 27 VFs [09:13:49] [PASSED] 28 VFs [09:13:49] [PASSED] 29 VFs [09:13:49] [PASSED] 30 VFs [09:13:49] [PASSED] 31 VFs [09:13:49] [PASSED] 32 VFs [09:13:49] [PASSED] 33 VFs [09:13:49] [PASSED] 34 VFs [09:13:49] [PASSED] 35 VFs [09:13:49] [PASSED] 36 VFs [09:13:49] [PASSED] 37 VFs [09:13:49] [PASSED] 38 VFs [09:13:49] [PASSED] 39 VFs [09:13:49] [PASSED] 40 VFs [09:13:49] [PASSED] 41 VFs [09:13:49] [PASSED] 42 VFs [09:13:49] [PASSED] 43 VFs [09:13:49] [PASSED] 44 VFs [09:13:49] [PASSED] 45 VFs [09:13:49] [PASSED] 46 VFs [09:13:49] [PASSED] 47 VFs [09:13:49] [PASSED] 48 VFs [09:13:49] [PASSED] 49 VFs [09:13:49] [PASSED] 50 VFs [09:13:49] [PASSED] 51 VFs [09:13:49] [PASSED] 52 VFs [09:13:49] [PASSED] 53 VFs [09:13:49] [PASSED] 54 VFs [09:13:49] [PASSED] 55 VFs [09:13:49] [PASSED] 56 VFs [09:13:49] [PASSED] 57 VFs [09:13:49] [PASSED] 58 VFs [09:13:49] [PASSED] 59 VFs [09:13:49] [PASSED] 60 VFs [09:13:49] [PASSED] 61 VFs [09:13:49] [PASSED] 62 VFs [09:13:49] [PASSED] 63 VFs [09:13:49] ================= [PASSED] fair_doorbells ================== [09:13:49] ======================== fair_ggtt ======================== [09:13:49] [PASSED] 1 VF [09:13:49] [PASSED] 2 VFs [09:13:49] [PASSED] 3 VFs [09:13:49] [PASSED] 4 VFs [09:13:49] [PASSED] 5 VFs [09:13:49] [PASSED] 6 VFs [09:13:49] [PASSED] 7 VFs [09:13:49] [PASSED] 8 VFs [09:13:49] [PASSED] 9 VFs [09:13:49] [PASSED] 10 VFs [09:13:49] [PASSED] 11 VFs [09:13:49] [PASSED] 12 VFs [09:13:49] [PASSED] 13 VFs [09:13:49] [PASSED] 14 VFs [09:13:49] [PASSED] 15 VFs [09:13:49] [PASSED] 16 VFs [09:13:49] [PASSED] 17 VFs [09:13:49] [PASSED] 18 VFs [09:13:49] [PASSED] 19 VFs [09:13:49] [PASSED] 20 VFs [09:13:49] [PASSED] 21 VFs [09:13:49] [PASSED] 22 VFs [09:13:49] [PASSED] 23 VFs [09:13:49] [PASSED] 24 VFs [09:13:49] [PASSED] 25 VFs [09:13:49] [PASSED] 26 VFs [09:13:49] [PASSED] 27 VFs [09:13:49] [PASSED] 28 VFs [09:13:49] [PASSED] 29 VFs [09:13:49] [PASSED] 30 VFs [09:13:49] [PASSED] 31 VFs [09:13:49] [PASSED] 32 VFs [09:13:49] [PASSED] 33 VFs [09:13:49] [PASSED] 34 VFs [09:13:49] [PASSED] 35 VFs [09:13:49] [PASSED] 36 VFs [09:13:49] [PASSED] 37 VFs [09:13:49] [PASSED] 38 VFs [09:13:49] [PASSED] 39 VFs [09:13:49] [PASSED] 40 VFs [09:13:49] [PASSED] 41 VFs [09:13:49] [PASSED] 42 VFs [09:13:49] [PASSED] 43 VFs [09:13:49] [PASSED] 44 VFs [09:13:49] [PASSED] 45 VFs [09:13:49] [PASSED] 46 VFs [09:13:49] [PASSED] 47 VFs [09:13:49] [PASSED] 48 VFs [09:13:49] [PASSED] 49 VFs [09:13:49] [PASSED] 50 VFs [09:13:49] [PASSED] 51 VFs [09:13:49] [PASSED] 52 VFs [09:13:49] [PASSED] 53 VFs [09:13:49] [PASSED] 54 VFs [09:13:49] [PASSED] 55 VFs [09:13:49] [PASSED] 56 VFs [09:13:49] [PASSED] 57 VFs [09:13:49] [PASSED] 58 VFs [09:13:49] [PASSED] 59 VFs [09:13:49] [PASSED] 60 VFs [09:13:49] [PASSED] 61 VFs [09:13:49] [PASSED] 62 VFs [09:13:49] [PASSED] 63 VFs [09:13:49] ==================== [PASSED] fair_ggtt ==================== [09:13:49] ================== [PASSED] pf_gt_config =================== [09:13:49] ===================== lmtt (1 subtest) ===================== [09:13:49] ======================== test_ops ========================= [09:13:49] [PASSED] 2-level [09:13:49] [PASSED] multi-level [09:13:49] ==================== [PASSED] test_ops ===================== [09:13:49] ====================== [PASSED] lmtt ======================= [09:13:49] ================= pf_service (11 subtests) ================= [09:13:49] [PASSED] pf_negotiate_any [09:13:49] [PASSED] pf_negotiate_base_match [09:13:49] [PASSED] pf_negotiate_base_newer [09:13:49] [PASSED] pf_negotiate_base_next [09:13:49] [SKIPPED] pf_negotiate_base_older [09:13:49] [PASSED] pf_negotiate_base_prev [09:13:49] [PASSED] pf_negotiate_latest_match [09:13:49] [PASSED] pf_negotiate_latest_newer [09:13:49] [PASSED] pf_negotiate_latest_next [09:13:49] [SKIPPED] pf_negotiate_latest_older [09:13:49] [SKIPPED] pf_negotiate_latest_prev [09:13:49] =================== [PASSED] pf_service ==================== [09:13:49] ================= xe_guc_g2g (2 subtests) ================== [09:13:49] ============== xe_live_guc_g2g_kunit_default ============== [09:13:49] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ========== [09:13:49] ============== xe_live_guc_g2g_kunit_allmem =============== [09:13:49] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ========== [09:13:49] =================== [SKIPPED] xe_guc_g2g =================== [09:13:49] =================== xe_mocs (2 subtests) =================== [09:13:49] ================ xe_live_mocs_kernel_kunit ================ [09:13:49] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============ [09:13:49] ================ xe_live_mocs_reset_kunit ================= [09:13:49] ============ [SKIPPED] xe_live_mocs_reset_kunit ============ [09:13:49] ==================== [SKIPPED] xe_mocs ===================== [09:13:49] ================= xe_migrate (2 subtests) ================== [09:13:49] ================= xe_migrate_sanity_kunit ================= [09:13:49] ============ [SKIPPED] xe_migrate_sanity_kunit ============= [09:13:49] ================== xe_validate_ccs_kunit ================== [09:13:49] ============= [SKIPPED] xe_validate_ccs_kunit ============== [09:13:49] =================== [SKIPPED] xe_migrate =================== [09:13:49] ================== xe_dma_buf (1 subtest) ================== [09:13:49] ==================== xe_dma_buf_kunit ===================== [09:13:49] ================ [SKIPPED] xe_dma_buf_kunit ================ [09:13:49] =================== [SKIPPED] xe_dma_buf =================== [09:13:49] ================= xe_bo_shrink (1 subtest) ================= [09:13:49] =================== xe_bo_shrink_kunit ==================== [09:13:49] =============== [SKIPPED] xe_bo_shrink_kunit =============== [09:13:49] ================== [SKIPPED] xe_bo_shrink ================== [09:13:49] ==================== xe_bo (2 subtests) ==================== [09:13:49] ================== xe_ccs_migrate_kunit =================== [09:13:49] ============== [SKIPPED] xe_ccs_migrate_kunit ============== [09:13:49] ==================== xe_bo_evict_kunit ==================== [09:13:49] =============== [SKIPPED] xe_bo_evict_kunit ================ [09:13:49] ===================== [SKIPPED] xe_bo ====================== [09:13:49] ==================== args (13 subtests) ==================== [09:13:49] [PASSED] count_args_test [09:13:49] [PASSED] call_args_example [09:13:49] [PASSED] call_args_test [09:13:49] [PASSED] drop_first_arg_example [09:13:49] [PASSED] drop_first_arg_test [09:13:49] [PASSED] first_arg_example [09:13:49] [PASSED] first_arg_test [09:13:49] [PASSED] last_arg_example [09:13:49] [PASSED] last_arg_test [09:13:49] [PASSED] pick_arg_example [09:13:49] [PASSED] if_args_example [09:13:49] [PASSED] if_args_test [09:13:49] [PASSED] sep_comma_example [09:13:49] ====================== [PASSED] args ======================= [09:13:49] =================== xe_pci (3 subtests) ==================== [09:13:49] ==================== check_graphics_ip ==================== [09:13:49] [PASSED] 12.00 Xe_LP [09:13:49] [PASSED] 12.10 Xe_LP+ [09:13:49] [PASSED] 12.55 Xe_HPG [09:13:49] [PASSED] 12.60 Xe_HPC [09:13:49] [PASSED] 12.70 Xe_LPG [09:13:49] [PASSED] 12.71 Xe_LPG [09:13:49] [PASSED] 12.74 Xe_LPG+ [09:13:49] [PASSED] 20.01 Xe2_HPG [09:13:49] [PASSED] 20.02 Xe2_HPG [09:13:49] [PASSED] 20.04 Xe2_LPG [09:13:49] [PASSED] 30.00 Xe3_LPG [09:13:49] [PASSED] 30.01 Xe3_LPG [09:13:49] [PASSED] 30.03 Xe3_LPG [09:13:49] [PASSED] 30.04 Xe3_LPG [09:13:49] [PASSED] 30.05 Xe3_LPG [09:13:49] [PASSED] 35.11 Xe3p_XPC [09:13:49] ================ [PASSED] check_graphics_ip ================ [09:13:49] ===================== check_media_ip ====================== [09:13:49] [PASSED] 12.00 Xe_M [09:13:49] [PASSED] 12.55 Xe_HPM [09:13:49] [PASSED] 13.00 Xe_LPM+ [09:13:49] [PASSED] 13.01 Xe2_HPM [09:13:49] [PASSED] 20.00 Xe2_LPM [09:13:49] [PASSED] 30.00 Xe3_LPM [09:13:49] [PASSED] 30.02 Xe3_LPM [09:13:49] [PASSED] 35.00 Xe3p_LPM [09:13:49] [PASSED] 35.03 Xe3p_HPM [09:13:49] ================= [PASSED] check_media_ip ================== [09:13:49] =================== check_platform_desc =================== [09:13:49] [PASSED] 0x9A60 (TIGERLAKE) [09:13:49] [PASSED] 0x9A68 (TIGERLAKE) [09:13:49] [PASSED] 0x9A70 (TIGERLAKE) [09:13:49] [PASSED] 0x9A40 (TIGERLAKE) [09:13:49] [PASSED] 0x9A49 (TIGERLAKE) [09:13:49] [PASSED] 0x9A59 (TIGERLAKE) [09:13:49] [PASSED] 0x9A78 (TIGERLAKE) [09:13:49] [PASSED] 0x9AC0 (TIGERLAKE) [09:13:49] [PASSED] 0x9AC9 (TIGERLAKE) [09:13:49] [PASSED] 0x9AD9 (TIGERLAKE) [09:13:49] [PASSED] 0x9AF8 (TIGERLAKE) [09:13:49] [PASSED] 0x4C80 (ROCKETLAKE) [09:13:49] [PASSED] 0x4C8A (ROCKETLAKE) [09:13:49] [PASSED] 0x4C8B (ROCKETLAKE) [09:13:49] [PASSED] 0x4C8C (ROCKETLAKE) [09:13:49] [PASSED] 0x4C90 (ROCKETLAKE) [09:13:49] [PASSED] 0x4C9A (ROCKETLAKE) [09:13:49] [PASSED] 0x4680 (ALDERLAKE_S) [09:13:49] [PASSED] 0x4682 (ALDERLAKE_S) [09:13:49] [PASSED] 0x4688 (ALDERLAKE_S) [09:13:49] [PASSED] 0x468A (ALDERLAKE_S) [09:13:49] [PASSED] 0x468B (ALDERLAKE_S) [09:13:49] [PASSED] 0x4690 (ALDERLAKE_S) [09:13:49] [PASSED] 0x4692 (ALDERLAKE_S) [09:13:49] [PASSED] 0x4693 (ALDERLAKE_S) [09:13:49] [PASSED] 0x46A0 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46A1 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46A2 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46A3 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46A6 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46A8 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46AA (ALDERLAKE_P) [09:13:49] [PASSED] 0x462A (ALDERLAKE_P) [09:13:49] [PASSED] 0x4626 (ALDERLAKE_P) [09:13:49] [PASSED] 0x4628 (ALDERLAKE_P) stty: 'standard input': Inappropriate ioctl for device [09:13:49] [PASSED] 0x46B0 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46B1 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46B2 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46B3 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46C0 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46C1 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46C2 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46C3 (ALDERLAKE_P) [09:13:49] [PASSED] 0x46D0 (ALDERLAKE_N) [09:13:49] [PASSED] 0x46D1 (ALDERLAKE_N) [09:13:49] [PASSED] 0x46D2 (ALDERLAKE_N) [09:13:49] [PASSED] 0x46D3 (ALDERLAKE_N) [09:13:49] [PASSED] 0x46D4 (ALDERLAKE_N) [09:13:49] [PASSED] 0xA721 (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7A1 (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7A9 (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7AC (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7AD (ALDERLAKE_P) [09:13:49] [PASSED] 0xA720 (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7A0 (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7A8 (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7AA (ALDERLAKE_P) [09:13:49] [PASSED] 0xA7AB (ALDERLAKE_P) [09:13:49] [PASSED] 0xA780 (ALDERLAKE_S) [09:13:49] [PASSED] 0xA781 (ALDERLAKE_S) [09:13:49] [PASSED] 0xA782 (ALDERLAKE_S) [09:13:49] [PASSED] 0xA783 (ALDERLAKE_S) [09:13:49] [PASSED] 0xA788 (ALDERLAKE_S) [09:13:49] [PASSED] 0xA789 (ALDERLAKE_S) [09:13:49] [PASSED] 0xA78A (ALDERLAKE_S) [09:13:49] [PASSED] 0xA78B (ALDERLAKE_S) [09:13:49] [PASSED] 0x4905 (DG1) [09:13:49] [PASSED] 0x4906 (DG1) [09:13:49] [PASSED] 0x4907 (DG1) [09:13:49] [PASSED] 0x4908 (DG1) [09:13:49] [PASSED] 0x4909 (DG1) [09:13:49] [PASSED] 0x56C0 (DG2) [09:13:49] [PASSED] 0x56C2 (DG2) [09:13:49] [PASSED] 0x56C1 (DG2) [09:13:49] [PASSED] 0x7D51 (METEORLAKE) [09:13:49] [PASSED] 0x7DD1 (METEORLAKE) [09:13:49] [PASSED] 0x7D41 (METEORLAKE) [09:13:49] [PASSED] 0x7D67 (METEORLAKE) [09:13:49] [PASSED] 0xB640 (METEORLAKE) [09:13:49] [PASSED] 0x56A0 (DG2) [09:13:49] [PASSED] 0x56A1 (DG2) [09:13:49] [PASSED] 0x56A2 (DG2) [09:13:49] [PASSED] 0x56BE (DG2) [09:13:49] [PASSED] 0x56BF (DG2) [09:13:49] [PASSED] 0x5690 (DG2) [09:13:49] [PASSED] 0x5691 (DG2) [09:13:49] [PASSED] 0x5692 (DG2) [09:13:49] [PASSED] 0x56A5 (DG2) [09:13:49] [PASSED] 0x56A6 (DG2) [09:13:49] [PASSED] 0x56B0 (DG2) [09:13:49] [PASSED] 0x56B1 (DG2) [09:13:49] [PASSED] 0x56BA (DG2) [09:13:49] [PASSED] 0x56BB (DG2) [09:13:49] [PASSED] 0x56BC (DG2) [09:13:49] [PASSED] 0x56BD (DG2) [09:13:49] [PASSED] 0x5693 (DG2) [09:13:49] [PASSED] 0x5694 (DG2) [09:13:49] [PASSED] 0x5695 (DG2) [09:13:49] [PASSED] 0x56A3 (DG2) [09:13:49] [PASSED] 0x56A4 (DG2) [09:13:49] [PASSED] 0x56B2 (DG2) [09:13:49] [PASSED] 0x56B3 (DG2) [09:13:49] [PASSED] 0x5696 (DG2) [09:13:49] [PASSED] 0x5697 (DG2) [09:13:49] [PASSED] 0xB69 (PVC) [09:13:49] [PASSED] 0xB6E (PVC) [09:13:49] [PASSED] 0xBD4 (PVC) [09:13:49] [PASSED] 0xBD5 (PVC) [09:13:49] [PASSED] 0xBD6 (PVC) [09:13:49] [PASSED] 0xBD7 (PVC) [09:13:49] [PASSED] 0xBD8 (PVC) [09:13:49] [PASSED] 0xBD9 (PVC) [09:13:49] [PASSED] 0xBDA (PVC) [09:13:49] [PASSED] 0xBDB (PVC) [09:13:49] [PASSED] 0xBE0 (PVC) [09:13:49] [PASSED] 0xBE1 (PVC) [09:13:49] [PASSED] 0xBE5 (PVC) [09:13:49] [PASSED] 0x7D40 (METEORLAKE) [09:13:49] [PASSED] 0x7D45 (METEORLAKE) [09:13:49] [PASSED] 0x7D55 (METEORLAKE) [09:13:49] [PASSED] 0x7D60 (METEORLAKE) [09:13:49] [PASSED] 0x7DD5 (METEORLAKE) [09:13:49] [PASSED] 0x6420 (LUNARLAKE) [09:13:49] [PASSED] 0x64A0 (LUNARLAKE) [09:13:49] [PASSED] 0x64B0 (LUNARLAKE) [09:13:49] [PASSED] 0xE202 (BATTLEMAGE) [09:13:49] [PASSED] 0xE209 (BATTLEMAGE) [09:13:49] [PASSED] 0xE20B (BATTLEMAGE) [09:13:49] [PASSED] 0xE20C (BATTLEMAGE) [09:13:49] [PASSED] 0xE20D (BATTLEMAGE) [09:13:49] [PASSED] 0xE210 (BATTLEMAGE) [09:13:49] [PASSED] 0xE211 (BATTLEMAGE) [09:13:49] [PASSED] 0xE212 (BATTLEMAGE) [09:13:49] [PASSED] 0xE216 (BATTLEMAGE) [09:13:49] [PASSED] 0xE220 (BATTLEMAGE) [09:13:49] [PASSED] 0xE221 (BATTLEMAGE) [09:13:49] [PASSED] 0xE222 (BATTLEMAGE) [09:13:49] [PASSED] 0xE223 (BATTLEMAGE) [09:13:49] [PASSED] 0xB080 (PANTHERLAKE) [09:13:49] [PASSED] 0xB081 (PANTHERLAKE) [09:13:49] [PASSED] 0xB082 (PANTHERLAKE) [09:13:49] [PASSED] 0xB083 (PANTHERLAKE) [09:13:49] [PASSED] 0xB084 (PANTHERLAKE) [09:13:49] [PASSED] 0xB085 (PANTHERLAKE) [09:13:49] [PASSED] 0xB086 (PANTHERLAKE) [09:13:49] [PASSED] 0xB087 (PANTHERLAKE) [09:13:49] [PASSED] 0xB08F (PANTHERLAKE) [09:13:49] [PASSED] 0xB090 (PANTHERLAKE) [09:13:49] [PASSED] 0xB0A0 (PANTHERLAKE) [09:13:49] [PASSED] 0xB0B0 (PANTHERLAKE) [09:13:49] [PASSED] 0xFD80 (PANTHERLAKE) [09:13:49] [PASSED] 0xFD81 (PANTHERLAKE) [09:13:49] [PASSED] 0xD740 (NOVALAKE_S) [09:13:49] [PASSED] 0xD741 (NOVALAKE_S) [09:13:49] [PASSED] 0xD742 (NOVALAKE_S) [09:13:49] [PASSED] 0xD743 (NOVALAKE_S) [09:13:49] [PASSED] 0xD744 (NOVALAKE_S) [09:13:49] [PASSED] 0xD745 (NOVALAKE_S) [09:13:49] [PASSED] 0x674C (CRESCENTISLAND) [09:13:49] =============== [PASSED] check_platform_desc =============== [09:13:49] ===================== [PASSED] xe_pci ====================== [09:13:49] =================== xe_rtp (2 subtests) ==================== [09:13:49] =============== xe_rtp_process_to_sr_tests ================ [09:13:49] [PASSED] coalesce-same-reg [09:13:49] [PASSED] no-match-no-add [09:13:49] [PASSED] match-or [09:13:49] [PASSED] match-or-xfail [09:13:49] [PASSED] no-match-no-add-multiple-rules [09:13:49] [PASSED] two-regs-two-entries [09:13:49] [PASSED] clr-one-set-other [09:13:49] [PASSED] set-field [09:13:49] [PASSED] conflict-duplicate [09:13:49] [PASSED] conflict-not-disjoint [09:13:49] [PASSED] conflict-reg-type [09:13:49] =========== [PASSED] xe_rtp_process_to_sr_tests ============ [09:13:49] ================== xe_rtp_process_tests =================== [09:13:49] [PASSED] active1 [09:13:49] [PASSED] active2 [09:13:49] [PASSED] active-inactive [09:13:49] [PASSED] inactive-active [09:13:49] [PASSED] inactive-1st_or_active-inactive [09:13:49] [PASSED] inactive-2nd_or_active-inactive [09:13:49] [PASSED] inactive-last_or_active-inactive [09:13:49] [PASSED] inactive-no_or_active-inactive [09:13:49] ============== [PASSED] xe_rtp_process_tests =============== [09:13:49] ===================== [PASSED] xe_rtp ====================== [09:13:49] ==================== xe_wa (1 subtest) ===================== [09:13:49] ======================== xe_wa_gt ========================= [09:13:49] [PASSED] TIGERLAKE B0 [09:13:49] [PASSED] DG1 A0 [09:13:49] [PASSED] DG1 B0 [09:13:49] [PASSED] ALDERLAKE_S A0 [09:13:49] [PASSED] ALDERLAKE_S B0 [09:13:49] [PASSED] ALDERLAKE_S C0 [09:13:49] [PASSED] ALDERLAKE_S D0 [09:13:49] [PASSED] ALDERLAKE_P A0 [09:13:49] [PASSED] ALDERLAKE_P B0 [09:13:49] [PASSED] ALDERLAKE_P C0 [09:13:49] [PASSED] ALDERLAKE_S RPLS D0 [09:13:49] [PASSED] ALDERLAKE_P RPLU E0 [09:13:49] [PASSED] DG2 G10 C0 [09:13:49] [PASSED] DG2 G11 B1 [09:13:49] [PASSED] DG2 G12 A1 [09:13:49] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0 [09:13:49] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0 [09:13:49] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0 [09:13:49] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0 [09:13:49] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0 [09:13:49] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1 [09:13:49] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0 [09:13:49] ==================== [PASSED] xe_wa_gt ===================== [09:13:49] ====================== [PASSED] xe_wa ====================== [09:13:49] ============================================================ [09:13:49] Testing complete. Ran 512 tests: passed: 494, skipped: 18 [09:13:49] Elapsed time: 36.320s total, 4.233s configuring, 31.571s building, 0.473s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [09:13:49] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [09:13:51] 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 [09:14:16] Starting KUnit Kernel (1/1)... [09:14:16] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [09:14:16] ============ drm_test_pick_cmdline (2 subtests) ============ [09:14:16] [PASSED] drm_test_pick_cmdline_res_1920_1080_60 [09:14:16] =============== drm_test_pick_cmdline_named =============== [09:14:16] [PASSED] NTSC [09:14:16] [PASSED] NTSC-J [09:14:16] [PASSED] PAL [09:14:16] [PASSED] PAL-M [09:14:16] =========== [PASSED] drm_test_pick_cmdline_named =========== [09:14:16] ============== [PASSED] drm_test_pick_cmdline ============== [09:14:16] == drm_test_atomic_get_connector_for_encoder (1 subtest) === [09:14:16] [PASSED] drm_test_drm_atomic_get_connector_for_encoder [09:14:16] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ==== [09:14:16] =========== drm_validate_clone_mode (2 subtests) =========== [09:14:16] ============== drm_test_check_in_clone_mode =============== [09:14:16] [PASSED] in_clone_mode [09:14:16] [PASSED] not_in_clone_mode [09:14:16] ========== [PASSED] drm_test_check_in_clone_mode =========== [09:14:16] =============== drm_test_check_valid_clones =============== [09:14:16] [PASSED] not_in_clone_mode [09:14:16] [PASSED] valid_clone [09:14:16] [PASSED] invalid_clone [09:14:16] =========== [PASSED] drm_test_check_valid_clones =========== [09:14:16] ============= [PASSED] drm_validate_clone_mode ============= [09:14:16] ============= drm_validate_modeset (1 subtest) ============= [09:14:16] [PASSED] drm_test_check_connector_changed_modeset [09:14:16] ============== [PASSED] drm_validate_modeset =============== [09:14:16] ====== drm_test_bridge_get_current_state (2 subtests) ====== [09:14:16] [PASSED] drm_test_drm_bridge_get_current_state_atomic [09:14:16] [PASSED] drm_test_drm_bridge_get_current_state_legacy [09:14:16] ======== [PASSED] drm_test_bridge_get_current_state ======== [09:14:16] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ====== [09:14:16] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic [09:14:16] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled [09:14:16] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy [09:14:16] ======== [PASSED] drm_test_bridge_helper_reset_crtc ======== [09:14:16] ============== drm_bridge_alloc (2 subtests) =============== [09:14:16] [PASSED] drm_test_drm_bridge_alloc_basic [09:14:16] [PASSED] drm_test_drm_bridge_alloc_get_put [09:14:16] ================ [PASSED] drm_bridge_alloc ================= [09:14:16] ================== drm_buddy (9 subtests) ================== [09:14:16] [PASSED] drm_test_buddy_alloc_limit [09:14:16] [PASSED] drm_test_buddy_alloc_optimistic [09:14:16] [PASSED] drm_test_buddy_alloc_pessimistic [09:14:16] [PASSED] drm_test_buddy_alloc_pathological [09:14:16] [PASSED] drm_test_buddy_alloc_contiguous [09:14:16] [PASSED] drm_test_buddy_alloc_clear [09:14:16] [PASSED] drm_test_buddy_alloc_range_bias [09:14:16] [PASSED] drm_test_buddy_fragmentation_performance [09:14:16] [PASSED] drm_test_buddy_alloc_exceeds_max_order [09:14:16] ==================== [PASSED] drm_buddy ==================== [09:14:16] ============= drm_cmdline_parser (40 subtests) ============= [09:14:16] [PASSED] drm_test_cmdline_force_d_only [09:14:16] [PASSED] drm_test_cmdline_force_D_only_dvi [09:14:16] [PASSED] drm_test_cmdline_force_D_only_hdmi [09:14:16] [PASSED] drm_test_cmdline_force_D_only_not_digital [09:14:16] [PASSED] drm_test_cmdline_force_e_only [09:14:16] [PASSED] drm_test_cmdline_res [09:14:16] [PASSED] drm_test_cmdline_res_vesa [09:14:16] [PASSED] drm_test_cmdline_res_vesa_rblank [09:14:16] [PASSED] drm_test_cmdline_res_rblank [09:14:16] [PASSED] drm_test_cmdline_res_bpp [09:14:16] [PASSED] drm_test_cmdline_res_refresh [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh_margins [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital [09:14:16] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on [09:14:16] [PASSED] drm_test_cmdline_res_margins_force_on [09:14:16] [PASSED] drm_test_cmdline_res_vesa_margins [09:14:16] [PASSED] drm_test_cmdline_name [09:14:16] [PASSED] drm_test_cmdline_name_bpp [09:14:16] [PASSED] drm_test_cmdline_name_option [09:14:16] [PASSED] drm_test_cmdline_name_bpp_option [09:14:16] [PASSED] drm_test_cmdline_rotate_0 [09:14:16] [PASSED] drm_test_cmdline_rotate_90 [09:14:16] [PASSED] drm_test_cmdline_rotate_180 [09:14:16] [PASSED] drm_test_cmdline_rotate_270 [09:14:16] [PASSED] drm_test_cmdline_hmirror [09:14:16] [PASSED] drm_test_cmdline_vmirror [09:14:16] [PASSED] drm_test_cmdline_margin_options [09:14:16] [PASSED] drm_test_cmdline_multiple_options [09:14:16] [PASSED] drm_test_cmdline_bpp_extra_and_option [09:14:16] [PASSED] drm_test_cmdline_extra_and_option [09:14:16] [PASSED] drm_test_cmdline_freestanding_options [09:14:16] [PASSED] drm_test_cmdline_freestanding_force_e_and_options [09:14:16] [PASSED] drm_test_cmdline_panel_orientation [09:14:16] ================ drm_test_cmdline_invalid ================= [09:14:16] [PASSED] margin_only [09:14:16] [PASSED] interlace_only [09:14:16] [PASSED] res_missing_x [09:14:16] [PASSED] res_missing_y [09:14:16] [PASSED] res_bad_y [09:14:16] [PASSED] res_missing_y_bpp [09:14:16] [PASSED] res_bad_bpp [09:14:16] [PASSED] res_bad_refresh [09:14:16] [PASSED] res_bpp_refresh_force_on_off [09:14:16] [PASSED] res_invalid_mode [09:14:16] [PASSED] res_bpp_wrong_place_mode [09:14:16] [PASSED] name_bpp_refresh [09:14:16] [PASSED] name_refresh [09:14:16] [PASSED] name_refresh_wrong_mode [09:14:16] [PASSED] name_refresh_invalid_mode [09:14:16] [PASSED] rotate_multiple [09:14:16] [PASSED] rotate_invalid_val [09:14:16] [PASSED] rotate_truncated [09:14:16] [PASSED] invalid_option [09:14:16] [PASSED] invalid_tv_option [09:14:16] [PASSED] truncated_tv_option [09:14:16] ============ [PASSED] drm_test_cmdline_invalid ============= [09:14:16] =============== drm_test_cmdline_tv_options =============== [09:14:16] [PASSED] NTSC [09:14:16] [PASSED] NTSC_443 [09:14:16] [PASSED] NTSC_J [09:14:16] [PASSED] PAL [09:14:16] [PASSED] PAL_M [09:14:16] [PASSED] PAL_N [09:14:16] [PASSED] SECAM [09:14:16] [PASSED] MONO_525 [09:14:16] [PASSED] MONO_625 [09:14:16] =========== [PASSED] drm_test_cmdline_tv_options =========== [09:14:16] =============== [PASSED] drm_cmdline_parser ================ [09:14:16] ========== drmm_connector_hdmi_init (20 subtests) ========== [09:14:16] [PASSED] drm_test_connector_hdmi_init_valid [09:14:16] [PASSED] drm_test_connector_hdmi_init_bpc_8 [09:14:16] [PASSED] drm_test_connector_hdmi_init_bpc_10 [09:14:16] [PASSED] drm_test_connector_hdmi_init_bpc_12 [09:14:16] [PASSED] drm_test_connector_hdmi_init_bpc_invalid [09:14:16] [PASSED] drm_test_connector_hdmi_init_bpc_null [09:14:16] [PASSED] drm_test_connector_hdmi_init_formats_empty [09:14:16] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb [09:14:16] === drm_test_connector_hdmi_init_formats_yuv420_allowed === [09:14:16] [PASSED] supported_formats=0x9 yuv420_allowed=1 [09:14:16] [PASSED] supported_formats=0x9 yuv420_allowed=0 [09:14:16] [PASSED] supported_formats=0x3 yuv420_allowed=1 [09:14:16] [PASSED] supported_formats=0x3 yuv420_allowed=0 [09:14:16] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed === [09:14:16] [PASSED] drm_test_connector_hdmi_init_null_ddc [09:14:16] [PASSED] drm_test_connector_hdmi_init_null_product [09:14:16] [PASSED] drm_test_connector_hdmi_init_null_vendor [09:14:16] [PASSED] drm_test_connector_hdmi_init_product_length_exact [09:14:16] [PASSED] drm_test_connector_hdmi_init_product_length_too_long [09:14:16] [PASSED] drm_test_connector_hdmi_init_product_valid [09:14:16] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact [09:14:16] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long [09:14:16] [PASSED] drm_test_connector_hdmi_init_vendor_valid [09:14:16] ========= drm_test_connector_hdmi_init_type_valid ========= [09:14:16] [PASSED] HDMI-A [09:14:16] [PASSED] HDMI-B [09:14:16] ===== [PASSED] drm_test_connector_hdmi_init_type_valid ===== [09:14:16] ======== drm_test_connector_hdmi_init_type_invalid ======== [09:14:16] [PASSED] Unknown [09:14:16] [PASSED] VGA [09:14:16] [PASSED] DVI-I [09:14:16] [PASSED] DVI-D [09:14:16] [PASSED] DVI-A [09:14:16] [PASSED] Composite [09:14:16] [PASSED] SVIDEO [09:14:16] [PASSED] LVDS [09:14:16] [PASSED] Component [09:14:16] [PASSED] DIN [09:14:16] [PASSED] DP [09:14:16] [PASSED] TV [09:14:16] [PASSED] eDP [09:14:16] [PASSED] Virtual [09:14:16] [PASSED] DSI [09:14:16] [PASSED] DPI [09:14:16] [PASSED] Writeback [09:14:16] [PASSED] SPI [09:14:16] [PASSED] USB [09:14:16] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ==== [09:14:16] ============ [PASSED] drmm_connector_hdmi_init ============= [09:14:16] ============= drmm_connector_init (3 subtests) ============= [09:14:16] [PASSED] drm_test_drmm_connector_init [09:14:16] [PASSED] drm_test_drmm_connector_init_null_ddc [09:14:16] ========= drm_test_drmm_connector_init_type_valid ========= [09:14:16] [PASSED] Unknown [09:14:16] [PASSED] VGA [09:14:16] [PASSED] DVI-I [09:14:16] [PASSED] DVI-D [09:14:16] [PASSED] DVI-A [09:14:16] [PASSED] Composite [09:14:16] [PASSED] SVIDEO [09:14:16] [PASSED] LVDS [09:14:16] [PASSED] Component [09:14:16] [PASSED] DIN [09:14:16] [PASSED] DP [09:14:16] [PASSED] HDMI-A [09:14:16] [PASSED] HDMI-B [09:14:16] [PASSED] TV [09:14:16] [PASSED] eDP [09:14:16] [PASSED] Virtual [09:14:16] [PASSED] DSI [09:14:16] [PASSED] DPI [09:14:16] [PASSED] Writeback [09:14:16] [PASSED] SPI [09:14:16] [PASSED] USB [09:14:16] ===== [PASSED] drm_test_drmm_connector_init_type_valid ===== [09:14:16] =============== [PASSED] drmm_connector_init =============== [09:14:16] ========= drm_connector_dynamic_init (6 subtests) ========== [09:14:16] [PASSED] drm_test_drm_connector_dynamic_init [09:14:16] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc [09:14:16] [PASSED] drm_test_drm_connector_dynamic_init_not_added [09:14:16] [PASSED] drm_test_drm_connector_dynamic_init_properties [09:14:16] ===== drm_test_drm_connector_dynamic_init_type_valid ====== [09:14:16] [PASSED] Unknown [09:14:16] [PASSED] VGA [09:14:16] [PASSED] DVI-I [09:14:16] [PASSED] DVI-D [09:14:16] [PASSED] DVI-A [09:14:16] [PASSED] Composite [09:14:16] [PASSED] SVIDEO [09:14:16] [PASSED] LVDS [09:14:16] [PASSED] Component [09:14:16] [PASSED] DIN [09:14:16] [PASSED] DP [09:14:16] [PASSED] HDMI-A [09:14:16] [PASSED] HDMI-B [09:14:16] [PASSED] TV [09:14:16] [PASSED] eDP [09:14:16] [PASSED] Virtual [09:14:16] [PASSED] DSI [09:14:16] [PASSED] DPI [09:14:16] [PASSED] Writeback [09:14:16] [PASSED] SPI [09:14:16] [PASSED] USB [09:14:16] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid == [09:14:16] ======== drm_test_drm_connector_dynamic_init_name ========= [09:14:16] [PASSED] Unknown [09:14:16] [PASSED] VGA [09:14:16] [PASSED] DVI-I [09:14:16] [PASSED] DVI-D [09:14:16] [PASSED] DVI-A [09:14:16] [PASSED] Composite [09:14:16] [PASSED] SVIDEO [09:14:16] [PASSED] LVDS [09:14:16] [PASSED] Component [09:14:16] [PASSED] DIN [09:14:16] [PASSED] DP [09:14:16] [PASSED] HDMI-A [09:14:16] [PASSED] HDMI-B [09:14:16] [PASSED] TV [09:14:16] [PASSED] eDP [09:14:16] [PASSED] Virtual [09:14:16] [PASSED] DSI [09:14:16] [PASSED] DPI [09:14:16] [PASSED] Writeback [09:14:16] [PASSED] SPI [09:14:16] [PASSED] USB [09:14:16] ==== [PASSED] drm_test_drm_connector_dynamic_init_name ===== [09:14:16] =========== [PASSED] drm_connector_dynamic_init ============ [09:14:16] ==== drm_connector_dynamic_register_early (4 subtests) ===== [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_early_defer [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object [09:14:16] ====== [PASSED] drm_connector_dynamic_register_early ======= [09:14:16] ======= drm_connector_dynamic_register (7 subtests) ======== [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_on_list [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_no_defer [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_no_init [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_mode_object [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_sysfs [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name [09:14:16] [PASSED] drm_test_drm_connector_dynamic_register_debugfs [09:14:16] ========= [PASSED] drm_connector_dynamic_register ========== [09:14:16] = drm_connector_attach_broadcast_rgb_property (2 subtests) = [09:14:16] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property [09:14:16] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector [09:14:16] === [PASSED] drm_connector_attach_broadcast_rgb_property === [09:14:16] ========== drm_get_tv_mode_from_name (2 subtests) ========== [09:14:16] ========== drm_test_get_tv_mode_from_name_valid =========== [09:14:16] [PASSED] NTSC [09:14:16] [PASSED] NTSC-443 [09:14:16] [PASSED] NTSC-J [09:14:16] [PASSED] PAL [09:14:16] [PASSED] PAL-M [09:14:16] [PASSED] PAL-N [09:14:16] [PASSED] SECAM [09:14:16] [PASSED] Mono [09:14:16] ====== [PASSED] drm_test_get_tv_mode_from_name_valid ======= [09:14:16] [PASSED] drm_test_get_tv_mode_from_name_truncated [09:14:16] ============ [PASSED] drm_get_tv_mode_from_name ============ [09:14:16] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) = [09:14:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb [09:14:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc [09:14:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1 [09:14:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc [09:14:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1 [09:14:16] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double [09:14:16] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid = [09:14:16] [PASSED] VIC 96 [09:14:16] [PASSED] VIC 97 [09:14:16] [PASSED] VIC 101 [09:14:16] [PASSED] VIC 102 [09:14:16] [PASSED] VIC 106 [09:14:16] [PASSED] VIC 107 [09:14:16] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid === [09:14:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc [09:14:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc [09:14:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc [09:14:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc [09:14:16] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc [09:14:16] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ==== [09:14:16] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) == [09:14:16] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ==== [09:14:16] [PASSED] Automatic [09:14:16] [PASSED] Full [09:14:16] [PASSED] Limited 16:235 [09:14:16] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name === [09:14:16] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid [09:14:16] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ==== [09:14:16] == drm_hdmi_connector_get_output_format_name (2 subtests) == [09:14:16] === drm_test_drm_hdmi_connector_get_output_format_name ==== [09:14:16] [PASSED] RGB [09:14:16] [PASSED] YUV 4:2:0 [09:14:16] [PASSED] YUV 4:2:2 [09:14:16] [PASSED] YUV 4:4:4 [09:14:16] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name === [09:14:16] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid [09:14:16] ==== [PASSED] drm_hdmi_connector_get_output_format_name ==== [09:14:16] ============= drm_damage_helper (21 subtests) ============== [09:14:16] [PASSED] drm_test_damage_iter_no_damage [09:14:16] [PASSED] drm_test_damage_iter_no_damage_fractional_src [09:14:16] [PASSED] drm_test_damage_iter_no_damage_src_moved [09:14:16] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved [09:14:16] [PASSED] drm_test_damage_iter_no_damage_not_visible [09:14:16] [PASSED] drm_test_damage_iter_no_damage_no_crtc [09:14:16] [PASSED] drm_test_damage_iter_no_damage_no_fb [09:14:16] [PASSED] drm_test_damage_iter_simple_damage [09:14:16] [PASSED] drm_test_damage_iter_single_damage [09:14:16] [PASSED] drm_test_damage_iter_single_damage_intersect_src [09:14:16] [PASSED] drm_test_damage_iter_single_damage_outside_src [09:14:16] [PASSED] drm_test_damage_iter_single_damage_fractional_src [09:14:16] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src [09:14:16] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src [09:14:16] [PASSED] drm_test_damage_iter_single_damage_src_moved [09:14:16] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved [09:14:16] [PASSED] drm_test_damage_iter_damage [09:14:16] [PASSED] drm_test_damage_iter_damage_one_intersect [09:14:16] [PASSED] drm_test_damage_iter_damage_one_outside [09:14:16] [PASSED] drm_test_damage_iter_damage_src_moved [09:14:16] [PASSED] drm_test_damage_iter_damage_not_visible [09:14:16] ================ [PASSED] drm_damage_helper ================ [09:14:16] ============== drm_dp_mst_helper (3 subtests) ============== [09:14:16] ============== drm_test_dp_mst_calc_pbn_mode ============== [09:14:16] [PASSED] Clock 154000 BPP 30 DSC disabled [09:14:16] [PASSED] Clock 234000 BPP 30 DSC disabled [09:14:16] [PASSED] Clock 297000 BPP 24 DSC disabled [09:14:16] [PASSED] Clock 332880 BPP 24 DSC enabled [09:14:16] [PASSED] Clock 324540 BPP 24 DSC enabled [09:14:16] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ========== [09:14:16] ============== drm_test_dp_mst_calc_pbn_div =============== [09:14:16] [PASSED] Link rate 2000000 lane count 4 [09:14:16] [PASSED] Link rate 2000000 lane count 2 [09:14:16] [PASSED] Link rate 2000000 lane count 1 [09:14:16] [PASSED] Link rate 1350000 lane count 4 [09:14:16] [PASSED] Link rate 1350000 lane count 2 [09:14:16] [PASSED] Link rate 1350000 lane count 1 [09:14:16] [PASSED] Link rate 1000000 lane count 4 [09:14:16] [PASSED] Link rate 1000000 lane count 2 [09:14:16] [PASSED] Link rate 1000000 lane count 1 [09:14:16] [PASSED] Link rate 810000 lane count 4 [09:14:16] [PASSED] Link rate 810000 lane count 2 [09:14:16] [PASSED] Link rate 810000 lane count 1 [09:14:16] [PASSED] Link rate 540000 lane count 4 [09:14:16] [PASSED] Link rate 540000 lane count 2 [09:14:16] [PASSED] Link rate 540000 lane count 1 [09:14:16] [PASSED] Link rate 270000 lane count 4 [09:14:16] [PASSED] Link rate 270000 lane count 2 [09:14:16] [PASSED] Link rate 270000 lane count 1 [09:14:16] [PASSED] Link rate 162000 lane count 4 [09:14:16] [PASSED] Link rate 162000 lane count 2 [09:14:16] [PASSED] Link rate 162000 lane count 1 [09:14:16] ========== [PASSED] drm_test_dp_mst_calc_pbn_div =========== [09:14:16] ========= drm_test_dp_mst_sideband_msg_req_decode ========= [09:14:16] [PASSED] DP_ENUM_PATH_RESOURCES with port number [09:14:16] [PASSED] DP_POWER_UP_PHY with port number [09:14:16] [PASSED] DP_POWER_DOWN_PHY with port number [09:14:16] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks [09:14:16] [PASSED] DP_ALLOCATE_PAYLOAD with port number [09:14:16] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI [09:14:16] [PASSED] DP_ALLOCATE_PAYLOAD with PBN [09:14:16] [PASSED] DP_QUERY_PAYLOAD with port number [09:14:16] [PASSED] DP_QUERY_PAYLOAD with VCPI [09:14:16] [PASSED] DP_REMOTE_DPCD_READ with port number [09:14:16] [PASSED] DP_REMOTE_DPCD_READ with DPCD address [09:14:16] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes [09:14:16] [PASSED] DP_REMOTE_DPCD_WRITE with port number [09:14:16] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address [09:14:16] [PASSED] DP_REMOTE_DPCD_WRITE with data array [09:14:16] [PASSED] DP_REMOTE_I2C_READ with port number [09:14:16] [PASSED] DP_REMOTE_I2C_READ with I2C device ID [09:14:16] [PASSED] DP_REMOTE_I2C_READ with transactions array [09:14:16] [PASSED] DP_REMOTE_I2C_WRITE with port number [09:14:16] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID [09:14:16] [PASSED] DP_REMOTE_I2C_WRITE with data array [09:14:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID [09:14:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID [09:14:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event [09:14:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event [09:14:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior [09:14:16] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior [09:14:16] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode ===== [09:14:16] ================ [PASSED] drm_dp_mst_helper ================ [09:14:16] ================== drm_exec (7 subtests) =================== [09:14:16] [PASSED] sanitycheck [09:14:16] [PASSED] test_lock [09:14:16] [PASSED] test_lock_unlock [09:14:16] [PASSED] test_duplicates [09:14:16] [PASSED] test_prepare [09:14:16] [PASSED] test_prepare_array [09:14:16] [PASSED] test_multiple_loops [09:14:16] ==================== [PASSED] drm_exec ===================== [09:14:16] =========== drm_format_helper_test (17 subtests) =========== [09:14:16] ============== drm_test_fb_xrgb8888_to_gray8 ============== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ========== [09:14:16] ============= drm_test_fb_xrgb8888_to_rgb332 ============== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ========== [09:14:16] ============= drm_test_fb_xrgb8888_to_rgb565 ============== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ========== [09:14:16] ============ drm_test_fb_xrgb8888_to_xrgb1555 ============= [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 ========= [09:14:16] ============ drm_test_fb_xrgb8888_to_argb1555 ============= [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 ========= [09:14:16] ============ drm_test_fb_xrgb8888_to_rgba5551 ============= [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 ========= [09:14:16] ============= drm_test_fb_xrgb8888_to_rgb888 ============== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ========== [09:14:16] ============= drm_test_fb_xrgb8888_to_bgr888 ============== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ========== [09:14:16] ============ drm_test_fb_xrgb8888_to_argb8888 ============= [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 ========= [09:14:16] =========== drm_test_fb_xrgb8888_to_xrgb2101010 =========== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 ======= [09:14:16] =========== drm_test_fb_xrgb8888_to_argb2101010 =========== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 ======= [09:14:16] ============== drm_test_fb_xrgb8888_to_mono =============== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ========== [PASSED] drm_test_fb_xrgb8888_to_mono =========== [09:14:16] ==================== drm_test_fb_swab ===================== [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ================ [PASSED] drm_test_fb_swab ================= [09:14:16] ============ drm_test_fb_xrgb8888_to_xbgr8888 ============= [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 ========= [09:14:16] ============ drm_test_fb_xrgb8888_to_abgr8888 ============= [09:14:16] [PASSED] single_pixel_source_buffer [09:14:16] [PASSED] single_pixel_clip_rectangle [09:14:16] [PASSED] well_known_colors [09:14:16] [PASSED] destination_pitch [09:14:16] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 ========= [09:14:16] ================= drm_test_fb_clip_offset ================= [09:14:16] [PASSED] pass through [09:14:16] [PASSED] horizontal offset [09:14:16] [PASSED] vertical offset [09:14:16] [PASSED] horizontal and vertical offset [09:14:16] [PASSED] horizontal offset (custom pitch) [09:14:16] [PASSED] vertical offset (custom pitch) [09:14:16] [PASSED] horizontal and vertical offset (custom pitch) [09:14:16] ============= [PASSED] drm_test_fb_clip_offset ============= [09:14:16] =================== drm_test_fb_memcpy ==================== [09:14:16] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258) [09:14:16] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258) [09:14:16] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559) [09:14:16] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258) [09:14:16] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258) [09:14:16] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559) [09:14:16] [PASSED] well_known_colors: XB24 little-endian (0x34324258) [09:14:16] [PASSED] well_known_colors: XRA8 little-endian (0x38415258) [09:14:16] [PASSED] well_known_colors: YU24 little-endian (0x34325559) [09:14:16] [PASSED] destination_pitch: XB24 little-endian (0x34324258) [09:14:16] [PASSED] destination_pitch: XRA8 little-endian (0x38415258) [09:14:16] [PASSED] destination_pitch: YU24 little-endian (0x34325559) [09:14:16] =============== [PASSED] drm_test_fb_memcpy ================ [09:14:16] ============= [PASSED] drm_format_helper_test ============== [09:14:16] ================= drm_format (18 subtests) ================= [09:14:16] [PASSED] drm_test_format_block_width_invalid [09:14:16] [PASSED] drm_test_format_block_width_one_plane [09:14:16] [PASSED] drm_test_format_block_width_two_plane [09:14:16] [PASSED] drm_test_format_block_width_three_plane [09:14:16] [PASSED] drm_test_format_block_width_tiled [09:14:16] [PASSED] drm_test_format_block_height_invalid [09:14:16] [PASSED] drm_test_format_block_height_one_plane [09:14:16] [PASSED] drm_test_format_block_height_two_plane [09:14:16] [PASSED] drm_test_format_block_height_three_plane [09:14:16] [PASSED] drm_test_format_block_height_tiled [09:14:16] [PASSED] drm_test_format_min_pitch_invalid [09:14:16] [PASSED] drm_test_format_min_pitch_one_plane_8bpp [09:14:16] [PASSED] drm_test_format_min_pitch_one_plane_16bpp [09:14:16] [PASSED] drm_test_format_min_pitch_one_plane_24bpp [09:14:16] [PASSED] drm_test_format_min_pitch_one_plane_32bpp [09:14:16] [PASSED] drm_test_format_min_pitch_two_plane [09:14:16] [PASSED] drm_test_format_min_pitch_three_plane_8bpp [09:14:16] [PASSED] drm_test_format_min_pitch_tiled [09:14:16] =================== [PASSED] drm_format ==================== [09:14:16] ============== drm_framebuffer (10 subtests) =============== [09:14:16] ========== drm_test_framebuffer_check_src_coords ========== [09:14:16] [PASSED] Success: source fits into fb [09:14:16] [PASSED] Fail: overflowing fb with x-axis coordinate [09:14:16] [PASSED] Fail: overflowing fb with y-axis coordinate [09:14:16] [PASSED] Fail: overflowing fb with source width [09:14:16] [PASSED] Fail: overflowing fb with source height [09:14:16] ====== [PASSED] drm_test_framebuffer_check_src_coords ====== [09:14:16] [PASSED] drm_test_framebuffer_cleanup [09:14:16] =============== drm_test_framebuffer_create =============== [09:14:16] [PASSED] ABGR8888 normal sizes [09:14:16] [PASSED] ABGR8888 max sizes [09:14:16] [PASSED] ABGR8888 pitch greater than min required [09:14:16] [PASSED] ABGR8888 pitch less than min required [09:14:16] [PASSED] ABGR8888 Invalid width [09:14:16] [PASSED] ABGR8888 Invalid buffer handle [09:14:16] [PASSED] No pixel format [09:14:16] [PASSED] ABGR8888 Width 0 [09:14:16] [PASSED] ABGR8888 Height 0 [09:14:16] [PASSED] ABGR8888 Out of bound height * pitch combination [09:14:16] [PASSED] ABGR8888 Large buffer offset [09:14:16] [PASSED] ABGR8888 Buffer offset for inexistent plane [09:14:16] [PASSED] ABGR8888 Invalid flag [09:14:16] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers [09:14:16] [PASSED] ABGR8888 Valid buffer modifier [09:14:16] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) [09:14:16] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS [09:14:16] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS [09:14:16] [PASSED] NV12 Normal sizes [09:14:16] [PASSED] NV12 Max sizes [09:14:16] [PASSED] NV12 Invalid pitch [09:14:16] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag [09:14:16] [PASSED] NV12 different modifier per-plane [09:14:16] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE [09:14:16] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS [09:14:16] [PASSED] NV12 Modifier for inexistent plane [09:14:16] [PASSED] NV12 Handle for inexistent plane [09:14:16] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS [09:14:16] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier [09:14:16] [PASSED] YVU420 Normal sizes [09:14:16] [PASSED] YVU420 Max sizes [09:14:16] [PASSED] YVU420 Invalid pitch [09:14:16] [PASSED] YVU420 Different pitches [09:14:16] [PASSED] YVU420 Different buffer offsets/pitches [09:14:16] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS [09:14:16] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS [09:14:16] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS [09:14:16] [PASSED] YVU420 Valid modifier [09:14:16] [PASSED] YVU420 Different modifiers per plane [09:14:16] [PASSED] YVU420 Modifier for inexistent plane [09:14:16] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR) [09:14:16] [PASSED] X0L2 Normal sizes [09:14:16] [PASSED] X0L2 Max sizes [09:14:16] [PASSED] X0L2 Invalid pitch [09:14:16] [PASSED] X0L2 Pitch greater than minimum required [09:14:16] [PASSED] X0L2 Handle for inexistent plane [09:14:16] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set [09:14:16] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set [09:14:16] [PASSED] X0L2 Valid modifier [09:14:16] [PASSED] X0L2 Modifier for inexistent plane [09:14:16] =========== [PASSED] drm_test_framebuffer_create =========== [09:14:16] [PASSED] drm_test_framebuffer_free [09:14:16] [PASSED] drm_test_framebuffer_init [09:14:16] [PASSED] drm_test_framebuffer_init_bad_format [09:14:16] [PASSED] drm_test_framebuffer_init_dev_mismatch [09:14:16] [PASSED] drm_test_framebuffer_lookup [09:14:16] [PASSED] drm_test_framebuffer_lookup_inexistent [09:14:16] [PASSED] drm_test_framebuffer_modifiers_not_supported [09:14:16] ================= [PASSED] drm_framebuffer ================= [09:14:16] ================ drm_gem_shmem (8 subtests) ================ [09:14:16] [PASSED] drm_gem_shmem_test_obj_create [09:14:16] [PASSED] drm_gem_shmem_test_obj_create_private [09:14:16] [PASSED] drm_gem_shmem_test_pin_pages [09:14:16] [PASSED] drm_gem_shmem_test_vmap [09:14:16] [PASSED] drm_gem_shmem_test_get_sg_table [09:14:16] [PASSED] drm_gem_shmem_test_get_pages_sgt [09:14:16] [PASSED] drm_gem_shmem_test_madvise [09:14:16] [PASSED] drm_gem_shmem_test_purge [09:14:16] ================== [PASSED] drm_gem_shmem ================== [09:14:16] === drm_atomic_helper_connector_hdmi_check (27 subtests) === [09:14:16] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode [09:14:16] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1 [09:14:16] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode [09:14:16] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1 [09:14:16] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode [09:14:16] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1 [09:14:16] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 ======= [09:14:16] [PASSED] Automatic [09:14:16] [PASSED] Full [09:14:16] [PASSED] Limited 16:235 [09:14:16] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 === [09:14:16] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed [09:14:16] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed [09:14:16] [PASSED] drm_test_check_disable_connector [09:14:16] [PASSED] drm_test_check_hdmi_funcs_reject_rate [09:14:16] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb [09:14:16] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420 [09:14:16] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422 [09:14:16] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420 [09:14:16] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420 [09:14:16] [PASSED] drm_test_check_output_bpc_crtc_mode_changed [09:14:16] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed [09:14:16] [PASSED] drm_test_check_output_bpc_dvi [09:14:16] [PASSED] drm_test_check_output_bpc_format_vic_1 [09:14:16] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only [09:14:16] [PASSED] drm_test_check_output_bpc_format_display_rgb_only [09:14:16] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only [09:14:16] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only [09:14:16] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc [09:14:16] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc [09:14:16] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc [09:14:16] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ====== [09:14:16] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ==== [09:14:16] [PASSED] drm_test_check_broadcast_rgb_value [09:14:16] [PASSED] drm_test_check_bpc_8_value [09:14:16] [PASSED] drm_test_check_bpc_10_value [09:14:16] [PASSED] drm_test_check_bpc_12_value [09:14:16] [PASSED] drm_test_check_format_value [09:14:16] [PASSED] drm_test_check_tmds_char_value [09:14:16] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ====== [09:14:16] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) = [09:14:16] [PASSED] drm_test_check_mode_valid [09:14:16] [PASSED] drm_test_check_mode_valid_reject [09:14:16] [PASSED] drm_test_check_mode_valid_reject_rate [09:14:16] [PASSED] drm_test_check_mode_valid_reject_max_clock [09:14:16] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid === [09:14:16] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) = [09:14:16] [PASSED] drm_test_check_infoframes [09:14:16] [PASSED] drm_test_check_reject_avi_infoframe [09:14:16] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8 [09:14:16] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10 [09:14:16] [PASSED] drm_test_check_reject_audio_infoframe [09:14:16] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes === [09:14:16] ================= drm_managed (2 subtests) ================= [09:14:16] [PASSED] drm_test_managed_release_action [09:14:16] [PASSED] drm_test_managed_run_action [09:14:16] =================== [PASSED] drm_managed =================== [09:14:16] =================== drm_mm (6 subtests) ==================== [09:14:16] [PASSED] drm_test_mm_init [09:14:16] [PASSED] drm_test_mm_debug [09:14:16] [PASSED] drm_test_mm_align32 [09:14:16] [PASSED] drm_test_mm_align64 [09:14:16] [PASSED] drm_test_mm_lowest [09:14:16] [PASSED] drm_test_mm_highest [09:14:16] ===================== [PASSED] drm_mm ====================== [09:14:16] ============= drm_modes_analog_tv (5 subtests) ============= [09:14:16] [PASSED] drm_test_modes_analog_tv_mono_576i [09:14:16] [PASSED] drm_test_modes_analog_tv_ntsc_480i [09:14:16] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined [09:14:16] [PASSED] drm_test_modes_analog_tv_pal_576i [09:14:16] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined [09:14:16] =============== [PASSED] drm_modes_analog_tv =============== [09:14:16] ============== drm_plane_helper (2 subtests) =============== [09:14:16] =============== drm_test_check_plane_state ================ [09:14:16] [PASSED] clipping_simple [09:14:16] [PASSED] clipping_rotate_reflect [09:14:16] [PASSED] positioning_simple [09:14:16] [PASSED] upscaling [09:14:16] [PASSED] downscaling [09:14:16] [PASSED] rounding1 [09:14:16] [PASSED] rounding2 [09:14:16] [PASSED] rounding3 [09:14:16] [PASSED] rounding4 [09:14:16] =========== [PASSED] drm_test_check_plane_state ============ [09:14:16] =========== drm_test_check_invalid_plane_state ============ [09:14:16] [PASSED] positioning_invalid [09:14:16] [PASSED] upscaling_invalid [09:14:16] [PASSED] downscaling_invalid [09:14:16] ======= [PASSED] drm_test_check_invalid_plane_state ======== [09:14:16] ================ [PASSED] drm_plane_helper ================= [09:14:16] ====== drm_connector_helper_tv_get_modes (1 subtest) ======= [09:14:16] ====== drm_test_connector_helper_tv_get_modes_check ======= [09:14:16] [PASSED] None [09:14:16] [PASSED] PAL [09:14:16] [PASSED] NTSC [09:14:16] [PASSED] Both, NTSC Default [09:14:16] [PASSED] Both, PAL Default [09:14:16] [PASSED] Both, NTSC Default, with PAL on command-line [09:14:16] [PASSED] Both, PAL Default, with NTSC on command-line [09:14:16] == [PASSED] drm_test_connector_helper_tv_get_modes_check === [09:14:16] ======== [PASSED] drm_connector_helper_tv_get_modes ======== [09:14:16] ================== drm_rect (9 subtests) =================== [09:14:16] [PASSED] drm_test_rect_clip_scaled_div_by_zero [09:14:16] [PASSED] drm_test_rect_clip_scaled_not_clipped [09:14:16] [PASSED] drm_test_rect_clip_scaled_clipped [09:14:16] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned [09:14:16] ================= drm_test_rect_intersect ================= [09:14:16] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0 [09:14:16] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1 [09:14:16] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0 [09:14:16] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1 [09:14:16] [PASSED] right x left: 2x1+0+0 x 3x1+1+0 [09:14:16] [PASSED] left x right: 3x1+1+0 x 2x1+0+0 [09:14:16] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1 [09:14:16] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0 [09:14:16] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1 [09:14:16] [PASSED] touching side: 1x1+0+0 x 1x1+1+0 [09:14:16] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0 [09:14:16] [PASSED] inside another: 2x2+0+0 x 1x1+1+1 [09:14:16] [PASSED] far away: 1x1+0+0 x 1x1+3+6 [09:14:16] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10 [09:14:16] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10 stty: 'standard input': Inappropriate ioctl for device [09:14:16] ============= [PASSED] drm_test_rect_intersect ============= [09:14:16] ================ drm_test_rect_calc_hscale ================ [09:14:16] [PASSED] normal use [09:14:16] [PASSED] out of max range [09:14:16] [PASSED] out of min range [09:14:16] [PASSED] zero dst [09:14:16] [PASSED] negative src [09:14:16] [PASSED] negative dst [09:14:16] ============ [PASSED] drm_test_rect_calc_hscale ============ [09:14:16] ================ drm_test_rect_calc_vscale ================ [09:14:16] [PASSED] normal use [09:14:16] [PASSED] out of max range [09:14:16] [PASSED] out of min range [09:14:16] [PASSED] zero dst [09:14:16] [PASSED] negative src [09:14:16] [PASSED] negative dst [09:14:16] ============ [PASSED] drm_test_rect_calc_vscale ============ [09:14:16] ================== drm_test_rect_rotate =================== [09:14:16] [PASSED] reflect-x [09:14:16] [PASSED] reflect-y [09:14:16] [PASSED] rotate-0 [09:14:16] [PASSED] rotate-90 [09:14:16] [PASSED] rotate-180 [09:14:16] [PASSED] rotate-270 [09:14:16] ============== [PASSED] drm_test_rect_rotate =============== [09:14:16] ================ drm_test_rect_rotate_inv ================= [09:14:16] [PASSED] reflect-x [09:14:16] [PASSED] reflect-y [09:14:16] [PASSED] rotate-0 [09:14:16] [PASSED] rotate-90 [09:14:16] [PASSED] rotate-180 [09:14:16] [PASSED] rotate-270 [09:14:16] ============ [PASSED] drm_test_rect_rotate_inv ============= [09:14:16] ==================== [PASSED] drm_rect ===================== [09:14:16] ============ drm_sysfb_modeset_test (1 subtest) ============ [09:14:16] ============ drm_test_sysfb_build_fourcc_list ============= [09:14:16] [PASSED] no native formats [09:14:16] [PASSED] XRGB8888 as native format [09:14:16] [PASSED] remove duplicates [09:14:16] [PASSED] convert alpha formats [09:14:16] [PASSED] random formats [09:14:16] ======== [PASSED] drm_test_sysfb_build_fourcc_list ========= [09:14:16] ============= [PASSED] drm_sysfb_modeset_test ============== [09:14:16] ================== drm_fixp (2 subtests) =================== [09:14:16] [PASSED] drm_test_int2fixp [09:14:16] [PASSED] drm_test_sm2fixp [09:14:16] ==================== [PASSED] drm_fixp ===================== [09:14:16] ============================================================ [09:14:16] Testing complete. Ran 630 tests: passed: 630 [09:14:16] Elapsed time: 27.348s total, 1.700s configuring, 25.227s building, 0.381s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig [09:14:16] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [09:14:18] 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 [09:14:28] Starting KUnit Kernel (1/1)... [09:14:28] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [09:14:28] ================= ttm_device (5 subtests) ================== [09:14:28] [PASSED] ttm_device_init_basic [09:14:28] [PASSED] ttm_device_init_multiple [09:14:28] [PASSED] ttm_device_fini_basic [09:14:28] [PASSED] ttm_device_init_no_vma_man [09:14:28] ================== ttm_device_init_pools ================== [09:14:28] [PASSED] No DMA allocations, no DMA32 required [09:14:28] [PASSED] DMA allocations, DMA32 required [09:14:28] [PASSED] No DMA allocations, DMA32 required [09:14:28] [PASSED] DMA allocations, no DMA32 required [09:14:28] ============== [PASSED] ttm_device_init_pools ============== [09:14:28] =================== [PASSED] ttm_device ==================== [09:14:28] ================== ttm_pool (8 subtests) =================== [09:14:28] ================== ttm_pool_alloc_basic =================== [09:14:28] [PASSED] One page [09:14:28] [PASSED] More than one page [09:14:28] [PASSED] Above the allocation limit [09:14:28] [PASSED] One page, with coherent DMA mappings enabled [09:14:28] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [09:14:28] ============== [PASSED] ttm_pool_alloc_basic =============== [09:14:28] ============== ttm_pool_alloc_basic_dma_addr ============== [09:14:28] [PASSED] One page [09:14:28] [PASSED] More than one page [09:14:28] [PASSED] Above the allocation limit [09:14:28] [PASSED] One page, with coherent DMA mappings enabled [09:14:28] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [09:14:28] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ========== [09:14:28] [PASSED] ttm_pool_alloc_order_caching_match [09:14:28] [PASSED] ttm_pool_alloc_caching_mismatch [09:14:28] [PASSED] ttm_pool_alloc_order_mismatch [09:14:28] [PASSED] ttm_pool_free_dma_alloc [09:14:28] [PASSED] ttm_pool_free_no_dma_alloc [09:14:28] [PASSED] ttm_pool_fini_basic [09:14:28] ==================== [PASSED] ttm_pool ===================== [09:14:28] ================ ttm_resource (8 subtests) ================= [09:14:28] ================= ttm_resource_init_basic ================= [09:14:28] [PASSED] Init resource in TTM_PL_SYSTEM [09:14:28] [PASSED] Init resource in TTM_PL_VRAM [09:14:28] [PASSED] Init resource in a private placement [09:14:28] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags [09:14:28] ============= [PASSED] ttm_resource_init_basic ============= [09:14:28] [PASSED] ttm_resource_init_pinned [09:14:28] [PASSED] ttm_resource_fini_basic [09:14:28] [PASSED] ttm_resource_manager_init_basic [09:14:28] [PASSED] ttm_resource_manager_usage_basic [09:14:28] [PASSED] ttm_resource_manager_set_used_basic [09:14:28] [PASSED] ttm_sys_man_alloc_basic [09:14:28] [PASSED] ttm_sys_man_free_basic [09:14:28] ================== [PASSED] ttm_resource =================== [09:14:28] =================== ttm_tt (15 subtests) =================== [09:14:28] ==================== ttm_tt_init_basic ==================== [09:14:28] [PASSED] Page-aligned size [09:14:28] [PASSED] Extra pages requested [09:14:28] ================ [PASSED] ttm_tt_init_basic ================ [09:14:28] [PASSED] ttm_tt_init_misaligned [09:14:28] [PASSED] ttm_tt_fini_basic [09:14:28] [PASSED] ttm_tt_fini_sg [09:14:28] [PASSED] ttm_tt_fini_shmem [09:14:28] [PASSED] ttm_tt_create_basic [09:14:28] [PASSED] ttm_tt_create_invalid_bo_type [09:14:28] [PASSED] ttm_tt_create_ttm_exists [09:14:28] [PASSED] ttm_tt_create_failed [09:14:28] [PASSED] ttm_tt_destroy_basic [09:14:28] [PASSED] ttm_tt_populate_null_ttm [09:14:28] [PASSED] ttm_tt_populate_populated_ttm [09:14:28] [PASSED] ttm_tt_unpopulate_basic [09:14:28] [PASSED] ttm_tt_unpopulate_empty_ttm [09:14:28] [PASSED] ttm_tt_swapin_basic [09:14:28] ===================== [PASSED] ttm_tt ====================== [09:14:28] =================== ttm_bo (14 subtests) =================== [09:14:28] =========== ttm_bo_reserve_optimistic_no_ticket =========== [09:14:28] [PASSED] Cannot be interrupted and sleeps [09:14:28] [PASSED] Cannot be interrupted, locks straight away [09:14:28] [PASSED] Can be interrupted, sleeps [09:14:28] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket ======= [09:14:28] [PASSED] ttm_bo_reserve_locked_no_sleep [09:14:28] [PASSED] ttm_bo_reserve_no_wait_ticket [09:14:28] [PASSED] ttm_bo_reserve_double_resv [09:14:28] [PASSED] ttm_bo_reserve_interrupted [09:14:28] [PASSED] ttm_bo_reserve_deadlock [09:14:28] [PASSED] ttm_bo_unreserve_basic [09:14:28] [PASSED] ttm_bo_unreserve_pinned [09:14:28] [PASSED] ttm_bo_unreserve_bulk [09:14:28] [PASSED] ttm_bo_fini_basic [09:14:28] [PASSED] ttm_bo_fini_shared_resv [09:14:28] [PASSED] ttm_bo_pin_basic [09:14:28] [PASSED] ttm_bo_pin_unpin_resource [09:14:28] [PASSED] ttm_bo_multiple_pin_one_unpin [09:14:28] ===================== [PASSED] ttm_bo ====================== [09:14:28] ============== ttm_bo_validate (21 subtests) =============== [09:14:28] ============== ttm_bo_init_reserved_sys_man =============== [09:14:28] [PASSED] Buffer object for userspace [09:14:28] [PASSED] Kernel buffer object [09:14:28] [PASSED] Shared buffer object [09:14:28] ========== [PASSED] ttm_bo_init_reserved_sys_man =========== [09:14:28] ============== ttm_bo_init_reserved_mock_man ============== [09:14:28] [PASSED] Buffer object for userspace [09:14:28] [PASSED] Kernel buffer object [09:14:28] [PASSED] Shared buffer object [09:14:28] ========== [PASSED] ttm_bo_init_reserved_mock_man ========== [09:14:28] [PASSED] ttm_bo_init_reserved_resv [09:14:28] ================== ttm_bo_validate_basic ================== [09:14:28] [PASSED] Buffer object for userspace [09:14:28] [PASSED] Kernel buffer object [09:14:28] [PASSED] Shared buffer object [09:14:28] ============== [PASSED] ttm_bo_validate_basic ============== [09:14:28] [PASSED] ttm_bo_validate_invalid_placement [09:14:28] ============= ttm_bo_validate_same_placement ============== [09:14:28] [PASSED] System manager [09:14:28] [PASSED] VRAM manager [09:14:28] ========= [PASSED] ttm_bo_validate_same_placement ========== [09:14:28] [PASSED] ttm_bo_validate_failed_alloc [09:14:28] [PASSED] ttm_bo_validate_pinned [09:14:28] [PASSED] ttm_bo_validate_busy_placement [09:14:28] ================ ttm_bo_validate_multihop ================= [09:14:28] [PASSED] Buffer object for userspace [09:14:28] [PASSED] Kernel buffer object [09:14:28] [PASSED] Shared buffer object [09:14:28] ============ [PASSED] ttm_bo_validate_multihop ============= [09:14:28] ========== ttm_bo_validate_no_placement_signaled ========== [09:14:28] [PASSED] Buffer object in system domain, no page vector [09:14:28] [PASSED] Buffer object in system domain with an existing page vector [09:14:28] ====== [PASSED] ttm_bo_validate_no_placement_signaled ====== [09:14:28] ======== ttm_bo_validate_no_placement_not_signaled ======== [09:14:28] [PASSED] Buffer object for userspace [09:14:28] [PASSED] Kernel buffer object [09:14:28] [PASSED] Shared buffer object [09:14:28] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ==== [09:14:28] [PASSED] ttm_bo_validate_move_fence_signaled [09:14:28] ========= ttm_bo_validate_move_fence_not_signaled ========= [09:14:28] [PASSED] Waits for GPU [09:14:28] [PASSED] Tries to lock straight away [09:14:28] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled ===== [09:14:28] [PASSED] ttm_bo_validate_happy_evict [09:14:28] [PASSED] ttm_bo_validate_all_pinned_evict [09:14:28] [PASSED] ttm_bo_validate_allowed_only_evict [09:14:28] [PASSED] ttm_bo_validate_deleted_evict [09:14:28] [PASSED] ttm_bo_validate_busy_domain_evict [09:14:28] [PASSED] ttm_bo_validate_evict_gutting [09:14:28] [PASSED] ttm_bo_validate_recrusive_evict stty: 'standard input': Inappropriate ioctl for device [09:14:28] ================= [PASSED] ttm_bo_validate ================= [09:14:28] ============================================================ [09:14:28] Testing complete. Ran 101 tests: passed: 101 [09:14:28] Elapsed time: 11.498s total, 1.696s configuring, 9.585s building, 0.184s running + cleanup ++ stat -c %u:%g /kernel + chown -R 1003:1003 /kernel ^ permalink raw reply [flat|nested] 16+ messages in thread
* ✓ Xe.CI.BAT: success for series starting with [1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-01-29 8:27 [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation Brian Nguyen 2026-01-29 8:27 ` [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func Brian Nguyen 2026-01-29 9:14 ` ✓ CI.KUnit: success for series starting with [1/2] drm/xe: Skip over non leaf pte for PRL generation Patchwork @ 2026-01-29 9:48 ` Patchwork 2026-02-23 21:48 ` [PATCH 1/2] " Nguyen, Brian3 2026-02-23 22:49 ` Summers, Stuart 4 siblings, 0 replies; 16+ messages in thread From: Patchwork @ 2026-01-29 9:48 UTC (permalink / raw) To: Brian Nguyen; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 2082 bytes --] == Series Details == Series: series starting with [1/2] drm/xe: Skip over non leaf pte for PRL generation URL : https://patchwork.freedesktop.org/series/160817/ State : success == Summary == CI Bug Log - changes from xe-4467-6a3c9a03d943eb112c916c7419a837bc7de3a296_BAT -> xe-pw-160817v1_BAT ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (12 -> 12) ------------------------------ No changes in participating hosts Known issues ------------ Here are the changes found in xe-pw-160817v1_BAT that come from known issues: ### IGT changes ### #### Issues hit #### * igt@xe_pat@pat-index-xe2@render: - bat-ptl-vm: [PASS][1] -> [DMESG-WARN][2] ([Intel XE#7110]) +1 other test dmesg-warn [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4467-6a3c9a03d943eb112c916c7419a837bc7de3a296/bat-ptl-vm/igt@xe_pat@pat-index-xe2@render.html [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160817v1/bat-ptl-vm/igt@xe_pat@pat-index-xe2@render.html #### Possible fixes #### * igt@xe_waitfence@abstime: - bat-dg2-oem2: [TIMEOUT][3] ([Intel XE#6506]) -> [PASS][4] [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-4467-6a3c9a03d943eb112c916c7419a837bc7de3a296/bat-dg2-oem2/igt@xe_waitfence@abstime.html [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160817v1/bat-dg2-oem2/igt@xe_waitfence@abstime.html [Intel XE#6506]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6506 [Intel XE#7110]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7110 Build changes ------------- * IGT: IGT_8723 -> IGT_8724 * Linux: xe-4467-6a3c9a03d943eb112c916c7419a837bc7de3a296 -> xe-pw-160817v1 IGT_8723: 8723 IGT_8724: 6a10d1136a4e856cc4ceb5b899c32b03ed8ddc5e @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git xe-4467-6a3c9a03d943eb112c916c7419a837bc7de3a296: 6a3c9a03d943eb112c916c7419a837bc7de3a296 xe-pw-160817v1: 160817v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-160817v1/index.html [-- Attachment #2: Type: text/html, Size: 2683 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-01-29 8:27 [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation Brian Nguyen ` (2 preceding siblings ...) 2026-01-29 9:48 ` ✓ Xe.CI.BAT: " Patchwork @ 2026-02-23 21:48 ` Nguyen, Brian3 2026-02-23 22:49 ` Summers, Stuart 4 siblings, 0 replies; 16+ messages in thread From: Nguyen, Brian3 @ 2026-02-23 21:48 UTC (permalink / raw) To: intel-xe@lists.freedesktop.org; +Cc: Roper, Matthew D, Brost, Matthew Hi all, Just bumping this patch again for review since it hasn't been reviewed yet but the other patch in series has. Thanks, Brian On Thursday, January 29, 2026 12:28 AM, Brian Nguyen wrote: > The check using xe_child->base.children was insufficient in determining if a pte was a leaf node. So explicitly check for if a pte is a leaf > through the bit checks. > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on unbind") > > v2: > - Remove old assert. (Matt R) > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > Cc: Matt Roper <matthew.d.roper@intel.com> Cc: Matthew Brost, since it relates to some of the PAT handling discussed previously for page reclamation. > --- > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c index 6703a7049227..b73a356d0fa1 100644 > --- a/drivers/gpu/drm/xe/xe_pt.c > +++ b/drivers/gpu/drm/xe/xe_pt.c > @@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t offset, > > XE_WARN_ON(!*child); > XE_WARN_ON(!level); > - /* Check for leaf node */ > + /* Optimistically check for leaf node, may not be guaranteed from > +children alone */ > if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk->prl) && > (!xe_child->base.children || !xe_child->base.children[first])) { > struct iosys_map *leaf_map = &xe_child->bo->vmap; @@ -1675,10 +1675,13 @@ static int > xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t offset, > break; > } > > - /* Ensure it is a defined page */ > - xe_tile_assert(xe_walk->tile, > - xe_child->level == 0 || > - (pte & (XE_PTE_PS64 | XE_PDE_PS_2M | XE_PDPE_PS_1G))); > + /* > + * The check for xe_pt's children is insufficient to determine leaf. > + * If not leaf, break out and continue in next page walk level. > + */ > + if (xe_child->level > 0 && > + !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | XE_PDPE_PS_1G))) > + break; > > /* An entry should be added for 64KB but contigious 4K have XE_PTE_PS64 */ > if (pte & XE_PTE_PS64) > -- > 2.43.0 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-01-29 8:27 [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation Brian Nguyen ` (3 preceding siblings ...) 2026-02-23 21:48 ` [PATCH 1/2] " Nguyen, Brian3 @ 2026-02-23 22:49 ` Summers, Stuart 2026-02-23 22:59 ` Matthew Brost 4 siblings, 1 reply; 16+ messages in thread From: Summers, Stuart @ 2026-02-23 22:49 UTC (permalink / raw) To: intel-xe@lists.freedesktop.org, Nguyen, Brian3; +Cc: Roper, Matthew D On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > The check using xe_child->base.children was insufficient in > determining > if a pte was a leaf node. So explicitly check for if a pte is a leaf > through the bit checks. > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on unbind") > > v2: > - Remove old assert. (Matt R) > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > Cc: Matt Roper <matthew.d.roper@intel.com> > --- > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c > index 6703a7049227..b73a356d0fa1 100644 > --- a/drivers/gpu/drm/xe/xe_pt.c > +++ b/drivers/gpu/drm/xe/xe_pt.c > @@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct > xe_ptw *parent, pgoff_t offset, > > XE_WARN_ON(!*child); > XE_WARN_ON(!level); > - /* Check for leaf node */ > + /* Optimistically check for leaf node, may not be guaranteed I would keep the comments the same - we're still trying to check a leaf node here and we aren't really doing anything special. If we have questions, we can look at the commit history to determine what changed from your prior implementation. Or if you want documentation here, it's more interesting to me *why* we can't see this from the child alone than just the fact that we can't (which we can observe by the if condition). Also applies to the comment below too. Thanks, Stuart > from children alone */ > if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk->prl) > && > (!xe_child->base.children || !xe_child- > >base.children[first])) { > struct iosys_map *leaf_map = &xe_child->bo->vmap; > @@ -1675,10 +1675,13 @@ static int xe_pt_stage_unbind_entry(struct > xe_ptw *parent, pgoff_t offset, > break; > } > > - /* Ensure it is a defined page */ > - xe_tile_assert(xe_walk->tile, > - xe_child->level == 0 || > - (pte & (XE_PTE_PS64 | > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > + /* > + * The check for xe_pt's children is > insufficient to determine leaf. > + * If not leaf, break out and continue in > next page walk level. > + */ > + if (xe_child->level > 0 && > + !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | > XE_PDPE_PS_1G))) > + break; > > /* An entry should be added for 64KB but > contigious 4K have XE_PTE_PS64 */ > if (pte & XE_PTE_PS64) ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-02-23 22:49 ` Summers, Stuart @ 2026-02-23 22:59 ` Matthew Brost 2026-02-23 23:07 ` Summers, Stuart 0 siblings, 1 reply; 16+ messages in thread From: Matthew Brost @ 2026-02-23 22:59 UTC (permalink / raw) To: Summers, Stuart Cc: intel-xe@lists.freedesktop.org, Nguyen, Brian3, Roper, Matthew D On Mon, Feb 23, 2026 at 10:49:21PM +0000, Summers, Stuart wrote: > On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > > The check using xe_child->base.children was insufficient in > > determining > > if a pte was a leaf node. So explicitly check for if a pte is a leaf > > through the bit checks. > > > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on unbind") Move the Fixes tag by other tags (Signed-off-by, Cc) > > > > v2: > > - Remove old assert. (Matt R) > > > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > > Cc: Matt Roper <matthew.d.roper@intel.com> > > --- > > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c > > index 6703a7049227..b73a356d0fa1 100644 > > --- a/drivers/gpu/drm/xe/xe_pt.c > > +++ b/drivers/gpu/drm/xe/xe_pt.c > > @@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct > > xe_ptw *parent, pgoff_t offset, > > > > XE_WARN_ON(!*child); > > XE_WARN_ON(!level); > > - /* Check for leaf node */ > > + /* Optimistically check for leaf node, may not be guaranteed > > I would keep the comments the same - we're still trying to check a leaf > node here and we aren't really doing anything special. If we have > questions, we can look at the commit history to determine what changed > from your prior implementation. > > Or if you want documentation here, it's more interesting to me *why* we > can't see this from the child alone than just the fact that we can't > (which we can observe by the if condition). > > Also applies to the comment below too. > > Thanks, > Stuart > > > from children alone */ > > if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk->prl) > > && > > (!xe_child->base.children || !xe_child- > > >base.children[first])) { > > struct iosys_map *leaf_map = &xe_child->bo->vmap; > > @@ -1675,10 +1675,13 @@ static int xe_pt_stage_unbind_entry(struct > > xe_ptw *parent, pgoff_t offset, > > break; > > } > > > > - /* Ensure it is a defined page */ > > - xe_tile_assert(xe_walk->tile, > > - xe_child->level == 0 || > > - (pte & (XE_PTE_PS64 | > > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > > + /* > > + * The check for xe_pt's children is > > insufficient to determine leaf. > > + * If not leaf, break out and continue in > > next page walk level. > > + */ > > + if (xe_child->level > 0 && > > + !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | > > XE_PDPE_PS_1G))) I don't think XE_PTE_PS64 needs to be checked here as that should only be set at level 0. I agree we xe_child->base.children can be set at level > 0 but now I'm thinking the outer if statement is wrong wrt to 'xe_child->base.children[first]'. Couldn't xe_child->base.children[first] be NULL when subsequent xe_child->base.children[first + 1] be non-NULL? Matt > > + break; > > > > /* An entry should be added for 64KB but > > contigious 4K have XE_PTE_PS64 */ > > if (pte & XE_PTE_PS64) > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-02-23 22:59 ` Matthew Brost @ 2026-02-23 23:07 ` Summers, Stuart 2026-02-23 23:33 ` Nguyen, Brian3 0 siblings, 1 reply; 16+ messages in thread From: Summers, Stuart @ 2026-02-23 23:07 UTC (permalink / raw) To: Brost, Matthew Cc: intel-xe@lists.freedesktop.org, Roper, Matthew D, Nguyen, Brian3 On Mon, 2026-02-23 at 14:59 -0800, Matthew Brost wrote: > On Mon, Feb 23, 2026 at 10:49:21PM +0000, Summers, Stuart wrote: > > On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > > > The check using xe_child->base.children was insufficient in > > > determining > > > if a pte was a leaf node. So explicitly check for if a pte is a > > > leaf > > > through the bit checks. > > > > > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on > > > unbind") > > Move the Fixes tag by other tags (Signed-off-by, Cc) > > > > > > > v2: > > > - Remove old assert. (Matt R) > > > > > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > > > Cc: Matt Roper <matthew.d.roper@intel.com> > > > --- > > > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/xe/xe_pt.c > > > b/drivers/gpu/drm/xe/xe_pt.c > > > index 6703a7049227..b73a356d0fa1 100644 > > > --- a/drivers/gpu/drm/xe/xe_pt.c > > > +++ b/drivers/gpu/drm/xe/xe_pt.c > > > @@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct > > > xe_ptw *parent, pgoff_t offset, > > > > > > XE_WARN_ON(!*child); > > > XE_WARN_ON(!level); > > > - /* Check for leaf node */ > > > + /* Optimistically check for leaf node, may not be > > > guaranteed > > > > I would keep the comments the same - we're still trying to check a > > leaf > > node here and we aren't really doing anything special. If we have > > questions, we can look at the commit history to determine what > > changed > > from your prior implementation. > > > > Or if you want documentation here, it's more interesting to me > > *why* we > > can't see this from the child alone than just the fact that we > > can't > > (which we can observe by the if condition). > > > > Also applies to the comment below too. > > > > Thanks, > > Stuart > > > > > from children alone */ > > > if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk- > > > >prl) > > > && > > > (!xe_child->base.children || !xe_child- > > > > base.children[first])) { > > > struct iosys_map *leaf_map = &xe_child->bo->vmap; > > > @@ -1675,10 +1675,13 @@ static int > > > xe_pt_stage_unbind_entry(struct > > > xe_ptw *parent, pgoff_t offset, > > > break; > > > } > > > > > > - /* Ensure it is a defined page */ > > > - xe_tile_assert(xe_walk->tile, > > > - xe_child->level == 0 || > > > - (pte & (XE_PTE_PS64 | > > > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > > > + /* > > > + * The check for xe_pt's children is > > > insufficient to determine leaf. > > > + * If not leaf, break out and continue in > > > next page walk level. > > > + */ > > > + if (xe_child->level > 0 && > > > + !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | > > > XE_PDPE_PS_1G))) > > I don't think XE_PTE_PS64 needs to be checked here as that should > only > be set at level 0. Oh that's a good catch. PS64 has a specific meaning within the PDE. Are we trying to check if this is > 4K basically? Thanks, Stuart > > I agree we xe_child->base.children can be set at level > 0 but now > I'm > thinking the outer if statement is wrong wrt to > 'xe_child->base.children[first]'. Couldn't > xe_child->base.children[first] be NULL when subsequent > xe_child->base.children[first + 1] be non-NULL? > > Matt > > > > + break; > > > > > > /* An entry should be added for 64KB but > > > contigious 4K have XE_PTE_PS64 */ > > > if (pte & XE_PTE_PS64) > > ^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-02-23 23:07 ` Summers, Stuart @ 2026-02-23 23:33 ` Nguyen, Brian3 2026-02-24 1:45 ` Matthew Brost 0 siblings, 1 reply; 16+ messages in thread From: Nguyen, Brian3 @ 2026-02-23 23:33 UTC (permalink / raw) To: Summers, Stuart, Brost, Matthew Cc: intel-xe@lists.freedesktop.org, Roper, Matthew D On Monday, February 23, 2026 3:07 PM, Stuart Summers wrote: > On Mon, 2026-02-23 at 14:59 -0800, Matthew Brost wrote: > > On Mon, Feb 23, 2026 at 10:49:21PM +0000, Summers, Stuart wrote: > > > On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > > > > The check using xe_child->base.children was insufficient in > > > > determining if a pte was a leaf node. So explicitly check for if a > > > > pte is a leaf through the bit checks. > > > > > > > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on > > > > unbind") > > > > Move the Fixes tag by other tags (Signed-off-by, Cc) > > Got it, will move. > > > > > > > > v2: > > > > - Remove old assert. (Matt R) > > > > > > > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > > > > Cc: Matt Roper <matthew.d.roper@intel.com> > > > > --- > > > > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > > > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_pt.c > > > > b/drivers/gpu/drm/xe/xe_pt.c index 6703a7049227..b73a356d0fa1 > > > > 100644 > > > > --- a/drivers/gpu/drm/xe/xe_pt.c > > > > +++ b/drivers/gpu/drm/xe/xe_pt.c > > > > @@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct > > > > xe_ptw *parent, pgoff_t offset, > > > > > > > > XE_WARN_ON(!*child); > > > > XE_WARN_ON(!level); > > > > - /* Check for leaf node */ > > > > + /* Optimistically check for leaf node, may not be > > > > guaranteed > > > > > > I would keep the comments the same - we're still trying to check a > > > leaf node here and we aren't really doing anything special. If we > > > have questions, we can look at the commit history to determine what > > > changed from your prior implementation. > > > > > > Or if you want documentation here, it's more interesting to me > > > *why* we > > > can't see this from the child alone than just the fact that we can't > > > (which we can observe by the if condition). > > > > > > Also applies to the comment below too. > > > Ahh got it. Let me reword the comments here with more details depending on the changes we make in the comments below. > > > Thanks, > > > Stuart > > > > > > > from children alone */ > > > > if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk- > > > > >prl) > > > > && > > > > (!xe_child->base.children || !xe_child- > > > > > base.children[first])) { > > > > struct iosys_map *leaf_map = &xe_child->bo->vmap; > > > > @@ -1675,10 +1675,13 @@ static int xe_pt_stage_unbind_entry(struct > > > > xe_ptw *parent, pgoff_t offset, > > > > break; > > > > } > > > > > > > > - /* Ensure it is a defined page */ > > > > - xe_tile_assert(xe_walk->tile, > > > > - xe_child->level == 0 || > > > > - (pte & (XE_PTE_PS64 | > > > > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > > > > + /* > > > > + * The check for xe_pt's children is > > > > insufficient to determine leaf. > > > > + * If not leaf, break out and continue in > > > > next page walk level. > > > > + */ > > > > + if (xe_child->level > 0 && > > > > + !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | > > > > XE_PDPE_PS_1G))) > > > > I don't think XE_PTE_PS64 needs to be checked here as that should only > > be set at level 0. > > Oh that's a good catch. PS64 has a specific meaning within the PDE. Are we trying to check if this is > 4K basically? > This was checking if one of the bits indicating that this is a leaf entry was raised and if not, skip adding this. So, checking for if it’s a leaf PTE (which would have one of those bits raised), not necessarily if it is just > 4K. Previously I had thought to remove XE_PTE_PS64 since level == 0 covers the condition but just for clarity of checking all leaf PTE, I kept it with the assert and then kept it since I inverted condition in this patch. I'll remove XE_PTE_PS64 in next patch. Thanks. > Thanks, > Stuart > > > > > I agree we xe_child->base.children can be set at level > 0 but now I'm > > thinking the outer if statement is wrong wrt to > > 'xe_child->base.children[first]'. Couldn't > > xe_child->base.children[first] be NULL when subsequent > > xe_child->base.children[first + 1] be non-NULL? > > I believe this was the issue I was running into with one of the test cases. Having some sort of non-NULL subsequent child declared here with the xe_child->base.children[first] = NULL. But determining if this PTE is a leaf entry would require us to iterate through all the childrens I believe, which is why I had kept that check (xe_child->base.children[first] != NULL) as sort of an optimistic filter and had this new inner if statement to ensure that these entries are leaf entries. So, what is your suggestion here? Thanks, Brian > > Matt > > > > > > + break; > > > > > > > > /* An entry should be added for 64KB but > > > > contigious 4K have XE_PTE_PS64 */ > > > > if (pte & XE_PTE_PS64) > > > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-02-23 23:33 ` Nguyen, Brian3 @ 2026-02-24 1:45 ` Matthew Brost 2026-02-24 2:02 ` Matthew Brost 0 siblings, 1 reply; 16+ messages in thread From: Matthew Brost @ 2026-02-24 1:45 UTC (permalink / raw) To: Nguyen, Brian3 Cc: Summers, Stuart, intel-xe@lists.freedesktop.org, Roper, Matthew D On Mon, Feb 23, 2026 at 04:33:30PM -0700, Nguyen, Brian3 wrote: > On Monday, February 23, 2026 3:07 PM, Stuart Summers wrote: > > On Mon, 2026-02-23 at 14:59 -0800, Matthew Brost wrote: > > > On Mon, Feb 23, 2026 at 10:49:21PM +0000, Summers, Stuart wrote: > > > > On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > > > > > The check using xe_child->base.children was insufficient in > > > > > determining if a pte was a leaf node. So explicitly check for if a > > > > > pte is a leaf through the bit checks. > > > > > > > > > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on > > > > > unbind") > > > > > > Move the Fixes tag by other tags (Signed-off-by, Cc) > > > > > Got it, will move. > > > > > > > > > > > v2: > > > > > - Remove old assert. (Matt R) > > > > > > > > > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > > > > > Cc: Matt Roper <matthew.d.roper@intel.com> > > > > > --- > > > > > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > > > > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_pt.c > > > > > b/drivers/gpu/drm/xe/xe_pt.c index 6703a7049227..b73a356d0fa1 > > > > > 100644 > > > > > --- a/drivers/gpu/drm/xe/xe_pt.c > > > > > +++ b/drivers/gpu/drm/xe/xe_pt.c > > > > > @@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct > > > > > xe_ptw *parent, pgoff_t offset, > > > > > > > > > > XE_WARN_ON(!*child); > > > > > XE_WARN_ON(!level); > > > > > - /* Check for leaf node */ > > > > > + /* Optimistically check for leaf node, may not be > > > > > guaranteed > > > > > > > > I would keep the comments the same - we're still trying to check a > > > > leaf node here and we aren't really doing anything special. If we > > > > have questions, we can look at the commit history to determine what > > > > changed from your prior implementation. > > > > > > > > Or if you want documentation here, it's more interesting to me > > > > *why* we > > > > can't see this from the child alone than just the fact that we can't > > > > (which we can observe by the if condition). > > > > > > > > Also applies to the comment below too. > > > > > > Ahh got it. Let me reword the comments here with more details depending on the changes > we make in the comments below. > > > > > Thanks, > > > > Stuart > > > > > > > > > from children alone */ > > > > > if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk- > > > > > >prl) > > > > > && > > > > > (!xe_child->base.children || !xe_child- > > > > > > base.children[first])) { > > > > > struct iosys_map *leaf_map = &xe_child->bo->vmap; > > > > > @@ -1675,10 +1675,13 @@ static int xe_pt_stage_unbind_entry(struct > > > > > xe_ptw *parent, pgoff_t offset, > > > > > break; > > > > > } > > > > > > > > > > - /* Ensure it is a defined page */ > > > > > - xe_tile_assert(xe_walk->tile, > > > > > - xe_child->level == 0 || > > > > > - (pte & (XE_PTE_PS64 | > > > > > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > > > > > + /* > > > > > + * The check for xe_pt's children is > > > > > insufficient to determine leaf. > > > > > + * If not leaf, break out and continue in > > > > > next page walk level. > > > > > + */ > > > > > + if (xe_child->level > 0 && > > > > > + !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | > > > > > XE_PDPE_PS_1G))) > > > > > > I don't think XE_PTE_PS64 needs to be checked here as that should only > > > be set at level 0. > > > > Oh that's a good catch. PS64 has a specific meaning within the PDE. Are we trying to check if this is > 4K basically? > > > > This was checking if one of the bits indicating that this is a leaf entry was raised and if not, skip adding this. > So, checking for if it’s a leaf PTE (which would have one of those bits raised), not necessarily if it is just > 4K. > > Previously I had thought to remove XE_PTE_PS64 since level == 0 covers the condition but just for clarity of > checking all leaf PTE, I kept it with the assert and then kept it since I inverted condition in this patch. > I'll remove XE_PTE_PS64 in next patch. Thanks. > > > Thanks, > > Stuart > > > > > > > > I agree we xe_child->base.children can be set at level > 0 but now I'm > > > thinking the outer if statement is wrong wrt to > > > 'xe_child->base.children[first]'. Couldn't > > > xe_child->base.children[first] be NULL when subsequent > > > xe_child->base.children[first + 1] be non-NULL? > > > > > I believe this was the issue I was running into with one of the test cases. Having some sort of non-NULL subsequent child declared here Yes, but any check at outer level of individual children doesn't seem right. Let's give an example of a 6M unbind. Case 1: - children[0] == NULL (leaf) - children[1] == Valid (not a leaf) - children[2] == NULL (leaf) I believe you correct code correctly generate PRL for children[0], break on children[1], so children[3] is skipped. I don't think this is correct... On hitting children[1], I believe in addition to breaking the loop, you the PRL needs to be invalidated, right? Case 2: - children[0] == Valid (not a leaf) - children[1] == NULL (leaf) - children[2] == NULL (leaf) The entire PRL generation is skipped but the PRL is not invalidated which seems to be problem as leafs are skipped here. So I believe this entire logic needs a bit more rework than this patch alone. I believe the logic is roughly - at level 1 / 0 always walk all the PTEs in the PRL is valid, at level 1 if any non-2M pages are found invalidate the PRL if we are not going to desend further down (i.e., we cover the entire 2M range). This fairly complicated, so I'd have to type this out + get on test machine to provide further advise here. Matt > with the xe_child->base.children[first] = NULL. But determining if this PTE is a leaf entry would require us to iterate through all the childrens > I believe, which is why I had kept that check (xe_child->base.children[first] != NULL) as sort of an optimistic filter and had this new inner if statement > to ensure that these entries are leaf entries. > > So, what is your suggestion here? > > Thanks, > Brian > > > > Matt > > > > > > > > + break; > > > > > > > > > > /* An entry should be added for 64KB but > > > > > contigious 4K have XE_PTE_PS64 */ > > > > > if (pte & XE_PTE_PS64) > > > > > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-02-24 1:45 ` Matthew Brost @ 2026-02-24 2:02 ` Matthew Brost 2026-02-25 6:45 ` Nguyen, Brian3 0 siblings, 1 reply; 16+ messages in thread From: Matthew Brost @ 2026-02-24 2:02 UTC (permalink / raw) To: Nguyen, Brian3 Cc: Summers, Stuart, intel-xe@lists.freedesktop.org, Roper, Matthew D On Mon, Feb 23, 2026 at 05:45:23PM -0800, Matthew Brost wrote: > On Mon, Feb 23, 2026 at 04:33:30PM -0700, Nguyen, Brian3 wrote: > > On Monday, February 23, 2026 3:07 PM, Stuart Summers wrote: > > > On Mon, 2026-02-23 at 14:59 -0800, Matthew Brost wrote: > > > > On Mon, Feb 23, 2026 at 10:49:21PM +0000, Summers, Stuart wrote: > > > > > On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > > > > > > The check using xe_child->base.children was insufficient in > > > > > > determining if a pte was a leaf node. So explicitly check for if a > > > > > > pte is a leaf through the bit checks. > > > > > > > > > > > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on > > > > > > unbind") > > > > > > > > Move the Fixes tag by other tags (Signed-off-by, Cc) > > > > > > > > Got it, will move. > > > > > > > > > > > > > > v2: > > > > > > - Remove old assert. (Matt R) > > > > > > > > > > > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > > > > > > Cc: Matt Roper <matthew.d.roper@intel.com> > > > > > > --- > > > > > > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > > > > > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_pt.c > > > > > > b/drivers/gpu/drm/xe/xe_pt.c index 6703a7049227..b73a356d0fa1 > > > > > > 100644 > > > > > > --- a/drivers/gpu/drm/xe/xe_pt.c > > > > > > +++ b/drivers/gpu/drm/xe/xe_pt.c > > > > > > @@ -1655,7 +1655,7 @@ static int xe_pt_stage_unbind_entry(struct > > > > > > xe_ptw *parent, pgoff_t offset, > > > > > > > > > > > > XE_WARN_ON(!*child); > > > > > > XE_WARN_ON(!level); > > > > > > - /* Check for leaf node */ > > > > > > + /* Optimistically check for leaf node, may not be > > > > > > guaranteed > > > > > > > > > > I would keep the comments the same - we're still trying to check a > > > > > leaf node here and we aren't really doing anything special. If we > > > > > have questions, we can look at the commit history to determine what > > > > > changed from your prior implementation. > > > > > > > > > > Or if you want documentation here, it's more interesting to me > > > > > *why* we > > > > > can't see this from the child alone than just the fact that we can't > > > > > (which we can observe by the if condition). > > > > > > > > > > Also applies to the comment below too. > > > > > > > > > Ahh got it. Let me reword the comments here with more details depending on the changes > > we make in the comments below. > > > > > > > Thanks, > > > > > Stuart > > > > > > > > > > > from children alone */ > > > > > > if (xe_walk->prl && xe_page_reclaim_list_valid(xe_walk- > > > > > > >prl) > > > > > > && > > > > > > (!xe_child->base.children || !xe_child- > > > > > > > base.children[first])) { > > > > > > struct iosys_map *leaf_map = &xe_child->bo->vmap; > > > > > > @@ -1675,10 +1675,13 @@ static int xe_pt_stage_unbind_entry(struct > > > > > > xe_ptw *parent, pgoff_t offset, > > > > > > break; > > > > > > } > > > > > > > > > > > > - /* Ensure it is a defined page */ > > > > > > - xe_tile_assert(xe_walk->tile, > > > > > > - xe_child->level == 0 || > > > > > > - (pte & (XE_PTE_PS64 | > > > > > > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > > > > > > + /* > > > > > > + * The check for xe_pt's children is > > > > > > insufficient to determine leaf. > > > > > > + * If not leaf, break out and continue in > > > > > > next page walk level. > > > > > > + */ > > > > > > + if (xe_child->level > 0 && > > > > > > + !(pte & (XE_PTE_PS64 | XE_PDE_PS_2M | > > > > > > XE_PDPE_PS_1G))) > > > > > > > > I don't think XE_PTE_PS64 needs to be checked here as that should only > > > > be set at level 0. > > > > > > Oh that's a good catch. PS64 has a specific meaning within the PDE. Are we trying to check if this is > 4K basically? > > > > > > > This was checking if one of the bits indicating that this is a leaf entry was raised and if not, skip adding this. > > So, checking for if it’s a leaf PTE (which would have one of those bits raised), not necessarily if it is just > 4K. > > > > Previously I had thought to remove XE_PTE_PS64 since level == 0 covers the condition but just for clarity of > > checking all leaf PTE, I kept it with the assert and then kept it since I inverted condition in this patch. > > I'll remove XE_PTE_PS64 in next patch. Thanks. > > > > > Thanks, > > > Stuart > > > > > > > > > > > I agree we xe_child->base.children can be set at level > 0 but now I'm > > > > thinking the outer if statement is wrong wrt to > > > > 'xe_child->base.children[first]'. Couldn't > > > > xe_child->base.children[first] be NULL when subsequent > > > > xe_child->base.children[first + 1] be non-NULL? > > > > > > > > I believe this was the issue I was running into with one of the test cases. Having some sort of non-NULL subsequent child declared here > > Yes, but any check at outer level of individual children doesn't seem > right. > > Let's give an example of a 6M unbind. > > Case 1: > - children[0] == NULL (leaf) > - children[1] == Valid (not a leaf) > - children[2] == NULL (leaf) > > I believe you correct code correctly generate PRL for children[0], break > on children[1], so children[3] is skipped. I don't think this is > correct... On hitting children[1], I believe in addition to breaking the > loop, you the PRL needs to be invalidated, right? > > Case 2: > - children[0] == Valid (not a leaf) > - children[1] == NULL (leaf) > - children[2] == NULL (leaf) > > The entire PRL generation is skipped but the PRL is not invalidated > which seems to be problem as leafs are skipped here. > > So I believe this entire logic needs a bit more rework than this patch > alone. > > I believe the logic is roughly - at level 1 / 0 always walk all the > PTEs in the PRL is valid, at level 1 if any non-2M pages are found > invalidate the PRL if we are not going to desend further down (i.e., we > cover the entire 2M range). > > This fairly complicated, so I'd have to type this out + get on test > machine to provide further advise here. > I can give you some test cases I suppose... - Test case A - 2M binds: BO[0] = alloc(8M); bind(BO[0], aligned VA, 8M); unbind(aligned VA, 8M); /* Get four 2M PRL */ - Test base B - 4k binds - Same as above but 4k - Test case C - 2M mixed: BO[0] = alloc(2M); BO[1] = alloc(4K); BO[2] = alloc(2M); bind(BO[0], aligned VA, 2M); bind(BO[1], aligned VA + 2M, 4K); bind(BO[2], aligned VA + 4M, 2M); unbind(aligned VA, 6M); /* PRL should be invalid */ - Test case C - 2M mixed: BO[0] = alloc(4K); BO[1] = alloc(2M); BO[2] = alloc(2M); bind(BO[0], aligned VA, 4k); bind(BO[1], aligned VA + 2M, 2M); bind(BO[2], aligned VA + 4M, 2M); /* PRL should be invalid */ unbind(aligned VA, 6M); /* PRL should be invalid */ - test case D - 2M, partial: BO[0] = alloc(2M); BO[1] = alloc(4k); bind(BO[0], aligned VA, 2M); bind(BO[1], aligned VA + 2M, 4k); unbind(aligned VA, 2M + 4k); /* Get one 2M PRL, one 4K PRL */ - test case E - 2M, partial: BO[0] = alloc(4K); BO[1] = alloc(2M); bind(BO[0], aligned VA - 4K, 4K); bind(BO[1], aligned VA, 2M); unbind(aligned VA - 4K, 2M + 4K); /* Get one 2M PRL, one 4K PRL */ - test case F - 1 GB, partial: BO[0] = alloc(1G); BO[1] = alloc(2M); bind(BO[0], aligned VA, 1G); bind(BO[1], aligned VA + 1G, 2M); unbind(aligned VA, 1G + 2M); /* PRL should be invalid */ Matt > Matt > > > with the xe_child->base.children[first] = NULL. But determining if this PTE is a leaf entry would require us to iterate through all the childrens > > I believe, which is why I had kept that check (xe_child->base.children[first] != NULL) as sort of an optimistic filter and had this new inner if statement > > to ensure that these entries are leaf entries. > > > > So, what is your suggestion here? > > > > Thanks, > > Brian > > > > > > Matt > > > > > > > > > > + break; > > > > > > > > > > > > /* An entry should be added for 64KB but > > > > > > contigious 4K have XE_PTE_PS64 */ > > > > > > if (pte & XE_PTE_PS64) > > > > > > > ^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-02-24 2:02 ` Matthew Brost @ 2026-02-25 6:45 ` Nguyen, Brian3 2026-02-25 7:19 ` Matthew Brost 0 siblings, 1 reply; 16+ messages in thread From: Nguyen, Brian3 @ 2026-02-25 6:45 UTC (permalink / raw) To: Brost, Matthew Cc: Summers, Stuart, intel-xe@lists.freedesktop.org, Roper, Matthew D On Monday, February 23, 2026 6:03 PM, Nguyen, Brian3 wrote: > On Mon, Feb 23, 2026 at 05:45:23PM -0800, Matthew Brost wrote: > > On Mon, Feb 23, 2026 at 04:33:30PM -0700, Nguyen, Brian3 wrote: > > > On Monday, February 23, 2026 3:07 PM, Stuart Summers wrote: > > > > On Mon, 2026-02-23 at 14:59 -0800, Matthew Brost wrote: > > > > > On Mon, Feb 23, 2026 at 10:49:21PM +0000, Summers, Stuart wrote: > > > > > > On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > > > > > > > The check using xe_child->base.children was insufficient in > > > > > > > determining if a pte was a leaf node. So explicitly check > > > > > > > for if a pte is a leaf through the bit checks. > > > > > > > > > > > > > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on > > > > > > > unbind") > > > > > > > > > > Move the Fixes tag by other tags (Signed-off-by, Cc) > > > > > > > > > > > Got it, will move. > > > > > > > > > > > > > > > > > v2: > > > > > > > - Remove old assert. (Matt R) > > > > > > > > > > > > > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > > > > > > > Cc: Matt Roper <matthew.d.roper@intel.com> > > > > > > > --- > > > > > > > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > > > > > > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > > > > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_pt.c > > > > > > > b/drivers/gpu/drm/xe/xe_pt.c index > > > > > > > 6703a7049227..b73a356d0fa1 > > > > > > > 100644 > > > > > > > --- a/drivers/gpu/drm/xe/xe_pt.c > > > > > > > +++ b/drivers/gpu/drm/xe/xe_pt.c > > > > > > > @@ -1655,7 +1655,7 @@ static int > > > > > > > xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t > > > > > > > offset, > > > > > > > > > > > > > > XE_WARN_ON(!*child); > > > > > > > XE_WARN_ON(!level); > > > > > > > - /* Check for leaf node */ > > > > > > > + /* Optimistically check for leaf node, may not be > > > > > > > guaranteed > > > > > > > > > > > > I would keep the comments the same - we're still trying to > > > > > > check a leaf node here and we aren't really doing anything > > > > > > special. If we have questions, we can look at the commit > > > > > > history to determine what changed from your prior implementation. > > > > > > > > > > > > Or if you want documentation here, it's more interesting to me > > > > > > *why* we > > > > > > can't see this from the child alone than just the fact that we > > > > > > can't (which we can observe by the if condition). > > > > > > > > > > > > Also applies to the comment below too. > > > > > > > > > > > > Ahh got it. Let me reword the comments here with more details > > > depending on the changes we make in the comments below. > > > > > > > > > Thanks, > > > > > > Stuart > > > > > > > > > > > > > from children alone */ > > > > > > > if (xe_walk->prl && > > > > > > > xe_page_reclaim_list_valid(xe_walk- > > > > > > > >prl) > > > > > > > && > > > > > > > (!xe_child->base.children || !xe_child- > > > > > > > > base.children[first])) { > > > > > > > struct iosys_map *leaf_map = > > > > > > > &xe_child->bo->vmap; @@ -1675,10 +1675,13 @@ static int > > > > > > > xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t > > > > > > > offset, > > > > > > > break; > > > > > > > } > > > > > > > > > > > > > > - /* Ensure it is a defined page */ > > > > > > > - xe_tile_assert(xe_walk->tile, > > > > > > > - xe_child->level == 0 > > > > > > > || > > > > > > > - (pte & (XE_PTE_PS64 | > > > > > > > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > > > > > > > + /* > > > > > > > + * The check for xe_pt's children is > > > > > > > insufficient to determine leaf. > > > > > > > + * If not leaf, break out and > > > > > > > +continue in > > > > > > > next page walk level. > > > > > > > + */ > > > > > > > + if (xe_child->level > 0 && > > > > > > > + !(pte & (XE_PTE_PS64 | > > > > > > > +XE_PDE_PS_2M | > > > > > > > XE_PDPE_PS_1G))) > > > > > > > > > > I don't think XE_PTE_PS64 needs to be checked here as that > > > > > should only be set at level 0. > > > > > > > > Oh that's a good catch. PS64 has a specific meaning within the PDE. Are we trying to check if this is > 4K basically? > > > > > > > > > > This was checking if one of the bits indicating that this is a leaf entry was raised and if not, skip adding this. > > > So, checking for if it’s a leaf PTE (which would have one of those bits raised), not necessarily if it is just > 4K. > > > > > > Previously I had thought to remove XE_PTE_PS64 since level == 0 > > > covers the condition but just for clarity of checking all leaf PTE, I kept it with the assert and then kept it since I inverted condition in > this patch. > > > I'll remove XE_PTE_PS64 in next patch. Thanks. > > > > > > > Thanks, > > > > Stuart > > > > > > > > > > > > > > I agree we xe_child->base.children can be set at level > 0 but > > > > > now I'm thinking the outer if statement is wrong wrt to > > > > > 'xe_child->base.children[first]'. Couldn't > > > > > xe_child->base.children[first] be NULL when subsequent > > > > > xe_child->base.children[first + 1] be non-NULL? > > > > > > > > > > > I believe this was the issue I was running into with one of the test > > > cases. Having some sort of non-NULL subsequent child declared here > > > > Yes, but any check at outer level of individual children doesn't seem > > right. > > > > Let's give an example of a 6M unbind. > > > > Case 1: > > - children[0] == NULL (leaf) > > - children[1] == Valid (not a leaf) > > - children[2] == NULL (leaf) > > > > I believe you correct code correctly generate PRL for children[0], > > break on children[1], so children[3] is skipped. I don't think this is > > correct... On hitting children[1], I believe in addition to breaking > > the loop, you the PRL needs to be invalidated, right? > > Yea... I see the issue. My intent at the time was to ensure that the xe_pt being read is a leaf entry by reading children. My thought was that if the 1st one read was a leaf PTE, then we could keep iterating until there wasn't a leaf anymore and handle it on next page walk, but that seems insufficient now for these interleaved leaf pte and nonleaf pt. Still smacking my head at this trying to come up with a better solution, but current idea here is removing that children check from the outer if statement and adding the following inside of the for loop. Let me test to see if that is sufficient. ``` for (pgoff_t i = 0; i < count; i++) { if (xe_child->base.children && xe_child->base.children[first + i]) continue; ... } ``` This would allow for us to add all the leaf nodes and skip over the ones aren't accessed by the page walker until later. This would work for the issue I previously ran into mentioned later and case 2 but it wouldn't work for case 1. - children[0] == NULL (leaf) - children[1] == Valid (not a leaf) - children[2] == NULL (leaf) In this case, could we do something dumb like check to see if this not a leaf would be at the edge, based on the index with count and alignment? If quick test results are good and no objections, I can try this as next patch to see... > > Case 2: > > - children[0] == Valid (not a leaf) > > - children[1] == NULL (leaf) > > - children[2] == NULL (leaf) > > > > The entire PRL generation is skipped but the PRL is not invalidated > > which seems to be problem as leafs are skipped here. > > > > So I believe this entire logic needs a bit more rework than this patch > > alone. > > > > I believe the logic is roughly - at level 1 / 0 always walk all the > > PTEs in the PRL is valid, at level 1 if any non-2M pages are found > > invalidate the PRL if we are not going to desend further down (i.e., > > we cover the entire 2M range). > > > > This fairly complicated, so I'd have to type this out + get on test > > machine to provide further advise here. > > > > I can give you some test cases I suppose... > Thanks for the test case and examples. I did have a try with these to see the intended behavior here and everything worked out except the 2m mixed cases. FYI, took a look again at the particular test case I was triggering an issue with the original assert: igt@xe_vm@large-split-binds-268435456, which performs BO[0] = alloc(256M+4K) bind(BO[0], aligned VA, 128M) bind(BO[0]+offset(128M), aligned VA + 128M, 128M+4K) unbind(aligned VA, 128M) unbind(aligned VA+128M, 128M+4K) So there was an edge case here of what I believe is a page directory filled with 2M and a 4K page afterwards and num_entries of xe_pt was 65. PD[64] = 2M PTE PD[65] = 2M PTE ... PD[127] = 2M PTE PD[128] = PT -> 4K PTE (Triggers assert, shouldn't be added as a PRL entry) But can still proceed with PRL w/o invalidate because the next page walk should proceed to the 4K page here. So - children[64] == NULL (leaf) - children[65] == NULL (leaf) ... - children[127] == NULL (leaf) - children[128] == VALID (not a leaf) > - Test case A - 2M binds: > > BO[0] = alloc(8M); > bind(BO[0], aligned VA, 8M); > unbind(aligned VA, 8M); /* Get four 2M PRL */ > > - Test base B - 4k binds - Same as above but 4k > > - Test case C - 2M mixed: > > BO[0] = alloc(2M); > BO[1] = alloc(4K); > BO[2] = alloc(2M); > bind(BO[0], aligned VA, 2M); > bind(BO[1], aligned VA + 2M, 4K); > bind(BO[2], aligned VA + 4M, 2M); > unbind(aligned VA, 6M); /* PRL should be invalid */ > A bit confused why this would require the PRL to be invalidated? There should be 3 unbind ops with the 6M range each could target one entry here since 3 BO. Hopefully understood your direction here and ran the test case and saw the OPs [drm:print_op [xe]] UNMAP: addr=0x0000000040000000, range=0x0000000000200000, keep=0 [drm:print_op [xe]] UNMAP: addr=0x0000000040200000, range=0x0000000000001000, keep=0 [drm:print_op [xe]] UNMAP: addr=0x0000000040400000, range=0x0000000000200000, keep=0 [drm:unbind_op_prepare [xe]] Preparing unbind, with range [40000000...401fffff) [drm:xe_pt_stage_unbind_entry [xe]] PRL add entry: level=1 pte=0x20000001516004bb reclamation_size=9 prl_idx=0 [drm:xe_vm_dbg_print_entries [xe]] unbind: 1 entries to update [drm:xe_vm_dbg_print_entries [xe]] 0: Update level 1 at (0 + 1) [40000000...40200000) f:0 [drm:unbind_op_prepare [xe]] Preparing unbind, with range [40200000...40200fff) [drm:xe_pt_stage_unbind_entry [xe]] PRL add entry: level=0 pte=0x200000015048c43b reclamation_size=0 prl_idx=1 [drm:xe_vm_dbg_print_entries [xe]] unbind: 1 entries to update [drm:xe_vm_dbg_print_entries [xe]] 0: Update level 1 at (1 + 1) [40200000...40400000) f:0 [drm:unbind_op_prepare [xe]] Preparing unbind, with range [40400000...405fffff) [drm:xe_pt_stage_unbind_entry [xe]] PRL add entry: level=1 pte=0x20000001808004bb reclamation_size=9 prl_idx=2 [drm:xe_vm_dbg_print_entries [xe]] unbind: 1 entries to update [drm:xe_vm_dbg_print_entries [xe]] 0: Update level 4 at (0 + 1) [0...1000000000000) f:0 > - Test case C - 2M mixed: > > BO[0] = alloc(4K); > BO[1] = alloc(2M); > BO[2] = alloc(2M); > bind(BO[0], aligned VA, 4k); > bind(BO[1], aligned VA + 2M, 2M); > bind(BO[2], aligned VA + 4M, 2M); /* PRL should be invalid */ > unbind(aligned VA, 6M); /* PRL should be invalid */ > Same question as above. I'm guessing that we are trying to trigger that case with the non-leaf in the middle of the children, but I believe we must make one BO that has 2M PTEs and scattered 4K PTEs for one of the 2M regions? Brian > - test case D - 2M, partial: > > BO[0] = alloc(2M); > BO[1] = alloc(4k); > bind(BO[0], aligned VA, 2M); > bind(BO[1], aligned VA + 2M, 4k); > unbind(aligned VA, 2M + 4k); /* Get one 2M PRL, one 4K PRL */ > > - test case E - 2M, partial: > > BO[0] = alloc(4K); > BO[1] = alloc(2M); > bind(BO[0], aligned VA - 4K, 4K); > bind(BO[1], aligned VA, 2M); > unbind(aligned VA - 4K, 2M + 4K); /* Get one 2M PRL, one 4K PRL */ > > - test case F - 1 GB, partial: > > BO[0] = alloc(1G); > BO[1] = alloc(2M); > bind(BO[0], aligned VA, 1G); > bind(BO[1], aligned VA + 1G, 2M); > unbind(aligned VA, 1G + 2M); /* PRL should be invalid */ > > Matt > > > Matt > > > > > with the xe_child->base.children[first] = NULL. But determining if > > > this PTE is a leaf entry would require us to iterate through all the > > > childrens I believe, which is why I had kept that check (xe_child->base.children[first] != NULL) as sort of an optimistic filter and had > this new inner if statement to ensure that these entries are leaf entries. > > > > > > So, what is your suggestion here? > > > > > > Thanks, > > > Brian > > > > > > > > Matt > > > > > > > > > > > > + break; > > > > > > > > > > > > > > /* An entry should be added for 64KB > > > > > > > but contigious 4K have XE_PTE_PS64 */ > > > > > > > if (pte & XE_PTE_PS64) > > > > > > > > > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation 2026-02-25 6:45 ` Nguyen, Brian3 @ 2026-02-25 7:19 ` Matthew Brost 0 siblings, 0 replies; 16+ messages in thread From: Matthew Brost @ 2026-02-25 7:19 UTC (permalink / raw) To: Nguyen, Brian3 Cc: Summers, Stuart, intel-xe@lists.freedesktop.org, Roper, Matthew D On Tue, Feb 24, 2026 at 11:45:21PM -0700, Nguyen, Brian3 wrote: > On Monday, February 23, 2026 6:03 PM, Nguyen, Brian3 wrote: > > On Mon, Feb 23, 2026 at 05:45:23PM -0800, Matthew Brost wrote: > > > On Mon, Feb 23, 2026 at 04:33:30PM -0700, Nguyen, Brian3 wrote: > > > > On Monday, February 23, 2026 3:07 PM, Stuart Summers wrote: > > > > > On Mon, 2026-02-23 at 14:59 -0800, Matthew Brost wrote: > > > > > > On Mon, Feb 23, 2026 at 10:49:21PM +0000, Summers, Stuart wrote: > > > > > > > On Thu, 2026-01-29 at 08:27 +0000, Brian Nguyen wrote: > > > > > > > > The check using xe_child->base.children was insufficient in > > > > > > > > determining if a pte was a leaf node. So explicitly check > > > > > > > > for if a pte is a leaf through the bit checks. > > > > > > > > > > > > > > > > Fixes: b912138df299 ("drm/xe: Create page reclaim list on > > > > > > > > unbind") > > > > > > > > > > > > Move the Fixes tag by other tags (Signed-off-by, Cc) > > > > > > > > > > > > > > Got it, will move. > > > > > > > > > > > > > > > > > > > > v2: > > > > > > > > - Remove old assert. (Matt R) > > > > > > > > > > > > > > > > Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com> > > > > > > > > Cc: Matt Roper <matthew.d.roper@intel.com> > > > > > > > > --- > > > > > > > > drivers/gpu/drm/xe/xe_pt.c | 13 ++++++++----- > > > > > > > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > > > > > > > > > > > > > diff --git a/drivers/gpu/drm/xe/xe_pt.c > > > > > > > > b/drivers/gpu/drm/xe/xe_pt.c index > > > > > > > > 6703a7049227..b73a356d0fa1 > > > > > > > > 100644 > > > > > > > > --- a/drivers/gpu/drm/xe/xe_pt.c > > > > > > > > +++ b/drivers/gpu/drm/xe/xe_pt.c > > > > > > > > @@ -1655,7 +1655,7 @@ static int > > > > > > > > xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t > > > > > > > > offset, > > > > > > > > > > > > > > > > XE_WARN_ON(!*child); > > > > > > > > XE_WARN_ON(!level); > > > > > > > > - /* Check for leaf node */ > > > > > > > > + /* Optimistically check for leaf node, may not be > > > > > > > > guaranteed > > > > > > > > > > > > > > I would keep the comments the same - we're still trying to > > > > > > > check a leaf node here and we aren't really doing anything > > > > > > > special. If we have questions, we can look at the commit > > > > > > > history to determine what changed from your prior implementation. > > > > > > > > > > > > > > Or if you want documentation here, it's more interesting to me > > > > > > > *why* we > > > > > > > can't see this from the child alone than just the fact that we > > > > > > > can't (which we can observe by the if condition). > > > > > > > > > > > > > > Also applies to the comment below too. > > > > > > > > > > > > > > > Ahh got it. Let me reword the comments here with more details > > > > depending on the changes we make in the comments below. > > > > > > > > > > > Thanks, > > > > > > > Stuart > > > > > > > > > > > > > > > from children alone */ > > > > > > > > if (xe_walk->prl && > > > > > > > > xe_page_reclaim_list_valid(xe_walk- > > > > > > > > >prl) > > > > > > > > && > > > > > > > > (!xe_child->base.children || !xe_child- > > > > > > > > > base.children[first])) { > > > > > > > > struct iosys_map *leaf_map = > > > > > > > > &xe_child->bo->vmap; @@ -1675,10 +1675,13 @@ static int > > > > > > > > xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t > > > > > > > > offset, > > > > > > > > break; > > > > > > > > } > > > > > > > > > > > > > > > > - /* Ensure it is a defined page */ > > > > > > > > - xe_tile_assert(xe_walk->tile, > > > > > > > > - xe_child->level == 0 > > > > > > > > || > > > > > > > > - (pte & (XE_PTE_PS64 | > > > > > > > > XE_PDE_PS_2M | XE_PDPE_PS_1G))); > > > > > > > > + /* > > > > > > > > + * The check for xe_pt's children is > > > > > > > > insufficient to determine leaf. > > > > > > > > + * If not leaf, break out and > > > > > > > > +continue in > > > > > > > > next page walk level. > > > > > > > > + */ > > > > > > > > + if (xe_child->level > 0 && > > > > > > > > + !(pte & (XE_PTE_PS64 | > > > > > > > > +XE_PDE_PS_2M | > > > > > > > > XE_PDPE_PS_1G))) > > > > > > > > > > > > I don't think XE_PTE_PS64 needs to be checked here as that > > > > > > should only be set at level 0. > > > > > > > > > > Oh that's a good catch. PS64 has a specific meaning within the PDE. Are we trying to check if this is > 4K basically? > > > > > > > > > > > > > This was checking if one of the bits indicating that this is a leaf entry was raised and if not, skip adding this. > > > > So, checking for if it’s a leaf PTE (which would have one of those bits raised), not necessarily if it is just > 4K. > > > > > > > > Previously I had thought to remove XE_PTE_PS64 since level == 0 > > > > covers the condition but just for clarity of checking all leaf PTE, I kept it with the assert and then kept it since I inverted condition in > > this patch. > > > > I'll remove XE_PTE_PS64 in next patch. Thanks. > > > > > > > > > Thanks, > > > > > Stuart > > > > > > > > > > > > > > > > > I agree we xe_child->base.children can be set at level > 0 but > > > > > > now I'm thinking the outer if statement is wrong wrt to > > > > > > 'xe_child->base.children[first]'. Couldn't > > > > > > xe_child->base.children[first] be NULL when subsequent > > > > > > xe_child->base.children[first + 1] be non-NULL? > > > > > > > > > > > > > > I believe this was the issue I was running into with one of the test > > > > cases. Having some sort of non-NULL subsequent child declared here > > > > > > Yes, but any check at outer level of individual children doesn't seem > > > right. > > > > > > Let's give an example of a 6M unbind. > > > > > > Case 1: > > > - children[0] == NULL (leaf) > > > - children[1] == Valid (not a leaf) > > > - children[2] == NULL (leaf) > > > > > > I believe you correct code correctly generate PRL for children[0], > > > break on children[1], so children[3] is skipped. I don't think this is > > > correct... On hitting children[1], I believe in addition to breaking > > > the loop, you the PRL needs to be invalidated, right? > > > > > Yea... I see the issue. My intent at the time was to ensure that the xe_pt being > read is a leaf entry by reading children. My thought was that if the 1st one read > was a leaf PTE, then we could keep iterating until there wasn't a leaf anymore > and handle it on next page walk, but that seems insufficient now for these > interleaved leaf pte and nonleaf pt. > > Still smacking my head at this trying to come up with a better solution, but > current idea here is removing that children check from the outer if statement > and adding the following inside of the for loop. Let me test to see if that is sufficient. > > ``` > for (pgoff_t i = 0; i < count; i++) { > if (xe_child->base.children && xe_child->base.children[first + i]) > continue; > ... > } > ``` Yes, I think something roughly like this. See below, I confused myself shooting test cases from hip so unless I type an implementation out I'll probably give further bad input... > > This would allow for us to add all the leaf nodes and skip over the ones aren't accessed > by the page walker until later. This would work for the issue I previously ran into > mentioned later and case 2 but it wouldn't work for case 1. > > - children[0] == NULL (leaf) > - children[1] == Valid (not a leaf) > - children[2] == NULL (leaf) > > In this case, could we do something dumb like check to see if this not a leaf would > be at the edge, based on the index with count and alignment? > > If quick test results are good and no objections, I can try this as next patch to see... > > > > Case 2: > > > - children[0] == Valid (not a leaf) > > > - children[1] == NULL (leaf) > > > - children[2] == NULL (leaf) > > > > > > The entire PRL generation is skipped but the PRL is not invalidated > > > which seems to be problem as leafs are skipped here. > > > > > > So I believe this entire logic needs a bit more rework than this patch > > > alone. > > > > > > I believe the logic is roughly - at level 1 / 0 always walk all the > > > PTEs in the PRL is valid, at level 1 if any non-2M pages are found > > > invalidate the PRL if we are not going to desend further down (i.e., > > > we cover the entire 2M range). > > > > > > This fairly complicated, so I'd have to type this out + get on test > > > machine to provide further advise here. > > > > > > > I can give you some test cases I suppose... > > > > Thanks for the test case and examples. I did have a try with these to see > the intended behavior here and everything worked out except the 2m mixed cases. > > FYI, took a look again at the particular test case I was triggering an issue > with the original assert: igt@xe_vm@large-split-binds-268435456, > which performs > BO[0] = alloc(256M+4K) > bind(BO[0], aligned VA, 128M) > bind(BO[0]+offset(128M), aligned VA + 128M, 128M+4K) > unbind(aligned VA, 128M) > unbind(aligned VA+128M, 128M+4K) > > So there was an edge case here of what I believe is a page directory > filled with 2M and a 4K page afterwards and num_entries of xe_pt was 65. > > PD[64] = 2M PTE > PD[65] = 2M PTE > ... > PD[127] = 2M PTE > PD[128] = PT -> 4K PTE (Triggers assert, shouldn't be added as a PRL entry) > But can still proceed with PRL w/o invalidate because the next page walk > should proceed to the 4K page here. Yes, I think we would descend if the unbind doesn’t completely cover the 2M region and there are other present PTEs in the region. I believe we'd short circuit the decend if the 4K PTE was only PTE in region though... I could be wrong though as it has been a while since I've run this code tracing every step. In some of my examples above, I was thinking that within a single VMA you could have a 2M page and then 512 4K pages in the covered region, depending on how the physical backing gets allocated. Hitting this case is really difficult because of how DRM buddy works, but it is possible. > > So > - children[64] == NULL (leaf) > - children[65] == NULL (leaf) > ... > - children[127] == NULL (leaf) > - children[128] == VALID (not a leaf) > > > - Test case A - 2M binds: > > > > BO[0] = alloc(8M); > > bind(BO[0], aligned VA, 8M); > > unbind(aligned VA, 8M); /* Get four 2M PRL */ > > > > - Test base B - 4k binds - Same as above but 4k > > > > - Test case C - 2M mixed: > > > > BO[0] = alloc(2M); > > BO[1] = alloc(4K); > > BO[2] = alloc(2M); > > bind(BO[0], aligned VA, 2M); > > bind(BO[1], aligned VA + 2M, 4K); > > bind(BO[2], aligned VA + 4M, 2M); > > unbind(aligned VA, 6M); /* PRL should be invalid */ > > > > A bit confused why this would require the PRL to be invalidated? > There should be 3 unbind ops with the 6M range each could > target one entry here since 3 BO. Ah, yes. We would get 3 unbind ops here. I was thinking we'd get one 6M unbind op and the middle part we wouldn't decend but I was clearly confusing myself... This case should actually work. > > Hopefully understood your direction here and ran the test case and saw the OPs > [drm:print_op [xe]] UNMAP: addr=0x0000000040000000, range=0x0000000000200000, keep=0 > [drm:print_op [xe]] UNMAP: addr=0x0000000040200000, range=0x0000000000001000, keep=0 > [drm:print_op [xe]] UNMAP: addr=0x0000000040400000, range=0x0000000000200000, keep=0 > [drm:unbind_op_prepare [xe]] Preparing unbind, with range [40000000...401fffff) > [drm:xe_pt_stage_unbind_entry [xe]] PRL add entry: level=1 pte=0x20000001516004bb reclamation_size=9 prl_idx=0 > [drm:xe_vm_dbg_print_entries [xe]] unbind: 1 entries to update > [drm:xe_vm_dbg_print_entries [xe]] 0: Update level 1 at (0 + 1) [40000000...40200000) f:0 > [drm:unbind_op_prepare [xe]] Preparing unbind, with range [40200000...40200fff) > [drm:xe_pt_stage_unbind_entry [xe]] PRL add entry: level=0 pte=0x200000015048c43b reclamation_size=0 prl_idx=1 > [drm:xe_vm_dbg_print_entries [xe]] unbind: 1 entries to update > [drm:xe_vm_dbg_print_entries [xe]] 0: Update level 1 at (1 + 1) [40200000...40400000) f:0 > [drm:unbind_op_prepare [xe]] Preparing unbind, with range [40400000...405fffff) > [drm:xe_pt_stage_unbind_entry [xe]] PRL add entry: level=1 pte=0x20000001808004bb reclamation_size=9 prl_idx=2 > [drm:xe_vm_dbg_print_entries [xe]] unbind: 1 entries to update > [drm:xe_vm_dbg_print_entries [xe]] 0: Update level 4 at (0 + 1) [0...1000000000000) f:0 > > > - Test case C - 2M mixed: > > > > BO[0] = alloc(4K); > > BO[1] = alloc(2M); > > BO[2] = alloc(2M); > > bind(BO[0], aligned VA, 4k); > > bind(BO[1], aligned VA + 2M, 2M); > > bind(BO[2], aligned VA + 4M, 2M); /* PRL should be invalid */ > > unbind(aligned VA, 6M); /* PRL should be invalid */ > > > This one should work too. Matt > Same question as above. I'm guessing that we are trying to > trigger that case with the non-leaf in the middle of the children, > but I believe we must make one BO that has 2M PTEs and > scattered 4K PTEs for one of the 2M regions? > > Brian > > > - test case D - 2M, partial: > > > > BO[0] = alloc(2M); > > BO[1] = alloc(4k); > > bind(BO[0], aligned VA, 2M); > > bind(BO[1], aligned VA + 2M, 4k); > > unbind(aligned VA, 2M + 4k); /* Get one 2M PRL, one 4K PRL */ > > > > - test case E - 2M, partial: > > > > BO[0] = alloc(4K); > > BO[1] = alloc(2M); > > bind(BO[0], aligned VA - 4K, 4K); > > bind(BO[1], aligned VA, 2M); > > unbind(aligned VA - 4K, 2M + 4K); /* Get one 2M PRL, one 4K PRL */ > > > > - test case F - 1 GB, partial: > > > > BO[0] = alloc(1G); > > BO[1] = alloc(2M); > > bind(BO[0], aligned VA, 1G); > > bind(BO[1], aligned VA + 1G, 2M); > > unbind(aligned VA, 1G + 2M); /* PRL should be invalid */ > > > > Matt > > > > > Matt > > > > > > > with the xe_child->base.children[first] = NULL. But determining if > > > > this PTE is a leaf entry would require us to iterate through all the > > > > childrens I believe, which is why I had kept that check (xe_child->base.children[first] != NULL) as sort of an optimistic filter and had > > this new inner if statement to ensure that these entries are leaf entries. > > > > > > > > So, what is your suggestion here? > > > > > > > > Thanks, > > > > Brian > > > > > > > > > > Matt > > > > > > > > > > > > > > + break; > > > > > > > > > > > > > > > > /* An entry should be added for 64KB > > > > > > > > but contigious 4K have XE_PTE_PS64 */ > > > > > > > > if (pte & XE_PTE_PS64) > > > > > > > > > > > ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-02-25 7:19 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-01-29 8:27 [PATCH 1/2] drm/xe: Skip over non leaf pte for PRL generation Brian Nguyen 2026-01-29 8:27 ` [PATCH 2/2] drm/xe: Move page reclaim done_handler to own func Brian Nguyen 2026-01-29 21:40 ` Lin, Shuicheng 2026-02-23 22:45 ` Summers, Stuart 2026-02-23 22:51 ` Matthew Brost 2026-01-29 9:14 ` ✓ CI.KUnit: success for series starting with [1/2] drm/xe: Skip over non leaf pte for PRL generation Patchwork 2026-01-29 9:48 ` ✓ Xe.CI.BAT: " Patchwork 2026-02-23 21:48 ` [PATCH 1/2] " Nguyen, Brian3 2026-02-23 22:49 ` Summers, Stuart 2026-02-23 22:59 ` Matthew Brost 2026-02-23 23:07 ` Summers, Stuart 2026-02-23 23:33 ` Nguyen, Brian3 2026-02-24 1:45 ` Matthew Brost 2026-02-24 2:02 ` Matthew Brost 2026-02-25 6:45 ` Nguyen, Brian3 2026-02-25 7:19 ` Matthew Brost
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox