* [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement
@ 2026-11-02 10:18 Himal Prasad Ghimiray
2026-11-02 10:18 ` [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node Himal Prasad Ghimiray
` (9 more replies)
0 siblings, 10 replies; 19+ messages in thread
From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw)
To: Christian König, Huang Rui, Thomas Hellström,
Rodrigo Vivi
Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe,
Himal Prasad Ghimiray
The backing pages of an Xe system memory BO are allocated on the device
local node (dev_to_node()), or on the allocating CPU's node when the
device has none. That is fine when CPU and GPU access a buffer from the
same place, but not in general:
- On multi-socket systems, and where the GPU's PCIe/CXL link attaches
to a different node than the threads using a buffer, the cost of
accessing a BO depends on which node backs its pages. The device
local node is not always the best choice.
- A runtime often knows where a BO should live: the node of the CPU
threads producing or consuming it, the node closest to the link the
GPU uses, or a node chosen to balance memory bandwidth. Today it has
no way to express that for driver allocated system memory.
- mbind()/set_mempolicy() do not help: BO pages are allocated by the
driver, not through the task's fault path, and BO CPU mappings are
VM_PFNMAP.
This series lets userspace select the host NUMA node per BO at
creation time.
UAPI:
- New DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE property on the existing
GEM_CREATE set-property extension.
- The node is a preference (best effort, like MPOL_PREFERRED); the
allocation falls back to other nodes under memory pressure.
- A negative value, or not setting the property, keeps the current
default placement.
- Invalid or offline nodes, and BOs that can't be placed in system
memory, are rejected with -EINVAL.
- The placement is preserved across shrinker backup / restore.
- A richer placement policy can be added later as a separate extension
without changing this one.
Why a node aware TTM allocation API rather than one ttm_pool per node
in the driver:
The NUMA node is a property of each allocation, not of the pool. TTM
already tracks pages per node (per-node LRUs in the pool caches,
per-node shrinker, per-node cache limits) and __ttm_pool_alloc()
already takes a node internally. ttm_pool_alloc_node() and
ttm_tt_restore_node() only let a caller pass that node in, following
the alloc_pages_node() / kmalloc_node() pattern, with no new state.
One pool per node in the driver would work for Xe today, but:
- TTM core helpers (ttm_tt_restore(), ttm_tt_backup(), pool debugfs)
all use the device pool. The driver would have to bypass them for
populate, restore, backup and free, and re-check that whenever TTM
adds or changes a helper. The restore issue fixed in this series is
an example: the placement was silently lost after backup.
- It relies on non dma_alloc pools having no per-pool state. For
dma_alloc pools, N pools mean N separate page caches that can't
share pages.
- Every TTM driver that wants per-BO placement would have to duplicate
the same per-node pool handling.
The existing ttm_pool_alloc() and ttm_tt_restore() become wrappers
passing NUMA_NO_NODE, so current users are unaffected.
Himal Prasad Ghimiray (7):
drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node
drm/ttm: Add NUMA node aware restore helpers
drm/ttm/pool: enforce per-node cache limits on free
drm/xe/bo: Plumb a per-BO host NUMA node hint into tt populate
drm/xe/bo: Preserve the host NUMA node across backup / restore
drm/xe/uapi: Add GEM_CREATE NUMA node placement property
drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler
drivers/gpu/drm/ttm/ttm_pool.c | 104 +++++++++++++++++++---
drivers/gpu/drm/ttm/ttm_pool_internal.h | 4 +
drivers/gpu/drm/ttm/ttm_tt.c | 20 ++++-
drivers/gpu/drm/xe/tests/xe_bo.c | 12 +--
drivers/gpu/drm/xe/tests/xe_dma_buf.c | 4 +-
drivers/gpu/drm/xe/tests/xe_migrate.c | 8 +-
drivers/gpu/drm/xe/xe_bo.c | 109 +++++++++++++++++++-----
drivers/gpu/drm/xe/xe_bo.h | 5 +-
drivers/gpu/drm/xe/xe_bo_types.h | 7 ++
drivers/gpu/drm/xe/xe_dma_buf.c | 3 +-
include/drm/ttm/ttm_pool.h | 2 +
include/drm/ttm/ttm_tt.h | 2 +
include/uapi/drm/xe_drm.h | 7 ++
13 files changed, 238 insertions(+), 49 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 19+ messages in thread* [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray @ 2026-11-02 10:18 ` Himal Prasad Ghimiray 2026-11-02 10:26 ` sashiko-bot 2026-11-02 10:50 ` Christian König 2026-11-02 10:18 ` [RFC 2/7] drm/ttm: Add NUMA node aware restore helpers Himal Prasad Ghimiray ` (8 subsequent siblings) 9 siblings, 2 replies; 19+ messages in thread From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw) To: Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe, Himal Prasad Ghimiray ttm_pool_alloc() always allocates on the pool's default node, although the internal TTM helpers (__ttm_pool_alloc(), ttm_pool_alloc_page(), ttm_pool_type_take()) already take a nid. Add ttm_pool_alloc_node() to let a driver pass that nid for a specific tt. ttm_pool_alloc() passes NUMA_NO_NODE, keeping current behaviour. An explicit node on a dma_alloc pool returns -EOPNOTSUPP, as dma_alloc_attrs() can't honor it. Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> --- drivers/gpu/drm/ttm/ttm_pool.c | 59 +++++++++++++++++++++++++++++----- include/drm/ttm/ttm_pool.h | 2 ++ 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c index 1bf37023fed6..54d2f6b5c229 100644 --- a/drivers/gpu/drm/ttm/ttm_pool.c +++ b/drivers/gpu/drm/ttm/ttm_pool.c @@ -158,9 +158,9 @@ static int ttm_pool_nid(struct ttm_pool *pool) return nid; } -/* Allocate pages of size 1 << order with the given gfp_flags */ +/* Allocate pages of size 1 << order with the given gfp_flags on node @nid */ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags, - unsigned int order) + unsigned int order, int nid) { const unsigned int beneficial_order = ttm_pool_beneficial_order(pool); unsigned long attr = DMA_ATTR_FORCE_CONTIGUOUS; @@ -189,7 +189,7 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags, } if (!ttm_pool_uses_dma_alloc(pool)) { - p = alloc_pages_node(pool->nid, gfp_flags, order); + p = alloc_pages_node(nid, gfp_flags, order); if (p) { p->private = order; mod_lruvec_page_state(p, NR_GPU_ACTIVE, 1 << order); @@ -783,7 +783,8 @@ static unsigned int ttm_pool_alloc_find_order(unsigned int highest, static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, const struct ttm_operation_ctx *ctx, struct ttm_pool_alloc_state *alloc, - struct ttm_pool_tt_restore *restore) + struct ttm_pool_tt_restore *restore, + int nid) { enum ttm_caching page_caching; gfp_t gfp_flags = GFP_USER; @@ -818,7 +819,7 @@ static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, p = NULL; pt = ttm_pool_select_type(pool, page_caching, order); if (pt && allow_pools) - p = ttm_pool_type_take(pt, ttm_pool_nid(pool)); + p = ttm_pool_type_take(pt, nid); /* * If that fails or previously failed, allocate from system. @@ -829,7 +830,7 @@ static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, if (!p) { page_caching = ttm_cached; allow_pools = false; - p = ttm_pool_alloc_page(pool, gfp_flags, order); + p = ttm_pool_alloc_page(pool, gfp_flags, order, nid); } /* If that fails, lower the order if possible and retry. */ if (!p) { @@ -900,10 +901,52 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, ttm_pool_alloc_state_init(tt, &alloc); - return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL); + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, ttm_pool_nid(pool)); } EXPORT_SYMBOL(ttm_pool_alloc); +/** + * ttm_pool_alloc_node - Fill a ttm_tt object, placing pages on a given node + * + * @pool: ttm_pool to use + * @tt: ttm_tt object to fill + * @ctx: operation context + * @nid: NUMA node id to allocate the backing system pages from, or + * NUMA_NO_NODE to use the pool's default node (@ttm_pool.nid) + * + * Like ttm_pool_alloc(), but allows the caller to override the NUMA node the + * backing system pages are allocated from. This only affects the + * non-coherent (non dma-alloc) allocation path; coherent/dma pools continue + * to use the device-local node. Intended for drivers that expose a + * user-selectable host memory NUMA placement. + * + * Returns: 0 on success, -EOPNOTSUPP if @nid is specified on a coherent/dma + * pool, negative error code otherwise. + */ +int ttm_pool_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, + struct ttm_operation_ctx *ctx, int nid) +{ + struct ttm_pool_alloc_state alloc; + + if (WARN_ON(ttm_tt_is_backed_up(tt))) + return -EINVAL; + + /* + * Coherent/dma pools allocate via dma_alloc_attrs(), which places pages + * per device DMA constraints and cannot honor a caller-requested node. + */ + if (nid != NUMA_NO_NODE && ttm_pool_uses_dma_alloc(pool)) + return -EOPNOTSUPP; + + if (nid == NUMA_NO_NODE) + nid = ttm_pool_nid(pool); + + ttm_pool_alloc_state_init(tt, &alloc); + + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, nid); +} +EXPORT_SYMBOL(ttm_pool_alloc_node); + /** * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring previously backed-up * content. @@ -964,7 +1007,7 @@ int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt, } } - return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore); + return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore, ttm_pool_nid(pool)); } /** diff --git a/include/drm/ttm/ttm_pool.h b/include/drm/ttm/ttm_pool.h index 26ee592e1994..6a0b14aca092 100644 --- a/include/drm/ttm/ttm_pool.h +++ b/include/drm/ttm/ttm_pool.h @@ -79,6 +79,8 @@ struct ttm_pool { int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, struct ttm_operation_ctx *ctx); +int ttm_pool_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, + struct ttm_operation_ctx *ctx, int nid); void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt); void ttm_pool_init(struct ttm_pool *pool, struct device *dev, -- 2.43.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node 2026-11-02 10:18 ` [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node Himal Prasad Ghimiray @ 2026-11-02 10:26 ` sashiko-bot 2026-11-02 10:50 ` Christian König 1 sibling, 0 replies; 19+ messages in thread From: sashiko-bot @ 2026-11-02 10:26 UTC (permalink / raw) To: Himal Prasad Ghimiray; +Cc: dri-devel, intel-xe Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [Medium] drm/ttm: high-order alloc failure on memoryless nodes in ttm_pool_nid() - [Low] drm/ttm: code duplication and doc mismatch in ttm_pool_alloc_node() -- commit 7c445098356d9efa9b5af93394f82d04655f28ad Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node This commit adds ttm_pool_alloc_node() to allow callers to specify a NUMA node when allocating backing pages for a ttm_tt object, while rejecting explicit NUMA node requests on pools that use dma_alloc_attrs(). > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c > index 1bf37023fed66..54d2f6b5c229c 100644 > --- a/drivers/gpu/drm/ttm/ttm_pool.c > +++ b/drivers/gpu/drm/ttm/ttm_pool.c > @@ -158,9 +158,9 @@ static int ttm_pool_nid(struct ttm_pool *pool) > return nid; > } > > -/* Allocate pages of size 1 << order with the given gfp_flags */ > +/* Allocate pages of size 1 << order with the given gfp_flags on node @nid */ > static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags, > - unsigned int order) > + unsigned int order, int nid) > { > const unsigned int beneficial_order = ttm_pool_beneficial_order(pool); > unsigned long attr = DMA_ATTR_FORCE_CONTIGUOUS; > @@ -189,7 +189,7 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags, > } > > if (!ttm_pool_uses_dma_alloc(pool)) { > - p = alloc_pages_node(pool->nid, gfp_flags, order); > + p = alloc_pages_node(nid, gfp_flags, order); [Severity: Medium] Can resolving NUMA_NO_NODE via ttm_pool_nid() before calling alloc_pages_node() cause higher-order allocations to fail on memoryless CPU NUMA nodes (CONFIG_HAVE_MEMORYLESS_NODES)? Previously, ttm_pool_alloc_page() passed pool->nid directly to alloc_pages_node(). When pool->nid was NUMA_NO_NODE, alloc_pages_node_noprof() translated NUMA_NO_NODE to numa_mem_id() (the nearest NUMA node with memory). With this change, ttm_pool_alloc(), ttm_pool_alloc_node() (when nid is NUMA_NO_NODE), and ttm_pool_restore_and_alloc() resolve nid up front via ttm_pool_nid(): drivers/gpu/drm/ttm/ttm_pool.c:ttm_pool_nid() { int nid = NUMA_NO_NODE; if (pool) nid = pool->nid; if (nid == NUMA_NO_NODE) nid = numa_node_id(); return nid; } In ttm_pool_alloc_page(), allocations with order > 0 set __GFP_THISNODE in gfp_flags: if (order) gfp_flags |= __GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN | __GFP_THISNODE; Because alloc_pages_node() now receives numa_node_id() instead of NUMA_NO_NODE, it no longer substitutes numa_mem_id(). When running on a CPU attached to a memoryless NUMA node, ZONELIST_NOFALLBACK has no memory zones, causing all order > 0 allocations to fail and fall back to order 0. In addition, any order-0 WC/UC pages allocated via fallback will reside on a memory-bearing node (page_to_nid(p) != numa_node_id()), so ttm_pool_type_give() places them on page_to_nid(p)'s list_lru while ttm_pool_type_take(pt, nid) searches the empty list_lru of the memoryless numa_node_id(). Should ttm_pool_nid() use numa_mem_id() instead of numa_node_id() when nid is NUMA_NO_NODE? [ ... ] > @@ -900,10 +901,52 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > > ttm_pool_alloc_state_init(tt, &alloc); > > - return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL); > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, ttm_pool_nid(pool)); > } > EXPORT_SYMBOL(ttm_pool_alloc); > > +/** > + * ttm_pool_alloc_node - Fill a ttm_tt object, placing pages on a given node > + * > + * @pool: ttm_pool to use > + * @tt: ttm_tt object to fill > + * @ctx: operation context > + * @nid: NUMA node id to allocate the backing system pages from, or > + * NUMA_NO_NODE to use the pool's default node (@ttm_pool.nid) > + * > + * Like ttm_pool_alloc(), but allows the caller to override the NUMA node the > + * backing system pages are allocated from. This only affects the > + * non-coherent (non dma-alloc) allocation path; coherent/dma pools continue > + * to use the device-local node. Intended for drivers that expose a > + * user-selectable host memory NUMA placement. > + * > + * Returns: 0 on success, -EOPNOTSUPP if @nid is specified on a coherent/dma > + * pool, negative error code otherwise. > + */ > +int ttm_pool_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, > + struct ttm_operation_ctx *ctx, int nid) > +{ > + struct ttm_pool_alloc_state alloc; > + > + if (WARN_ON(ttm_tt_is_backed_up(tt))) > + return -EINVAL; > + > + /* > + * Coherent/dma pools allocate via dma_alloc_attrs(), which places pages > + * per device DMA constraints and cannot honor a caller-requested node. > + */ > + if (nid != NUMA_NO_NODE && ttm_pool_uses_dma_alloc(pool)) > + return -EOPNOTSUPP; > + > + if (nid == NUMA_NO_NODE) > + nid = ttm_pool_nid(pool); > + > + ttm_pool_alloc_state_init(tt, &alloc); > + > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, nid); > +} > +EXPORT_SYMBOL(ttm_pool_alloc_node); [Severity: Low] This isn't a bug, but there are a couple of inconsistencies between the documentation, the commit message, and the implementation here. First, the kernel-doc description for ttm_pool_alloc_node() states that "coherent/dma pools continue to use the device-local node", which contradicts both the Returns section ("-EOPNOTSUPP if @nid is specified on a coherent/dma pool") and the implementation when nid != NUMA_NO_NODE. Second, the commit message mentions that "ttm_pool_alloc() passes NUMA_NO_NODE, keeping current behaviour" and that "__ttm_pool_alloc(), ttm_pool_alloc_page(), ttm_pool_type_take() already take a nid", whereas this patch adds the nid parameter to __ttm_pool_alloc() and ttm_pool_alloc_page(), and ttm_pool_alloc() duplicates the setup and calls __ttm_pool_alloc() directly. Could ttm_pool_alloc() simply call ttm_pool_alloc_node(pool, tt, ctx, NUMA_NO_NODE), and the kernel-doc and commit message be updated to match? -- Sashiko AI review · https://sashiko.dev/#/patchset/20261102101803.455921-9-himal.prasad.ghimiray@intel.com?part=1 ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node 2026-11-02 10:18 ` [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node Himal Prasad Ghimiray 2026-11-02 10:26 ` sashiko-bot @ 2026-11-02 10:50 ` Christian König 2026-11-02 12:46 ` Thomas Hellström 1 sibling, 1 reply; 19+ messages in thread From: Christian König @ 2026-11-02 10:50 UTC (permalink / raw) To: Himal Prasad Ghimiray, Huang Rui, Thomas Hellström, Rodrigo Vivi, Natalie Vock, Paneer Selvam, Arunpravin Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe First of all please add Natalie and Arun on TTM patches, they are the maintainers of that component now. On 11/2/26 11:18, Himal Prasad Ghimiray wrote: > ttm_pool_alloc() always allocates on the pool's default node, although > the internal TTM helpers (__ttm_pool_alloc(), ttm_pool_alloc_page(), > ttm_pool_type_take()) already take a nid. Add ttm_pool_alloc_node() to > let a driver pass that nid for a specific tt. > > ttm_pool_alloc() passes NUMA_NO_NODE, keeping current behaviour. An > explicit node on a dma_alloc pool returns -EOPNOTSUPP, as > dma_alloc_attrs() can't honor it. We already have an interface for NUMA node aware allocations in the TTM pool. I don't mind changing/improving that when necessary, but that here is only adding a second path and therfore a clear NO-GO from my side. If you want to change the nid from ttm_pool_init() to ttm_pool_alloc() then change all existing users. Regards, Christian. > Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> > --- > drivers/gpu/drm/ttm/ttm_pool.c | 59 +++++++++++++++++++++++++++++----- > include/drm/ttm/ttm_pool.h | 2 ++ > 2 files changed, 53 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c > index 1bf37023fed6..54d2f6b5c229 100644 > --- a/drivers/gpu/drm/ttm/ttm_pool.c > +++ b/drivers/gpu/drm/ttm/ttm_pool.c > @@ -158,9 +158,9 @@ static int ttm_pool_nid(struct ttm_pool *pool) > return nid; > } > > -/* Allocate pages of size 1 << order with the given gfp_flags */ > +/* Allocate pages of size 1 << order with the given gfp_flags on node @nid */ > static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags, > - unsigned int order) > + unsigned int order, int nid) > { > const unsigned int beneficial_order = ttm_pool_beneficial_order(pool); > unsigned long attr = DMA_ATTR_FORCE_CONTIGUOUS; > @@ -189,7 +189,7 @@ static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, gfp_t gfp_flags, > } > > if (!ttm_pool_uses_dma_alloc(pool)) { > - p = alloc_pages_node(pool->nid, gfp_flags, order); > + p = alloc_pages_node(nid, gfp_flags, order); > if (p) { > p->private = order; > mod_lruvec_page_state(p, NR_GPU_ACTIVE, 1 << order); > @@ -783,7 +783,8 @@ static unsigned int ttm_pool_alloc_find_order(unsigned int highest, > static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > const struct ttm_operation_ctx *ctx, > struct ttm_pool_alloc_state *alloc, > - struct ttm_pool_tt_restore *restore) > + struct ttm_pool_tt_restore *restore, > + int nid) > { > enum ttm_caching page_caching; > gfp_t gfp_flags = GFP_USER; > @@ -818,7 +819,7 @@ static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > p = NULL; > pt = ttm_pool_select_type(pool, page_caching, order); > if (pt && allow_pools) > - p = ttm_pool_type_take(pt, ttm_pool_nid(pool)); > + p = ttm_pool_type_take(pt, nid); > > /* > * If that fails or previously failed, allocate from system. > @@ -829,7 +830,7 @@ static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > if (!p) { > page_caching = ttm_cached; > allow_pools = false; > - p = ttm_pool_alloc_page(pool, gfp_flags, order); > + p = ttm_pool_alloc_page(pool, gfp_flags, order, nid); > } > /* If that fails, lower the order if possible and retry. */ > if (!p) { > @@ -900,10 +901,52 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > > ttm_pool_alloc_state_init(tt, &alloc); > > - return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL); > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, ttm_pool_nid(pool)); > } > EXPORT_SYMBOL(ttm_pool_alloc); > > +/** > + * ttm_pool_alloc_node - Fill a ttm_tt object, placing pages on a given node > + * > + * @pool: ttm_pool to use > + * @tt: ttm_tt object to fill > + * @ctx: operation context > + * @nid: NUMA node id to allocate the backing system pages from, or > + * NUMA_NO_NODE to use the pool's default node (@ttm_pool.nid) > + * > + * Like ttm_pool_alloc(), but allows the caller to override the NUMA node the > + * backing system pages are allocated from. This only affects the > + * non-coherent (non dma-alloc) allocation path; coherent/dma pools continue > + * to use the device-local node. Intended for drivers that expose a > + * user-selectable host memory NUMA placement. > + * > + * Returns: 0 on success, -EOPNOTSUPP if @nid is specified on a coherent/dma > + * pool, negative error code otherwise. > + */ > +int ttm_pool_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, > + struct ttm_operation_ctx *ctx, int nid) > +{ > + struct ttm_pool_alloc_state alloc; > + > + if (WARN_ON(ttm_tt_is_backed_up(tt))) > + return -EINVAL; > + > + /* > + * Coherent/dma pools allocate via dma_alloc_attrs(), which places pages > + * per device DMA constraints and cannot honor a caller-requested node. > + */ > + if (nid != NUMA_NO_NODE && ttm_pool_uses_dma_alloc(pool)) > + return -EOPNOTSUPP; > + > + if (nid == NUMA_NO_NODE) > + nid = ttm_pool_nid(pool); > + > + ttm_pool_alloc_state_init(tt, &alloc); > + > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, nid); > +} > +EXPORT_SYMBOL(ttm_pool_alloc_node); > + > /** > * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring previously backed-up > * content. > @@ -964,7 +1007,7 @@ int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > } > } > > - return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore); > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore, ttm_pool_nid(pool)); > } > > /** > diff --git a/include/drm/ttm/ttm_pool.h b/include/drm/ttm/ttm_pool.h > index 26ee592e1994..6a0b14aca092 100644 > --- a/include/drm/ttm/ttm_pool.h > +++ b/include/drm/ttm/ttm_pool.h > @@ -79,6 +79,8 @@ struct ttm_pool { > > int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > struct ttm_operation_ctx *ctx); > +int ttm_pool_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, > + struct ttm_operation_ctx *ctx, int nid); > void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt); > > void ttm_pool_init(struct ttm_pool *pool, struct device *dev, ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node 2026-11-02 10:50 ` Christian König @ 2026-11-02 12:46 ` Thomas Hellström 0 siblings, 0 replies; 19+ messages in thread From: Thomas Hellström @ 2026-11-02 12:46 UTC (permalink / raw) To: Christian König, Himal Prasad Ghimiray, Huang Rui, Rodrigo Vivi, Natalie Vock, Paneer Selvam, Arunpravin Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe Hi, Christian, On Mon, 2026-11-02 at 11:50 +0100, Christian König wrote: > First of all please add Natalie and Arun on TTM patches, they are the > maintainers of that component now. > > On 11/2/26 11:18, Himal Prasad Ghimiray wrote: > > ttm_pool_alloc() always allocates on the pool's default node, > > although > > the internal TTM helpers (__ttm_pool_alloc(), > > ttm_pool_alloc_page(), > > ttm_pool_type_take()) already take a nid. Add ttm_pool_alloc_node() > > to > > let a driver pass that nid for a specific tt. > > > > ttm_pool_alloc() passes NUMA_NO_NODE, keeping current behaviour. An > > explicit node on a dma_alloc pool returns -EOPNOTSUPP, as > > dma_alloc_attrs() can't honor it. > > We already have an interface for NUMA node aware allocations in the > TTM pool. > > I don't mind changing/improving that when necessary, but that here is > only adding a second path and therfore a clear NO-GO from my side. What we were looking at moving forward is to possibly support interleaving modes (and that would mean interleaving per folio). > > If you want to change the nid from ttm_pool_init() to > ttm_pool_alloc() then change all existing users. Point taken. Any specific reason ttm_pool_init() was initially chosen? Thanks, Thomas > > Regards, > Christian. > > > Signed-off-by: Himal Prasad Ghimiray > > <himal.prasad.ghimiray@intel.com> > > --- > > drivers/gpu/drm/ttm/ttm_pool.c | 59 +++++++++++++++++++++++++++++- > > ---- > > include/drm/ttm/ttm_pool.h | 2 ++ > > 2 files changed, 53 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c > > b/drivers/gpu/drm/ttm/ttm_pool.c > > index 1bf37023fed6..54d2f6b5c229 100644 > > --- a/drivers/gpu/drm/ttm/ttm_pool.c > > +++ b/drivers/gpu/drm/ttm/ttm_pool.c > > @@ -158,9 +158,9 @@ static int ttm_pool_nid(struct ttm_pool *pool) > > return nid; > > } > > > > -/* Allocate pages of size 1 << order with the given gfp_flags */ > > +/* Allocate pages of size 1 << order with the given gfp_flags on > > node @nid */ > > static struct page *ttm_pool_alloc_page(struct ttm_pool *pool, > > gfp_t gfp_flags, > > - unsigned int order) > > + unsigned int order, int > > nid) > > { > > const unsigned int beneficial_order = > > ttm_pool_beneficial_order(pool); > > unsigned long attr = DMA_ATTR_FORCE_CONTIGUOUS; > > @@ -189,7 +189,7 @@ static struct page *ttm_pool_alloc_page(struct > > ttm_pool *pool, gfp_t gfp_flags, > > } > > > > if (!ttm_pool_uses_dma_alloc(pool)) { > > - p = alloc_pages_node(pool->nid, gfp_flags, order); > > + p = alloc_pages_node(nid, gfp_flags, order); > > if (p) { > > p->private = order; > > mod_lruvec_page_state(p, NR_GPU_ACTIVE, 1 > > << order); > > @@ -783,7 +783,8 @@ static unsigned int > > ttm_pool_alloc_find_order(unsigned int highest, > > static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt > > *tt, > > const struct ttm_operation_ctx *ctx, > > struct ttm_pool_alloc_state *alloc, > > - struct ttm_pool_tt_restore *restore) > > + struct ttm_pool_tt_restore *restore, > > + int nid) > > { > > enum ttm_caching page_caching; > > gfp_t gfp_flags = GFP_USER; > > @@ -818,7 +819,7 @@ static int __ttm_pool_alloc(struct ttm_pool > > *pool, struct ttm_tt *tt, > > p = NULL; > > pt = ttm_pool_select_type(pool, page_caching, > > order); > > if (pt && allow_pools) > > - p = ttm_pool_type_take(pt, > > ttm_pool_nid(pool)); > > + p = ttm_pool_type_take(pt, nid); > > > > /* > > * If that fails or previously failed, allocate > > from system. > > @@ -829,7 +830,7 @@ static int __ttm_pool_alloc(struct ttm_pool > > *pool, struct ttm_tt *tt, > > if (!p) { > > page_caching = ttm_cached; > > allow_pools = false; > > - p = ttm_pool_alloc_page(pool, gfp_flags, > > order); > > + p = ttm_pool_alloc_page(pool, gfp_flags, > > order, nid); > > } > > /* If that fails, lower the order if possible and > > retry. */ > > if (!p) { > > @@ -900,10 +901,52 @@ int ttm_pool_alloc(struct ttm_pool *pool, > > struct ttm_tt *tt, > > > > ttm_pool_alloc_state_init(tt, &alloc); > > > > - return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL); > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, > > ttm_pool_nid(pool)); > > } > > EXPORT_SYMBOL(ttm_pool_alloc); > > > > +/** > > + * ttm_pool_alloc_node - Fill a ttm_tt object, placing pages on a > > given node > > + * > > + * @pool: ttm_pool to use > > + * @tt: ttm_tt object to fill > > + * @ctx: operation context > > + * @nid: NUMA node id to allocate the backing system pages from, > > or > > + * NUMA_NO_NODE to use the pool's default node (@ttm_pool.nid) > > + * > > + * Like ttm_pool_alloc(), but allows the caller to override the > > NUMA node the > > + * backing system pages are allocated from. This only affects the > > + * non-coherent (non dma-alloc) allocation path; coherent/dma > > pools continue > > + * to use the device-local node. Intended for drivers that expose > > a > > + * user-selectable host memory NUMA placement. > > + * > > + * Returns: 0 on success, -EOPNOTSUPP if @nid is specified on a > > coherent/dma > > + * pool, negative error code otherwise. > > + */ > > +int ttm_pool_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, > > + struct ttm_operation_ctx *ctx, int nid) > > +{ > > + struct ttm_pool_alloc_state alloc; > > + > > + if (WARN_ON(ttm_tt_is_backed_up(tt))) > > + return -EINVAL; > > + > > + /* > > + * Coherent/dma pools allocate via dma_alloc_attrs(), > > which places pages > > + * per device DMA constraints and cannot honor a caller- > > requested node. > > + */ > > + if (nid != NUMA_NO_NODE && ttm_pool_uses_dma_alloc(pool)) > > + return -EOPNOTSUPP; > > + > > + if (nid == NUMA_NO_NODE) > > + nid = ttm_pool_nid(pool); > > + > > + ttm_pool_alloc_state_init(tt, &alloc); > > + > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL, nid); > > +} > > +EXPORT_SYMBOL(ttm_pool_alloc_node); > > + > > /** > > * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring > > previously backed-up > > * content. > > @@ -964,7 +1007,7 @@ int ttm_pool_restore_and_alloc(struct ttm_pool > > *pool, struct ttm_tt *tt, > > } > > } > > > > - return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore); > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore, > > ttm_pool_nid(pool)); > > } > > > > /** > > diff --git a/include/drm/ttm/ttm_pool.h > > b/include/drm/ttm/ttm_pool.h > > index 26ee592e1994..6a0b14aca092 100644 > > --- a/include/drm/ttm/ttm_pool.h > > +++ b/include/drm/ttm/ttm_pool.h > > @@ -79,6 +79,8 @@ struct ttm_pool { > > > > int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > > struct ttm_operation_ctx *ctx); > > +int ttm_pool_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, > > + struct ttm_operation_ctx *ctx, int nid); > > void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt); > > > > void ttm_pool_init(struct ttm_pool *pool, struct device *dev, ^ permalink raw reply [flat|nested] 19+ messages in thread
* [RFC 2/7] drm/ttm: Add NUMA node aware restore helpers 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node Himal Prasad Ghimiray @ 2026-11-02 10:18 ` Himal Prasad Ghimiray 2026-11-02 10:26 ` sashiko-bot 2026-11-02 10:18 ` [RFC 3/7] drm/ttm/pool: enforce per-node cache limits on free Himal Prasad Ghimiray ` (7 subsequent siblings) 9 siblings, 1 reply; 19+ messages in thread From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw) To: Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe, Himal Prasad Ghimiray Restore after shrinker backup always allocates on the pool's default node, so a placement chosen with ttm_pool_alloc_node() is lost. The internal restore path already uses __ttm_pool_alloc(), which takes a nid; add ttm_tt_restore_node() to pass it through. ttm_tt_restore() passes NUMA_NO_NODE, keeping current behaviour. Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> --- drivers/gpu/drm/ttm/ttm_pool.c | 32 ++++++++++++++++++++++++- drivers/gpu/drm/ttm/ttm_pool_internal.h | 4 ++++ drivers/gpu/drm/ttm/ttm_tt.c | 20 ++++++++++++++-- include/drm/ttm/ttm_tt.h | 2 ++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c index 54d2f6b5c229..2107dc6c69b3 100644 --- a/drivers/gpu/drm/ttm/ttm_pool.c +++ b/drivers/gpu/drm/ttm/ttm_pool.c @@ -962,6 +962,30 @@ EXPORT_SYMBOL(ttm_pool_alloc_node); */ int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt, const struct ttm_operation_ctx *ctx) +{ + return ttm_pool_restore_and_alloc_node(pool, tt, ctx, NUMA_NO_NODE); +} +EXPORT_SYMBOL(ttm_pool_restore_and_alloc); + +/** + * ttm_pool_restore_and_alloc_node - Fill a ttm_tt, restoring previously + * backed-up content, placing pages on a given node. + * + * @pool: ttm_pool to use + * @tt: ttm_tt object to fill + * @ctx: operation context + * @nid: NUMA node id to allocate the backing system pages from, or + * NUMA_NO_NODE to use the pool's default node (@ttm_pool.nid) + * + * Like ttm_pool_restore_and_alloc(), but allows the caller to keep the NUMA + * placement requested at ttm_pool_alloc_node() time across backup / restore. + * + * Returns: 0 on success, -EOPNOTSUPP if @nid is specified on a coherent/dma + * pool, negative error code otherwise. + */ +int ttm_pool_restore_and_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, + const struct ttm_operation_ctx *ctx, + int nid) { struct ttm_pool_tt_restore *restore = tt->restore; struct ttm_pool_alloc_state alloc; @@ -970,6 +994,12 @@ int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt, if (WARN_ON(!ttm_tt_is_backed_up(tt))) return -EINVAL; + if (nid != NUMA_NO_NODE && ttm_pool_uses_dma_alloc(pool)) + return -EOPNOTSUPP; + + if (nid == NUMA_NO_NODE) + nid = ttm_pool_nid(pool); + if (!restore) { gfp_t gfp = GFP_KERNEL | __GFP_NOWARN; @@ -1007,7 +1037,7 @@ int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt, } } - return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore, ttm_pool_nid(pool)); + return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore, nid); } /** diff --git a/drivers/gpu/drm/ttm/ttm_pool_internal.h b/drivers/gpu/drm/ttm/ttm_pool_internal.h index cbb17a2129fe..66ee0e57cdeb 100644 --- a/drivers/gpu/drm/ttm/ttm_pool_internal.h +++ b/drivers/gpu/drm/ttm/ttm_pool_internal.h @@ -22,6 +22,10 @@ static inline unsigned int ttm_pool_beneficial_order(struct ttm_pool *pool) return pool->alloc_flags & 0xff; } +int ttm_pool_restore_and_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, + const struct ttm_operation_ctx *ctx, + int nid); + /* * Implemented in ttm_pool.c, used by ttm_backup.c. Returns true if a fault * should be injected mid-compound to test the reactive split-and-retry diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index b645a1818184..775219ae5367 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -298,7 +298,23 @@ long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt, int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt, const struct ttm_operation_ctx *ctx) { - int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt, ctx); + return ttm_tt_restore_node(bdev, tt, ctx, NUMA_NO_NODE); +} +EXPORT_SYMBOL(ttm_tt_restore); + +/** + * ttm_tt_restore_node - Restore a backed-up tt, placing pages on a given node + * @bdev: The TTM device. + * @tt: The struct ttm_tt to restore. + * @ctx: The operation context. + * @nid: NUMA node for the restored pages, or NUMA_NO_NODE for the pool default. + * + * Return: 0 on success, negative error code on failure. + */ +int ttm_tt_restore_node(struct ttm_device *bdev, struct ttm_tt *tt, + const struct ttm_operation_ctx *ctx, int nid) +{ + int ret = ttm_pool_restore_and_alloc_node(&bdev->pool, tt, ctx, nid); if (ret) return ret; @@ -307,7 +323,7 @@ int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt, return 0; } -EXPORT_SYMBOL(ttm_tt_restore); +EXPORT_SYMBOL(ttm_tt_restore_node); /** * ttm_tt_swapout - swap out tt object diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h index 406437ad674b..7a75e22a7f70 100644 --- a/include/drm/ttm/ttm_tt.h +++ b/include/drm/ttm/ttm_tt.h @@ -297,6 +297,8 @@ long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt, int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt, const struct ttm_operation_ctx *ctx); +int ttm_tt_restore_node(struct ttm_device *bdev, struct ttm_tt *tt, + const struct ttm_operation_ctx *ctx, int nid); int ttm_tt_setup_backup(struct ttm_tt *tt); -- 2.43.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [RFC 2/7] drm/ttm: Add NUMA node aware restore helpers 2026-11-02 10:18 ` [RFC 2/7] drm/ttm: Add NUMA node aware restore helpers Himal Prasad Ghimiray @ 2026-11-02 10:26 ` sashiko-bot 0 siblings, 0 replies; 19+ messages in thread From: sashiko-bot @ 2026-11-02 10:26 UTC (permalink / raw) To: Himal Prasad Ghimiray; +Cc: dri-devel, intel-xe Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Low] drm/ttm: unused helper and EXPORT_SYMBOL() on ttm_pool_restore_and_alloc() -- commit 8d0a6d62696c67cc37673b025155aa37dad8e6a7 Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> drm/ttm: Add NUMA node aware restore helpers This commit introduces ttm_tt_restore_node() and ttm_pool_restore_and_alloc_node() so callers can preserve a specific NUMA node placement when restoring backed-up TTM pages. > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c > index 54d2f6b5c229c..2107dc6c69b36 100644 > --- a/drivers/gpu/drm/ttm/ttm_pool.c > +++ b/drivers/gpu/drm/ttm/ttm_pool.c > @@ -962,6 +962,30 @@ EXPORT_SYMBOL(ttm_pool_alloc_node); > */ > int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt, > const struct ttm_operation_ctx *ctx) > +{ > + return ttm_pool_restore_and_alloc_node(pool, tt, ctx, NUMA_NO_NODE); > +} > +EXPORT_SYMBOL(ttm_pool_restore_and_alloc); [Severity: Low] Is ttm_pool_restore_and_alloc() still needed now that ttm_tt_restore() in drivers/gpu/drm/ttm/ttm_tt.c delegates to ttm_tt_restore_node(), which calls ttm_pool_restore_and_alloc_node() directly? Previously, ttm_pool_restore_and_alloc() was an unexported TTM-internal helper whose only caller was ttm_tt_restore(), and external drivers cannot call it directly because only ttm_tt_restore() and ttm_tt_restore_node() clear TTM_TT_FLAG_BACKED_UP on tt->page_flags. With ttm_tt_restore() switched over to ttm_tt_restore_node(), ttm_pool_restore_and_alloc() has no remaining callers in the tree, yet it is kept and newly exported with EXPORT_SYMBOL(). Should ttm_pool_restore_and_alloc() and its EXPORT_SYMBOL() be dropped (or kept unexported if there is a planned internal user)? -- Sashiko AI review · https://sashiko.dev/#/patchset/20261102101803.455921-9-himal.prasad.ghimiray@intel.com?part=2 ^ permalink raw reply [flat|nested] 19+ messages in thread
* [RFC 3/7] drm/ttm/pool: enforce per-node cache limits on free 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 2/7] drm/ttm: Add NUMA node aware restore helpers Himal Prasad Ghimiray @ 2026-11-02 10:18 ` Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 4/7] drm/xe/bo: Plumb a per-BO host NUMA node hint into tt populate Himal Prasad Ghimiray ` (6 subsequent siblings) 9 siblings, 0 replies; 19+ messages in thread From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw) To: Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe, Himal Prasad Ghimiray ttm_pool_free() only trims the cache of the pool's default node. With pages allocated on other nodes, check each node's limit on free. The per-node accounting and shrinker already exist in TTM. Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> --- drivers/gpu/drm/ttm/ttm_pool.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c index 2107dc6c69b3..faba20cef216 100644 --- a/drivers/gpu/drm/ttm/ttm_pool.c +++ b/drivers/gpu/drm/ttm/ttm_pool.c @@ -1050,13 +1050,20 @@ int ttm_pool_restore_and_alloc_node(struct ttm_pool *pool, struct ttm_tt *tt, */ void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt) { - int nid = ttm_pool_nid(pool); + int nid; ttm_pool_free_range(pool, tt, tt->caching, 0, tt->num_pages); - while (atomic_long_read(&allocated_pages[nid]) > pool_node_limit[nid]) { - unsigned long diff = atomic_long_read(&allocated_pages[nid]) - pool_node_limit[nid]; - ttm_pool_shrink(nid, diff); + /* + * ttm_pool_alloc_node() can place pages on a caller-requested node, so + * freed pages may land on any node's cache; enforce every node's limit. + */ + for_each_node(nid) { + unsigned long cached; + + while ((cached = atomic_long_read(&allocated_pages[nid])) > + pool_node_limit[nid]) + ttm_pool_shrink(nid, cached - pool_node_limit[nid]); } } EXPORT_SYMBOL(ttm_pool_free); -- 2.43.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC 4/7] drm/xe/bo: Plumb a per-BO host NUMA node hint into tt populate 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray ` (2 preceding siblings ...) 2026-11-02 10:18 ` [RFC 3/7] drm/ttm/pool: enforce per-node cache limits on free Himal Prasad Ghimiray @ 2026-11-02 10:18 ` Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 5/7] drm/xe/bo: Preserve the host NUMA node across backup / restore Himal Prasad Ghimiray ` (5 subsequent siblings) 9 siblings, 0 replies; 19+ messages in thread From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw) To: Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe, Himal Prasad Ghimiray Store a host NUMA node in the BO and its tt, and pass it to ttm_pool_alloc_node() on populate. It defaults to NUMA_NO_NODE, so no functional change. Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> --- drivers/gpu/drm/xe/xe_bo.c | 7 ++++++- drivers/gpu/drm/xe/xe_bo_types.h | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index 42a6aa1a2e4a..b0760d5d6bad 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -394,6 +394,8 @@ struct xe_ttm_tt { struct sg_table *sg; /** @purgeable: Whether the content of the pages of @ttm is purgeable. */ bool purgeable; + /** @numa_node: Preferred host NUMA node for backing pages. */ + s16 numa_node; }; static int xe_tt_map_sg(struct xe_device *xe, struct ttm_tt *tt) @@ -595,6 +597,7 @@ static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object *ttm_bo, return NULL; tt = &xe_tt->ttm; + xe_tt->numa_node = bo->numa_node; extra_pages = 0; if (xe_bo_needs_ccs_pages(bo)) @@ -676,7 +679,8 @@ static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt, err = ttm_tt_restore(ttm_dev, tt, ctx); } else { ttm_tt_clear_backed_up(tt); - err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx); + err = ttm_pool_alloc_node(&ttm_dev->pool, tt, ctx, + xe_tt->numa_node); } if (err) return err; @@ -2542,6 +2546,7 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, bo->tile = tile; bo->flags = flags; bo->cpu_caching = cpu_caching; + bo->numa_node = NUMA_NO_NODE; bo->ttm.base.funcs = &xe_gem_object_funcs; bo->ttm.priority = XE_BO_PRIORITY_NORMAL; INIT_LIST_HEAD(&bo->pinned_link); diff --git a/drivers/gpu/drm/xe/xe_bo_types.h b/drivers/gpu/drm/xe/xe_bo_types.h index 0265fb314c77..91e1c541b616 100644 --- a/drivers/gpu/drm/xe/xe_bo_types.h +++ b/drivers/gpu/drm/xe/xe_bo_types.h @@ -112,6 +112,13 @@ struct xe_bo { */ u16 cpu_caching; + /** + * @numa_node: Preferred host NUMA node for system-memory backing + * pages, or NUMA_NO_NODE to use the device-local node. Only honored + * for user objects with a system-memory placement. + */ + s16 numa_node; + /** @devmem_allocation: SVM device memory allocation */ struct drm_pagemap_devmem devmem_allocation; -- 2.43.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC 5/7] drm/xe/bo: Preserve the host NUMA node across backup / restore 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray ` (3 preceding siblings ...) 2026-11-02 10:18 ` [RFC 4/7] drm/xe/bo: Plumb a per-BO host NUMA node hint into tt populate Himal Prasad Ghimiray @ 2026-11-02 10:18 ` Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 6/7] drm/xe/uapi: Add GEM_CREATE NUMA node placement property Himal Prasad Ghimiray ` (4 subsequent siblings) 9 siblings, 0 replies; 19+ messages in thread From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw) To: Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe, Himal Prasad Ghimiray Use ttm_tt_restore_node() so a BO restored after shrinker backup comes back on its requested node instead of the pool default. Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> --- drivers/gpu/drm/xe/xe_bo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index b0760d5d6bad..fc9bfb436b8e 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -676,7 +676,7 @@ static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt, return 0; if (ttm_tt_is_backed_up(tt) && !xe_tt->purgeable) { - err = ttm_tt_restore(ttm_dev, tt, ctx); + err = ttm_tt_restore_node(ttm_dev, tt, ctx, xe_tt->numa_node); } else { ttm_tt_clear_backed_up(tt); err = ttm_pool_alloc_node(&ttm_dev->pool, tt, ctx, -- 2.43.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC 6/7] drm/xe/uapi: Add GEM_CREATE NUMA node placement property 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray ` (4 preceding siblings ...) 2026-11-02 10:18 ` [RFC 5/7] drm/xe/bo: Preserve the host NUMA node across backup / restore Himal Prasad Ghimiray @ 2026-11-02 10:18 ` Himal Prasad Ghimiray 2026-11-02 10:27 ` sashiko-bot 2026-11-02 10:18 ` [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler Himal Prasad Ghimiray ` (3 subsequent siblings) 9 siblings, 1 reply; 19+ messages in thread From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw) To: Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe, Himal Prasad Ghimiray Add DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE so userspace can choose the host NUMA node backing a system memory BO. A negative value keeps the default device-local placement. Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> --- include/uapi/drm/xe_drm.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h index 578f0c1eb43e..0b39081330ee 100644 --- a/include/uapi/drm/xe_drm.h +++ b/include/uapi/drm/xe_drm.h @@ -843,6 +843,13 @@ struct drm_xe_device_query { struct drm_xe_gem_create { #define DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY 0 #define DRM_XE_GEM_CREATE_SET_PROPERTY_PXP_TYPE 0 + /* + * Host NUMA node (as a signed value) to allocate system-memory + * backing pages from. Only honored for objects with a system-memory + * placement; ignored for VRAM-only objects. Use a value < 0 to keep + * the default device-local placement. + */ +#define DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE 1 /** @extensions: Pointer to the first extension struct, if any */ __u64 extensions; -- 2.43.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [RFC 6/7] drm/xe/uapi: Add GEM_CREATE NUMA node placement property 2026-11-02 10:18 ` [RFC 6/7] drm/xe/uapi: Add GEM_CREATE NUMA node placement property Himal Prasad Ghimiray @ 2026-11-02 10:27 ` sashiko-bot 0 siblings, 0 replies; 19+ messages in thread From: sashiko-bot @ 2026-11-02 10:27 UTC (permalink / raw) To: Himal Prasad Ghimiray; +Cc: dri-devel, intel-xe Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Low] drm/xe/uapi: inaccurate comment and missing kernel-doc for NUMA_NODE property -- commit 3afc5386219df9a82a534e249ba21444e34868d6 Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> drm/xe/uapi: Add GEM_CREATE NUMA node placement property This commit adds the DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE property to struct drm_xe_gem_create so userspace can specify the host NUMA node for system-memory buffer objects. > diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h > index 578f0c1eb43e8..0b39081330eeb 100644 > --- a/include/uapi/drm/xe_drm.h > +++ b/include/uapi/drm/xe_drm.h > @@ -843,6 +843,13 @@ struct drm_xe_device_query { > struct drm_xe_gem_create { > #define DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY 0 > #define DRM_XE_GEM_CREATE_SET_PROPERTY_PXP_TYPE 0 > + /* > + * Host NUMA node (as a signed value) to allocate system-memory > + * backing pages from. Only honored for objects with a system-memory > + * placement; ignored for VRAM-only objects. Use a value < 0 to keep > + * the default device-local placement. > + */ > +#define DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE 1 [Severity: Low] In the follow-up commit ("drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler"), gem_create_parse_numa_node() in drivers/gpu/drm/xe/xe_bo.c checks whether XE_BO_FLAG_SYSTEM is set and returns -EINVAL when a non-negative NUMA node is requested on a VRAM-only BO, rather than ignoring the property. Should this comment say that specifying a NUMA node is rejected for VRAM-only objects instead of ignored? Also, struct drm_xe_gem_create documents its DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY properties in the kernel-doc comment block above the struct definition alongside DRM_XE_GEM_CREATE_SET_PROPERTY_PXP_TYPE so that they are included in Documentation/gpu/driver-uapi.rst. Should the description for DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE be moved into that kernel-doc list above struct drm_xe_gem_create? -- Sashiko AI review · https://sashiko.dev/#/patchset/20261102101803.455921-9-himal.prasad.ghimiray@intel.com?part=6 ^ permalink raw reply [flat|nested] 19+ messages in thread
* [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray ` (5 preceding siblings ...) 2026-11-02 10:18 ` [RFC 6/7] drm/xe/uapi: Add GEM_CREATE NUMA node placement property Himal Prasad Ghimiray @ 2026-11-02 10:18 ` Himal Prasad Ghimiray 2026-11-02 10:29 ` sashiko-bot 2026-11-02 11:12 ` Matthew Auld 2026-11-02 12:44 ` ✓ CI.KUnit: success for drm/ttm, drm/xe: Per-BO host NUMA node placement Patchwork ` (2 subsequent siblings) 9 siblings, 2 replies; 19+ messages in thread From: Himal Prasad Ghimiray @ 2026-11-02 10:18 UTC (permalink / raw) To: Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Auld, Matthew Brost, dri-devel, intel-xe, Himal Prasad Ghimiray Parse the NUMA node property before BO creation and store it on the BO. Offline or out of range nodes, and BOs without a system memory placement, are rejected with -EINVAL. Drop the explicit DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY check, already covered by the property bounds check. Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> --- drivers/gpu/drm/xe/tests/xe_bo.c | 12 +-- drivers/gpu/drm/xe/tests/xe_dma_buf.c | 4 +- drivers/gpu/drm/xe/tests/xe_migrate.c | 8 +- drivers/gpu/drm/xe/xe_bo.c | 102 +++++++++++++++++++++----- drivers/gpu/drm/xe/xe_bo.h | 5 +- drivers/gpu/drm/xe/xe_dma_buf.c | 3 +- 6 files changed, 100 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c b/drivers/gpu/drm/xe/tests/xe_bo.c index 6a17e13d58cf..6f61f5c618f1 100644 --- a/drivers/gpu/drm/xe/tests/xe_bo.c +++ b/drivers/gpu/drm/xe/tests/xe_bo.c @@ -89,7 +89,7 @@ static void run_only_leaf(struct kunit *test, bo = xe_bo_create_user(xe, NULL, li->alloc_size, DRM_XE_GEM_CPU_CACHING_WC, - XE_BO_FLAG_VRAM0, NULL); + XE_BO_FLAG_VRAM0, NUMA_NO_NODE, NULL); if (IS_ERR(bo)) { page_size_alloc_restore(xe, &saved); if (PTR_ERR(bo) == -ENOSPC) { @@ -183,7 +183,7 @@ static void xe_bo_page_size_alloc_mixed_bos(struct kunit *test) */ bo = xe_bo_create_user(xe, NULL, SZ_1G, DRM_XE_GEM_CPU_CACHING_WC, - XE_BO_FLAG_VRAM0, NULL); + XE_BO_FLAG_VRAM0, NUMA_NO_NODE, NULL); if (IS_ERR(bo)) { int err = PTR_ERR(bo); @@ -366,7 +366,7 @@ static void ccs_test_run_tile(struct xe_device *xe, struct xe_tile *tile, kunit_info(test, "Testing system memory\n"); bo = xe_bo_create_user(xe, NULL, SZ_1M, DRM_XE_GEM_CPU_CACHING_WC, - bo_flags, exec); + bo_flags, NUMA_NO_NODE, exec); if (IS_ERR(bo)) { KUNIT_FAIL(test, "Failed to create bo.\n"); return; @@ -445,7 +445,7 @@ static int evict_test_run_tile(struct xe_device *xe, struct xe_tile *tile, struc xe_vm_lock(vm, false); bo = xe_bo_create_user(xe, vm, 0x10000, DRM_XE_GEM_CPU_CACHING_WC, - bo_flags, exec); + bo_flags, NUMA_NO_NODE, exec); xe_vm_unlock(vm); if (IS_ERR(bo)) { KUNIT_FAIL(test, "bo create err=%pe\n", bo); @@ -454,7 +454,7 @@ static int evict_test_run_tile(struct xe_device *xe, struct xe_tile *tile, struc external = xe_bo_create_user(xe, NULL, 0x10000, DRM_XE_GEM_CPU_CACHING_WC, - bo_flags, NULL); + bo_flags, NUMA_NO_NODE, NULL); if (IS_ERR(external)) { KUNIT_FAIL(test, "external bo create err=%pe\n", external); goto cleanup_bo; @@ -719,7 +719,7 @@ static int shrink_test_run_device(struct xe_device *xe) /* We can create bos using WC caching here. But it is slower. */ bo = xe_bo_create_user(xe, NULL, XE_BO_SHRINK_SIZE, DRM_XE_GEM_CPU_CACHING_WB, - XE_BO_FLAG_SYSTEM, NULL); + XE_BO_FLAG_SYSTEM, NUMA_NO_NODE, NULL); if (IS_ERR(bo)) { if (bo != ERR_PTR(-ENOMEM) && bo != ERR_PTR(-ENOSPC) && bo != ERR_PTR(-EINTR) && bo != ERR_PTR(-ERESTARTSYS)) diff --git a/drivers/gpu/drm/xe/tests/xe_dma_buf.c b/drivers/gpu/drm/xe/tests/xe_dma_buf.c index 792376e965f1..876ea545d1a7 100644 --- a/drivers/gpu/drm/xe/tests/xe_dma_buf.c +++ b/drivers/gpu/drm/xe/tests/xe_dma_buf.c @@ -127,7 +127,7 @@ static void xe_test_dmabuf_import_same_driver(struct xe_device *xe) kunit_info(test, "running %s\n", __func__); bo = xe_bo_create_user(xe, NULL, size, DRM_XE_GEM_CPU_CACHING_WC, - params->mem_mask, NULL); + params->mem_mask, NUMA_NO_NODE, NULL); if (IS_ERR(bo)) { KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", PTR_ERR(bo)); @@ -215,7 +215,7 @@ static void xe_test_dmabuf_move_notify_no_resource(struct xe_device *xe) kunit_info(test, "running %s\n", __func__); bo = xe_bo_create_user(xe, NULL, PAGE_SIZE, DRM_XE_GEM_CPU_CACHING_WC, - params->mem_mask, NULL); + params->mem_mask, NUMA_NO_NODE, NULL); if (IS_ERR(bo)) { KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", PTR_ERR(bo)); diff --git a/drivers/gpu/drm/xe/tests/xe_migrate.c b/drivers/gpu/drm/xe/tests/xe_migrate.c index 56c49d8507d7..69b64e3a23b8 100644 --- a/drivers/gpu/drm/xe/tests/xe_migrate.c +++ b/drivers/gpu/drm/xe/tests/xe_migrate.c @@ -649,7 +649,7 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til DRM_XE_GEM_CPU_CACHING_WC, XE_BO_FLAG_SYSTEM | XE_BO_FLAG_NEEDS_CPU_ACCESS | - XE_BO_FLAG_PINNED, NULL); + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); if (IS_ERR(sys_bo)) { KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", @@ -675,7 +675,7 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til ccs_bo = xe_bo_create_user(xe, NULL, SZ_4M, DRM_XE_GEM_CPU_CACHING_WC, bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | - XE_BO_FLAG_PINNED, NULL); + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); if (IS_ERR(ccs_bo)) { KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", @@ -700,7 +700,7 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til vram_bo = xe_bo_create_user(xe, NULL, SZ_4M, DRM_XE_GEM_CPU_CACHING_WC, bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | - XE_BO_FLAG_PINNED, NULL); + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); if (IS_ERR(vram_bo)) { KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", PTR_ERR(vram_bo)); @@ -979,7 +979,7 @@ static void access_memory_test_run_tile(struct xe_device *xe, bo = xe_bo_create_user(xe, NULL, ACCESS_MEM_BO_SIZE, DRM_XE_GEM_CPU_CACHING_WC, - bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL); + bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS, NUMA_NO_NODE, NULL); if (IS_ERR(bo)) { KUNIT_FAIL(test, "Failed to create bo: %pe\n", bo); goto free_buf; diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index fc9bfb436b8e..bbbc33737264 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -1538,7 +1538,7 @@ int xe_bo_notifier_prepare_pinned(struct xe_bo *bo) backup = xe_bo_init_locked(xe, NULL, NULL, bo->ttm.base.resv, NULL, xe_bo_size(bo), DRM_XE_GEM_CPU_CACHING_WB, ttm_bo_type_kernel, XE_BO_FLAG_SYSTEM | XE_BO_FLAG_NEEDS_CPU_ACCESS | - XE_BO_FLAG_PINNED, NULL, &exec); + XE_BO_FLAG_PINNED, NULL, NUMA_NO_NODE, &exec); if (IS_ERR(backup)) { drm_exec_retry_on_contention(&exec); ret = PTR_ERR(backup); @@ -1680,7 +1680,7 @@ int xe_bo_evict_pinned(struct xe_bo *bo) xe_bo_size(bo), DRM_XE_GEM_CPU_CACHING_WB, ttm_bo_type_kernel, XE_BO_FLAG_SYSTEM | XE_BO_FLAG_NEEDS_CPU_ACCESS | - XE_BO_FLAG_PINNED, NULL, &exec); + XE_BO_FLAG_PINNED, NULL, NUMA_NO_NODE, &exec); if (IS_ERR(backup)) { drm_exec_retry_on_contention(&exec); ret = PTR_ERR(backup); @@ -2480,7 +2480,7 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, struct ttm_lru_bulk_move *bulk, size_t size, u16 cpu_caching, enum ttm_bo_type type, u32 flags, struct dma_buf *dma_buf, - struct drm_exec *exec) + int numa_node, struct drm_exec *exec) { struct ttm_operation_ctx ctx = { .interruptible = true, @@ -2546,7 +2546,7 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, bo->tile = tile; bo->flags = flags; bo->cpu_caching = cpu_caching; - bo->numa_node = NUMA_NO_NODE; + bo->numa_node = numa_node; bo->ttm.base.funcs = &xe_gem_object_funcs; bo->ttm.priority = XE_BO_PRIORITY_NORMAL; INIT_LIST_HEAD(&bo->pinned_link); @@ -2681,7 +2681,7 @@ __xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, u64 start, u64 end, u16 cpu_caching, enum ttm_bo_type type, u32 flags, - u64 alignment, struct drm_exec *exec) + u64 alignment, int numa_node, struct drm_exec *exec) { struct xe_bo *bo = NULL; int err; @@ -2706,7 +2706,7 @@ __xe_bo_create_locked(struct xe_device *xe, vm && !xe_vm_in_fault_mode(vm) && flags & XE_BO_FLAG_USER ? &vm->lru_bulk_move : NULL, size, - cpu_caching, type, flags, NULL, exec); + cpu_caching, type, flags, NULL, numa_node, exec); if (IS_ERR(bo)) return bo; @@ -2781,13 +2781,13 @@ struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, struct drm_exec *exec) { return __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL, 0, type, - flags, 0, exec); + flags, 0, NUMA_NO_NODE, exec); } static struct xe_bo *xe_bo_create_novm(struct xe_device *xe, struct xe_tile *tile, size_t size, u16 cpu_caching, enum ttm_bo_type type, u32 flags, - u64 alignment, bool intr) + u64 alignment, int numa_node, bool intr) { struct xe_validation_ctx ctx; struct drm_exec exec; @@ -2797,7 +2797,8 @@ static struct xe_bo *xe_bo_create_novm(struct xe_device *xe, struct xe_tile *til xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {.interruptible = intr}, ret) { bo = __xe_bo_create_locked(xe, tile, NULL, size, 0, ~0ULL, - cpu_caching, type, flags, alignment, &exec); + cpu_caching, type, flags, alignment, + numa_node, &exec); drm_exec_retry_on_contention(&exec); if (IS_ERR(bo)) { ret = PTR_ERR(bo); @@ -2966,7 +2967,8 @@ static void xe_bo_debug_mixed_mode_cur_index_advance(struct xe_device *xe, struct xe_bo *xe_bo_create_user(struct xe_device *xe, struct xe_vm *vm, size_t size, u16 cpu_caching, - u32 flags, struct drm_exec *exec) + u32 flags, int numa_node, + struct drm_exec *exec) { struct xe_bo *bo; int err = 0; @@ -2983,12 +2985,13 @@ struct xe_bo *xe_bo_create_user(struct xe_device *xe, xe_assert(xe, exec); bo = __xe_bo_create_locked(xe, NULL, vm, size, 0, ~0ULL, cpu_caching, ttm_bo_type_device, - flags, 0, exec); + flags, 0, numa_node, exec); if (!IS_ERR(bo)) xe_bo_unlock_vm_held(bo); } else { bo = xe_bo_create_novm(xe, NULL, size, cpu_caching, - ttm_bo_type_device, flags, 0, true); + ttm_bo_type_device, flags, 0, + numa_node, true); } return bo; @@ -3022,7 +3025,7 @@ struct xe_bo *xe_bo_create_pin_range_novm(struct xe_device *xe, struct xe_tile * xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) { bo = __xe_bo_create_locked(xe, tile, NULL, size, start, end, - 0, type, flags, 0, &exec); + 0, type, flags, 0, NUMA_NO_NODE, &exec); if (IS_ERR(bo)) { drm_exec_retry_on_contention(&exec); err = PTR_ERR(bo); @@ -3061,7 +3064,7 @@ static struct xe_bo *xe_bo_create_pin_map_at_aligned(struct xe_device *xe, bo = __xe_bo_create_locked(xe, tile, vm, size, start, end, 0, type, flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | XE_BO_FLAG_PINNED, - alignment, exec); + alignment, NUMA_NO_NODE, exec); if (IS_ERR(bo)) return bo; @@ -3604,10 +3607,15 @@ static int gem_create_user_ext_set_property(struct xe_device *xe, if (XE_IOCTL_DBG(xe, err)) return -EFAULT; + if (XE_IOCTL_DBG(xe, ext.pad)) + return -EINVAL; + + /* The NUMA node property is parsed and applied before BO creation. */ + if (ext.property == DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE) + return 0; + if (XE_IOCTL_DBG(xe, ext.property >= - ARRAY_SIZE(gem_create_set_property_funcs)) || - XE_IOCTL_DBG(xe, ext.pad) || - XE_IOCTL_DBG(xe, ext.property != DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY)) + ARRAY_SIZE(gem_create_set_property_funcs))) return -EINVAL; idx = array_index_nospec(ext.property, ARRAY_SIZE(gem_create_set_property_funcs)); @@ -3658,6 +3666,56 @@ static int gem_create_user_extensions(struct xe_device *xe, struct xe_bo *bo, return 0; } +/* + * Parse a host NUMA node request from the extension chain. The node must be + * known before the BO is created, because the backing pages are allocated + * during creation. Returns the requested node in @numa_node (NUMA_NO_NODE if + * none or a negative value is given) or a negative errno on an invalid request. + */ +static int gem_create_parse_numa_node(struct xe_device *xe, u64 extensions, + u32 bo_flags, int *numa_node) +{ + struct drm_xe_user_extension base; + struct drm_xe_ext_set_property ext; + unsigned int i = 0; + + *numa_node = NUMA_NO_NODE; + + while (extensions && i++ < MAX_USER_EXTENSIONS) { + u64 __user *address = u64_to_user_ptr(extensions); + s64 nid; + + if (XE_IOCTL_DBG(xe, copy_from_user(&base, address, sizeof(base)))) + return -EFAULT; + + if (base.name != DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY) + goto next; + + if (XE_IOCTL_DBG(xe, copy_from_user(&ext, address, sizeof(ext)))) + return -EFAULT; + + if (ext.property != DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE) + goto next; + + nid = (s64)ext.value; + *numa_node = NUMA_NO_NODE; + if (nid < 0) + goto next; + + if (XE_IOCTL_DBG(xe, nid >= MAX_NUMNODES || !node_online(nid))) + return -EINVAL; + + if (XE_IOCTL_DBG(xe, !(bo_flags & XE_BO_FLAG_SYSTEM))) + return -EINVAL; + + *numa_node = nid; +next: + extensions = base.next_extension; + } + + return 0; +} + int xe_gem_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file) { @@ -3669,6 +3727,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, struct xe_vm *vm = NULL; struct xe_bo *bo; unsigned int bo_flags; + int numa_node; u32 handle; int err; @@ -3744,6 +3803,11 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, args->cpu_caching == DRM_XE_GEM_CPU_CACHING_WB)) return -EINVAL; + err = gem_create_parse_numa_node(xe, args->extensions, bo_flags, + &numa_node); + if (err) + return err; + if (args->vm_id) { vm = xe_vm_lookup(xef, args->vm_id); if (XE_IOCTL_DBG(xe, !vm)) @@ -3760,7 +3824,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, break; } bo = xe_bo_create_user(xe, vm, args->size, args->cpu_caching, - bo_flags, &exec); + bo_flags, numa_node, &exec); drm_exec_retry_on_contention(&exec); if (IS_ERR(bo)) { err = PTR_ERR(bo); @@ -4231,7 +4295,7 @@ int xe_bo_dumb_create(struct drm_file *file_priv, DRM_XE_GEM_CPU_CACHING_WC, XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | XE_BO_FLAG_FORCE_WC | - XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL); + XE_BO_FLAG_NEEDS_CPU_ACCESS, NUMA_NO_NODE, NULL); if (IS_ERR(bo)) return PTR_ERR(bo); diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h index 77b3a02e9b8e..225c6a8676a6 100644 --- a/drivers/gpu/drm/xe/xe_bo.h +++ b/drivers/gpu/drm/xe/xe_bo.h @@ -122,13 +122,14 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, struct ttm_lru_bulk_move *bulk, size_t size, u16 cpu_caching, enum ttm_bo_type type, u32 flags, struct dma_buf *dma_buf, - struct drm_exec *exec); + int numa_node, struct drm_exec *exec); struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, enum ttm_bo_type type, u32 flags, struct drm_exec *exec); struct xe_bo *xe_bo_create_user(struct xe_device *xe, struct xe_vm *vm, size_t size, - u16 cpu_caching, u32 flags, struct drm_exec *exec); + u16 cpu_caching, u32 flags, int numa_node, + struct drm_exec *exec); struct xe_bo *xe_bo_create_pin_map(struct xe_device *xe, struct xe_tile *tile, struct xe_vm *vm, size_t size, enum ttm_bo_type type, u32 flags, diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c index 5bf13dc4b61d..b5351310a07b 100644 --- a/drivers/gpu/drm/xe/xe_dma_buf.c +++ b/drivers/gpu/drm/xe/xe_dma_buf.c @@ -343,7 +343,8 @@ xe_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf) bo = xe_bo_init_locked(xe, NULL, NULL, resv, NULL, dma_buf->size, 0, /* Will require 1way or 2way for vm_bind */ - ttm_bo_type_sg, XE_BO_FLAG_SYSTEM, dma_buf, &exec); + ttm_bo_type_sg, XE_BO_FLAG_SYSTEM, dma_buf, + NUMA_NO_NODE, &exec); drm_exec_retry_on_contention(&exec); if (IS_ERR(bo)) { ret = PTR_ERR(bo); -- 2.43.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler 2026-11-02 10:18 ` [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler Himal Prasad Ghimiray @ 2026-11-02 10:29 ` sashiko-bot 2026-11-02 11:12 ` Matthew Auld 1 sibling, 0 replies; 19+ messages in thread From: sashiko-bot @ 2026-11-02 10:29 UTC (permalink / raw) To: Himal Prasad Ghimiray; +Cc: dri-devel, intel-xe Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [Medium] drm/xe: UAPI mismatch for VRAM-only BOs in gem_create_parse_numa_node() - [Low] drm/xe: missing numa_node kernel-doc in xe_bo_init_locked() -- commit 4dfdcc93fc9d778a45958834231a36c288d379fc Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler This commit parses the DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE user extension prior to BO creation in xe_gem_create_ioctl() and passes the requested NUMA node ID down through the BO creation helpers to store on the xe_bo. > diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c > index fc9bfb436b8e7..bbbc337372641 100644 > --- a/drivers/gpu/drm/xe/xe_bo.c > +++ b/drivers/gpu/drm/xe/xe_bo.c [ ... ] > @@ -2480,7 +2480,7 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, > struct ttm_lru_bulk_move *bulk, size_t size, > u16 cpu_caching, enum ttm_bo_type type, > u32 flags, struct dma_buf *dma_buf, > - struct drm_exec *exec) > + int numa_node, struct drm_exec *exec) > { [ ... ] > @@ -2966,7 +2967,8 @@ static void xe_bo_debug_mixed_mode_cur_index_advance(struct xe_device *xe, > struct xe_bo *xe_bo_create_user(struct xe_device *xe, > struct xe_vm *vm, size_t size, > u16 cpu_caching, > - u32 flags, struct drm_exec *exec) > + u32 flags, int numa_node, > + struct drm_exec *exec) > { [Severity: Low] This isn't a bug, but both xe_bo_init_locked() and xe_bo_create_user() have kernel-doc comment blocks immediately above their definitions. Should @numa_node be added to both kernel-doc blocks to avoid W=1 kernel-doc warnings for undescribed function parameters? [ ... ] > @@ -3658,6 +3666,56 @@ static int gem_create_user_extensions(struct xe_device *xe, struct xe_bo *bo, > return 0; > } > > +/* > + * Parse a host NUMA node request from the extension chain. The node must be > + * known before the BO is created, because the backing pages are allocated > + * during creation. Returns the requested node in @numa_node (NUMA_NO_NODE if > + * none or a negative value is given) or a negative errno on an invalid request. > + */ > +static int gem_create_parse_numa_node(struct xe_device *xe, u64 extensions, > + u32 bo_flags, int *numa_node) > +{ > + struct drm_xe_user_extension base; > + struct drm_xe_ext_set_property ext; > + unsigned int i = 0; > + > + *numa_node = NUMA_NO_NODE; > + > + while (extensions && i++ < MAX_USER_EXTENSIONS) { > + u64 __user *address = u64_to_user_ptr(extensions); > + s64 nid; > + > + if (XE_IOCTL_DBG(xe, copy_from_user(&base, address, sizeof(base)))) > + return -EFAULT; > + > + if (base.name != DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY) > + goto next; > + > + if (XE_IOCTL_DBG(xe, copy_from_user(&ext, address, sizeof(ext)))) > + return -EFAULT; > + > + if (ext.property != DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE) > + goto next; > + > + nid = (s64)ext.value; > + *numa_node = NUMA_NO_NODE; > + if (nid < 0) > + goto next; > + > + if (XE_IOCTL_DBG(xe, nid >= MAX_NUMNODES || !node_online(nid))) > + return -EINVAL; > + > + if (XE_IOCTL_DBG(xe, !(bo_flags & XE_BO_FLAG_SYSTEM))) > + return -EINVAL; > + > + *numa_node = nid; > +next: > + extensions = base.next_extension; > + } > + > + return 0; > +} [Severity: Medium] Does rejecting !(bo_flags & XE_BO_FLAG_SYSTEM) with -EINVAL in xe_gem_create_ioctl() -> gem_create_parse_numa_node() match the UAPI contract in include/uapi/drm/xe_drm.h? In struct drm_xe_gem_create, the comment for DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE states: /* * Host NUMA node (as a signed value) to allocate system-memory * backing pages from. Only honored for objects with a system-memory * placement; ignored for VRAM-only objects. Use a value < 0 to keep * the default device-local placement. */ #define DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE 1 However, gem_create_parse_numa_node() returns -EINVAL when nid >= 0 and !(bo_flags & XE_BO_FLAG_SYSTEM) instead of ignoring the property on VRAM-only objects. In addition, because nid < 0 jumps to next before reaching the !(bo_flags & XE_BO_FLAG_SYSTEM) check, a VRAM-only BO with nid < 0 is accepted while nid >= 0 fails with -EINVAL, and an extension chain on a VRAM-only BO that sets nid >= 0 followed by a later extension resetting nid = -1 will fail on the first extension. Should the UAPI comment and gem_create_parse_numa_node() be aligned on whether VRAM-only BOs ignore DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE or reject it with -EINVAL? -- Sashiko AI review · https://sashiko.dev/#/patchset/20261102101803.455921-9-himal.prasad.ghimiray@intel.com?part=7 ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler 2026-11-02 10:18 ` [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler Himal Prasad Ghimiray 2026-11-02 10:29 ` sashiko-bot @ 2026-11-02 11:12 ` Matthew Auld 2026-11-02 18:24 ` Himal prasad Ghimiray 1 sibling, 1 reply; 19+ messages in thread From: Matthew Auld @ 2026-11-02 11:12 UTC (permalink / raw) To: Himal Prasad Ghimiray, Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Brost, dri-devel, intel-xe On 02/11/2026 10:18, Himal Prasad Ghimiray wrote: > Parse the NUMA node property before BO creation and store it on the BO. > Offline or out of range nodes, and BOs without a system memory > placement, are rejected with -EINVAL. > > Drop the explicit DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY check, already > covered by the property bounds check. > > Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> > --- > drivers/gpu/drm/xe/tests/xe_bo.c | 12 +-- > drivers/gpu/drm/xe/tests/xe_dma_buf.c | 4 +- > drivers/gpu/drm/xe/tests/xe_migrate.c | 8 +- > drivers/gpu/drm/xe/xe_bo.c | 102 +++++++++++++++++++++----- > drivers/gpu/drm/xe/xe_bo.h | 5 +- > drivers/gpu/drm/xe/xe_dma_buf.c | 3 +- > 6 files changed, 100 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c b/drivers/gpu/drm/xe/tests/xe_bo.c > index 6a17e13d58cf..6f61f5c618f1 100644 > --- a/drivers/gpu/drm/xe/tests/xe_bo.c > +++ b/drivers/gpu/drm/xe/tests/xe_bo.c > @@ -89,7 +89,7 @@ static void run_only_leaf(struct kunit *test, > > bo = xe_bo_create_user(xe, NULL, li->alloc_size, > DRM_XE_GEM_CPU_CACHING_WC, > - XE_BO_FLAG_VRAM0, NULL); > + XE_BO_FLAG_VRAM0, NUMA_NO_NODE, NULL); > if (IS_ERR(bo)) { > page_size_alloc_restore(xe, &saved); > if (PTR_ERR(bo) == -ENOSPC) { > @@ -183,7 +183,7 @@ static void xe_bo_page_size_alloc_mixed_bos(struct kunit *test) > */ > bo = xe_bo_create_user(xe, NULL, SZ_1G, > DRM_XE_GEM_CPU_CACHING_WC, > - XE_BO_FLAG_VRAM0, NULL); > + XE_BO_FLAG_VRAM0, NUMA_NO_NODE, NULL); > if (IS_ERR(bo)) { > int err = PTR_ERR(bo); > > @@ -366,7 +366,7 @@ static void ccs_test_run_tile(struct xe_device *xe, struct xe_tile *tile, > kunit_info(test, "Testing system memory\n"); > > bo = xe_bo_create_user(xe, NULL, SZ_1M, DRM_XE_GEM_CPU_CACHING_WC, > - bo_flags, exec); > + bo_flags, NUMA_NO_NODE, exec); > if (IS_ERR(bo)) { > KUNIT_FAIL(test, "Failed to create bo.\n"); > return; > @@ -445,7 +445,7 @@ static int evict_test_run_tile(struct xe_device *xe, struct xe_tile *tile, struc > xe_vm_lock(vm, false); > bo = xe_bo_create_user(xe, vm, 0x10000, > DRM_XE_GEM_CPU_CACHING_WC, > - bo_flags, exec); > + bo_flags, NUMA_NO_NODE, exec); > xe_vm_unlock(vm); > if (IS_ERR(bo)) { > KUNIT_FAIL(test, "bo create err=%pe\n", bo); > @@ -454,7 +454,7 @@ static int evict_test_run_tile(struct xe_device *xe, struct xe_tile *tile, struc > > external = xe_bo_create_user(xe, NULL, 0x10000, > DRM_XE_GEM_CPU_CACHING_WC, > - bo_flags, NULL); > + bo_flags, NUMA_NO_NODE, NULL); > if (IS_ERR(external)) { > KUNIT_FAIL(test, "external bo create err=%pe\n", external); > goto cleanup_bo; > @@ -719,7 +719,7 @@ static int shrink_test_run_device(struct xe_device *xe) > /* We can create bos using WC caching here. But it is slower. */ > bo = xe_bo_create_user(xe, NULL, XE_BO_SHRINK_SIZE, > DRM_XE_GEM_CPU_CACHING_WB, > - XE_BO_FLAG_SYSTEM, NULL); > + XE_BO_FLAG_SYSTEM, NUMA_NO_NODE, NULL); > if (IS_ERR(bo)) { > if (bo != ERR_PTR(-ENOMEM) && bo != ERR_PTR(-ENOSPC) && > bo != ERR_PTR(-EINTR) && bo != ERR_PTR(-ERESTARTSYS)) > diff --git a/drivers/gpu/drm/xe/tests/xe_dma_buf.c b/drivers/gpu/drm/xe/tests/xe_dma_buf.c > index 792376e965f1..876ea545d1a7 100644 > --- a/drivers/gpu/drm/xe/tests/xe_dma_buf.c > +++ b/drivers/gpu/drm/xe/tests/xe_dma_buf.c > @@ -127,7 +127,7 @@ static void xe_test_dmabuf_import_same_driver(struct xe_device *xe) > > kunit_info(test, "running %s\n", __func__); > bo = xe_bo_create_user(xe, NULL, size, DRM_XE_GEM_CPU_CACHING_WC, > - params->mem_mask, NULL); > + params->mem_mask, NUMA_NO_NODE, NULL); > if (IS_ERR(bo)) { > KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", > PTR_ERR(bo)); > @@ -215,7 +215,7 @@ static void xe_test_dmabuf_move_notify_no_resource(struct xe_device *xe) > > kunit_info(test, "running %s\n", __func__); > bo = xe_bo_create_user(xe, NULL, PAGE_SIZE, DRM_XE_GEM_CPU_CACHING_WC, > - params->mem_mask, NULL); > + params->mem_mask, NUMA_NO_NODE, NULL); > if (IS_ERR(bo)) { > KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", > PTR_ERR(bo)); > diff --git a/drivers/gpu/drm/xe/tests/xe_migrate.c b/drivers/gpu/drm/xe/tests/xe_migrate.c > index 56c49d8507d7..69b64e3a23b8 100644 > --- a/drivers/gpu/drm/xe/tests/xe_migrate.c > +++ b/drivers/gpu/drm/xe/tests/xe_migrate.c > @@ -649,7 +649,7 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til > DRM_XE_GEM_CPU_CACHING_WC, > XE_BO_FLAG_SYSTEM | > XE_BO_FLAG_NEEDS_CPU_ACCESS | > - XE_BO_FLAG_PINNED, NULL); > + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); > > if (IS_ERR(sys_bo)) { > KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", > @@ -675,7 +675,7 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til > ccs_bo = xe_bo_create_user(xe, NULL, SZ_4M, > DRM_XE_GEM_CPU_CACHING_WC, > bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | > - XE_BO_FLAG_PINNED, NULL); > + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); > > if (IS_ERR(ccs_bo)) { > KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", > @@ -700,7 +700,7 @@ static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *til > vram_bo = xe_bo_create_user(xe, NULL, SZ_4M, > DRM_XE_GEM_CPU_CACHING_WC, > bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | > - XE_BO_FLAG_PINNED, NULL); > + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); > if (IS_ERR(vram_bo)) { > KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", > PTR_ERR(vram_bo)); > @@ -979,7 +979,7 @@ static void access_memory_test_run_tile(struct xe_device *xe, > > bo = xe_bo_create_user(xe, NULL, ACCESS_MEM_BO_SIZE, > DRM_XE_GEM_CPU_CACHING_WC, > - bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL); > + bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS, NUMA_NO_NODE, NULL); > if (IS_ERR(bo)) { > KUNIT_FAIL(test, "Failed to create bo: %pe\n", bo); > goto free_buf; > diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c > index fc9bfb436b8e..bbbc33737264 100644 > --- a/drivers/gpu/drm/xe/xe_bo.c > +++ b/drivers/gpu/drm/xe/xe_bo.c > @@ -1538,7 +1538,7 @@ int xe_bo_notifier_prepare_pinned(struct xe_bo *bo) > backup = xe_bo_init_locked(xe, NULL, NULL, bo->ttm.base.resv, NULL, xe_bo_size(bo), > DRM_XE_GEM_CPU_CACHING_WB, ttm_bo_type_kernel, > XE_BO_FLAG_SYSTEM | XE_BO_FLAG_NEEDS_CPU_ACCESS | > - XE_BO_FLAG_PINNED, NULL, &exec); > + XE_BO_FLAG_PINNED, NULL, NUMA_NO_NODE, &exec); > if (IS_ERR(backup)) { > drm_exec_retry_on_contention(&exec); > ret = PTR_ERR(backup); > @@ -1680,7 +1680,7 @@ int xe_bo_evict_pinned(struct xe_bo *bo) > xe_bo_size(bo), > DRM_XE_GEM_CPU_CACHING_WB, ttm_bo_type_kernel, > XE_BO_FLAG_SYSTEM | XE_BO_FLAG_NEEDS_CPU_ACCESS | > - XE_BO_FLAG_PINNED, NULL, &exec); > + XE_BO_FLAG_PINNED, NULL, NUMA_NO_NODE, &exec); > if (IS_ERR(backup)) { > drm_exec_retry_on_contention(&exec); > ret = PTR_ERR(backup); > @@ -2480,7 +2480,7 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, > struct ttm_lru_bulk_move *bulk, size_t size, > u16 cpu_caching, enum ttm_bo_type type, > u32 flags, struct dma_buf *dma_buf, > - struct drm_exec *exec) > + int numa_node, struct drm_exec *exec) > { > struct ttm_operation_ctx ctx = { > .interruptible = true, > @@ -2546,7 +2546,7 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, > bo->tile = tile; > bo->flags = flags; > bo->cpu_caching = cpu_caching; > - bo->numa_node = NUMA_NO_NODE; > + bo->numa_node = numa_node; > bo->ttm.base.funcs = &xe_gem_object_funcs; > bo->ttm.priority = XE_BO_PRIORITY_NORMAL; > INIT_LIST_HEAD(&bo->pinned_link); > @@ -2681,7 +2681,7 @@ __xe_bo_create_locked(struct xe_device *xe, > struct xe_tile *tile, struct xe_vm *vm, > size_t size, u64 start, u64 end, > u16 cpu_caching, enum ttm_bo_type type, u32 flags, > - u64 alignment, struct drm_exec *exec) > + u64 alignment, int numa_node, struct drm_exec *exec) > { > struct xe_bo *bo = NULL; > int err; > @@ -2706,7 +2706,7 @@ __xe_bo_create_locked(struct xe_device *xe, > vm && !xe_vm_in_fault_mode(vm) && > flags & XE_BO_FLAG_USER ? > &vm->lru_bulk_move : NULL, size, > - cpu_caching, type, flags, NULL, exec); > + cpu_caching, type, flags, NULL, numa_node, exec); > if (IS_ERR(bo)) > return bo; > > @@ -2781,13 +2781,13 @@ struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, > struct drm_exec *exec) > { > return __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL, 0, type, > - flags, 0, exec); > + flags, 0, NUMA_NO_NODE, exec); > } > > static struct xe_bo *xe_bo_create_novm(struct xe_device *xe, struct xe_tile *tile, > size_t size, u16 cpu_caching, > enum ttm_bo_type type, u32 flags, > - u64 alignment, bool intr) > + u64 alignment, int numa_node, bool intr) > { > struct xe_validation_ctx ctx; > struct drm_exec exec; > @@ -2797,7 +2797,8 @@ static struct xe_bo *xe_bo_create_novm(struct xe_device *xe, struct xe_tile *til > xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {.interruptible = intr}, > ret) { > bo = __xe_bo_create_locked(xe, tile, NULL, size, 0, ~0ULL, > - cpu_caching, type, flags, alignment, &exec); > + cpu_caching, type, flags, alignment, > + numa_node, &exec); > drm_exec_retry_on_contention(&exec); > if (IS_ERR(bo)) { > ret = PTR_ERR(bo); > @@ -2966,7 +2967,8 @@ static void xe_bo_debug_mixed_mode_cur_index_advance(struct xe_device *xe, > struct xe_bo *xe_bo_create_user(struct xe_device *xe, > struct xe_vm *vm, size_t size, > u16 cpu_caching, > - u32 flags, struct drm_exec *exec) > + u32 flags, int numa_node, > + struct drm_exec *exec) > { > struct xe_bo *bo; > int err = 0; > @@ -2983,12 +2985,13 @@ struct xe_bo *xe_bo_create_user(struct xe_device *xe, > xe_assert(xe, exec); > bo = __xe_bo_create_locked(xe, NULL, vm, size, 0, ~0ULL, > cpu_caching, ttm_bo_type_device, > - flags, 0, exec); > + flags, 0, numa_node, exec); > if (!IS_ERR(bo)) > xe_bo_unlock_vm_held(bo); > } else { > bo = xe_bo_create_novm(xe, NULL, size, cpu_caching, > - ttm_bo_type_device, flags, 0, true); > + ttm_bo_type_device, flags, 0, > + numa_node, true); > } > > return bo; > @@ -3022,7 +3025,7 @@ struct xe_bo *xe_bo_create_pin_range_novm(struct xe_device *xe, struct xe_tile * > > xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) { > bo = __xe_bo_create_locked(xe, tile, NULL, size, start, end, > - 0, type, flags, 0, &exec); > + 0, type, flags, 0, NUMA_NO_NODE, &exec); > if (IS_ERR(bo)) { > drm_exec_retry_on_contention(&exec); > err = PTR_ERR(bo); > @@ -3061,7 +3064,7 @@ static struct xe_bo *xe_bo_create_pin_map_at_aligned(struct xe_device *xe, > > bo = __xe_bo_create_locked(xe, tile, vm, size, start, end, 0, type, > flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | XE_BO_FLAG_PINNED, > - alignment, exec); > + alignment, NUMA_NO_NODE, exec); > if (IS_ERR(bo)) > return bo; > > @@ -3604,10 +3607,15 @@ static int gem_create_user_ext_set_property(struct xe_device *xe, > if (XE_IOCTL_DBG(xe, err)) > return -EFAULT; > > + if (XE_IOCTL_DBG(xe, ext.pad)) > + return -EINVAL; > + > + /* The NUMA node property is parsed and applied before BO creation. */ > + if (ext.property == DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE) > + return 0; > + > if (XE_IOCTL_DBG(xe, ext.property >= > - ARRAY_SIZE(gem_create_set_property_funcs)) || > - XE_IOCTL_DBG(xe, ext.pad) || > - XE_IOCTL_DBG(xe, ext.property != DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY)) > + ARRAY_SIZE(gem_create_set_property_funcs))) > return -EINVAL; > > idx = array_index_nospec(ext.property, ARRAY_SIZE(gem_create_set_property_funcs)); > @@ -3658,6 +3666,56 @@ static int gem_create_user_extensions(struct xe_device *xe, struct xe_bo *bo, > return 0; > } > > +/* > + * Parse a host NUMA node request from the extension chain. The node must be > + * known before the BO is created, because the backing pages are allocated > + * during creation. Returns the requested node in @numa_node (NUMA_NO_NODE if > + * none or a negative value is given) or a negative errno on an invalid request. Would it make sense to rework this and have something like: struct gem_create_extension_data { u32 pxp_key_instance; int numa_node; } Which is parsed up front before the bo create? And then in some way we just pass that along to create_user() or manual bo init after? Otherwise here we look to be open coding a duplicate extension parser flow, rather than using gem_create_set_property_funcs? I think parsing before bo create make more sense anyway, like you do here? > + */ > +static int gem_create_parse_numa_node(struct xe_device *xe, u64 extensions, > + u32 bo_flags, int *numa_node) > +{ > + struct drm_xe_user_extension base; > + struct drm_xe_ext_set_property ext; > + unsigned int i = 0; > + > + *numa_node = NUMA_NO_NODE; > + > + while (extensions && i++ < MAX_USER_EXTENSIONS) { > + u64 __user *address = u64_to_user_ptr(extensions); > + s64 nid; > + > + if (XE_IOCTL_DBG(xe, copy_from_user(&base, address, sizeof(base)))) > + return -EFAULT; > + > + if (base.name != DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY) > + goto next; > + > + if (XE_IOCTL_DBG(xe, copy_from_user(&ext, address, sizeof(ext)))) > + return -EFAULT; > + > + if (ext.property != DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE) > + goto next; > + > + nid = (s64)ext.value; > + *numa_node = NUMA_NO_NODE; > + if (nid < 0) > + goto next; > + > + if (XE_IOCTL_DBG(xe, nid >= MAX_NUMNODES || !node_online(nid))) I think needs nospec dance for nid? > + return -EINVAL; > + > + if (XE_IOCTL_DBG(xe, !(bo_flags & XE_BO_FLAG_SYSTEM))) > + return -EINVAL; > + > + *numa_node = nid; > +next: > + extensions = base.next_extension; > + } > + > + return 0; > +} > + > int xe_gem_create_ioctl(struct drm_device *dev, void *data, > struct drm_file *file) > { > @@ -3669,6 +3727,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, > struct xe_vm *vm = NULL; > struct xe_bo *bo; > unsigned int bo_flags; > + int numa_node; > u32 handle; > int err; > > @@ -3744,6 +3803,11 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, > args->cpu_caching == DRM_XE_GEM_CPU_CACHING_WB)) > return -EINVAL; > > + err = gem_create_parse_numa_node(xe, args->extensions, bo_flags, > + &numa_node); > + if (err) > + return err; > + > if (args->vm_id) { > vm = xe_vm_lookup(xef, args->vm_id); > if (XE_IOCTL_DBG(xe, !vm)) > @@ -3760,7 +3824,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data, > break; > } > bo = xe_bo_create_user(xe, vm, args->size, args->cpu_caching, > - bo_flags, &exec); > + bo_flags, numa_node, &exec); > drm_exec_retry_on_contention(&exec); > if (IS_ERR(bo)) { > err = PTR_ERR(bo); > @@ -4231,7 +4295,7 @@ int xe_bo_dumb_create(struct drm_file *file_priv, > DRM_XE_GEM_CPU_CACHING_WC, > XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | > XE_BO_FLAG_FORCE_WC | > - XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL); > + XE_BO_FLAG_NEEDS_CPU_ACCESS, NUMA_NO_NODE, NULL); > if (IS_ERR(bo)) > return PTR_ERR(bo); > > diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h > index 77b3a02e9b8e..225c6a8676a6 100644 > --- a/drivers/gpu/drm/xe/xe_bo.h > +++ b/drivers/gpu/drm/xe/xe_bo.h > @@ -122,13 +122,14 @@ struct xe_bo *xe_bo_init_locked(struct xe_device *xe, struct xe_bo *bo, > struct ttm_lru_bulk_move *bulk, size_t size, > u16 cpu_caching, enum ttm_bo_type type, > u32 flags, struct dma_buf *dma_buf, > - struct drm_exec *exec); > + int numa_node, struct drm_exec *exec); > struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct xe_tile *tile, > struct xe_vm *vm, size_t size, > enum ttm_bo_type type, u32 flags, > struct drm_exec *exec); > struct xe_bo *xe_bo_create_user(struct xe_device *xe, struct xe_vm *vm, size_t size, > - u16 cpu_caching, u32 flags, struct drm_exec *exec); > + u16 cpu_caching, u32 flags, int numa_node, > + struct drm_exec *exec); > struct xe_bo *xe_bo_create_pin_map(struct xe_device *xe, struct xe_tile *tile, > struct xe_vm *vm, size_t size, > enum ttm_bo_type type, u32 flags, > diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c > index 5bf13dc4b61d..b5351310a07b 100644 > --- a/drivers/gpu/drm/xe/xe_dma_buf.c > +++ b/drivers/gpu/drm/xe/xe_dma_buf.c > @@ -343,7 +343,8 @@ xe_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf) > > bo = xe_bo_init_locked(xe, NULL, NULL, resv, NULL, dma_buf->size, > 0, /* Will require 1way or 2way for vm_bind */ > - ttm_bo_type_sg, XE_BO_FLAG_SYSTEM, dma_buf, &exec); > + ttm_bo_type_sg, XE_BO_FLAG_SYSTEM, dma_buf, > + NUMA_NO_NODE, &exec); > drm_exec_retry_on_contention(&exec); > if (IS_ERR(bo)) { > ret = PTR_ERR(bo); ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler 2026-11-02 11:12 ` Matthew Auld @ 2026-11-02 18:24 ` Himal prasad Ghimiray 0 siblings, 0 replies; 19+ messages in thread From: Himal prasad Ghimiray @ 2026-11-02 18:24 UTC (permalink / raw) To: Matthew Auld, Christian König, Huang Rui, Thomas Hellström, Rodrigo Vivi Cc: Matthew Brost, dri-devel, intel-xe On 02-11-2026 16:42, Matthew Auld wrote: > On 02/11/2026 10:18, Himal Prasad Ghimiray wrote: >> Parse the NUMA node property before BO creation and store it on the BO. >> Offline or out of range nodes, and BOs without a system memory >> placement, are rejected with -EINVAL. >> >> Drop the explicit DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY check, >> already >> covered by the property bounds check. >> >> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> >> --- >> drivers/gpu/drm/xe/tests/xe_bo.c | 12 +-- >> drivers/gpu/drm/xe/tests/xe_dma_buf.c | 4 +- >> drivers/gpu/drm/xe/tests/xe_migrate.c | 8 +- >> drivers/gpu/drm/xe/xe_bo.c | 102 +++++++++++++++++++++----- >> drivers/gpu/drm/xe/xe_bo.h | 5 +- >> drivers/gpu/drm/xe/xe_dma_buf.c | 3 +- >> 6 files changed, 100 insertions(+), 34 deletions(-) >> >> diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c >> b/drivers/gpu/drm/xe/tests/xe_bo.c >> index 6a17e13d58cf..6f61f5c618f1 100644 >> --- a/drivers/gpu/drm/xe/tests/xe_bo.c >> +++ b/drivers/gpu/drm/xe/tests/xe_bo.c >> @@ -89,7 +89,7 @@ static void run_only_leaf(struct kunit *test, >> bo = xe_bo_create_user(xe, NULL, li->alloc_size, >> DRM_XE_GEM_CPU_CACHING_WC, >> - XE_BO_FLAG_VRAM0, NULL); >> + XE_BO_FLAG_VRAM0, NUMA_NO_NODE, NULL); >> if (IS_ERR(bo)) { >> page_size_alloc_restore(xe, &saved); >> if (PTR_ERR(bo) == -ENOSPC) { >> @@ -183,7 +183,7 @@ static void >> xe_bo_page_size_alloc_mixed_bos(struct kunit *test) >> */ >> bo = xe_bo_create_user(xe, NULL, SZ_1G, >> DRM_XE_GEM_CPU_CACHING_WC, >> - XE_BO_FLAG_VRAM0, NULL); >> + XE_BO_FLAG_VRAM0, NUMA_NO_NODE, NULL); >> if (IS_ERR(bo)) { >> int err = PTR_ERR(bo); >> @@ -366,7 +366,7 @@ static void ccs_test_run_tile(struct xe_device >> *xe, struct xe_tile *tile, >> kunit_info(test, "Testing system memory\n"); >> bo = xe_bo_create_user(xe, NULL, SZ_1M, >> DRM_XE_GEM_CPU_CACHING_WC, >> - bo_flags, exec); >> + bo_flags, NUMA_NO_NODE, exec); >> if (IS_ERR(bo)) { >> KUNIT_FAIL(test, "Failed to create bo.\n"); >> return; >> @@ -445,7 +445,7 @@ static int evict_test_run_tile(struct xe_device >> *xe, struct xe_tile *tile, struc >> xe_vm_lock(vm, false); >> bo = xe_bo_create_user(xe, vm, 0x10000, >> DRM_XE_GEM_CPU_CACHING_WC, >> - bo_flags, exec); >> + bo_flags, NUMA_NO_NODE, exec); >> xe_vm_unlock(vm); >> if (IS_ERR(bo)) { >> KUNIT_FAIL(test, "bo create err=%pe\n", bo); >> @@ -454,7 +454,7 @@ static int evict_test_run_tile(struct xe_device >> *xe, struct xe_tile *tile, struc >> external = xe_bo_create_user(xe, NULL, 0x10000, >> DRM_XE_GEM_CPU_CACHING_WC, >> - bo_flags, NULL); >> + bo_flags, NUMA_NO_NODE, NULL); >> if (IS_ERR(external)) { >> KUNIT_FAIL(test, "external bo create err=%pe\n", >> external); >> goto cleanup_bo; >> @@ -719,7 +719,7 @@ static int shrink_test_run_device(struct >> xe_device *xe) >> /* We can create bos using WC caching here. But it is >> slower. */ >> bo = xe_bo_create_user(xe, NULL, XE_BO_SHRINK_SIZE, >> DRM_XE_GEM_CPU_CACHING_WB, >> - XE_BO_FLAG_SYSTEM, NULL); >> + XE_BO_FLAG_SYSTEM, NUMA_NO_NODE, NULL); >> if (IS_ERR(bo)) { >> if (bo != ERR_PTR(-ENOMEM) && bo != ERR_PTR(-ENOSPC) && >> bo != ERR_PTR(-EINTR) && bo != ERR_PTR(-ERESTARTSYS)) >> diff --git a/drivers/gpu/drm/xe/tests/xe_dma_buf.c >> b/drivers/gpu/drm/xe/tests/xe_dma_buf.c >> index 792376e965f1..876ea545d1a7 100644 >> --- a/drivers/gpu/drm/xe/tests/xe_dma_buf.c >> +++ b/drivers/gpu/drm/xe/tests/xe_dma_buf.c >> @@ -127,7 +127,7 @@ static void >> xe_test_dmabuf_import_same_driver(struct xe_device *xe) >> kunit_info(test, "running %s\n", __func__); >> bo = xe_bo_create_user(xe, NULL, size, DRM_XE_GEM_CPU_CACHING_WC, >> - params->mem_mask, NULL); >> + params->mem_mask, NUMA_NO_NODE, NULL); >> if (IS_ERR(bo)) { >> KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", >> PTR_ERR(bo)); >> @@ -215,7 +215,7 @@ static void >> xe_test_dmabuf_move_notify_no_resource(struct xe_device *xe) >> kunit_info(test, "running %s\n", __func__); >> bo = xe_bo_create_user(xe, NULL, PAGE_SIZE, >> DRM_XE_GEM_CPU_CACHING_WC, >> - params->mem_mask, NULL); >> + params->mem_mask, NUMA_NO_NODE, NULL); >> if (IS_ERR(bo)) { >> KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", >> PTR_ERR(bo)); >> diff --git a/drivers/gpu/drm/xe/tests/xe_migrate.c >> b/drivers/gpu/drm/xe/tests/xe_migrate.c >> index 56c49d8507d7..69b64e3a23b8 100644 >> --- a/drivers/gpu/drm/xe/tests/xe_migrate.c >> +++ b/drivers/gpu/drm/xe/tests/xe_migrate.c >> @@ -649,7 +649,7 @@ static void validate_ccs_test_run_tile(struct >> xe_device *xe, struct xe_tile *til >> DRM_XE_GEM_CPU_CACHING_WC, >> XE_BO_FLAG_SYSTEM | >> XE_BO_FLAG_NEEDS_CPU_ACCESS | >> - XE_BO_FLAG_PINNED, NULL); >> + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); >> if (IS_ERR(sys_bo)) { >> KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", >> @@ -675,7 +675,7 @@ static void validate_ccs_test_run_tile(struct >> xe_device *xe, struct xe_tile *til >> ccs_bo = xe_bo_create_user(xe, NULL, SZ_4M, >> DRM_XE_GEM_CPU_CACHING_WC, >> bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | >> - XE_BO_FLAG_PINNED, NULL); >> + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); >> if (IS_ERR(ccs_bo)) { >> KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", >> @@ -700,7 +700,7 @@ static void validate_ccs_test_run_tile(struct >> xe_device *xe, struct xe_tile *til >> vram_bo = xe_bo_create_user(xe, NULL, SZ_4M, >> DRM_XE_GEM_CPU_CACHING_WC, >> bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | >> - XE_BO_FLAG_PINNED, NULL); >> + XE_BO_FLAG_PINNED, NUMA_NO_NODE, NULL); >> if (IS_ERR(vram_bo)) { >> KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n", >> PTR_ERR(vram_bo)); >> @@ -979,7 +979,7 @@ static void access_memory_test_run_tile(struct >> xe_device *xe, >> bo = xe_bo_create_user(xe, NULL, ACCESS_MEM_BO_SIZE, >> DRM_XE_GEM_CPU_CACHING_WC, >> - bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL); >> + bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS, >> NUMA_NO_NODE, NULL); >> if (IS_ERR(bo)) { >> KUNIT_FAIL(test, "Failed to create bo: %pe\n", bo); >> goto free_buf; >> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c >> index fc9bfb436b8e..bbbc33737264 100644 >> --- a/drivers/gpu/drm/xe/xe_bo.c >> +++ b/drivers/gpu/drm/xe/xe_bo.c >> @@ -1538,7 +1538,7 @@ int xe_bo_notifier_prepare_pinned(struct xe_bo >> *bo) >> backup = xe_bo_init_locked(xe, NULL, NULL, >> bo->ttm.base.resv, NULL, xe_bo_size(bo), >> DRM_XE_GEM_CPU_CACHING_WB, ttm_bo_type_kernel, >> XE_BO_FLAG_SYSTEM | >> XE_BO_FLAG_NEEDS_CPU_ACCESS | >> - XE_BO_FLAG_PINNED, NULL, &exec); >> + XE_BO_FLAG_PINNED, NULL, NUMA_NO_NODE, &exec); >> if (IS_ERR(backup)) { >> drm_exec_retry_on_contention(&exec); >> ret = PTR_ERR(backup); >> @@ -1680,7 +1680,7 @@ int xe_bo_evict_pinned(struct xe_bo *bo) >> xe_bo_size(bo), >> DRM_XE_GEM_CPU_CACHING_WB, >> ttm_bo_type_kernel, >> XE_BO_FLAG_SYSTEM | >> XE_BO_FLAG_NEEDS_CPU_ACCESS | >> - XE_BO_FLAG_PINNED, NULL, &exec); >> + XE_BO_FLAG_PINNED, NULL, NUMA_NO_NODE, >> &exec); >> if (IS_ERR(backup)) { >> drm_exec_retry_on_contention(&exec); >> ret = PTR_ERR(backup); >> @@ -2480,7 +2480,7 @@ struct xe_bo *xe_bo_init_locked(struct >> xe_device *xe, struct xe_bo *bo, >> struct ttm_lru_bulk_move *bulk, size_t size, >> u16 cpu_caching, enum ttm_bo_type type, >> u32 flags, struct dma_buf *dma_buf, >> - struct drm_exec *exec) >> + int numa_node, struct drm_exec *exec) >> { >> struct ttm_operation_ctx ctx = { >> .interruptible = true, >> @@ -2546,7 +2546,7 @@ struct xe_bo *xe_bo_init_locked(struct >> xe_device *xe, struct xe_bo *bo, >> bo->tile = tile; >> bo->flags = flags; >> bo->cpu_caching = cpu_caching; >> - bo->numa_node = NUMA_NO_NODE; >> + bo->numa_node = numa_node; >> bo->ttm.base.funcs = &xe_gem_object_funcs; >> bo->ttm.priority = XE_BO_PRIORITY_NORMAL; >> INIT_LIST_HEAD(&bo->pinned_link); >> @@ -2681,7 +2681,7 @@ __xe_bo_create_locked(struct xe_device *xe, >> struct xe_tile *tile, struct xe_vm *vm, >> size_t size, u64 start, u64 end, >> u16 cpu_caching, enum ttm_bo_type type, u32 flags, >> - u64 alignment, struct drm_exec *exec) >> + u64 alignment, int numa_node, struct drm_exec *exec) >> { >> struct xe_bo *bo = NULL; >> int err; >> @@ -2706,7 +2706,7 @@ __xe_bo_create_locked(struct xe_device *xe, >> vm && !xe_vm_in_fault_mode(vm) && >> flags & XE_BO_FLAG_USER ? >> &vm->lru_bulk_move : NULL, size, >> - cpu_caching, type, flags, NULL, exec); >> + cpu_caching, type, flags, NULL, numa_node, exec); >> if (IS_ERR(bo)) >> return bo; >> @@ -2781,13 +2781,13 @@ struct xe_bo *xe_bo_create_locked(struct >> xe_device *xe, struct xe_tile *tile, >> struct drm_exec *exec) >> { >> return __xe_bo_create_locked(xe, tile, vm, size, 0, ~0ULL, 0, >> type, >> - flags, 0, exec); >> + flags, 0, NUMA_NO_NODE, exec); >> } >> static struct xe_bo *xe_bo_create_novm(struct xe_device *xe, >> struct xe_tile *tile, >> size_t size, u16 cpu_caching, >> enum ttm_bo_type type, u32 flags, >> - u64 alignment, bool intr) >> + u64 alignment, int numa_node, bool intr) >> { >> struct xe_validation_ctx ctx; >> struct drm_exec exec; >> @@ -2797,7 +2797,8 @@ static struct xe_bo *xe_bo_create_novm(struct >> xe_device *xe, struct xe_tile *til >> xe_validation_guard(&ctx, &xe->val, &exec, (struct >> xe_val_flags) {.interruptible = intr}, >> ret) { >> bo = __xe_bo_create_locked(xe, tile, NULL, size, 0, ~0ULL, >> - cpu_caching, type, flags, alignment, &exec); >> + cpu_caching, type, flags, alignment, >> + numa_node, &exec); >> drm_exec_retry_on_contention(&exec); >> if (IS_ERR(bo)) { >> ret = PTR_ERR(bo); >> @@ -2966,7 +2967,8 @@ static void >> xe_bo_debug_mixed_mode_cur_index_advance(struct xe_device *xe, >> struct xe_bo *xe_bo_create_user(struct xe_device *xe, >> struct xe_vm *vm, size_t size, >> u16 cpu_caching, >> - u32 flags, struct drm_exec *exec) >> + u32 flags, int numa_node, >> + struct drm_exec *exec) >> { >> struct xe_bo *bo; >> int err = 0; >> @@ -2983,12 +2985,13 @@ struct xe_bo *xe_bo_create_user(struct >> xe_device *xe, >> xe_assert(xe, exec); >> bo = __xe_bo_create_locked(xe, NULL, vm, size, 0, ~0ULL, >> cpu_caching, ttm_bo_type_device, >> - flags, 0, exec); >> + flags, 0, numa_node, exec); >> if (!IS_ERR(bo)) >> xe_bo_unlock_vm_held(bo); >> } else { >> bo = xe_bo_create_novm(xe, NULL, size, cpu_caching, >> - ttm_bo_type_device, flags, 0, true); >> + ttm_bo_type_device, flags, 0, >> + numa_node, true); >> } >> return bo; >> @@ -3022,7 +3025,7 @@ struct xe_bo >> *xe_bo_create_pin_range_novm(struct xe_device *xe, struct xe_tile * >> xe_validation_guard(&ctx, &xe->val, &exec, (struct >> xe_val_flags) {}, err) { >> bo = __xe_bo_create_locked(xe, tile, NULL, size, start, end, >> - 0, type, flags, 0, &exec); >> + 0, type, flags, 0, NUMA_NO_NODE, &exec); >> if (IS_ERR(bo)) { >> drm_exec_retry_on_contention(&exec); >> err = PTR_ERR(bo); >> @@ -3061,7 +3064,7 @@ static struct xe_bo >> *xe_bo_create_pin_map_at_aligned(struct xe_device *xe, >> bo = __xe_bo_create_locked(xe, tile, vm, size, start, end, 0, >> type, >> flags | XE_BO_FLAG_NEEDS_CPU_ACCESS | >> XE_BO_FLAG_PINNED, >> - alignment, exec); >> + alignment, NUMA_NO_NODE, exec); >> if (IS_ERR(bo)) >> return bo; >> @@ -3604,10 +3607,15 @@ static int >> gem_create_user_ext_set_property(struct xe_device *xe, >> if (XE_IOCTL_DBG(xe, err)) >> return -EFAULT; >> + if (XE_IOCTL_DBG(xe, ext.pad)) >> + return -EINVAL; >> + >> + /* The NUMA node property is parsed and applied before BO >> creation. */ >> + if (ext.property == DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE) >> + return 0; >> + >> if (XE_IOCTL_DBG(xe, ext.property >= >> - ARRAY_SIZE(gem_create_set_property_funcs)) || >> - XE_IOCTL_DBG(xe, ext.pad) || >> - XE_IOCTL_DBG(xe, ext.property != >> DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY)) >> + ARRAY_SIZE(gem_create_set_property_funcs))) >> return -EINVAL; >> idx = array_index_nospec(ext.property, >> ARRAY_SIZE(gem_create_set_property_funcs)); >> @@ -3658,6 +3666,56 @@ static int gem_create_user_extensions(struct >> xe_device *xe, struct xe_bo *bo, >> return 0; >> } >> +/* >> + * Parse a host NUMA node request from the extension chain. The node >> must be >> + * known before the BO is created, because the backing pages are >> allocated >> + * during creation. Returns the requested node in @numa_node >> (NUMA_NO_NODE if >> + * none or a negative value is given) or a negative errno on an >> invalid request. > > Would it make sense to rework this and have something like: > > struct gem_create_extension_data { > u32 pxp_key_instance; > int numa_node; > } > > Which is parsed up front before the bo create? And then in some way we > just pass that along to create_user() or manual bo init after? > Otherwise here we look to be open coding a duplicate extension parser > flow, rather than using gem_create_set_property_funcs? I think parsing > before bo create make more sense anyway, like you do here? Makes sense, will explore this. > >> + */ >> +static int gem_create_parse_numa_node(struct xe_device *xe, u64 >> extensions, >> + u32 bo_flags, int *numa_node) >> +{ >> + struct drm_xe_user_extension base; >> + struct drm_xe_ext_set_property ext; >> + unsigned int i = 0; >> + >> + *numa_node = NUMA_NO_NODE; >> + >> + while (extensions && i++ < MAX_USER_EXTENSIONS) { >> + u64 __user *address = u64_to_user_ptr(extensions); >> + s64 nid; >> + >> + if (XE_IOCTL_DBG(xe, copy_from_user(&base, address, >> sizeof(base)))) >> + return -EFAULT; >> + >> + if (base.name != DRM_XE_GEM_CREATE_EXTENSION_SET_PROPERTY) >> + goto next; >> + >> + if (XE_IOCTL_DBG(xe, copy_from_user(&ext, address, >> sizeof(ext)))) >> + return -EFAULT; >> + >> + if (ext.property != DRM_XE_GEM_CREATE_SET_PROPERTY_NUMA_NODE) >> + goto next; >> + >> + nid = (s64)ext.value; >> + *numa_node = NUMA_NO_NODE; >> + if (nid < 0) >> + goto next; >> + >> + if (XE_IOCTL_DBG(xe, nid >= MAX_NUMNODES || !node_online(nid))) > > I think needs nospec dance for nid? sure > >> + return -EINVAL; >> + >> + if (XE_IOCTL_DBG(xe, !(bo_flags & XE_BO_FLAG_SYSTEM))) >> + return -EINVAL; >> + >> + *numa_node = nid; >> +next: >> + extensions = base.next_extension; >> + } >> + >> + return 0; >> +} >> + >> int xe_gem_create_ioctl(struct drm_device *dev, void *data, >> struct drm_file *file) >> { >> @@ -3669,6 +3727,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, >> void *data, >> struct xe_vm *vm = NULL; >> struct xe_bo *bo; >> unsigned int bo_flags; >> + int numa_node; >> u32 handle; >> int err; >> @@ -3744,6 +3803,11 @@ int xe_gem_create_ioctl(struct drm_device >> *dev, void *data, >> args->cpu_caching == DRM_XE_GEM_CPU_CACHING_WB)) >> return -EINVAL; >> + err = gem_create_parse_numa_node(xe, args->extensions, bo_flags, >> + &numa_node); >> + if (err) >> + return err; >> + >> if (args->vm_id) { >> vm = xe_vm_lookup(xef, args->vm_id); >> if (XE_IOCTL_DBG(xe, !vm)) >> @@ -3760,7 +3824,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, >> void *data, >> break; >> } >> bo = xe_bo_create_user(xe, vm, args->size, args->cpu_caching, >> - bo_flags, &exec); >> + bo_flags, numa_node, &exec); >> drm_exec_retry_on_contention(&exec); >> if (IS_ERR(bo)) { >> err = PTR_ERR(bo); >> @@ -4231,7 +4295,7 @@ int xe_bo_dumb_create(struct drm_file *file_priv, >> DRM_XE_GEM_CPU_CACHING_WC, >> XE_BO_FLAG_VRAM_IF_DGFX(xe_device_get_root_tile(xe)) | >> XE_BO_FLAG_FORCE_WC | >> - XE_BO_FLAG_NEEDS_CPU_ACCESS, NULL); >> + XE_BO_FLAG_NEEDS_CPU_ACCESS, NUMA_NO_NODE, NULL); >> if (IS_ERR(bo)) >> return PTR_ERR(bo); >> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h >> index 77b3a02e9b8e..225c6a8676a6 100644 >> --- a/drivers/gpu/drm/xe/xe_bo.h >> +++ b/drivers/gpu/drm/xe/xe_bo.h >> @@ -122,13 +122,14 @@ struct xe_bo *xe_bo_init_locked(struct >> xe_device *xe, struct xe_bo *bo, >> struct ttm_lru_bulk_move *bulk, size_t size, >> u16 cpu_caching, enum ttm_bo_type type, >> u32 flags, struct dma_buf *dma_buf, >> - struct drm_exec *exec); >> + int numa_node, struct drm_exec *exec); >> struct xe_bo *xe_bo_create_locked(struct xe_device *xe, struct >> xe_tile *tile, >> struct xe_vm *vm, size_t size, >> enum ttm_bo_type type, u32 flags, >> struct drm_exec *exec); >> struct xe_bo *xe_bo_create_user(struct xe_device *xe, struct xe_vm >> *vm, size_t size, >> - u16 cpu_caching, u32 flags, struct drm_exec *exec); >> + u16 cpu_caching, u32 flags, int numa_node, >> + struct drm_exec *exec); >> struct xe_bo *xe_bo_create_pin_map(struct xe_device *xe, struct >> xe_tile *tile, >> struct xe_vm *vm, size_t size, >> enum ttm_bo_type type, u32 flags, >> diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c >> b/drivers/gpu/drm/xe/xe_dma_buf.c >> index 5bf13dc4b61d..b5351310a07b 100644 >> --- a/drivers/gpu/drm/xe/xe_dma_buf.c >> +++ b/drivers/gpu/drm/xe/xe_dma_buf.c >> @@ -343,7 +343,8 @@ xe_dma_buf_create_obj(struct drm_device *dev, >> struct dma_buf *dma_buf) >> bo = xe_bo_init_locked(xe, NULL, NULL, resv, NULL, >> dma_buf->size, >> 0, /* Will require 1way or 2way for vm_bind */ >> - ttm_bo_type_sg, XE_BO_FLAG_SYSTEM, dma_buf, >> &exec); >> + ttm_bo_type_sg, XE_BO_FLAG_SYSTEM, dma_buf, >> + NUMA_NO_NODE, &exec); >> drm_exec_retry_on_contention(&exec); >> if (IS_ERR(bo)) { >> ret = PTR_ERR(bo); > ^ permalink raw reply [flat|nested] 19+ messages in thread
* ✓ CI.KUnit: success for drm/ttm, drm/xe: Per-BO host NUMA node placement 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray ` (6 preceding siblings ...) 2026-11-02 10:18 ` [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler Himal Prasad Ghimiray @ 2026-11-02 12:44 ` Patchwork 2026-11-02 13:22 ` ✓ Xe.CI.BAT: " Patchwork 2026-11-02 14:55 ` ✓ Xe.CI.FULL: " Patchwork 9 siblings, 0 replies; 19+ messages in thread From: Patchwork @ 2026-11-02 12:44 UTC (permalink / raw) To: Himal Prasad Ghimiray; +Cc: intel-xe == Series Details == Series: drm/ttm, drm/xe: Per-BO host NUMA node placement URL : https://patchwork.freedesktop.org/series/177437/ State : success == Summary == + trap cleanup EXIT + kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig') + for kcfg in "${kunitconfigs[@]}" + [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]] + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig [12:41:57] Configuring KUnit Kernel ... Generating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [12:42:02] Building KUnit Kernel ... Populating config with: $ make ARCH=um O=.kunit olddefconfig Building with: $ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48 [12:42:22] Starting KUnit Kernel (1/1)... [12:42:22] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [12:42:22] ================= gpu_buddy (14 subtests) ================== [12:42:22] [PASSED] gpu_test_buddy_alloc_limit [12:42:22] [PASSED] gpu_test_buddy_alloc_optimistic [12:42:22] [PASSED] gpu_test_buddy_alloc_pessimistic [12:42:22] [PASSED] gpu_test_buddy_alloc_pathological [12:42:22] [PASSED] gpu_test_buddy_alloc_contiguous [12:42:22] [PASSED] gpu_test_buddy_alloc_clear [12:42:22] [PASSED] gpu_test_buddy_alloc_range [12:42:22] [PASSED] gpu_test_buddy_alloc_range_bias [12:42:23] [PASSED] gpu_test_buddy_fragmentation_performance [12:42:24] [PASSED] gpu_test_buddy_dirty_tracker_performance [12:42:24] [PASSED] gpu_test_buddy_alloc_exceeds_max_order [12:42:24] [PASSED] gpu_test_buddy_offset_aligned_allocation [12:42:24] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress [12:42:24] [PASSED] gpu_test_buddy_addr_to_block [12:42:24] ==================== [PASSED] gpu_buddy ==================== [12:42:24] ============================================================ [12:42:24] Testing complete. Ran 14 tests: passed: 14 [12:42:24] Elapsed time: 26.796s total, 5.049s configuring, 19.880s building, 1.819s running + for kcfg in "${kunitconfigs[@]}" + [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]] + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [12:42:24] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [12:42:26] 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 [12:43:05] Starting KUnit Kernel (1/1)... [12:43:05] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [12:43:05] ================== guc_buf (11 subtests) =================== [12:43:05] [PASSED] test_smallest [12:43:05] [PASSED] test_largest [12:43:05] [PASSED] test_granular [12:43:05] [PASSED] test_unique [12:43:05] [PASSED] test_overlap [12:43:05] [PASSED] test_reusable [12:43:05] [PASSED] test_too_big [12:43:05] [PASSED] test_flush [12:43:05] [PASSED] test_lookup [12:43:05] [PASSED] test_data [12:43:05] [PASSED] test_class [12:43:05] ===================== [PASSED] guc_buf ===================== [12:43:05] =================== guc_dbm (7 subtests) =================== [12:43:05] [PASSED] test_empty [12:43:05] [PASSED] test_default [12:43:05] ======================== test_size ======================== [12:43:05] [PASSED] 4 [12:43:05] [PASSED] 8 [12:43:05] [PASSED] 32 [12:43:05] [PASSED] 256 [12:43:05] ==================== [PASSED] test_size ==================== [12:43:05] ======================= test_reuse ======================== [12:43:05] [PASSED] 4 [12:43:05] [PASSED] 8 [12:43:05] [PASSED] 32 [12:43:05] [PASSED] 256 [12:43:05] =================== [PASSED] test_reuse ==================== [12:43:05] =================== test_range_overlap ==================== [12:43:05] [PASSED] 4 [12:43:05] [PASSED] 8 [12:43:05] [PASSED] 32 [12:43:05] [PASSED] 256 [12:43:05] =============== [PASSED] test_range_overlap ================ [12:43:05] =================== test_range_compact ==================== [12:43:05] [PASSED] 4 [12:43:05] [PASSED] 8 [12:43:05] [PASSED] 32 [12:43:05] [PASSED] 256 [12:43:05] =============== [PASSED] test_range_compact ================ [12:43:05] ==================== test_range_spare ===================== [12:43:05] [PASSED] 4 [12:43:05] [PASSED] 8 [12:43:05] [PASSED] 32 [12:43:05] [PASSED] 256 [12:43:05] ================ [PASSED] test_range_spare ================= [12:43:05] ===================== [PASSED] guc_dbm ===================== [12:43:05] ================== guc_idm (22 subtests) =================== [12:43:05] [PASSED] bad_init [12:43:05] [PASSED] no_init [12:43:05] [PASSED] init_fini [12:43:05] [PASSED] check_init_small [12:43:05] [PASSED] check_init_shared [12:43:05] [PASSED] check_used [12:43:05] [PASSED] check_quota [12:43:05] [PASSED] check_all [12:43:05] [PASSED] check_limits [12:43:05] [PASSED] check_overlap [12:43:05] [PASSED] check_overlap_alloc [12:43:05] [PASSED] check_overlap_release [12:43:05] [PASSED] check_overlap_partial_init [12:43:05] [PASSED] check_overlap_partial_shared_range_blocking [12:43:05] [PASSED] check_used_usable [12:43:05] [PASSED] check_used_shareable [12:43:05] [PASSED] check_used_mixed [12:43:05] [PASSED] check_release_usable_range [12:43:05] [PASSED] check_release_shareable_range [12:43:05] [PASSED] check_split_boundaries [12:43:05] [PASSED] check_shareable_spare [12:43:05] [PASSED] check_shareable_spare_fragmented_tail [12:43:05] ===================== [PASSED] guc_idm ===================== [12:43:05] ============== guc_klv_helpers (13 subtests) =============== [12:43:05] [PASSED] test_count [12:43:05] [PASSED] test_encode_u32 [12:43:05] [PASSED] test_encode_u64 [12:43:05] [PASSED] test_encode_string [12:43:05] [PASSED] test_encode_object_raw [12:43:05] [PASSED] test_encode_object_klv [12:43:05] [PASSED] test_encode_object_nested [12:43:05] [PASSED] test_encode_object_basic [12:43:05] ===================== test_decode_u16 ===================== [12:43:05] [PASSED] empty [12:43:05] [PASSED] valid [12:43:05] [PASSED] max [12:43:05] [PASSED] big [12:43:05] [PASSED] long [12:43:05] ================= [PASSED] test_decode_u16 ================= [12:43:05] ===================== test_decode_u32 ===================== [12:43:05] [PASSED] empty [12:43:05] [PASSED] valid [12:43:05] [PASSED] max [12:43:05] [PASSED] long [12:43:05] ================= [PASSED] test_decode_u32 ================= [12:43:05] ===================== test_decode_u64 ===================== [12:43:05] [PASSED] empty [12:43:05] [PASSED] short [12:43:05] [PASSED] valid [12:43:05] [PASSED] max [12:43:05] [PASSED] long [12:43:05] ================= [PASSED] test_decode_u64 ================= [12:43:05] ===================== test_decode_str ===================== [12:43:05] [PASSED] empty [12:43:05] [PASSED] one [12:43:05] [PASSED] one_trash [12:43:05] [PASSED] two [12:43:05] [PASSED] two_trash [12:43:05] [PASSED] three [12:43:05] [PASSED] dword [12:43:05] [PASSED] four [12:43:05] [PASSED] five [12:43:05] [PASSED] six [12:43:05] [PASSED] seven [12:43:05] [PASSED] qword [12:43:05] ================= [PASSED] test_decode_str ================= [12:43:05] [PASSED] test_print [12:43:05] ================= [PASSED] guc_klv_helpers ================= [12:43:05] =================== xe_log (4 subtests) ==================== [12:43:05] [PASSED] demo_cper [12:43:05] [PASSED] demo_dmesg [12:43:05] ======================= test_dmesg ======================== [12:43:05] [PASSED] test_fatal [12:43:05] [PASSED] test_fatal_tile [12:43:05] [PASSED] test_fatal_gt [12:43:05] [PASSED] test_fatal_comp [12:43:05] [PASSED] test_fatal_comp_tile [12:43:05] [PASSED] test_fatal_comp_gt [12:43:05] [PASSED] test_fatal_all [12:43:05] [PASSED] test_recoverable [12:43:05] [PASSED] test_recoverable_tile [12:43:05] [PASSED] test_recoverable_gt [12:43:05] [PASSED] test_recoverable_comp [12:43:05] [PASSED] test_recoverable_comp_tile [12:43:05] [PASSED] test_recoverable_comp_gt [12:43:05] [PASSED] test_recoverable_all [12:43:05] [PASSED] test_info [12:43:05] [PASSED] test_info_tile [12:43:05] [PASSED] test_info_gt [12:43:05] [PASSED] test_info_err [12:43:05] [PASSED] test_info_comp [12:43:05] [PASSED] test_info_comp_tile [12:43:05] [PASSED] test_info_comp_gt [12:43:05] [PASSED] test_info_all [12:43:05] [PASSED] test_hw_fatal [12:43:05] [PASSED] test_hw_recoverable [12:43:05] [PASSED] test_hw_corrected [12:43:05] [PASSED] test_hw_informational [12:43:05] =================== [PASSED] test_dmesg ==================== [12:43:05] ====================== test_invalid ======================= [12:43:05] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG) [12:43:05] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG) [12:43:05] ================== [SKIPPED] test_invalid ================== [12:43:05] ===================== [PASSED] xe_log ====================== [12:43:05] ================== no_relay (3 subtests) =================== [12:43:05] [PASSED] xe_drops_guc2pf_if_not_ready [12:43:05] [PASSED] xe_drops_guc2vf_if_not_ready [12:43:05] [PASSED] xe_rejects_send_if_not_ready [12:43:05] ==================== [PASSED] no_relay ===================== [12:43:05] ================== pf_relay (14 subtests) ================== [12:43:05] [PASSED] pf_rejects_guc2pf_too_short [12:43:05] [PASSED] pf_rejects_guc2pf_too_long [12:43:05] [PASSED] pf_rejects_guc2pf_no_payload [12:43:05] [PASSED] pf_fails_no_payload [12:43:05] [PASSED] pf_fails_bad_origin [12:43:05] [PASSED] pf_fails_bad_type [12:43:05] [PASSED] pf_txn_reports_error [12:43:05] [PASSED] pf_txn_sends_pf2guc [12:43:05] [PASSED] pf_sends_pf2guc [12:43:05] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV) [12:43:05] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV) [12:43:05] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV) [12:43:05] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV) [12:43:05] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV) [12:43:05] ==================== [PASSED] pf_relay ===================== [12:43:05] ================== vf_relay (3 subtests) =================== [12:43:05] [PASSED] vf_rejects_guc2vf_too_short [12:43:05] [PASSED] vf_rejects_guc2vf_too_long [12:43:05] [PASSED] vf_rejects_guc2vf_no_payload [12:43:05] ==================== [PASSED] vf_relay ===================== [12:43:05] ================ pf_gt_config (9 subtests) ================= [12:43:05] [PASSED] fair_contexts_1vf [12:43:05] [PASSED] fair_doorbells_1vf [12:43:05] [PASSED] fair_ggtt_1vf [12:43:05] ====================== fair_vram_1vf ====================== [12:43:05] [PASSED] 3.50 GiB [12:43:05] [PASSED] 11.5 GiB [12:43:05] [PASSED] 15.5 GiB [12:43:05] [PASSED] 31.5 GiB [12:43:05] [PASSED] 63.5 GiB [12:43:05] [PASSED] 1.91 GiB [12:43:05] ================== [PASSED] fair_vram_1vf ================== [12:43:05] ================ fair_vram_1vf_admin_only ================= [12:43:05] [PASSED] 3.50 GiB [12:43:05] [PASSED] 11.5 GiB [12:43:05] [PASSED] 15.5 GiB [12:43:05] [PASSED] 31.5 GiB [12:43:05] [PASSED] 63.5 GiB [12:43:05] [PASSED] 1.91 GiB [12:43:05] ============ [PASSED] fair_vram_1vf_admin_only ============= [12:43:05] ====================== fair_contexts ====================== [12:43:05] [PASSED] 1 VF [12:43:05] [PASSED] 2 VFs [12:43:05] [PASSED] 3 VFs [12:43:05] [PASSED] 4 VFs [12:43:05] [PASSED] 5 VFs [12:43:05] [PASSED] 6 VFs [12:43:05] [PASSED] 7 VFs [12:43:05] [PASSED] 8 VFs [12:43:05] [PASSED] 9 VFs [12:43:05] [PASSED] 10 VFs [12:43:05] [PASSED] 11 VFs [12:43:05] [PASSED] 12 VFs [12:43:05] [PASSED] 13 VFs [12:43:05] [PASSED] 14 VFs [12:43:05] [PASSED] 15 VFs [12:43:05] [PASSED] 16 VFs [12:43:05] [PASSED] 17 VFs [12:43:05] [PASSED] 18 VFs [12:43:05] [PASSED] 19 VFs [12:43:05] [PASSED] 20 VFs [12:43:05] [PASSED] 21 VFs [12:43:05] [PASSED] 22 VFs [12:43:05] [PASSED] 23 VFs [12:43:05] [PASSED] 24 VFs [12:43:05] [PASSED] 25 VFs [12:43:05] [PASSED] 26 VFs [12:43:05] [PASSED] 27 VFs [12:43:05] [PASSED] 28 VFs [12:43:05] [PASSED] 29 VFs [12:43:05] [PASSED] 30 VFs [12:43:05] [PASSED] 31 VFs [12:43:05] [PASSED] 32 VFs [12:43:05] [PASSED] 33 VFs [12:43:05] [PASSED] 34 VFs [12:43:05] [PASSED] 35 VFs [12:43:05] [PASSED] 36 VFs [12:43:05] [PASSED] 37 VFs [12:43:05] [PASSED] 38 VFs [12:43:05] [PASSED] 39 VFs [12:43:05] [PASSED] 40 VFs [12:43:05] [PASSED] 41 VFs [12:43:05] [PASSED] 42 VFs [12:43:05] [PASSED] 43 VFs [12:43:05] [PASSED] 44 VFs [12:43:05] [PASSED] 45 VFs [12:43:05] [PASSED] 46 VFs [12:43:05] [PASSED] 47 VFs [12:43:05] [PASSED] 48 VFs [12:43:05] [PASSED] 49 VFs [12:43:05] [PASSED] 50 VFs [12:43:05] [PASSED] 51 VFs [12:43:05] [PASSED] 52 VFs [12:43:05] [PASSED] 53 VFs [12:43:05] [PASSED] 54 VFs [12:43:05] [PASSED] 55 VFs [12:43:05] [PASSED] 56 VFs [12:43:05] [PASSED] 57 VFs [12:43:05] [PASSED] 58 VFs [12:43:05] [PASSED] 59 VFs [12:43:05] [PASSED] 60 VFs [12:43:05] [PASSED] 61 VFs [12:43:05] [PASSED] 62 VFs [12:43:05] [PASSED] 63 VFs [12:43:05] ================== [PASSED] fair_contexts ================== [12:43:05] ===================== fair_doorbells ====================== [12:43:05] [PASSED] 1 VF [12:43:05] [PASSED] 2 VFs [12:43:05] [PASSED] 3 VFs [12:43:05] [PASSED] 4 VFs [12:43:05] [PASSED] 5 VFs [12:43:05] [PASSED] 6 VFs [12:43:05] [PASSED] 7 VFs [12:43:05] [PASSED] 8 VFs [12:43:05] [PASSED] 9 VFs [12:43:05] [PASSED] 10 VFs [12:43:05] [PASSED] 11 VFs [12:43:05] [PASSED] 12 VFs [12:43:05] [PASSED] 13 VFs [12:43:05] [PASSED] 14 VFs [12:43:05] [PASSED] 15 VFs [12:43:05] [PASSED] 16 VFs [12:43:05] [PASSED] 17 VFs [12:43:05] [PASSED] 18 VFs [12:43:05] [PASSED] 19 VFs [12:43:05] [PASSED] 20 VFs [12:43:05] [PASSED] 21 VFs [12:43:05] [PASSED] 22 VFs [12:43:05] [PASSED] 23 VFs [12:43:05] [PASSED] 24 VFs [12:43:05] [PASSED] 25 VFs [12:43:05] [PASSED] 26 VFs [12:43:05] [PASSED] 27 VFs [12:43:05] [PASSED] 28 VFs [12:43:05] [PASSED] 29 VFs [12:43:05] [PASSED] 30 VFs [12:43:05] [PASSED] 31 VFs [12:43:05] [PASSED] 32 VFs [12:43:05] [PASSED] 33 VFs [12:43:05] [PASSED] 34 VFs [12:43:05] [PASSED] 35 VFs [12:43:05] [PASSED] 36 VFs [12:43:05] [PASSED] 37 VFs [12:43:05] [PASSED] 38 VFs [12:43:05] [PASSED] 39 VFs [12:43:05] [PASSED] 40 VFs [12:43:05] [PASSED] 41 VFs [12:43:05] [PASSED] 42 VFs [12:43:05] [PASSED] 43 VFs [12:43:05] [PASSED] 44 VFs [12:43:05] [PASSED] 45 VFs [12:43:05] [PASSED] 46 VFs [12:43:05] [PASSED] 47 VFs [12:43:05] [PASSED] 48 VFs [12:43:05] [PASSED] 49 VFs [12:43:05] [PASSED] 50 VFs [12:43:05] [PASSED] 51 VFs [12:43:05] [PASSED] 52 VFs [12:43:05] [PASSED] 53 VFs [12:43:05] [PASSED] 54 VFs [12:43:05] [PASSED] 55 VFs [12:43:05] [PASSED] 56 VFs [12:43:05] [PASSED] 57 VFs [12:43:05] [PASSED] 58 VFs [12:43:05] [PASSED] 59 VFs [12:43:05] [PASSED] 60 VFs [12:43:05] [PASSED] 61 VFs [12:43:05] [PASSED] 62 VFs [12:43:05] [PASSED] 63 VFs [12:43:05] ================= [PASSED] fair_doorbells ================== [12:43:05] ======================== fair_ggtt ======================== [12:43:05] [PASSED] 1 VF [12:43:05] [PASSED] 2 VFs [12:43:05] [PASSED] 3 VFs [12:43:05] [PASSED] 4 VFs [12:43:05] [PASSED] 5 VFs [12:43:05] [PASSED] 6 VFs [12:43:05] [PASSED] 7 VFs [12:43:05] [PASSED] 8 VFs [12:43:05] [PASSED] 9 VFs [12:43:05] [PASSED] 10 VFs [12:43:05] [PASSED] 11 VFs [12:43:05] [PASSED] 12 VFs [12:43:05] [PASSED] 13 VFs [12:43:05] [PASSED] 14 VFs [12:43:05] [PASSED] 15 VFs [12:43:05] [PASSED] 16 VFs [12:43:05] [PASSED] 17 VFs [12:43:05] [PASSED] 18 VFs [12:43:05] [PASSED] 19 VFs [12:43:05] [PASSED] 20 VFs [12:43:05] [PASSED] 21 VFs [12:43:05] [PASSED] 22 VFs [12:43:05] [PASSED] 23 VFs [12:43:05] [PASSED] 24 VFs [12:43:05] [PASSED] 25 VFs [12:43:05] [PASSED] 26 VFs [12:43:05] [PASSED] 27 VFs [12:43:05] [PASSED] 28 VFs [12:43:05] [PASSED] 29 VFs [12:43:05] [PASSED] 30 VFs [12:43:05] [PASSED] 31 VFs [12:43:05] [PASSED] 32 VFs [12:43:05] [PASSED] 33 VFs [12:43:05] [PASSED] 34 VFs [12:43:05] [PASSED] 35 VFs [12:43:05] [PASSED] 36 VFs [12:43:05] [PASSED] 37 VFs [12:43:05] [PASSED] 38 VFs [12:43:05] [PASSED] 39 VFs [12:43:05] [PASSED] 40 VFs [12:43:05] [PASSED] 41 VFs [12:43:05] [PASSED] 42 VFs [12:43:05] [PASSED] 43 VFs [12:43:05] [PASSED] 44 VFs [12:43:05] [PASSED] 45 VFs [12:43:05] [PASSED] 46 VFs [12:43:05] [PASSED] 47 VFs [12:43:05] [PASSED] 48 VFs [12:43:05] [PASSED] 49 VFs [12:43:05] [PASSED] 50 VFs [12:43:06] [PASSED] 51 VFs [12:43:06] [PASSED] 52 VFs [12:43:06] [PASSED] 53 VFs [12:43:06] [PASSED] 54 VFs [12:43:06] [PASSED] 55 VFs [12:43:06] [PASSED] 56 VFs [12:43:06] [PASSED] 57 VFs [12:43:06] [PASSED] 58 VFs [12:43:06] [PASSED] 59 VFs [12:43:06] [PASSED] 60 VFs [12:43:06] [PASSED] 61 VFs [12:43:06] [PASSED] 62 VFs [12:43:06] [PASSED] 63 VFs [12:43:06] ==================== [PASSED] fair_ggtt ==================== [12:43:06] ======================== fair_vram ======================== [12:43:06] [PASSED] 1 VF [12:43:06] [PASSED] 2 VFs [12:43:06] [PASSED] 3 VFs [12:43:06] [PASSED] 4 VFs [12:43:06] [PASSED] 5 VFs [12:43:06] [PASSED] 6 VFs [12:43:06] [PASSED] 7 VFs [12:43:06] [PASSED] 8 VFs [12:43:06] [PASSED] 9 VFs [12:43:06] [PASSED] 10 VFs [12:43:06] [PASSED] 11 VFs [12:43:06] [PASSED] 12 VFs [12:43:06] [PASSED] 13 VFs [12:43:06] [PASSED] 14 VFs [12:43:06] [PASSED] 15 VFs [12:43:06] [PASSED] 16 VFs [12:43:06] [PASSED] 17 VFs [12:43:06] [PASSED] 18 VFs [12:43:06] [PASSED] 19 VFs [12:43:06] [PASSED] 20 VFs [12:43:06] [PASSED] 21 VFs [12:43:06] [PASSED] 22 VFs [12:43:06] [PASSED] 23 VFs [12:43:06] [PASSED] 24 VFs [12:43:06] [PASSED] 25 VFs [12:43:06] [PASSED] 26 VFs [12:43:06] [PASSED] 27 VFs [12:43:06] [PASSED] 28 VFs [12:43:06] [PASSED] 29 VFs [12:43:06] [PASSED] 30 VFs [12:43:06] [PASSED] 31 VFs [12:43:06] [PASSED] 32 VFs [12:43:06] [PASSED] 33 VFs [12:43:06] [PASSED] 34 VFs [12:43:06] [PASSED] 35 VFs [12:43:06] [PASSED] 36 VFs [12:43:06] [PASSED] 37 VFs [12:43:06] [PASSED] 38 VFs [12:43:06] [PASSED] 39 VFs [12:43:06] [PASSED] 40 VFs [12:43:06] [PASSED] 41 VFs [12:43:06] [PASSED] 42 VFs [12:43:06] [PASSED] 43 VFs [12:43:06] [PASSED] 44 VFs [12:43:06] [PASSED] 45 VFs [12:43:06] [PASSED] 46 VFs [12:43:06] [PASSED] 47 VFs [12:43:06] [PASSED] 48 VFs [12:43:06] [PASSED] 49 VFs [12:43:06] [PASSED] 50 VFs [12:43:06] [PASSED] 51 VFs [12:43:06] [PASSED] 52 VFs [12:43:06] [PASSED] 53 VFs [12:43:06] [PASSED] 54 VFs [12:43:06] [PASSED] 55 VFs [12:43:06] [PASSED] 56 VFs [12:43:06] [PASSED] 57 VFs [12:43:06] [PASSED] 58 VFs [12:43:06] [PASSED] 59 VFs [12:43:06] [PASSED] 60 VFs [12:43:06] [PASSED] 61 VFs [12:43:06] [PASSED] 62 VFs [12:43:06] [PASSED] 63 VFs [12:43:06] ==================== [PASSED] fair_vram ==================== [12:43:06] ================== [PASSED] pf_gt_config =================== [12:43:06] ===================== lmtt (1 subtest) ===================== [12:43:06] ======================== test_ops ========================= [12:43:06] [PASSED] 2-level [12:43:06] [PASSED] multi-level [12:43:06] ==================== [PASSED] test_ops ===================== [12:43:06] ====================== [PASSED] lmtt ======================= [12:43:06] ================= sriov_packet (1 subtest) ================= [12:43:06] [PASSED] test_descriptor_init [12:43:06] ================== [PASSED] sriov_packet =================== [12:43:06] ================= pf_service (11 subtests) ================= [12:43:06] [PASSED] pf_negotiate_any [12:43:06] [PASSED] pf_negotiate_base_match [12:43:06] [PASSED] pf_negotiate_base_newer [12:43:06] [PASSED] pf_negotiate_base_next [12:43:06] [SKIPPED] pf_negotiate_base_older (no older minor) [12:43:06] [PASSED] pf_negotiate_base_prev [12:43:06] [PASSED] pf_negotiate_latest_match [12:43:06] [PASSED] pf_negotiate_latest_newer [12:43:06] [PASSED] pf_negotiate_latest_next [12:43:06] [SKIPPED] pf_negotiate_latest_older (no older minor) [12:43:06] [SKIPPED] pf_negotiate_latest_prev (no prev major) [12:43:06] =================== [PASSED] pf_service ==================== [12:43:06] ================= xe_guc_g2g (2 subtests) ================== [12:43:06] ============== xe_live_guc_g2g_kunit_default ============== [12:43:06] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ========== [12:43:06] ============== xe_live_guc_g2g_kunit_allmem =============== [12:43:06] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ========== [12:43:06] =================== [SKIPPED] xe_guc_g2g =================== [12:43:06] =================== xe_mocs (2 subtests) =================== [12:43:06] ================ xe_live_mocs_kernel_kunit ================ [12:43:06] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============ [12:43:06] ================ xe_live_mocs_reset_kunit ================= [12:43:06] ============ [SKIPPED] xe_live_mocs_reset_kunit ============ [12:43:06] ==================== [SKIPPED] xe_mocs ===================== [12:43:06] ================= xe_migrate (3 subtests) ================== [12:43:06] ================= xe_migrate_sanity_kunit ================= [12:43:06] ============ [SKIPPED] xe_migrate_sanity_kunit ============= [12:43:06] ================== xe_validate_ccs_kunit ================== [12:43:06] ============= [SKIPPED] xe_validate_ccs_kunit ============== [12:43:06] ============= xe_migrate_access_memory_kunit ============== [12:43:06] ========= [SKIPPED] xe_migrate_access_memory_kunit ========= [12:43:06] =================== [SKIPPED] xe_migrate =================== [12:43:06] ================== xe_dma_buf (1 subtest) ================== [12:43:06] ==================== xe_dma_buf_kunit ===================== [12:43:06] ================ [SKIPPED] xe_dma_buf_kunit ================ [12:43:06] =================== [SKIPPED] xe_dma_buf =================== [12:43:06] ================= xe_bo_shrink (1 subtest) ================= [12:43:06] =================== xe_bo_shrink_kunit ==================== [12:43:06] =============== [SKIPPED] xe_bo_shrink_kunit =============== [12:43:06] ================== [SKIPPED] xe_bo_shrink ================== [12:43:06] ==================== xe_bo (2 subtests) ==================== [12:43:06] ================== xe_ccs_migrate_kunit =================== [12:43:06] ============== [SKIPPED] xe_ccs_migrate_kunit ============== [12:43:06] ==================== xe_bo_evict_kunit ==================== [12:43:06] =============== [SKIPPED] xe_bo_evict_kunit ================ [12:43:06] ===================== [SKIPPED] xe_bo ====================== [12:43:06] =================== xe_any (9 subtests) ==================== [12:43:06] [PASSED] test_to_xe [12:43:06] [PASSED] test_to_dev [12:43:06] [PASSED] test_to_pdev [12:43:06] [PASSED] test_to_drm [12:43:06] [PASSED] test_if_pdev [12:43:06] [PASSED] test_if_xe [12:43:06] [PASSED] test_if_tile [12:43:06] [PASSED] test_if_gt [12:43:06] [PASSED] test_to_id [12:43:06] ===================== [PASSED] xe_any ====================== [12:43:06] ==================== args (13 subtests) ==================== [12:43:06] [PASSED] count_args_test [12:43:06] [PASSED] call_args_example [12:43:06] [PASSED] call_args_test [12:43:06] [PASSED] drop_first_arg_example [12:43:06] [PASSED] drop_first_arg_test [12:43:06] [PASSED] first_arg_example [12:43:06] [PASSED] first_arg_test [12:43:06] [PASSED] last_arg_example [12:43:06] [PASSED] last_arg_test [12:43:06] [PASSED] pick_arg_example [12:43:06] [PASSED] if_args_example [12:43:06] [PASSED] if_args_test [12:43:06] [PASSED] sep_comma_example [12:43:06] ====================== [PASSED] args ======================= [12:43:06] =================== xe_pci (3 subtests) ==================== [12:43:06] ==================== check_graphics_ip ==================== [12:43:06] [PASSED] 12.00 Xe_LP [12:43:06] [PASSED] 12.10 Xe_LP+ [12:43:06] [PASSED] 12.55 Xe_HPG [12:43:06] [PASSED] 12.60 Xe_HPC [12:43:06] [PASSED] 12.70 Xe_LPG [12:43:06] [PASSED] 12.71 Xe_LPG [12:43:06] [PASSED] 12.74 Xe_LPG+ [12:43:06] [PASSED] 20.01 Xe2_HPG [12:43:06] [PASSED] 20.02 Xe2_HPG [12:43:06] [PASSED] 20.04 Xe2_LPG [12:43:06] [PASSED] 30.00 Xe3_LPG [12:43:06] [PASSED] 30.01 Xe3_LPG [12:43:06] [PASSED] 30.03 Xe3_LPG [12:43:06] [PASSED] 30.04 Xe3_LPG [12:43:06] [PASSED] 30.05 Xe3_LPG [12:43:06] [PASSED] 35.10 Xe3p_LPG [12:43:06] [PASSED] 35.11 Xe3p_XPC [12:43:06] ================ [PASSED] check_graphics_ip ================ [12:43:06] ===================== check_media_ip ====================== [12:43:06] [PASSED] 12.00 Xe_M [12:43:06] [PASSED] 12.55 Xe_HPM [12:43:06] [PASSED] 13.00 Xe_LPM+ [12:43:06] [PASSED] 13.01 Xe2_HPM [12:43:06] [PASSED] 20.00 Xe2_LPM [12:43:06] [PASSED] 30.00 Xe3_LPM [12:43:06] [PASSED] 30.02 Xe3_LPM [12:43:06] [PASSED] 35.00 Xe3p_LPM [12:43:06] [PASSED] 35.03 Xe3p_HPM [12:43:06] ================= [PASSED] check_media_ip ================== [12:43:06] =================== check_platform_desc =================== [12:43:06] [PASSED] 0x9A60 (TIGERLAKE) [12:43:06] [PASSED] 0x9A68 (TIGERLAKE) [12:43:06] [PASSED] 0x9A70 (TIGERLAKE) [12:43:06] [PASSED] 0x9A40 (TIGERLAKE) [12:43:06] [PASSED] 0x9A49 (TIGERLAKE) [12:43:06] [PASSED] 0x9A59 (TIGERLAKE) [12:43:06] [PASSED] 0x9A78 (TIGERLAKE) [12:43:06] [PASSED] 0x9AC0 (TIGERLAKE) [12:43:06] [PASSED] 0x9AC9 (TIGERLAKE) [12:43:06] [PASSED] 0x9AD9 (TIGERLAKE) [12:43:06] [PASSED] 0x9AF8 (TIGERLAKE) [12:43:06] [PASSED] 0x4C80 (ROCKETLAKE) [12:43:06] [PASSED] 0x4C8A (ROCKETLAKE) [12:43:06] [PASSED] 0x4C8B (ROCKETLAKE) [12:43:06] [PASSED] 0x4C8C (ROCKETLAKE) [12:43:06] [PASSED] 0x4C90 (ROCKETLAKE) [12:43:06] [PASSED] 0x4C9A (ROCKETLAKE) [12:43:06] [PASSED] 0x4680 (ALDERLAKE_S) [12:43:06] [PASSED] 0x4682 (ALDERLAKE_S) [12:43:06] [PASSED] 0x4688 (ALDERLAKE_S) [12:43:06] [PASSED] 0x468A (ALDERLAKE_S) [12:43:06] [PASSED] 0x468B (ALDERLAKE_S) [12:43:06] [PASSED] 0x4690 (ALDERLAKE_S) [12:43:06] [PASSED] 0x4692 (ALDERLAKE_S) [12:43:06] [PASSED] 0x4693 (ALDERLAKE_S) [12:43:06] [PASSED] 0x46A0 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46A1 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46A2 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46A3 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46A6 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46A8 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46AA (ALDERLAKE_P) [12:43:06] [PASSED] 0x462A (ALDERLAKE_P) [12:43:06] [PASSED] 0x4626 (ALDERLAKE_P) [12:43:06] [PASSED] 0x4628 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46B0 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46B1 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46B2 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46B3 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46C0 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46C1 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46C2 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46C3 (ALDERLAKE_P) [12:43:06] [PASSED] 0x46D0 (ALDERLAKE_N) [12:43:06] [PASSED] 0x46D1 (ALDERLAKE_N) [12:43:06] [PASSED] 0x46D2 (ALDERLAKE_N) [12:43:06] [PASSED] 0x46D3 (ALDERLAKE_N) [12:43:06] [PASSED] 0x46D4 (ALDERLAKE_N) [12:43:06] [PASSED] 0xA721 (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7A1 (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7A9 (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7AC (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7AD (ALDERLAKE_P) [12:43:06] [PASSED] 0xA720 (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7A0 (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7A8 (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7AA (ALDERLAKE_P) [12:43:06] [PASSED] 0xA7AB (ALDERLAKE_P) [12:43:06] [PASSED] 0xA780 (ALDERLAKE_S) [12:43:06] [PASSED] 0xA781 (ALDERLAKE_S) [12:43:06] [PASSED] 0xA782 (ALDERLAKE_S) [12:43:06] [PASSED] 0xA783 (ALDERLAKE_S) [12:43:06] [PASSED] 0xA788 (ALDERLAKE_S) [12:43:06] [PASSED] 0xA789 (ALDERLAKE_S) [12:43:06] [PASSED] 0xA78A (ALDERLAKE_S) [12:43:06] [PASSED] 0xA78B (ALDERLAKE_S) [12:43:06] [PASSED] 0x4905 (DG1) [12:43:06] [PASSED] 0x4906 (DG1) [12:43:06] [PASSED] 0x4907 (DG1) [12:43:06] [PASSED] 0x4908 (DG1) [12:43:06] [PASSED] 0x4909 (DG1) [12:43:06] [PASSED] 0x56C0 (DG2) [12:43:06] [PASSED] 0x56C2 (DG2) [12:43:06] [PASSED] 0x56C1 (DG2) [12:43:06] [PASSED] 0x7D51 (METEORLAKE) [12:43:06] [PASSED] 0x7DD1 (METEORLAKE) [12:43:06] [PASSED] 0x7D41 (METEORLAKE) [12:43:06] [PASSED] 0x7D67 (METEORLAKE) [12:43:06] [PASSED] 0xB640 (METEORLAKE) [12:43:06] [PASSED] 0x56A0 (DG2) [12:43:06] [PASSED] 0x56A1 (DG2) [12:43:06] [PASSED] 0x56A2 (DG2) [12:43:06] [PASSED] 0x56BE (DG2) [12:43:06] [PASSED] 0x56BF (DG2) [12:43:06] [PASSED] 0x5690 (DG2) [12:43:06] [PASSED] 0x5691 (DG2) [12:43:06] [PASSED] 0x5692 (DG2) [12:43:06] [PASSED] 0x56A5 (DG2) [12:43:06] [PASSED] 0x56A6 (DG2) [12:43:06] [PASSED] 0x56B0 (DG2) [12:43:06] [PASSED] 0x56B1 (DG2) [12:43:06] [PASSED] 0x56BA (DG2) [12:43:06] [PASSED] 0x56BB (DG2) [12:43:06] [PASSED] 0x56BC (DG2) [12:43:06] [PASSED] 0x56BD (DG2) [12:43:06] [PASSED] 0x5693 (DG2) [12:43:06] [PASSED] 0x5694 (DG2) [12:43:06] [PASSED] 0x5695 (DG2) [12:43:06] [PASSED] 0x56A3 (DG2) [12:43:06] [PASSED] 0x56A4 (DG2) [12:43:06] [PASSED] 0x56B2 (DG2) [12:43:06] [PASSED] 0x56B3 (DG2) [12:43:06] [PASSED] 0x5696 (DG2) [12:43:06] [PASSED] 0x5697 (DG2) [12:43:06] [PASSED] 0xB69 (PVC) [12:43:06] [PASSED] 0xB6E (PVC) [12:43:06] [PASSED] 0xBD4 (PVC) [12:43:06] [PASSED] 0xBD5 (PVC) [12:43:06] [PASSED] 0xBD6 (PVC) [12:43:06] [PASSED] 0xBD7 (PVC) [12:43:06] [PASSED] 0xBD8 (PVC) [12:43:06] [PASSED] 0xBD9 (PVC) [12:43:06] [PASSED] 0xBDA (PVC) [12:43:06] [PASSED] 0xBDB (PVC) [12:43:06] [PASSED] 0xBE0 (PVC) [12:43:06] [PASSED] 0xBE1 (PVC) [12:43:06] [PASSED] 0xBE5 (PVC) [12:43:06] [PASSED] 0x7D40 (METEORLAKE) [12:43:06] [PASSED] 0x7D45 (METEORLAKE) [12:43:06] [PASSED] 0x7D55 (METEORLAKE) [12:43:06] [PASSED] 0x7D60 (METEORLAKE) [12:43:06] [PASSED] 0x7DD5 (METEORLAKE) [12:43:06] [PASSED] 0x6420 (LUNARLAKE) [12:43:06] [PASSED] 0x64A0 (LUNARLAKE) [12:43:06] [PASSED] 0x64B0 (LUNARLAKE) [12:43:06] [PASSED] 0xE202 (BATTLEMAGE) [12:43:06] [PASSED] 0xE209 (BATTLEMAGE) [12:43:06] [PASSED] 0xE20B (BATTLEMAGE) [12:43:06] [PASSED] 0xE20C (BATTLEMAGE) [12:43:06] [PASSED] 0xE20D (BATTLEMAGE) [12:43:06] [PASSED] 0xE210 (BATTLEMAGE) [12:43:06] [PASSED] 0xE211 (BATTLEMAGE) [12:43:06] [PASSED] 0xE212 (BATTLEMAGE) [12:43:06] [PASSED] 0xE216 (BATTLEMAGE) [12:43:06] [PASSED] 0xE220 (BATTLEMAGE) [12:43:06] [PASSED] 0xE221 (BATTLEMAGE) [12:43:06] [PASSED] 0xE222 (BATTLEMAGE) [12:43:06] [PASSED] 0xE223 (BATTLEMAGE) [12:43:06] [PASSED] 0xB080 (PANTHERLAKE) [12:43:06] [PASSED] 0xB081 (PANTHERLAKE) [12:43:06] [PASSED] 0xB082 (PANTHERLAKE) [12:43:06] [PASSED] 0xB083 (PANTHERLAKE) [12:43:06] [PASSED] 0xB084 (PANTHERLAKE) [12:43:06] [PASSED] 0xB085 (PANTHERLAKE) [12:43:06] [PASSED] 0xB086 (PANTHERLAKE) [12:43:06] [PASSED] 0xB087 (PANTHERLAKE) [12:43:06] [PASSED] 0xB08F (PANTHERLAKE) [12:43:06] [PASSED] 0xB090 (PANTHERLAKE) [12:43:06] [PASSED] 0xB0A0 (PANTHERLAKE) [12:43:06] [PASSED] 0xB0A1 (PANTHERLAKE) [12:43:06] [PASSED] 0xB0B0 (PANTHERLAKE) [12:43:06] [PASSED] 0xFD80 (PANTHERLAKE) [12:43:06] [PASSED] 0xFD81 (PANTHERLAKE) [12:43:06] [PASSED] 0xD740 (NOVALAKE_S) [12:43:06] [PASSED] 0xD741 (NOVALAKE_S) [12:43:06] [PASSED] 0xD742 (NOVALAKE_S) [12:43:06] [PASSED] 0xD743 (NOVALAKE_S) [12:43:06] [PASSED] 0xD745 (NOVALAKE_S) [12:43:06] [PASSED] 0xD74A (NOVALAKE_S) [12:43:06] [PASSED] 0xD74B (NOVALAKE_S) [12:43:06] [PASSED] 0x674C (CRESCENTISLAND) [12:43:06] [PASSED] 0x674D (CRESCENTISLAND) [12:43:06] [PASSED] 0x674E (CRESCENTISLAND) [12:43:06] [PASSED] 0x674F (CRESCENTISLAND) [12:43:06] [PASSED] 0x6750 (CRESCENTISLAND) [12:43:06] [PASSED] 0x6751 (CRESCENTISLAND) [12:43:06] [PASSED] 0x6752 (CRESCENTISLAND) [12:43:06] [PASSED] 0xD750 (NOVALAKE_P) [12:43:06] [PASSED] 0xD751 (NOVALAKE_P) [12:43:06] [PASSED] 0xD752 (NOVALAKE_P) [12:43:06] [PASSED] 0xD753 (NOVALAKE_P) [12:43:06] [PASSED] 0xD754 (NOVALAKE_P) [12:43:06] [PASSED] 0xD755 (NOVALAKE_P) [12:43:06] [PASSED] 0xD756 (NOVALAKE_P) [12:43:06] [PASSED] 0xD757 (NOVALAKE_P) [12:43:06] [PASSED] 0xD75F (NOVALAKE_P) [12:43:06] =============== [PASSED] check_platform_desc =============== [12:43:06] ===================== [PASSED] xe_pci ====================== [12:43:06] ============= xe_rtp_tables_test (5 subtests) ============== [12:43:06] ================== xe_rtp_table_gt_test =================== [12:43:06] [PASSED] gt_was/14011060649 [12:43:06] [PASSED] gt_was/14011059788 [12:43:06] [PASSED] gt_was/14015795083 [12:43:06] [PASSED] gt_was/16021867713 [12:43:06] [PASSED] gt_was/14019449301 [12:43:06] [PASSED] gt_was/16028005424 [12:43:06] [PASSED] gt_was/14026578760 [12:43:06] [PASSED] gt_was/1409420604 [12:43:06] [PASSED] gt_was/1408615072 [12:43:06] [PASSED] gt_was/22010523718 [12:43:06] [PASSED] gt_was/14011006942 [12:43:06] [PASSED] gt_was/14014830051 [12:43:06] [PASSED] gt_was/18018781329 [12:43:06] [PASSED] gt_was/1509235366 [12:43:06] [PASSED] gt_was/18018781329 [12:43:06] [PASSED] gt_was/16016694945 [12:43:06] [PASSED] gt_was/14018575942 [12:43:06] [PASSED] gt_was/22016670082 [12:43:06] [PASSED] gt_was/22016670082 [12:43:06] [PASSED] gt_was/14017421178 [12:43:06] [PASSED] gt_was/16025250150 [12:43:06] [PASSED] gt_was/14021871409 [12:43:06] [PASSED] gt_was/16021865536 [12:43:06] [PASSED] gt_was/14021486841 [12:43:06] [PASSED] gt_was/14025160223 [12:43:06] [PASSED] gt_was/14026144927, 16029437861, 14026127056 [12:43:06] [PASSED] gt_was/14025635424 [12:43:06] [PASSED] gt_was/16028005424 [12:43:06] ============== [PASSED] xe_rtp_table_gt_test =============== [12:43:06] ================== xe_rtp_table_gt_test =================== [12:43:06] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable [12:43:06] [PASSED] gt_tunings/Tuning: 32B Access Enable [12:43:06] [PASSED] gt_tunings/Tuning: L3 cache [12:43:06] [PASSED] gt_tunings/Tuning: L3 cache - media [12:43:06] [PASSED] gt_tunings/Tuning: Compression Overfetch [12:43:06] [PASSED] gt_tunings/Tuning: Compression Overfetch - media [12:43:06] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 [12:43:06] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media [12:43:06] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only [12:43:06] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media [12:43:06] [PASSED] gt_tunings/Tuning: Stateless compression control [12:43:06] [PASSED] gt_tunings/Tuning: Stateless compression control - media [12:43:06] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache [12:43:06] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media [12:43:06] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB [12:43:06] [PASSED] gt_tunings/Tuning: Force All Non-Compressible Memory Reads to be 256B Overfetches [12:43:06] ============== [PASSED] xe_rtp_table_gt_test =============== [12:43:06] ================== xe_rtp_table_oob_test ================== [12:43:06] [PASSED] oob_was/1607983814 [12:43:06] [PASSED] oob_was/16010904313 [12:43:06] [PASSED] oob_was/18022495364 [12:43:06] [PASSED] oob_was/22012773006 [12:43:06] [PASSED] oob_was/14014475959 [12:43:06] [PASSED] oob_was/22011391025 [12:43:06] [PASSED] oob_was/22012727170 [12:43:06] [PASSED] oob_was/22012727685 [12:43:06] [PASSED] oob_was/22016596838 [12:43:06] [PASSED] oob_was/18020744125 [12:43:06] [PASSED] oob_was/1409600907 [12:43:06] [PASSED] oob_was/22014953428 [12:43:06] [PASSED] oob_was/16017236439 [12:43:06] [PASSED] oob_was/14019821291 [12:43:06] [PASSED] oob_was/14015076503 [12:43:06] [PASSED] oob_was/22016122933 [12:43:06] [PASSED] oob_was/14018913170 [12:43:06] [PASSED] oob_was/14018094691 [12:43:06] [PASSED] oob_was/18024947630 [12:43:06] [PASSED] oob_was/16022287689 [12:43:06] [PASSED] oob_was/13011645652 [12:43:06] [PASSED] oob_was/14022293748 [12:43:06] [PASSED] oob_was/22019794406 [12:43:06] [PASSED] oob_was/22019338487 [12:43:06] [PASSED] oob_was/16023588340 [12:43:06] [PASSED] oob_was/14019789679 [12:43:06] [PASSED] oob_was/14022866841 [12:43:06] [PASSED] oob_was/16021333562 [12:43:06] [PASSED] oob_was/14016712196 [12:43:06] [PASSED] oob_was/14015568240 [12:43:06] [PASSED] oob_was/18013179988 [12:43:06] [PASSED] oob_was/1508761755 [12:43:06] [PASSED] oob_was/16023105232 [12:43:06] [PASSED] oob_was/16026508708 [12:43:06] [PASSED] oob_was/14020001231 [12:43:06] [PASSED] oob_was/16023683509 [12:43:06] [PASSED] oob_was/14025515070 [12:43:06] [PASSED] oob_was/15015404425_disable [12:43:06] [PASSED] oob_was/16026007364 [12:43:06] [PASSED] oob_was/14020316580 [12:43:06] [PASSED] oob_was/14025883347 [12:43:06] [PASSED] oob_was/16029380221 [12:43:06] [PASSED] oob_was/22022079272 [12:43:06] [PASSED] oob_was/16029897822 [12:43:06] [PASSED] oob_was/14026539277 [12:43:06] [PASSED] oob_was/14027054324 [12:43:06] [PASSED] oob_was/14025941587 [12:43:06] [PASSED] oob_was/16030224309 [12:43:06] ============== [PASSED] xe_rtp_table_oob_test ============== [12:43:06] ================ xe_rtp_table_dev_oob_test ================ [12:43:06] [PASSED] device_oob_was/22010954014 [12:43:06] [PASSED] device_oob_was/15015404425 [12:43:06] [PASSED] device_oob_was/22019338487_display [12:43:06] [PASSED] device_oob_was/14022085890 [12:43:06] [PASSED] device_oob_was/14026633728 [12:43:06] [PASSED] device_oob_was/14026746987 [12:43:06] [PASSED] device_oob_was/14026779378 [12:43:06] ============ [PASSED] xe_rtp_table_dev_oob_test ============ [12:43:06] ========== xe_rtp_table_missing_upper_bound_test ========== [12:43:06] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865 [12:43:06] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037 [12:43:06] [PASSED] register_whitelist/1806527549 [12:43:06] [PASSED] register_whitelist/allow_read_ctx_timestamp [12:43:06] [PASSED] register_whitelist/allow_read_queue_timestamp [12:43:06] [PASSED] register_whitelist/16014440446 [12:43:06] [PASSED] register_whitelist/16017236439 [12:43:06] [PASSED] register_whitelist/16020183090 [12:43:06] [PASSED] register_whitelist/14024997852 [12:43:06] [PASSED] register_whitelist/14024997852 [12:43:06] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ====== [12:43:06] =============== [PASSED] xe_rtp_tables_test ================ [12:43:06] =================== xe_rtp (3 subtests) ==================== [12:43:06] =================== xe_rtp_rules_tests ==================== [12:43:06] [PASSED] no [12:43:06] [PASSED] yes [12:43:06] [PASSED] no-and-no [12:43:06] [PASSED] no-and-yes [12:43:06] [PASSED] yes-and-no [12:43:06] [PASSED] yes-and-yes [12:43:06] [PASSED] no-or-no [12:43:06] [PASSED] no-or-yes [12:43:06] [PASSED] yes-or-no [12:43:06] [PASSED] yes-or-yes [12:43:06] [PASSED] no-yes-or-yes-no [12:43:06] [PASSED] no-yes-or-yes-yes [12:43:06] [PASSED] yes-yes-or-no-yes [12:43:06] [PASSED] yes-yes-or-yes-yes [12:43:06] [PASSED] no-no-or-yes-or-no [12:43:06] [PASSED] or [12:43:06] [PASSED] or-yes [12:43:06] [PASSED] or-no [12:43:06] [PASSED] yes-or [12:43:06] [PASSED] no-or [12:43:06] [PASSED] no-or-or-yes [12:43:06] [PASSED] yes-or-or-no [12:43:06] [PASSED] no-or-or-no [12:43:06] [PASSED] missing-context-engine-class [12:43:06] [PASSED] missing-context-engine-class-or-yes [12:43:06] [PASSED] missing-context-engine-class-or-or-yes [12:43:06] =============== [PASSED] xe_rtp_rules_tests ================ [12:43:06] =============== xe_rtp_process_to_sr_tests ================ [12:43:06] [PASSED] coalesce-same-reg [12:43:06] [PASSED] coalesce-same-reg-literal-and-func [12:43:06] [PASSED] no-match-no-add [12:43:06] [PASSED] two-regs-two-entries [12:43:06] [PASSED] clr-one-set-other [12:43:06] [PASSED] set-field [12:43:06] [PASSED] conflict-duplicate [12:43:06] [PASSED] conflict-not-disjoint [12:43:06] [PASSED] conflict-not-disjoint-literal-and-func [12:43:06] [PASSED] conflict-reg-type [12:43:06] [PASSED] bad-mcr-reg-forced-to-regular [12:43:06] [PASSED] bad-regular-reg-forced-to-mcr [12:43:06] =========== [PASSED] xe_rtp_process_to_sr_tests ============ [12:43:06] ================== xe_rtp_process_tests =================== [12:43:06] [PASSED] active1 [12:43:06] [PASSED] active2 [12:43:06] [PASSED] active-inactive [12:43:06] [PASSED] inactive-active [12:43:06] [PASSED] inactive-active-inactive [12:43:06] [PASSED] inactive-inactive-inactive [12:43:06] ============== [PASSED] xe_rtp_process_tests =============== [12:43:06] ===================== [PASSED] xe_rtp ====================== [12:43:06] ==================== xe_wa (1 subtest) ===================== [12:43:06] ======================== xe_wa_gt ========================= [12:43:06] [PASSED] TIGERLAKE B0 [12:43:06] [PASSED] DG1 A0 [12:43:06] [PASSED] DG1 B0 [12:43:06] [PASSED] ALDERLAKE_S A0 [12:43:06] [PASSED] ALDERLAKE_S B0 [12:43:06] [PASSED] ALDERLAKE_S C0 [12:43:06] [PASSED] ALDERLAKE_S D0 [12:43:06] [PASSED] ALDERLAKE_P A0 [12:43:06] [PASSED] ALDERLAKE_P B0 [12:43:06] [PASSED] ALDERLAKE_P C0 [12:43:06] [PASSED] ALDERLAKE_S RPLS D0 [12:43:06] [PASSED] ALDERLAKE_P RPLU E0 [12:43:06] [PASSED] DG2 G10 C0 [12:43:06] [PASSED] DG2 G11 B1 [12:43:06] [PASSED] DG2 G12 A1 [12:43:06] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0 [12:43:06] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0 [12:43:06] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0 [12:43:06] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0 [12:43:06] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0 [12:43:06] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1 [12:43:06] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0 [12:43:06] ==================== [PASSED] xe_wa_gt ===================== [12:43:06] ====================== [PASSED] xe_wa ====================== [12:43:06] ============================================================ [12:43:06] Testing complete. Ran 839 tests: passed: 810, skipped: 29 [12:43:06] Elapsed time: 42.025s total, 2.521s configuring, 38.737s building, 0.727s running + for kcfg in "${kunitconfigs[@]}" + [[ ! -f /kernel/drivers/gpu/drm/tests/.kunitconfig ]] + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [12:43:06] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [12:43:08] 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 [12:43:33] Starting KUnit Kernel (1/1)... [12:43:33] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [12:43:33] ============ drm_test_pick_cmdline (2 subtests) ============ [12:43:33] [PASSED] drm_test_pick_cmdline_res_1920_1080_60 [12:43:33] =============== drm_test_pick_cmdline_named =============== [12:43:33] [PASSED] NTSC [12:43:33] [PASSED] NTSC-J [12:43:33] [PASSED] PAL [12:43:33] [PASSED] PAL-M [12:43:33] =========== [PASSED] drm_test_pick_cmdline_named =========== [12:43:33] ============== [PASSED] drm_test_pick_cmdline ============== [12:43:33] == drm_test_atomic_get_connector_for_encoder (1 subtest) === [12:43:33] [PASSED] drm_test_drm_atomic_get_connector_for_encoder [12:43:33] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ==== [12:43:33] =========== drm_validate_clone_mode (2 subtests) =========== [12:43:33] ============== drm_test_check_in_clone_mode =============== [12:43:33] [PASSED] in_clone_mode [12:43:33] [PASSED] not_in_clone_mode [12:43:33] ========== [PASSED] drm_test_check_in_clone_mode =========== [12:43:33] =============== drm_test_check_valid_clones =============== [12:43:33] [PASSED] not_in_clone_mode [12:43:33] [PASSED] valid_clone [12:43:33] [PASSED] invalid_clone [12:43:33] =========== [PASSED] drm_test_check_valid_clones =========== [12:43:33] ============= [PASSED] drm_validate_clone_mode ============= [12:43:33] ============= drm_validate_modeset (1 subtest) ============= [12:43:33] [PASSED] drm_test_check_connector_changed_modeset [12:43:33] ============== [PASSED] drm_validate_modeset =============== [12:43:33] ====== drm_test_bridge_get_current_state (1 subtest) ======= [12:43:33] [PASSED] drm_test_drm_bridge_get_current_state_atomic [12:43:33] ======== [PASSED] drm_test_bridge_get_current_state ======== [12:43:33] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ====== [12:43:33] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic [12:43:33] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled [12:43:33] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts [12:43:33] ======== [PASSED] drm_test_bridge_helper_reset_crtc ======== [12:43:33] ============== drm_bridge_alloc (2 subtests) =============== [12:43:33] [PASSED] drm_test_drm_bridge_alloc_basic [12:43:33] [PASSED] drm_test_drm_bridge_alloc_get_put [12:43:33] ================ [PASSED] drm_bridge_alloc ================= [12:43:33] ============= drm_bridge_bus_fmt (5 subtests) ============== [12:43:33] [PASSED] drm_test_bridge_rgb_yuv_rgb [12:43:33] [PASSED] drm_test_bridge_must_convert_to_yuv444 [12:43:33] [PASSED] drm_test_bridge_hdmi_auto_rgb [12:43:33] [PASSED] drm_test_bridge_auto_first [12:43:33] [PASSED] drm_test_bridge_rgb_yuv_no_path [12:43:33] =============== [PASSED] drm_bridge_bus_fmt ================ [12:43:33] ============= drm_cmdline_parser (40 subtests) ============= [12:43:33] [PASSED] drm_test_cmdline_force_d_only [12:43:33] [PASSED] drm_test_cmdline_force_D_only_dvi [12:43:33] [PASSED] drm_test_cmdline_force_D_only_hdmi [12:43:33] [PASSED] drm_test_cmdline_force_D_only_not_digital [12:43:33] [PASSED] drm_test_cmdline_force_e_only [12:43:33] [PASSED] drm_test_cmdline_res [12:43:33] [PASSED] drm_test_cmdline_res_vesa [12:43:33] [PASSED] drm_test_cmdline_res_vesa_rblank [12:43:33] [PASSED] drm_test_cmdline_res_rblank [12:43:33] [PASSED] drm_test_cmdline_res_bpp [12:43:33] [PASSED] drm_test_cmdline_res_refresh [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh_margins [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital [12:43:33] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on [12:43:33] [PASSED] drm_test_cmdline_res_margins_force_on [12:43:33] [PASSED] drm_test_cmdline_res_vesa_margins [12:43:33] [PASSED] drm_test_cmdline_name [12:43:33] [PASSED] drm_test_cmdline_name_bpp [12:43:33] [PASSED] drm_test_cmdline_name_option [12:43:33] [PASSED] drm_test_cmdline_name_bpp_option [12:43:33] [PASSED] drm_test_cmdline_rotate_0 [12:43:33] [PASSED] drm_test_cmdline_rotate_90 [12:43:33] [PASSED] drm_test_cmdline_rotate_180 [12:43:33] [PASSED] drm_test_cmdline_rotate_270 [12:43:33] [PASSED] drm_test_cmdline_hmirror [12:43:33] [PASSED] drm_test_cmdline_vmirror [12:43:33] [PASSED] drm_test_cmdline_margin_options [12:43:33] [PASSED] drm_test_cmdline_multiple_options [12:43:33] [PASSED] drm_test_cmdline_bpp_extra_and_option [12:43:33] [PASSED] drm_test_cmdline_extra_and_option [12:43:33] [PASSED] drm_test_cmdline_freestanding_options [12:43:33] [PASSED] drm_test_cmdline_freestanding_force_e_and_options [12:43:33] [PASSED] drm_test_cmdline_panel_orientation [12:43:33] ================ drm_test_cmdline_invalid ================= [12:43:33] [PASSED] margin_only [12:43:33] [PASSED] interlace_only [12:43:33] [PASSED] res_missing_x [12:43:33] [PASSED] res_missing_y [12:43:33] [PASSED] res_bad_y [12:43:33] [PASSED] res_missing_y_bpp [12:43:33] [PASSED] res_bad_bpp [12:43:33] [PASSED] res_bad_refresh [12:43:33] [PASSED] res_bpp_refresh_force_on_off [12:43:33] [PASSED] res_invalid_mode [12:43:33] [PASSED] res_bpp_wrong_place_mode [12:43:33] [PASSED] name_bpp_refresh [12:43:33] [PASSED] name_refresh [12:43:33] [PASSED] name_refresh_wrong_mode [12:43:33] [PASSED] name_refresh_invalid_mode [12:43:33] [PASSED] rotate_multiple [12:43:33] [PASSED] rotate_invalid_val [12:43:33] [PASSED] rotate_truncated [12:43:33] [PASSED] invalid_option [12:43:33] [PASSED] invalid_tv_option [12:43:33] [PASSED] truncated_tv_option [12:43:33] ============ [PASSED] drm_test_cmdline_invalid ============= [12:43:33] =============== drm_test_cmdline_tv_options =============== [12:43:33] [PASSED] NTSC [12:43:33] [PASSED] NTSC_443 [12:43:33] [PASSED] NTSC_J [12:43:33] [PASSED] PAL [12:43:33] [PASSED] PAL_M [12:43:33] [PASSED] PAL_N [12:43:33] [PASSED] SECAM [12:43:33] [PASSED] MONO_525 [12:43:33] [PASSED] MONO_625 [12:43:33] =========== [PASSED] drm_test_cmdline_tv_options =========== [12:43:33] =============== [PASSED] drm_cmdline_parser ================ [12:43:33] ========== drmm_connector_hdmi_init (20 subtests) ========== [12:43:33] [PASSED] drm_test_connector_hdmi_init_valid [12:43:33] [PASSED] drm_test_connector_hdmi_init_bpc_8 [12:43:33] [PASSED] drm_test_connector_hdmi_init_bpc_10 [12:43:33] [PASSED] drm_test_connector_hdmi_init_bpc_12 [12:43:33] [PASSED] drm_test_connector_hdmi_init_bpc_invalid [12:43:33] [PASSED] drm_test_connector_hdmi_init_bpc_null [12:43:33] [PASSED] drm_test_connector_hdmi_init_formats_empty [12:43:33] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb [12:43:33] === drm_test_connector_hdmi_init_formats_yuv420_allowed === [12:43:33] [PASSED] supported_formats=0x9 yuv420_allowed=1 [12:43:33] [PASSED] supported_formats=0x9 yuv420_allowed=0 [12:43:33] [PASSED] supported_formats=0x5 yuv420_allowed=1 [12:43:33] [PASSED] supported_formats=0x5 yuv420_allowed=0 [12:43:33] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed === [12:43:33] [PASSED] drm_test_connector_hdmi_init_null_ddc [12:43:33] [PASSED] drm_test_connector_hdmi_init_null_product [12:43:33] [PASSED] drm_test_connector_hdmi_init_null_vendor [12:43:33] [PASSED] drm_test_connector_hdmi_init_product_length_exact [12:43:33] [PASSED] drm_test_connector_hdmi_init_product_length_too_long [12:43:33] [PASSED] drm_test_connector_hdmi_init_product_valid [12:43:33] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact [12:43:33] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long [12:43:33] [PASSED] drm_test_connector_hdmi_init_vendor_valid [12:43:33] ========= drm_test_connector_hdmi_init_type_valid ========= [12:43:33] [PASSED] HDMI-A [12:43:33] [PASSED] HDMI-B [12:43:33] ===== [PASSED] drm_test_connector_hdmi_init_type_valid ===== [12:43:33] ======== drm_test_connector_hdmi_init_type_invalid ======== [12:43:33] [PASSED] Unknown [12:43:33] [PASSED] VGA [12:43:33] [PASSED] DVI-I [12:43:33] [PASSED] DVI-D [12:43:33] [PASSED] DVI-A [12:43:33] [PASSED] Composite [12:43:33] [PASSED] SVIDEO [12:43:33] [PASSED] LVDS [12:43:33] [PASSED] Component [12:43:33] [PASSED] DIN [12:43:33] [PASSED] DP [12:43:33] [PASSED] TV [12:43:33] [PASSED] eDP [12:43:33] [PASSED] Virtual [12:43:33] [PASSED] DSI [12:43:33] [PASSED] DPI [12:43:33] [PASSED] Writeback [12:43:33] [PASSED] SPI [12:43:33] [PASSED] USB [12:43:33] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ==== [12:43:33] ============ [PASSED] drmm_connector_hdmi_init ============= [12:43:33] ============= drmm_connector_init (3 subtests) ============= [12:43:33] [PASSED] drm_test_drmm_connector_init [12:43:33] [PASSED] drm_test_drmm_connector_init_null_ddc [12:43:33] ========= drm_test_drmm_connector_init_type_valid ========= [12:43:33] [PASSED] Unknown [12:43:33] [PASSED] VGA [12:43:33] [PASSED] DVI-I [12:43:33] [PASSED] DVI-D [12:43:33] [PASSED] DVI-A [12:43:33] [PASSED] Composite [12:43:33] [PASSED] SVIDEO [12:43:33] [PASSED] LVDS [12:43:33] [PASSED] Component [12:43:33] [PASSED] DIN [12:43:33] [PASSED] DP [12:43:33] [PASSED] HDMI-A [12:43:33] [PASSED] HDMI-B [12:43:33] [PASSED] TV [12:43:33] [PASSED] eDP [12:43:33] [PASSED] Virtual [12:43:33] [PASSED] DSI [12:43:33] [PASSED] DPI [12:43:33] [PASSED] Writeback [12:43:33] [PASSED] SPI [12:43:33] [PASSED] USB [12:43:33] ===== [PASSED] drm_test_drmm_connector_init_type_valid ===== [12:43:33] =============== [PASSED] drmm_connector_init =============== [12:43:33] ========= drm_connector_dynamic_init (6 subtests) ========== [12:43:33] [PASSED] drm_test_drm_connector_dynamic_init [12:43:33] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc [12:43:33] [PASSED] drm_test_drm_connector_dynamic_init_not_added [12:43:33] [PASSED] drm_test_drm_connector_dynamic_init_properties [12:43:33] ===== drm_test_drm_connector_dynamic_init_type_valid ====== [12:43:33] [PASSED] Unknown [12:43:33] [PASSED] VGA [12:43:33] [PASSED] DVI-I [12:43:33] [PASSED] DVI-D [12:43:33] [PASSED] DVI-A [12:43:33] [PASSED] Composite [12:43:33] [PASSED] SVIDEO [12:43:33] [PASSED] LVDS [12:43:33] [PASSED] Component [12:43:33] [PASSED] DIN [12:43:33] [PASSED] DP [12:43:33] [PASSED] HDMI-A [12:43:33] [PASSED] HDMI-B [12:43:33] [PASSED] TV [12:43:33] [PASSED] eDP [12:43:33] [PASSED] Virtual [12:43:33] [PASSED] DSI [12:43:33] [PASSED] DPI [12:43:33] [PASSED] Writeback [12:43:33] [PASSED] SPI [12:43:33] [PASSED] USB [12:43:33] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid == [12:43:33] ======== drm_test_drm_connector_dynamic_init_name ========= [12:43:33] [PASSED] Unknown [12:43:33] [PASSED] VGA [12:43:33] [PASSED] DVI-I [12:43:33] [PASSED] DVI-D [12:43:33] [PASSED] DVI-A [12:43:33] [PASSED] Composite [12:43:33] [PASSED] SVIDEO [12:43:33] [PASSED] LVDS [12:43:33] [PASSED] Component [12:43:33] [PASSED] DIN [12:43:33] [PASSED] DP [12:43:33] [PASSED] HDMI-A [12:43:33] [PASSED] HDMI-B [12:43:33] [PASSED] TV [12:43:33] [PASSED] eDP [12:43:33] [PASSED] Virtual [12:43:33] [PASSED] DSI [12:43:33] [PASSED] DPI [12:43:33] [PASSED] Writeback [12:43:33] [PASSED] SPI [12:43:33] [PASSED] USB [12:43:33] ==== [PASSED] drm_test_drm_connector_dynamic_init_name ===== [12:43:33] =========== [PASSED] drm_connector_dynamic_init ============ [12:43:33] ==== drm_connector_dynamic_register_early (4 subtests) ===== [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_early_defer [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object [12:43:33] ====== [PASSED] drm_connector_dynamic_register_early ======= [12:43:33] ======= drm_connector_dynamic_register (7 subtests) ======== [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_on_list [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_no_defer [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_no_init [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_mode_object [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_sysfs [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name [12:43:33] [PASSED] drm_test_drm_connector_dynamic_register_debugfs [12:43:33] ========= [PASSED] drm_connector_dynamic_register ========== [12:43:33] = drm_connector_attach_broadcast_rgb_property (2 subtests) = [12:43:33] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property [12:43:33] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector [12:43:33] === [PASSED] drm_connector_attach_broadcast_rgb_property === [12:43:33] ========== drm_get_tv_mode_from_name (2 subtests) ========== [12:43:33] ========== drm_test_get_tv_mode_from_name_valid =========== [12:43:33] [PASSED] NTSC [12:43:33] [PASSED] NTSC-443 [12:43:33] [PASSED] NTSC-J [12:43:33] [PASSED] PAL [12:43:33] [PASSED] PAL-M [12:43:33] [PASSED] PAL-N [12:43:33] [PASSED] SECAM [12:43:33] [PASSED] Mono [12:43:33] ====== [PASSED] drm_test_get_tv_mode_from_name_valid ======= [12:43:33] [PASSED] drm_test_get_tv_mode_from_name_truncated [12:43:33] ============ [PASSED] drm_get_tv_mode_from_name ============ [12:43:33] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) = [12:43:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb [12:43:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc [12:43:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1 [12:43:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc [12:43:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1 [12:43:33] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double [12:43:33] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid = [12:43:33] [PASSED] VIC 96 [12:43:33] [PASSED] VIC 97 [12:43:33] [PASSED] VIC 101 [12:43:33] [PASSED] VIC 102 [12:43:33] [PASSED] VIC 106 [12:43:33] [PASSED] VIC 107 [12:43:33] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid === [12:43:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc [12:43:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc [12:43:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc [12:43:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc [12:43:33] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc [12:43:33] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ==== [12:43:33] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) == [12:43:33] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ==== [12:43:33] [PASSED] Automatic [12:43:33] [PASSED] Full [12:43:33] [PASSED] Limited 16:235 [12:43:33] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name === [12:43:33] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid [12:43:33] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ==== [12:43:33] == drm_hdmi_connector_get_output_format_name (2 subtests) == [12:43:33] === drm_test_drm_hdmi_connector_get_output_format_name ==== [12:43:33] [PASSED] RGB [12:43:33] [PASSED] YUV 4:2:0 [12:43:33] [PASSED] YUV 4:2:2 [12:43:33] [PASSED] YUV 4:4:4 [12:43:33] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name === [12:43:33] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid [12:43:33] ==== [PASSED] drm_hdmi_connector_get_output_format_name ==== [12:43:33] ============= drm_damage_helper (21 subtests) ============== [12:43:33] [PASSED] drm_test_damage_iter_no_damage [12:43:33] [PASSED] drm_test_damage_iter_no_damage_fractional_src [12:43:33] [PASSED] drm_test_damage_iter_no_damage_src_moved [12:43:33] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved [12:43:33] [PASSED] drm_test_damage_iter_no_damage_not_visible [12:43:33] [PASSED] drm_test_damage_iter_no_damage_no_crtc [12:43:33] [PASSED] drm_test_damage_iter_no_damage_no_fb [12:43:33] [PASSED] drm_test_damage_iter_simple_damage [12:43:33] [PASSED] drm_test_damage_iter_single_damage [12:43:33] [PASSED] drm_test_damage_iter_single_damage_intersect_src [12:43:33] [PASSED] drm_test_damage_iter_single_damage_outside_src [12:43:33] [PASSED] drm_test_damage_iter_single_damage_fractional_src [12:43:33] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src [12:43:33] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src [12:43:33] [PASSED] drm_test_damage_iter_single_damage_src_moved [12:43:33] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved [12:43:33] [PASSED] drm_test_damage_iter_damage [12:43:33] [PASSED] drm_test_damage_iter_damage_one_intersect [12:43:33] [PASSED] drm_test_damage_iter_damage_one_outside [12:43:33] [PASSED] drm_test_damage_iter_damage_src_moved [12:43:33] [PASSED] drm_test_damage_iter_damage_not_visible [12:43:33] ================ [PASSED] drm_damage_helper ================ [12:43:33] ============== drm_dp_mst_helper (3 subtests) ============== [12:43:33] ============== drm_test_dp_mst_calc_pbn_mode ============== [12:43:33] [PASSED] Clock 154000 BPP 30 DSC disabled [12:43:33] [PASSED] Clock 234000 BPP 30 DSC disabled [12:43:33] [PASSED] Clock 297000 BPP 24 DSC disabled [12:43:33] [PASSED] Clock 332880 BPP 24 DSC enabled [12:43:33] [PASSED] Clock 324540 BPP 24 DSC enabled [12:43:33] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ========== [12:43:33] ============== drm_test_dp_mst_calc_pbn_div =============== [12:43:33] [PASSED] Link rate 2000000 lane count 4 [12:43:33] [PASSED] Link rate 2000000 lane count 2 [12:43:33] [PASSED] Link rate 2000000 lane count 1 [12:43:33] [PASSED] Link rate 1350000 lane count 4 [12:43:33] [PASSED] Link rate 1350000 lane count 2 [12:43:33] [PASSED] Link rate 1350000 lane count 1 [12:43:33] [PASSED] Link rate 1000000 lane count 4 [12:43:33] [PASSED] Link rate 1000000 lane count 2 [12:43:33] [PASSED] Link rate 1000000 lane count 1 [12:43:33] [PASSED] Link rate 810000 lane count 4 [12:43:33] [PASSED] Link rate 810000 lane count 2 [12:43:33] [PASSED] Link rate 810000 lane count 1 [12:43:33] [PASSED] Link rate 540000 lane count 4 [12:43:33] [PASSED] Link rate 540000 lane count 2 [12:43:33] [PASSED] Link rate 540000 lane count 1 [12:43:33] [PASSED] Link rate 270000 lane count 4 [12:43:33] [PASSED] Link rate 270000 lane count 2 [12:43:33] [PASSED] Link rate 270000 lane count 1 [12:43:33] [PASSED] Link rate 162000 lane count 4 [12:43:33] [PASSED] Link rate 162000 lane count 2 [12:43:33] [PASSED] Link rate 162000 lane count 1 [12:43:33] ========== [PASSED] drm_test_dp_mst_calc_pbn_div =========== [12:43:33] ========= drm_test_dp_mst_sideband_msg_req_decode ========= [12:43:33] [PASSED] DP_ENUM_PATH_RESOURCES with port number [12:43:33] [PASSED] DP_POWER_UP_PHY with port number [12:43:33] [PASSED] DP_POWER_DOWN_PHY with port number [12:43:33] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks [12:43:33] [PASSED] DP_ALLOCATE_PAYLOAD with port number [12:43:33] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI [12:43:33] [PASSED] DP_ALLOCATE_PAYLOAD with PBN [12:43:33] [PASSED] DP_QUERY_PAYLOAD with port number [12:43:33] [PASSED] DP_QUERY_PAYLOAD with VCPI [12:43:33] [PASSED] DP_REMOTE_DPCD_READ with port number [12:43:33] [PASSED] DP_REMOTE_DPCD_READ with DPCD address [12:43:33] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes [12:43:33] [PASSED] DP_REMOTE_DPCD_WRITE with port number [12:43:33] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address [12:43:33] [PASSED] DP_REMOTE_DPCD_WRITE with data array [12:43:33] [PASSED] DP_REMOTE_I2C_READ with port number [12:43:33] [PASSED] DP_REMOTE_I2C_READ with I2C device ID [12:43:33] [PASSED] DP_REMOTE_I2C_READ with transactions array [12:43:33] [PASSED] DP_REMOTE_I2C_WRITE with port number [12:43:33] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID [12:43:33] [PASSED] DP_REMOTE_I2C_WRITE with data array [12:43:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID [12:43:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID [12:43:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event [12:43:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event [12:43:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior [12:43:33] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior [12:43:33] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode ===== [12:43:33] ================ [PASSED] drm_dp_mst_helper ================ [12:43:33] ================== drm_exec (7 subtests) =================== [12:43:33] [PASSED] sanitycheck [12:43:33] [PASSED] test_lock [12:43:33] [PASSED] test_lock_unlock [12:43:33] [PASSED] test_duplicates [12:43:33] [PASSED] test_prepare [12:43:33] [PASSED] test_prepare_array [12:43:33] [PASSED] test_multiple_loops [12:43:33] ==================== [PASSED] drm_exec ===================== [12:43:33] =========== drm_format_helper_test (17 subtests) =========== [12:43:33] ============== drm_test_fb_xrgb8888_to_gray8 ============== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ========== [12:43:33] ============= drm_test_fb_xrgb8888_to_rgb332 ============== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ========== [12:43:33] ============= drm_test_fb_xrgb8888_to_rgb565 ============== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ========== [12:43:33] ============ drm_test_fb_xrgb8888_to_xrgb1555 ============= [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 ========= [12:43:33] ============ drm_test_fb_xrgb8888_to_argb1555 ============= [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 ========= [12:43:33] ============ drm_test_fb_xrgb8888_to_rgba5551 ============= [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 ========= [12:43:33] ============= drm_test_fb_xrgb8888_to_rgb888 ============== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ========== [12:43:33] ============= drm_test_fb_xrgb8888_to_bgr888 ============== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ========== [12:43:33] ============ drm_test_fb_xrgb8888_to_argb8888 ============= [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 ========= [12:43:33] =========== drm_test_fb_xrgb8888_to_xrgb2101010 =========== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 ======= [12:43:33] =========== drm_test_fb_xrgb8888_to_argb2101010 =========== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 ======= [12:43:33] ============== drm_test_fb_xrgb8888_to_mono =============== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ========== [PASSED] drm_test_fb_xrgb8888_to_mono =========== [12:43:33] ==================== drm_test_fb_swab ===================== [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ================ [PASSED] drm_test_fb_swab ================= [12:43:33] ============ drm_test_fb_xrgb8888_to_xbgr8888 ============= [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 ========= [12:43:33] ============ drm_test_fb_xrgb8888_to_abgr8888 ============= [12:43:33] [PASSED] single_pixel_source_buffer [12:43:33] [PASSED] single_pixel_clip_rectangle [12:43:33] [PASSED] well_known_colors [12:43:33] [PASSED] destination_pitch [12:43:33] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 ========= [12:43:33] ================= drm_test_fb_clip_offset ================= [12:43:33] [PASSED] pass through [12:43:33] [PASSED] horizontal offset [12:43:33] [PASSED] vertical offset [12:43:33] [PASSED] horizontal and vertical offset [12:43:33] [PASSED] horizontal offset (custom pitch) [12:43:33] [PASSED] vertical offset (custom pitch) [12:43:33] [PASSED] horizontal and vertical offset (custom pitch) [12:43:33] ============= [PASSED] drm_test_fb_clip_offset ============= [12:43:33] =================== drm_test_fb_memcpy ==================== [12:43:33] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258) [12:43:33] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258) [12:43:33] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559) [12:43:33] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258) [12:43:33] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258) [12:43:33] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559) [12:43:33] [PASSED] well_known_colors: XB24 little-endian (0x34324258) [12:43:33] [PASSED] well_known_colors: XRA8 little-endian (0x38415258) [12:43:33] [PASSED] well_known_colors: YU24 little-endian (0x34325559) [12:43:33] [PASSED] destination_pitch: XB24 little-endian (0x34324258) [12:43:33] [PASSED] destination_pitch: XRA8 little-endian (0x38415258) [12:43:33] [PASSED] destination_pitch: YU24 little-endian (0x34325559) [12:43:33] =============== [PASSED] drm_test_fb_memcpy ================ [12:43:33] ============= [PASSED] drm_format_helper_test ============== [12:43:33] ================= drm_format (18 subtests) ================= [12:43:33] [PASSED] drm_test_format_block_width_invalid [12:43:33] [PASSED] drm_test_format_block_width_one_plane [12:43:33] [PASSED] drm_test_format_block_width_two_plane [12:43:33] [PASSED] drm_test_format_block_width_three_plane [12:43:33] [PASSED] drm_test_format_block_width_tiled [12:43:33] [PASSED] drm_test_format_block_height_invalid [12:43:33] [PASSED] drm_test_format_block_height_one_plane [12:43:33] [PASSED] drm_test_format_block_height_two_plane [12:43:33] [PASSED] drm_test_format_block_height_three_plane [12:43:33] [PASSED] drm_test_format_block_height_tiled [12:43:33] [PASSED] drm_test_format_min_pitch_invalid [12:43:33] [PASSED] drm_test_format_min_pitch_one_plane_8bpp [12:43:33] [PASSED] drm_test_format_min_pitch_one_plane_16bpp [12:43:33] [PASSED] drm_test_format_min_pitch_one_plane_24bpp [12:43:33] [PASSED] drm_test_format_min_pitch_one_plane_32bpp [12:43:33] [PASSED] drm_test_format_min_pitch_two_plane [12:43:33] [PASSED] drm_test_format_min_pitch_three_plane_8bpp [12:43:33] [PASSED] drm_test_format_min_pitch_tiled [12:43:33] =================== [PASSED] drm_format ==================== [12:43:33] ============== drm_framebuffer (10 subtests) =============== [12:43:33] ========== drm_test_framebuffer_check_src_coords ========== [12:43:33] [PASSED] Success: source fits into fb [12:43:33] [PASSED] Fail: overflowing fb with x-axis coordinate [12:43:33] [PASSED] Fail: overflowing fb with y-axis coordinate [12:43:33] [PASSED] Fail: overflowing fb with source width [12:43:33] [PASSED] Fail: overflowing fb with source height [12:43:33] ====== [PASSED] drm_test_framebuffer_check_src_coords ====== [12:43:33] [PASSED] drm_test_framebuffer_cleanup [12:43:33] =============== drm_test_framebuffer_create =============== [12:43:33] [PASSED] ABGR8888 normal sizes [12:43:33] [PASSED] ABGR8888 max sizes [12:43:33] [PASSED] ABGR8888 pitch greater than min required [12:43:33] [PASSED] ABGR8888 pitch less than min required [12:43:33] [PASSED] ABGR8888 Invalid width [12:43:33] [PASSED] ABGR8888 Invalid buffer handle [12:43:33] [PASSED] No pixel format [12:43:33] [PASSED] ABGR8888 Width 0 [12:43:33] [PASSED] ABGR8888 Height 0 [12:43:33] [PASSED] ABGR8888 Out of bound height * pitch combination [12:43:33] [PASSED] ABGR8888 Large buffer offset [12:43:33] [PASSED] ABGR8888 Buffer offset for inexistent plane [12:43:33] [PASSED] ABGR8888 Invalid flag [12:43:33] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers [12:43:33] [PASSED] ABGR8888 Valid buffer modifier [12:43:33] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) [12:43:33] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS [12:43:33] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS [12:43:33] [PASSED] NV12 Normal sizes [12:43:33] [PASSED] NV12 Max sizes [12:43:33] [PASSED] NV12 Invalid pitch [12:43:33] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag [12:43:33] [PASSED] NV12 different modifier per-plane [12:43:33] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE [12:43:33] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS [12:43:33] [PASSED] NV12 Modifier for inexistent plane [12:43:33] [PASSED] NV12 Handle for inexistent plane [12:43:33] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS [12:43:33] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier [12:43:33] [PASSED] YVU420 Normal sizes [12:43:33] [PASSED] YVU420 Max sizes [12:43:33] [PASSED] YVU420 Invalid pitch [12:43:33] [PASSED] YVU420 Different pitches [12:43:33] [PASSED] YVU420 Different buffer offsets/pitches [12:43:33] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS [12:43:33] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS [12:43:33] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS [12:43:33] [PASSED] YVU420 Valid modifier [12:43:33] [PASSED] YVU420 Different modifiers per plane [12:43:33] [PASSED] YVU420 Modifier for inexistent plane [12:43:33] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR) [12:43:33] [PASSED] X0L2 Normal sizes [12:43:33] [PASSED] X0L2 Max sizes [12:43:33] [PASSED] X0L2 Invalid pitch [12:43:33] [PASSED] X0L2 Pitch greater than minimum required [12:43:33] [PASSED] X0L2 Handle for inexistent plane [12:43:33] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set [12:43:33] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set [12:43:33] [PASSED] X0L2 Valid modifier [12:43:33] [PASSED] X0L2 Modifier for inexistent plane [12:43:33] =========== [PASSED] drm_test_framebuffer_create =========== [12:43:33] [PASSED] drm_test_framebuffer_free [12:43:33] [PASSED] drm_test_framebuffer_init [12:43:33] [PASSED] drm_test_framebuffer_init_bad_format [12:43:33] [PASSED] drm_test_framebuffer_init_dev_mismatch [12:43:33] [PASSED] drm_test_framebuffer_lookup [12:43:33] [PASSED] drm_test_framebuffer_lookup_inexistent [12:43:33] [PASSED] drm_test_framebuffer_modifiers_not_supported [12:43:33] ================= [PASSED] drm_framebuffer ================= [12:43:33] ================ drm_gem_shmem (8 subtests) ================ [12:43:33] [PASSED] drm_gem_shmem_test_obj_create [12:43:33] [PASSED] drm_gem_shmem_test_obj_create_private [12:43:33] [PASSED] drm_gem_shmem_test_pin_pages [12:43:33] [PASSED] drm_gem_shmem_test_vmap [12:43:33] [PASSED] drm_gem_shmem_test_get_sg_table [12:43:33] [PASSED] drm_gem_shmem_test_get_pages_sgt [12:43:33] [PASSED] drm_gem_shmem_test_madvise [12:43:33] [PASSED] drm_gem_shmem_test_purge [12:43:33] ================== [PASSED] drm_gem_shmem ================== [12:43:33] === drm_atomic_helper_connector_hdmi_check (29 subtests) === [12:43:33] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode [12:43:33] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1 [12:43:33] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode [12:43:33] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1 [12:43:33] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode [12:43:33] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1 [12:43:33] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 ======= [12:43:33] [PASSED] Automatic [12:43:33] [PASSED] Full [12:43:33] [PASSED] Limited 16:235 [12:43:33] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 === [12:43:33] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed [12:43:33] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed [12:43:33] [PASSED] drm_test_check_disable_connector [12:43:33] [PASSED] drm_test_check_hdmi_funcs_reject_rate [12:43:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb [12:43:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420 [12:43:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422 [12:43:33] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420 [12:43:33] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420 [12:43:33] [PASSED] drm_test_check_output_bpc_crtc_mode_changed [12:43:33] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed [12:43:33] [PASSED] drm_test_check_output_bpc_dvi [12:43:33] [PASSED] drm_test_check_output_bpc_format_vic_1 [12:43:33] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only [12:43:33] [PASSED] drm_test_check_output_bpc_format_display_rgb_only [12:43:33] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only [12:43:33] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only [12:43:33] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc [12:43:33] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc [12:43:33] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc [12:43:33] ============ drm_test_check_hdmi_color_format ============= [12:43:33] [PASSED] AUTO -> RGB [12:43:33] [PASSED] YCBCR422 -> YUV422 [12:43:33] [PASSED] YCBCR420 -> YUV420 [12:43:33] [PASSED] YCBCR444 -> YUV444 [12:43:33] [PASSED] RGB -> RGB [12:43:33] ======== [PASSED] drm_test_check_hdmi_color_format ========= [12:43:33] ======== drm_test_check_hdmi_color_format_420_only ======== [12:43:33] [PASSED] RGB should fail [12:43:33] [PASSED] YUV444 should fail [12:43:33] [PASSED] YUV422 should fail [12:43:33] [PASSED] YUV420 should work [12:43:33] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ==== [12:43:33] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ====== [12:43:33] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ==== [12:43:33] [PASSED] drm_test_check_broadcast_rgb_value [12:43:33] [PASSED] drm_test_check_bpc_8_value [12:43:33] [PASSED] drm_test_check_bpc_10_value [12:43:33] [PASSED] drm_test_check_bpc_12_value [12:43:33] [PASSED] drm_test_check_format_value [12:43:33] [PASSED] drm_test_check_tmds_char_value [12:43:33] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ====== [12:43:33] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) = [12:43:33] [PASSED] drm_test_check_mode_valid [12:43:33] [PASSED] drm_test_check_mode_valid_reject [12:43:33] [PASSED] drm_test_check_mode_valid_reject_rate [12:43:33] [PASSED] drm_test_check_mode_valid_reject_max_clock [12:43:33] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock [12:43:33] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector [12:43:33] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb [12:43:33] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid === [12:43:33] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) = [12:43:33] [PASSED] drm_test_check_infoframes [12:43:33] [PASSED] drm_test_check_reject_avi_infoframe [12:43:33] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8 [12:43:33] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10 [12:43:33] [PASSED] drm_test_check_reject_audio_infoframe [12:43:33] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes === [12:43:33] ================= drm_managed (2 subtests) ================= [12:43:33] [PASSED] drm_test_managed_release_action [12:43:33] [PASSED] drm_test_managed_run_action [12:43:33] =================== [PASSED] drm_managed =================== [12:43:33] =================== drm_mm (6 subtests) ==================== [12:43:33] [PASSED] drm_test_mm_init [12:43:33] [PASSED] drm_test_mm_debug [12:43:33] [PASSED] drm_test_mm_align32 [12:43:33] [PASSED] drm_test_mm_align64 [12:43:33] [PASSED] drm_test_mm_lowest [12:43:33] [PASSED] drm_test_mm_highest [12:43:33] ===================== [PASSED] drm_mm ====================== [12:43:33] ============= drm_modes_analog_tv (5 subtests) ============= [12:43:33] [PASSED] drm_test_modes_analog_tv_mono_576i [12:43:33] [PASSED] drm_test_modes_analog_tv_ntsc_480i [12:43:33] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined [12:43:33] [PASSED] drm_test_modes_analog_tv_pal_576i [12:43:33] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined [12:43:33] =============== [PASSED] drm_modes_analog_tv =============== [12:43:33] ============== drm_panic_helper (3 subtests) =============== [12:43:33] ============= drm_test_panic_screen_user_map ============== [12:43:33] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752) [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752) [12:43:34] ========= [PASSED] drm_test_panic_screen_user_map ========== [12:43:34] ============= drm_test_panic_screen_user_page ============= [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752) [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752) [12:43:34] ========= [PASSED] drm_test_panic_screen_user_page ========= [12:43:34] ========== drm_test_panic_screen_user_set_pixel =========== [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752) [12:43:34] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752) [12:43:34] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752) [12:43:34] ====== [PASSED] drm_test_panic_screen_user_set_pixel ======= [12:43:34] ================ [PASSED] drm_panic_helper ================= [12:43:34] ============== drm_plane_helper (2 subtests) =============== [12:43:34] =============== drm_test_check_plane_state ================ [12:43:34] [PASSED] clipping_simple [12:43:34] [PASSED] clipping_rotate_reflect [12:43:34] [PASSED] positioning_simple [12:43:34] [PASSED] upscaling [12:43:34] [PASSED] downscaling [12:43:34] [PASSED] rounding1 [12:43:34] [PASSED] rounding2 [12:43:34] [PASSED] rounding3 [12:43:34] [PASSED] rounding4 [12:43:34] =========== [PASSED] drm_test_check_plane_state ============ [12:43:34] =========== drm_test_check_invalid_plane_state ============ [12:43:34] [PASSED] positioning_invalid [12:43:34] [PASSED] upscaling_invalid [12:43:34] [PASSED] downscaling_invalid [12:43:34] ======= [PASSED] drm_test_check_invalid_plane_state ======== [12:43:34] ================ [PASSED] drm_plane_helper ================= [12:43:34] ====== drm_connector_helper_tv_get_modes (1 subtest) ======= [12:43:34] ====== drm_test_connector_helper_tv_get_modes_check ======= [12:43:34] [PASSED] None [12:43:34] [PASSED] PAL [12:43:34] [PASSED] NTSC [12:43:34] [PASSED] Both, NTSC Default [12:43:34] [PASSED] Both, PAL Default [12:43:34] [PASSED] Both, NTSC Default, with PAL on command-line [12:43:34] [PASSED] Both, PAL Default, with NTSC on command-line [12:43:34] == [PASSED] drm_test_connector_helper_tv_get_modes_check === [12:43:34] ======== [PASSED] drm_connector_helper_tv_get_modes ======== [12:43:34] ================== drm_rect (9 subtests) =================== [12:43:34] [PASSED] drm_test_rect_clip_scaled_div_by_zero [12:43:34] [PASSED] drm_test_rect_clip_scaled_not_clipped [12:43:34] [PASSED] drm_test_rect_clip_scaled_clipped [12:43:34] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned [12:43:34] ================= drm_test_rect_intersect ================= [12:43:34] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0 [12:43:34] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1 [12:43:34] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0 [12:43:34] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1 [12:43:34] [PASSED] right x left: 2x1+0+0 x 3x1+1+0 [12:43:34] [PASSED] left x right: 3x1+1+0 x 2x1+0+0 [12:43:34] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1 [12:43:34] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0 [12:43:34] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1 [12:43:34] [PASSED] touching side: 1x1+0+0 x 1x1+1+0 [12:43:34] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0 [12:43:34] [PASSED] inside another: 2x2+0+0 x 1x1+1+1 [12:43:34] [PASSED] far away: 1x1+0+0 x 1x1+3+6 [12:43:34] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10 [12:43:34] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10 [12:43:34] ============= [PASSED] drm_test_rect_intersect ============= [12:43:34] ================ drm_test_rect_calc_hscale ================ [12:43:34] [PASSED] normal use [12:43:34] [PASSED] out of max range [12:43:34] [PASSED] out of min range [12:43:34] [PASSED] zero dst [12:43:34] [PASSED] negative src [12:43:34] [PASSED] negative dst [12:43:34] ============ [PASSED] drm_test_rect_calc_hscale ============ [12:43:34] ================ drm_test_rect_calc_vscale ================ [12:43:34] [PASSED] normal use [12:43:34] [PASSED] out of max range [12:43:34] [PASSED] out of min range [12:43:34] [PASSED] zero dst [12:43:34] [PASSED] negative src [12:43:34] [PASSED] negative dst [12:43:34] ============ [PASSED] drm_test_rect_calc_vscale ============ [12:43:34] ================== drm_test_rect_rotate =================== [12:43:34] [PASSED] reflect-x [12:43:34] [PASSED] reflect-y [12:43:34] [PASSED] rotate-0 [12:43:34] [PASSED] rotate-90 [12:43:34] [PASSED] rotate-180 [12:43:34] [PASSED] rotate-270 [12:43:34] ============== [PASSED] drm_test_rect_rotate =============== [12:43:34] ================ drm_test_rect_rotate_inv ================= [12:43:34] [PASSED] reflect-x [12:43:34] [PASSED] reflect-y [12:43:34] [PASSED] rotate-0 [12:43:34] [PASSED] rotate-90 [12:43:34] [PASSED] rotate-180 [12:43:34] [PASSED] rotate-270 [12:43:34] ============ [PASSED] drm_test_rect_rotate_inv ============= [12:43:34] ==================== [PASSED] drm_rect ===================== [12:43:34] ============ drm_sysfb_modeset_test (1 subtest) ============ [12:43:34] ============ drm_test_sysfb_build_fourcc_list ============= [12:43:34] [PASSED] no native formats [12:43:34] [PASSED] XRGB8888 as native format [12:43:34] [PASSED] remove duplicates [12:43:34] [PASSED] convert alpha formats [12:43:34] [PASSED] random formats [12:43:34] ======== [PASSED] drm_test_sysfb_build_fourcc_list ========= [12:43:34] ============= [PASSED] drm_sysfb_modeset_test ============== [12:43:34] ================== drm_fixp (2 subtests) =================== [12:43:34] [PASSED] drm_test_int2fixp [12:43:34] [PASSED] drm_test_sm2fixp [12:43:34] ==================== [PASSED] drm_fixp ===================== [12:43:34] ============================================================ [12:43:34] Testing complete. Ran 667 tests: passed: 667 [12:43:34] Elapsed time: 27.918s total, 2.529s configuring, 24.972s building, 0.405s running + for kcfg in "${kunitconfigs[@]}" + [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]] + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig [12:43:34] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [12:43:36] 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 [12:43:47] Starting KUnit Kernel (1/1)... [12:43:47] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [12:43:47] ================= ttm_device (5 subtests) ================== [12:43:47] [PASSED] ttm_device_init_basic [12:43:47] [PASSED] ttm_device_init_multiple [12:43:47] [PASSED] ttm_device_fini_basic [12:43:47] [PASSED] ttm_device_init_no_vma_man [12:43:47] ================== ttm_device_init_pools ================== [12:43:47] [PASSED] No DMA allocations, no DMA32 required [12:43:47] [PASSED] DMA allocations, DMA32 required [12:43:47] [PASSED] No DMA allocations, DMA32 required [12:43:47] [PASSED] DMA allocations, no DMA32 required [12:43:47] ============== [PASSED] ttm_device_init_pools ============== [12:43:47] =================== [PASSED] ttm_device ==================== [12:43:47] ================== ttm_pool (8 subtests) =================== [12:43:47] ================== ttm_pool_alloc_basic =================== [12:43:47] [PASSED] One page [12:43:47] [PASSED] More than one page [12:43:47] [PASSED] Above the allocation limit [12:43:47] [PASSED] One page, with coherent DMA mappings enabled [12:43:47] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [12:43:47] ============== [PASSED] ttm_pool_alloc_basic =============== [12:43:47] ============== ttm_pool_alloc_basic_dma_addr ============== [12:43:47] [PASSED] One page [12:43:47] [PASSED] More than one page [12:43:47] [PASSED] Above the allocation limit [12:43:47] [PASSED] One page, with coherent DMA mappings enabled [12:43:47] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [12:43:47] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ========== [12:43:47] [PASSED] ttm_pool_alloc_order_caching_match [12:43:47] [PASSED] ttm_pool_alloc_caching_mismatch [12:43:47] [PASSED] ttm_pool_alloc_order_mismatch [12:43:47] [PASSED] ttm_pool_free_dma_alloc [12:43:47] [PASSED] ttm_pool_free_no_dma_alloc [12:43:47] [PASSED] ttm_pool_fini_basic [12:43:47] ==================== [PASSED] ttm_pool ===================== [12:43:47] ================ ttm_resource (8 subtests) ================= [12:43:47] ================= ttm_resource_init_basic ================= [12:43:47] [PASSED] Init resource in TTM_PL_SYSTEM [12:43:47] [PASSED] Init resource in TTM_PL_VRAM [12:43:47] [PASSED] Init resource in a private placement [12:43:47] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags [12:43:47] ============= [PASSED] ttm_resource_init_basic ============= [12:43:47] [PASSED] ttm_resource_init_pinned [12:43:47] [PASSED] ttm_resource_fini_basic [12:43:47] [PASSED] ttm_resource_manager_init_basic [12:43:47] [PASSED] ttm_resource_manager_usage_basic [12:43:47] [PASSED] ttm_resource_manager_set_used_basic [12:43:47] [PASSED] ttm_sys_man_alloc_basic [12:43:47] [PASSED] ttm_sys_man_free_basic [12:43:47] ================== [PASSED] ttm_resource =================== [12:43:47] =================== ttm_tt (15 subtests) =================== [12:43:47] ==================== ttm_tt_init_basic ==================== [12:43:47] [PASSED] Page-aligned size [12:43:47] [PASSED] Extra pages requested [12:43:47] ================ [PASSED] ttm_tt_init_basic ================ [12:43:47] [PASSED] ttm_tt_init_misaligned [12:43:47] [PASSED] ttm_tt_fini_basic [12:43:47] [PASSED] ttm_tt_fini_sg [12:43:47] [PASSED] ttm_tt_fini_shmem [12:43:47] [PASSED] ttm_tt_create_basic [12:43:47] [PASSED] ttm_tt_create_invalid_bo_type [12:43:47] [PASSED] ttm_tt_create_ttm_exists [12:43:47] [PASSED] ttm_tt_create_failed [12:43:47] [PASSED] ttm_tt_destroy_basic [12:43:47] [PASSED] ttm_tt_populate_null_ttm [12:43:47] [PASSED] ttm_tt_populate_populated_ttm [12:43:47] [PASSED] ttm_tt_unpopulate_basic [12:43:47] [PASSED] ttm_tt_unpopulate_empty_ttm [12:43:47] [PASSED] ttm_tt_swapin_basic [12:43:47] ===================== [PASSED] ttm_tt ====================== [12:43:47] =================== ttm_bo (14 subtests) =================== [12:43:47] =========== ttm_bo_reserve_optimistic_no_ticket =========== [12:43:47] [PASSED] Cannot be interrupted and sleeps [12:43:47] [PASSED] Cannot be interrupted, locks straight away [12:43:47] [PASSED] Can be interrupted, sleeps [12:43:47] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket ======= [12:43:47] [PASSED] ttm_bo_reserve_locked_no_sleep [12:43:47] [PASSED] ttm_bo_reserve_no_wait_ticket [12:43:47] [PASSED] ttm_bo_reserve_double_resv [12:43:47] [PASSED] ttm_bo_reserve_interrupted [12:43:47] [PASSED] ttm_bo_reserve_deadlock [12:43:47] [PASSED] ttm_bo_unreserve_basic [12:43:47] [PASSED] ttm_bo_unreserve_pinned [12:43:47] [PASSED] ttm_bo_unreserve_bulk [12:43:47] [PASSED] ttm_bo_fini_basic [12:43:47] [PASSED] ttm_bo_fini_shared_resv [12:43:47] [PASSED] ttm_bo_pin_basic [12:43:47] [PASSED] ttm_bo_pin_unpin_resource [12:43:47] [PASSED] ttm_bo_multiple_pin_one_unpin [12:43:47] ===================== [PASSED] ttm_bo ====================== [12:43:47] ============== ttm_bo_validate (22 subtests) =============== [12:43:47] ============== ttm_bo_init_reserved_sys_man =============== [12:43:47] [PASSED] Buffer object for userspace [12:43:47] [PASSED] Kernel buffer object [12:43:47] [PASSED] Shared buffer object [12:43:47] ========== [PASSED] ttm_bo_init_reserved_sys_man =========== [12:43:47] ============== ttm_bo_init_reserved_mock_man ============== [12:43:47] [PASSED] Buffer object for userspace [12:43:47] [PASSED] Kernel buffer object [12:43:47] [PASSED] Shared buffer object [12:43:47] ========== [PASSED] ttm_bo_init_reserved_mock_man ========== [12:43:47] [PASSED] ttm_bo_init_reserved_resv [12:43:47] ================== ttm_bo_validate_basic ================== [12:43:47] [PASSED] Buffer object for userspace [12:43:47] [PASSED] Kernel buffer object [12:43:47] [PASSED] Shared buffer object [12:43:47] ============== [PASSED] ttm_bo_validate_basic ============== [12:43:47] [PASSED] ttm_bo_validate_invalid_placement [12:43:47] ============= ttm_bo_validate_same_placement ============== [12:43:47] [PASSED] System manager [12:43:47] [PASSED] VRAM manager [12:43:47] ========= [PASSED] ttm_bo_validate_same_placement ========== [12:43:47] [PASSED] ttm_bo_validate_failed_alloc [12:43:47] [PASSED] ttm_bo_validate_pinned [12:43:47] [PASSED] ttm_bo_validate_busy_placement [12:43:47] ================ ttm_bo_validate_multihop ================= [12:43:47] [PASSED] Buffer object for userspace [12:43:47] [PASSED] Kernel buffer object [12:43:47] [PASSED] Shared buffer object [12:43:47] ============ [PASSED] ttm_bo_validate_multihop ============= [12:43:47] ========== ttm_bo_validate_no_placement_signaled ========== [12:43:47] [PASSED] Buffer object in system domain, no page vector [12:43:47] [PASSED] Buffer object in system domain with an existing page vector [12:43:47] ====== [PASSED] ttm_bo_validate_no_placement_signaled ====== [12:43:47] ======== ttm_bo_validate_no_placement_not_signaled ======== [12:43:47] [PASSED] Buffer object for userspace [12:43:47] [PASSED] Kernel buffer object [12:43:47] [PASSED] Shared buffer object [12:43:47] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ==== [12:43:47] [PASSED] ttm_bo_validate_move_fence_signaled [12:43:47] ========= ttm_bo_validate_move_fence_not_signaled ========= [12:43:47] [PASSED] Waits for GPU [12:43:47] [PASSED] Tries to lock straight away [12:43:47] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled ===== [12:43:47] [PASSED] ttm_bo_validate_swapout [12:43:47] [PASSED] ttm_bo_validate_happy_evict [12:43:47] [PASSED] ttm_bo_validate_all_pinned_evict [12:43:47] [PASSED] ttm_bo_validate_allowed_only_evict [12:43:47] [PASSED] ttm_bo_validate_deleted_evict [12:43:47] [PASSED] ttm_bo_validate_busy_domain_evict [12:43:47] [PASSED] ttm_bo_validate_evict_gutting [12:43:47] [PASSED] ttm_bo_validate_recrusive_evict [12:43:47] ================= [PASSED] ttm_bo_validate ================= [12:43:47] ============================================================ [12:43:47] Testing complete. Ran 102 tests: passed: 102 [12:43:47] Elapsed time: 12.925s total, 2.438s configuring, 10.272s building, 0.177s running + for kcfg in "${kunitconfigs[@]}" + [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]] + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig [12:43:47] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [12:43:50] 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 [12:43:58] Starting KUnit Kernel (1/1)... [12:43:58] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [12:43:58] =============== dma-buf-fence (12 subtests) ================ [12:43:58] [PASSED] test_sanitycheck [12:43:58] [PASSED] test_signaling [12:43:58] [PASSED] test_add_callback [12:43:58] [PASSED] test_late_add_callback [12:43:58] [PASSED] test_rm_callback [12:43:58] [PASSED] test_late_rm_callback [12:43:58] [PASSED] test_status [12:43:58] [PASSED] test_error [12:43:59] [PASSED] test_wait [12:43:59] [PASSED] test_wait_timeout [12:43:59] [PASSED] test_stub [12:43:59] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs) [12:43:59] ================== [PASSED] dma-buf-fence ================== [12:43:59] ============ dma-buf-fence-chain (11 subtests) ============= [12:43:59] [PASSED] test_sanitycheck [12:43:59] [PASSED] test_find_seqno [12:43:59] [PASSED] test_find_signaled [12:43:59] [PASSED] test_find_out_of_order [12:44:04] [PASSED] test_find_gap [12:44:04] [PASSED] test_find_race [12:44:04] [PASSED] test_signal_forward [12:44:04] [PASSED] test_signal_backward [12:44:04] [PASSED] test_wait_forward [12:44:04] [PASSED] test_wait_backward [12:44:04] [PASSED] test_wait_random [12:44:04] =============== [PASSED] dma-buf-fence-chain =============== [12:44:04] ============ dma-buf-fence-unwrap (11 subtests) ============ [12:44:04] [PASSED] test_sanitycheck [12:44:04] [PASSED] test_unwrap_array [12:44:04] [PASSED] test_unwrap_chain [12:44:04] [PASSED] test_unwrap_chain_array [12:44:04] [PASSED] test_unwrap_merge [12:44:04] [PASSED] test_unwrap_merge_duplicate [12:44:04] [PASSED] test_unwrap_merge_seqno [12:44:04] [PASSED] test_unwrap_merge_order [12:44:04] [PASSED] test_unwrap_merge_complex [12:44:04] [PASSED] test_unwrap_merge_complex_seqno [12:44:04] [PASSED] test_dedup_empty [12:44:04] ============== [PASSED] dma-buf-fence-unwrap =============== [12:44:04] ================ dma-buf-resv (5 subtests) ================= [12:44:04] [PASSED] test_sanitycheck [12:44:04] ===================== test_signaling ====================== [12:44:04] [PASSED] kernel [12:44:04] [PASSED] write [12:44:04] [PASSED] read [12:44:04] [PASSED] bookkeep [12:44:04] ================= [PASSED] test_signaling ================== [12:44:04] ====================== test_for_each ====================== [12:44:04] [PASSED] kernel [12:44:04] [PASSED] write [12:44:04] [PASSED] read [12:44:04] [PASSED] bookkeep [12:44:04] ================== [PASSED] test_for_each ================== [12:44:04] ================= test_for_each_unlocked ================== [12:44:04] [PASSED] kernel [12:44:04] [PASSED] write [12:44:04] [PASSED] read [12:44:04] [PASSED] bookkeep [12:44:04] ============= [PASSED] test_for_each_unlocked ============== [12:44:04] ===================== test_get_fences ===================== [12:44:04] [PASSED] kernel [12:44:04] [PASSED] write [12:44:04] [PASSED] read [12:44:04] [PASSED] bookkeep [12:44:04] ================= [PASSED] test_get_fences ================= [12:44:04] ================== [PASSED] dma-buf-resv =================== [12:44:04] ============================================================ [12:44:04] Testing complete. Ran 51 tests: passed: 50, skipped: 1 [12:44:04] Elapsed time: 16.701s total, 2.572s configuring, 8.858s building, 5.262s running + cleanup ++ stat -c %u:%g /kernel + chown -R 1003:1003 /kernel ^ permalink raw reply [flat|nested] 19+ messages in thread
* ✓ Xe.CI.BAT: success for drm/ttm, drm/xe: Per-BO host NUMA node placement 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray ` (7 preceding siblings ...) 2026-11-02 12:44 ` ✓ CI.KUnit: success for drm/ttm, drm/xe: Per-BO host NUMA node placement Patchwork @ 2026-11-02 13:22 ` Patchwork 2026-11-02 14:55 ` ✓ Xe.CI.FULL: " Patchwork 9 siblings, 0 replies; 19+ messages in thread From: Patchwork @ 2026-11-02 13:22 UTC (permalink / raw) To: Himal Prasad Ghimiray; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 871 bytes --] == Series Details == Series: drm/ttm, drm/xe: Per-BO host NUMA node placement URL : https://patchwork.freedesktop.org/series/177437/ State : success == Summary == CI Bug Log - changes from xe-6043-77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee_BAT -> xe-pw-177437v1_BAT ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (15 -> 15) ------------------------------ No changes in participating hosts Changes ------- No changes found Build changes ------------- * Linux: xe-6043-77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee -> xe-pw-177437v1 IGT_9173: 9173 xe-6043-77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee: 77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee xe-pw-177437v1: 177437v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177437v1/index.html [-- Attachment #2: Type: text/html, Size: 1419 bytes --] ^ permalink raw reply [flat|nested] 19+ messages in thread
* ✓ Xe.CI.FULL: success for drm/ttm, drm/xe: Per-BO host NUMA node placement 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray ` (8 preceding siblings ...) 2026-11-02 13:22 ` ✓ Xe.CI.BAT: " Patchwork @ 2026-11-02 14:55 ` Patchwork 9 siblings, 0 replies; 19+ messages in thread From: Patchwork @ 2026-11-02 14:55 UTC (permalink / raw) To: Himal Prasad Ghimiray; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 871 bytes --] == Series Details == Series: drm/ttm, drm/xe: Per-BO host NUMA node placement URL : https://patchwork.freedesktop.org/series/177437/ State : success == Summary == CI Bug Log - changes from xe-6043-77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee_FULL -> xe-pw-177437v1_FULL ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (3 -> 3) ------------------------------ No changes in participating hosts Changes ------- No changes found Build changes ------------- * Linux: xe-6043-77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee -> xe-pw-177437v1 IGT_9173: 9173 xe-6043-77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee: 77e9b8bc2afe3ad1cff8570dcae1bf0998fcffee xe-pw-177437v1: 177437v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177437v1/index.html [-- Attachment #2: Type: text/html, Size: 1419 bytes --] ^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2026-11-02 18:24 UTC | newest] Thread overview: 19+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-11-02 10:18 [RFC 0/7] drm/ttm, drm/xe: Per-BO host NUMA node placement Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 1/7] drm/ttm/pool: Add ttm_pool_alloc_node() for caller-selected NUMA node Himal Prasad Ghimiray 2026-11-02 10:26 ` sashiko-bot 2026-11-02 10:50 ` Christian König 2026-11-02 12:46 ` Thomas Hellström 2026-11-02 10:18 ` [RFC 2/7] drm/ttm: Add NUMA node aware restore helpers Himal Prasad Ghimiray 2026-11-02 10:26 ` sashiko-bot 2026-11-02 10:18 ` [RFC 3/7] drm/ttm/pool: enforce per-node cache limits on free Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 4/7] drm/xe/bo: Plumb a per-BO host NUMA node hint into tt populate Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 5/7] drm/xe/bo: Preserve the host NUMA node across backup / restore Himal Prasad Ghimiray 2026-11-02 10:18 ` [RFC 6/7] drm/xe/uapi: Add GEM_CREATE NUMA node placement property Himal Prasad Ghimiray 2026-11-02 10:27 ` sashiko-bot 2026-11-02 10:18 ` [RFC 7/7] drm/xe/uapi: Wire up GEM_CREATE NUMA node placement handler Himal Prasad Ghimiray 2026-11-02 10:29 ` sashiko-bot 2026-11-02 11:12 ` Matthew Auld 2026-11-02 18:24 ` Himal prasad Ghimiray 2026-11-02 12:44 ` ✓ CI.KUnit: success for drm/ttm, drm/xe: Per-BO host NUMA node placement Patchwork 2026-11-02 13:22 ` ✓ Xe.CI.BAT: " Patchwork 2026-11-02 14:55 ` ✓ Xe.CI.FULL: " Patchwork
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.