From: "Summers, Stuart" <stuart.summers@intel.com>
To: "intel-xe@lists.freedesktop.org" <intel-xe@lists.freedesktop.org>,
"Brost, Matthew" <matthew.brost@intel.com>
Subject: Re: [PATCH v4 05/12] drm/xe: Add vm to exec queues association
Date: Tue, 13 Jan 2026 21:26:32 +0000 [thread overview]
Message-ID: <2835894e30e0930a752dbb0f9c57bda7c8376abd.camel@intel.com> (raw)
In-Reply-To: <20260113025232.3504648-6-matthew.brost@intel.com>
On Mon, 2026-01-12 at 18:52 -0800, Matthew Brost wrote:
> Maintain a list of exec queues per vm which will be used by TLB
> invalidation code to do context-ID based tlb invalidations.
>
> v4:
> - More asserts (Stuart)
> - Per GT list (CI)
> - Skip adding / removal if context TLB invalidatiions not supported
> (Stuart)
>
> Signed-off-by: Nirmoy Das <nirmoy.das@intel.com>
> Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> Reviewed-by: Stuart Summers <stuart.summers@intel.com>
R-B on these latest changes, although still predicated on what happens
in that later patch that does the actual invalidation list add/remove
and invalidation sent, since that's where the active check is
happening. If we decide to move away from that approach, this patch
will need to be changed too (or we can go with the prior approach of
merging as-is and fixing the GuC side later).
Thanks,
Stuart
> ---
> drivers/gpu/drm/xe/xe_device.h | 7 ---
> drivers/gpu/drm/xe/xe_device_types.h | 7 +++
> drivers/gpu/drm/xe/xe_exec_queue.c | 7 ++-
> drivers/gpu/drm/xe/xe_exec_queue_types.h | 3 ++
> drivers/gpu/drm/xe/xe_vm.c | 62
> ++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_vm.h | 3 ++
> drivers/gpu/drm/xe/xe_vm_types.h | 16 ++++++
> 7 files changed, 97 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_device.h
> b/drivers/gpu/drm/xe/xe_device.h
> index d25421e5181c..58d7d8b2fea3 100644
> --- a/drivers/gpu/drm/xe/xe_device.h
> +++ b/drivers/gpu/drm/xe/xe_device.h
> @@ -62,13 +62,6 @@ static inline struct xe_tile
> *xe_device_get_root_tile(struct xe_device *xe)
> return &xe->tiles[0];
> }
>
> -/*
> - * Highest GT/tile count for any platform. Used only for memory
> allocation
> - * sizing. Any logic looping over GTs or mapping userspace GT IDs
> into GT
> - * structures should use the per-platform xe->info.max_gt_per_tile
> instead.
> - */
> -#define XE_MAX_GT_PER_TILE 2
> -
> static inline struct xe_gt *xe_device_get_gt(struct xe_device *xe,
> u8 gt_id)
> {
> struct xe_tile *tile;
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h
> b/drivers/gpu/drm/xe/xe_device_types.h
> index 57cb5533679d..b51acff4edcd 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -79,6 +79,13 @@ enum xe_wedged_mode {
> #define XE_GT1 1
> #define XE_MAX_TILES_PER_DEVICE (XE_GT1 + 1)
>
> +/*
> + * Highest GT/tile count for any platform. Used only for memory
> allocation
> + * sizing. Any logic looping over GTs or mapping userspace GT IDs
> into GT
> + * structures should use the per-platform xe->info.max_gt_per_tile
> instead.
> + */
> +#define XE_MAX_GT_PER_TILE 2
> +
> #define XE_MAX_ASID (BIT(20))
>
> #define IS_PLATFORM_STEP(_xe, _platform, min_step, max_step) \
> diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c
> b/drivers/gpu/drm/xe/xe_exec_queue.c
> index b5737563ee14..ce309d848916 100644
> --- a/drivers/gpu/drm/xe/xe_exec_queue.c
> +++ b/drivers/gpu/drm/xe/xe_exec_queue.c
> @@ -154,8 +154,10 @@ static void __xe_exec_queue_free(struct
> xe_exec_queue *q)
> if (xe_exec_queue_is_multi_queue(q))
> xe_exec_queue_group_cleanup(q);
>
> - if (q->vm)
> + if (q->vm) {
> + xe_vm_remove_exec_queue(q->vm, q);
> xe_vm_put(q->vm);
> + }
>
> if (q->xef)
> xe_file_put(q->xef);
> @@ -226,6 +228,7 @@ static struct xe_exec_queue
> *__xe_exec_queue_alloc(struct xe_device *xe,
> q->ring_ops = gt->ring_ops[hwe->class];
> q->ops = gt->exec_queue_ops;
> INIT_LIST_HEAD(&q->lr.link);
> + INIT_LIST_HEAD(&q->vm_exec_queue_link);
> INIT_LIST_HEAD(&q->multi_gt_link);
> INIT_LIST_HEAD(&q->hw_engine_group_link);
> INIT_LIST_HEAD(&q->pxp.link);
> @@ -1205,6 +1208,8 @@ int xe_exec_queue_create_ioctl(struct
> drm_device *dev, void *data,
> }
>
> q->xef = xe_file_get(xef);
> + if (eci[0].engine_class != DRM_XE_ENGINE_CLASS_VM_BIND)
> + xe_vm_add_exec_queue(vm, q);
>
> /* user id alloc must always be last in ioctl to prevent UAF
> */
> err = xa_alloc(&xef->exec_queue.xa, &id, q, xa_limit_32b,
> GFP_KERNEL);
> diff --git a/drivers/gpu/drm/xe/xe_exec_queue_types.h
> b/drivers/gpu/drm/xe/xe_exec_queue_types.h
> index 5fc516b0bb77..d3e2789cf5bc 100644
> --- a/drivers/gpu/drm/xe/xe_exec_queue_types.h
> +++ b/drivers/gpu/drm/xe/xe_exec_queue_types.h
> @@ -205,6 +205,9 @@ struct xe_exec_queue {
> struct dma_fence *last_fence;
> } tlb_inval[XE_EXEC_QUEUE_TLB_INVAL_COUNT];
>
> + /** @vm_exec_queue_link: Link to track exec queue within a
> VM's list of exec queues. */
> + struct list_head vm_exec_queue_link;
> +
> /** @pxp: PXP info tracking */
> struct {
> /** @pxp.type: PXP session type used by this queue */
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index bdb04d6bf39c..6ab6706e77de 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -1530,11 +1530,24 @@ struct xe_vm *xe_vm_create(struct xe_device
> *xe, u32 flags, struct xe_file *xef)
> INIT_WORK(&vm->destroy_work, vm_destroy_work_func);
>
> INIT_LIST_HEAD(&vm->preempt.exec_queues);
> + for (id = 0; id < XE_MAX_TILES_PER_DEVICE *
> XE_MAX_GT_PER_TILE; ++id)
> + INIT_LIST_HEAD(&vm->exec_queues.list[id]);
> if (flags & XE_VM_FLAG_FAULT_MODE)
> vm->preempt.min_run_period_ms = xe-
> >min_run_period_pf_ms;
> else
> vm->preempt.min_run_period_ms = xe-
> >min_run_period_lr_ms;
>
> + init_rwsem(&vm->exec_queues.lock);
> + if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
> + fs_reclaim_acquire(GFP_KERNEL);
> + might_lock(&vm->exec_queues.lock);
> + fs_reclaim_release(GFP_KERNEL);
> +
> + down_read(&vm->exec_queues.lock);
> + might_lock(&xe_root_mmio_gt(xe)->uc.guc.ct.lock);
> + up_read(&vm->exec_queues.lock);
> + }
> +
> for_each_tile(tile, xe, id)
> xe_range_fence_tree_init(&vm->rftree[id]);
>
> @@ -4570,3 +4583,52 @@ int xe_vm_alloc_cpu_addr_mirror_vma(struct
> xe_vm *vm, uint64_t start, uint64_t r
> return xe_vm_alloc_vma(vm, &map_req, false);
> }
>
> +/**
> + * xe_vm_add_exec_queue() - Add exec queue to VM
> + * @vm: The VM.
> + * @q: The exec_queue
> + *
> + * Add exec queue to VM, skipped if the device does not have context
> based TLB
> + * invalidations.
> + */
> +void xe_vm_add_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q)
> +{
> + struct xe_device *xe = vm->xe;
> +
> + /* User VMs and queues only */
> + xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_KERNEL));
> + xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_PERMANENT));
> + xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_VM));
> + xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_MIGRATE));
> + xe_assert(xe, vm->xef);
> + xe_assert(xe, vm == q->vm);
> +
> + if (!xe->info.has_ctx_tlb_inval)
> + return;
> +
> + down_write(&vm->exec_queues.lock);
> + list_add(&q->vm_exec_queue_link, &vm->exec_queues.list[q->gt-
> >info.id]);
> + ++vm->exec_queues.count[q->gt->info.id];
> + up_write(&vm->exec_queues.lock);
> +}
> +
> +/**
> + * xe_vm_remove_exec_queue() - Remove exec queue from VM
> + * @vm: The VM.
> + * @q: The exec_queue
> + *
> + * Remove exec queue from VM, skipped if the device does not have
> context based
> + * TLB invalidations.
> + */
> +void xe_vm_remove_exec_queue(struct xe_vm *vm, struct xe_exec_queue
> *q)
> +{
> + if (!vm->xe->info.has_ctx_tlb_inval)
> + return;
> +
> + down_write(&vm->exec_queues.lock);
> + if (!list_empty(&q->vm_exec_queue_link)) {
> + list_del(&q->vm_exec_queue_link);
> + --vm->exec_queues.count[q->gt->info.id];
> + }
> + up_write(&vm->exec_queues.lock);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> index 6cc98df47291..288115c7844a 100644
> --- a/drivers/gpu/drm/xe/xe_vm.h
> +++ b/drivers/gpu/drm/xe/xe_vm.h
> @@ -287,6 +287,9 @@ static inline struct dma_resv *xe_vm_resv(struct
> xe_vm *vm)
>
> void xe_vm_kill(struct xe_vm *vm, bool unlocked);
>
> +void xe_vm_add_exec_queue(struct xe_vm *vm, struct xe_exec_queue
> *q);
> +void xe_vm_remove_exec_queue(struct xe_vm *vm, struct xe_exec_queue
> *q);
> +
> /**
> * xe_vm_assert_held(vm) - Assert that the vm's reservation object
> is held.
> * @vm: The vm
> diff --git a/drivers/gpu/drm/xe/xe_vm_types.h
> b/drivers/gpu/drm/xe/xe_vm_types.h
> index 437f64202f3b..43203e90ee3e 100644
> --- a/drivers/gpu/drm/xe/xe_vm_types.h
> +++ b/drivers/gpu/drm/xe/xe_vm_types.h
> @@ -298,6 +298,22 @@ struct xe_vm {
> struct list_head pm_activate_link;
> } preempt;
>
> + /** @exec_queues: Manages list of exec queues attached to
> this VM, protected by lock. */
> + struct {
> + /**
> + * @exec_queues.list: list of exec queues attached to
> this VM,
> + * per GT
> + */
> + struct list_head list[XE_MAX_TILES_PER_DEVICE *
> XE_MAX_GT_PER_TILE];
> + /**
> + * @exec_queues.count: count of exec queues attached
> to this VM,
> + * per GT
> + */
> + int count[XE_MAX_TILES_PER_DEVICE *
> XE_MAX_GT_PER_TILE];
> + /** @exec_queues.lock: lock to protect exec_queues
> list */
> + struct rw_semaphore lock;
> + } exec_queues;
> +
> /** @um: unified memory state */
> struct {
> /** @asid: address space ID, unique to each VM */
next prev parent reply other threads:[~2026-01-13 21:26 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-13 2:52 [PATCH v4 00/12] Context based TLB invalidations Matthew Brost
2026-01-13 2:52 ` [PATCH v4 01/12] drm/xe: Add normalize_invalidation_range Matthew Brost
2026-01-13 2:52 ` [PATCH v4 02/12] drm/xe: Make usm.asid_to_vm allocation use GFP_NOWAIT Matthew Brost
2026-01-13 2:52 ` [PATCH v4 03/12] drm/xe: Add has_ctx_tlb_inval to device info Matthew Brost
2026-01-13 21:24 ` Summers, Stuart
2026-01-13 2:52 ` [PATCH v4 04/12] drm/xe: Add xe_device_asid_to_vm helper Matthew Brost
2026-01-13 2:52 ` [PATCH v4 05/12] drm/xe: Add vm to exec queues association Matthew Brost
2026-01-13 21:26 ` Summers, Stuart [this message]
2026-01-13 2:52 ` [PATCH v4 06/12] drm/xe: Taint TLB invalidation seqno lock with GFP_KERNEL Matthew Brost
2026-01-13 2:52 ` [PATCH v4 07/12] drm/xe: Rename send_tlb_inval_ppgtt to send_tlb_inval_asid_ppgtt Matthew Brost
2026-01-13 2:52 ` [PATCH v4 08/12] drm/xe: Add send_tlb_inval_ppgtt helper Matthew Brost
2026-01-13 2:52 ` [PATCH v4 09/12] drm/xe: Add xe_tlb_inval_idle helper Matthew Brost
2026-01-13 2:52 ` [PATCH v4 10/12] drm/xe: Add exec queue active vfunc Matthew Brost
2026-01-13 21:32 ` Summers, Stuart
2026-01-13 22:16 ` Matthew Brost
2026-01-13 22:21 ` Summers, Stuart
2026-01-14 21:17 ` Summers, Stuart
2026-01-13 2:52 ` [PATCH v4 11/12] drm/xe: Add context-based invalidation to GuC TLB invalidation backend Matthew Brost
2026-01-13 21:23 ` Summers, Stuart
2026-01-13 22:08 ` Matthew Brost
2026-01-13 23:25 ` Summers, Stuart
2026-01-14 0:25 ` Matthew Brost
2026-01-13 2:52 ` [PATCH v4 12/12] drm/xe: Enable context TLB invalidations for CI Matthew Brost
2026-01-13 3:00 ` ✓ CI.KUnit: success for Context based TLB invalidations (rev4) Patchwork
2026-01-13 3:41 ` ✓ Xe.CI.BAT: " Patchwork
2026-01-13 9:45 ` ✓ Xe.CI.Full: " Patchwork
2026-01-16 0:25 ` [PATCH v4 00/12] Context based TLB invalidations Summers, Stuart
2026-01-16 1:52 ` Matthew Brost
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2835894e30e0930a752dbb0f9c57bda7c8376abd.camel@intel.com \
--to=stuart.summers@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=matthew.brost@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox