From: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
To: Matthew Brost <matthew.brost@intel.com>,
intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: apopple@nvidia.com, airlied@gmail.com, christian.koenig@amd.com,
simona.vetter@ffwll.ch, felix.kuehling@amd.com, dakr@kernel.org
Subject: Re: [PATCH v2 09/29] drm/xe: Add SVM range invalidation
Date: Tue, 19 Nov 2024 14:56:12 +0100 [thread overview]
Message-ID: <12b541d3a1b46434032afc1bcb9ce90428aa24a5.camel@linux.intel.com> (raw)
In-Reply-To: <20241016032518.539495-10-matthew.brost@intel.com>
On Tue, 2024-10-15 at 20:24 -0700, Matthew Brost wrote:
> Add SVM range invalidation vfunc.
>
> v2:
> - Don't run invalidation if VM is closed
> - Cycle notifier lock in xe_svm_close
> - Drop xe_gt_tlb_invalidation_fence_fini
>
> Signed-off-by: Matthew Brost <matthew.brost@intel.com>
> ---
> drivers/gpu/drm/xe/xe_gt_pagefault.c | 17 ++-
> drivers/gpu/drm/xe/xe_pt.c | 24 ++++
> drivers/gpu/drm/xe/xe_pt.h | 3 +
> drivers/gpu/drm/xe/xe_svm.c | 205
> ++++++++++++++++++++++++++-
> drivers/gpu/drm/xe/xe_svm.h | 13 ++
> 5 files changed, 256 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c
> b/drivers/gpu/drm/xe/xe_gt_pagefault.c
> index 79c426dc2505..92923947a12c 100644
> --- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
> @@ -19,6 +19,7 @@
> #include "xe_guc.h"
> #include "xe_guc_ct.h"
> #include "xe_migrate.h"
> +#include "xe_svm.h"
> #include "xe_trace_bo.h"
> #include "xe_vm.h"
>
> @@ -125,18 +126,17 @@ static int xe_pf_begin(struct drm_exec *exec,
> struct xe_vma *vma,
> return 0;
> }
>
> -static int handle_vma_pagefault(struct xe_tile *tile, struct
> pagefault *pf,
> - struct xe_vma *vma)
> +static int handle_vma_pagefault(struct xe_tile *tile, struct xe_vma
> *vma,
> + bool atomic)
> {
> struct xe_vm *vm = xe_vma_vm(vma);
> struct drm_exec exec;
> struct dma_fence *fence;
> ktime_t end = 0;
> int err;
> - bool atomic;
>
> + lockdep_assert_held_write(&vm->lock);
> trace_xe_vma_pagefault(vma);
> - atomic = access_is_atomic(pf->access_type);
>
> /* Check if VMA is valid */
> if (vma_is_valid(tile, vma) && !atomic)
> @@ -207,6 +207,7 @@ static int handle_pagefault(struct xe_gt *gt,
> struct pagefault *pf)
> struct xe_vm *vm;
> struct xe_vma *vma = NULL;
> int err;
> + bool atomic;
>
> /* SW isn't expected to handle TRTT faults */
> if (pf->trva_fault)
> @@ -232,7 +233,13 @@ static int handle_pagefault(struct xe_gt *gt,
> struct pagefault *pf)
> goto unlock_vm;
> }
>
> - err = handle_vma_pagefault(tile, pf, vma);
> + atomic = access_is_atomic(pf->access_type);
> +
> + if (xe_vma_is_system_allocator(vma))
> + err = xe_svm_handle_pagefault(vm, vma, tile,
> + pf->page_addr,
> atomic);
> + else
> + err = handle_vma_pagefault(tile, vma, atomic);
>
> unlock_vm:
> if (!err)
> diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c
> index 39357e829b6d..282476c4edbd 100644
> --- a/drivers/gpu/drm/xe/xe_pt.c
> +++ b/drivers/gpu/drm/xe/xe_pt.c
> @@ -20,6 +20,7 @@
> #include "xe_res_cursor.h"
> #include "xe_sched_job.h"
> #include "xe_sync.h"
> +#include "xe_svm.h"
> #include "xe_trace.h"
> #include "xe_ttm_stolen_mgr.h"
> #include "xe_vm.h"
> @@ -829,6 +830,29 @@ bool xe_pt_zap_ptes(struct xe_tile *tile, struct
> xe_vma *vma)
> return xe_walk.needs_invalidate;
> }
>
> +bool xe_pt_zap_ptes_range(struct xe_tile *tile, struct xe_vm *vm,
> + struct xe_svm_range *range)
Kerneldoc.
Here, (and I saw Oak also commented around this some time ago) ideally
we should make xe_pt.c unaware of vmas and svm ranges, and in this
case, use the same xe_pt function for both.
> +{
> + struct xe_pt_zap_ptes_walk xe_walk = {
> + .base = {
> + .ops = &xe_pt_zap_ptes_ops,
> + .shifts = xe_normal_pt_shifts,
> + .max_level = XE_PT_HIGHEST_LEVEL,
> + },
> + .tile = tile,
> + };
> + struct xe_pt *pt = vm->pt_root[tile->id];
> + u8 pt_mask = (range->tile_present & ~range-
> >tile_invalidated);
> +
> + if (!(pt_mask & BIT(tile->id)))
> + return false;
> +
> + (void)xe_pt_walk_shared(&pt->base, pt->level, range-
> >base.va.start,
> + range->base.va.end, &xe_walk.base);
> +
> + return xe_walk.needs_invalidate;
> +}
> +
> static void
> xe_vm_populate_pgtable(struct xe_migrate_pt_update *pt_update,
> struct xe_tile *tile,
> struct iosys_map *map, void *data,
> diff --git a/drivers/gpu/drm/xe/xe_pt.h b/drivers/gpu/drm/xe/xe_pt.h
> index 9ab386431cad..5f333eeedf5c 100644
> --- a/drivers/gpu/drm/xe/xe_pt.h
> +++ b/drivers/gpu/drm/xe/xe_pt.h
> @@ -13,6 +13,7 @@ struct dma_fence;
> struct xe_bo;
> struct xe_device;
> struct xe_exec_queue;
> +struct xe_svm_range;
> struct xe_sync_entry;
> struct xe_tile;
> struct xe_vm;
> @@ -42,5 +43,7 @@ void xe_pt_update_ops_fini(struct xe_tile *tile,
> struct xe_vma_ops *vops);
> void xe_pt_update_ops_abort(struct xe_tile *tile, struct xe_vma_ops
> *vops);
>
> bool xe_pt_zap_ptes(struct xe_tile *tile, struct xe_vma *vma);
> +bool xe_pt_zap_ptes_range(struct xe_tile *tile, struct xe_vm *vm,
> + struct xe_svm_range *range);
>
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_svm.c
> b/drivers/gpu/drm/xe/xe_svm.c
> index 57b740367843..b2bc259978c4 100644
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
> @@ -5,18 +5,188 @@
>
> #include "drm_gpusvm.h"
>
> +#include "xe_gt_tlb_invalidation.h"
> +#include "xe_pt.h"
> #include "xe_svm.h"
> #include "xe_vm.h"
> #include "xe_vm_types.h"
>
> +static struct xe_vm *gpusvm_to_vm(struct drm_gpusvm *gpusvm)
> +{
> + return container_of(gpusvm, struct xe_vm, svm.gpusvm);
> +}
> +
> +static struct xe_vm *range_to_vm(struct drm_gpusvm_range *r)
> +{
> + return gpusvm_to_vm(r->gpusvm);
> +}
> +
> +static struct drm_gpusvm_range *
> +xe_svm_range_alloc(struct drm_gpusvm *gpusvm)
> +{
> + struct xe_svm_range *range;
> +
> + range = kzalloc(sizeof(*range), GFP_KERNEL);
> + if (!range)
> + return ERR_PTR(-ENOMEM);
> +
> + xe_vm_get(gpusvm_to_vm(gpusvm));
> +
> + return &range->base;
> +}
> +
> +static void xe_svm_range_free(struct drm_gpusvm_range *range)
> +{
> + xe_vm_put(range_to_vm(range));
> + kfree(range);
> +}
> +
> +static struct xe_svm_range *to_xe_range(struct drm_gpusvm_range *r)
> +{
> + return container_of(r, struct xe_svm_range, base);
> +}
> +
> +static u8
> +xe_svm_range_notifier_event_begin(struct xe_vm *vm, struct
> drm_gpusvm_range *r,
> + const struct mmu_notifier_range
> *mmu_range,
> + u64 *adj_start, u64 *adj_end)
> +{
> + struct xe_svm_range *range = to_xe_range(r);
> + struct xe_device *xe = vm->xe;
> + struct xe_tile *tile;
> + u8 tile_mask = 0;
> + u8 id;
> +
lockdep assert?
> + /* Skip if already unmapped or if no binding exist */
> + if (range->base.flags.unmapped || !range->tile_present)
> + return 0;
> +
> + /* Adjust invalidation to range boundaries */
> + if (range->base.va.start < mmu_range->start)
> + *adj_start = range->base.va.start;
> + if (range->base.va.end > mmu_range->end)
> + *adj_end = range->base.va.end;
> +
> + /*
> + * XXX: Ideally would zap PTEs in one shot in
> xe_svm_invalidate but the
> + * invalidation code can't correctly cope with sparse ranges
> or
> + * invalidations spanning multiple ranges.
> + */
> + for_each_tile(tile, xe, id)
> + if (xe_pt_zap_ptes_range(tile, vm, range)) {
> + tile_mask |= BIT(id);
> + range->tile_invalidated |= BIT(id);
> + }
> +
> + return tile_mask;
> +}
> +
> +static void
> +xe_svm_range_notifier_event_end(struct xe_vm *vm, struct
> drm_gpusvm_range *r,
> + const struct mmu_notifier_range
> *mmu_range)
> +{
> + struct drm_gpusvm_ctx ctx = { .in_notifier = true, };
> +
> + drm_gpusvm_range_unmap_pages(&vm->svm.gpusvm, r, &ctx);
> + /* TODO: Add range to garbage collector */
> +}
> +
> static void xe_svm_invalidate(struct drm_gpusvm *gpusvm,
> struct drm_gpusvm_notifier *notifier,
> const struct mmu_notifier_range
> *mmu_range)
> {
> - /* TODO: Implement */
> + struct xe_vm *vm = gpusvm_to_vm(gpusvm);
> + struct xe_device *xe = vm->xe;
> + struct xe_tile *tile;
> + struct drm_gpusvm_range *r, *first;
> + struct xe_gt_tlb_invalidation_fence
> + fence[XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE];
> + u64 adj_start = mmu_range->start, adj_end = mmu_range->end;
> + u8 tile_mask = 0;
> + u8 id;
> + u32 fence_id = 0;
> + long err;
> +
> + if (xe_vm_is_closed(vm))
> + return;
How do we ensure we don't race here? Are we sure that all dma mappings
and all PTEs pointing to the range is gone at this point? Becase "They
will soon be gone anyway" isn't enough.
> +
> + /* Adjust invalidation to notifier boundaries */
> + if (adj_start < notifier->interval.start)
> + adj_start = notifier->interval.start;
> + if (adj_end > notifier->interval.end)
> + adj_end = notifier->interval.end;
> +
> + first = drm_gpusvm_range_find(notifier, adj_start, adj_end);
> + if (!first)
> + return;
> +
> + /*
> + * XXX: Less than ideal to always wait on VM's resv slots if
> an
> + * invalidation is not required. Could walk range list twice
> to figure
> + * out if an invalidations is need, but also not ideal.
> Maybe a counter
> + * within the notifier, seems like that could work.
> + */
> + err = dma_resv_wait_timeout(xe_vm_resv(vm),
> + DMA_RESV_USAGE_BOOKKEEP,
> + false, MAX_SCHEDULE_TIMEOUT);
> + XE_WARN_ON(err <= 0);
> +
> + r = first;
> + drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end)
> + tile_mask |= xe_svm_range_notifier_event_begin(vm,
> r, mmu_range,
> +
> &adj_start,
> +
> &adj_end);
> + if (!tile_mask)
> + goto range_notifier_event_end;
> +
> + xe_device_wmb(xe);
> +
> + for_each_tile(tile, xe, id) {
> + if (tile_mask & BIT(id)) {
> + int err;
> +
> + xe_gt_tlb_invalidation_fence_init(tile-
> >primary_gt,
> +
> &fence[fence_id], true);
> +
> + err = xe_gt_tlb_invalidation_range(tile-
> >primary_gt,
> +
> &fence[fence_id],
> +
> adj_start,
> + adj_end,
> + vm-
> >usm.asid);
> + if (WARN_ON_ONCE(err < 0))
> + goto wait;
> + ++fence_id;
> +
> + if (!tile->media_gt)
> + continue;
> +
> + xe_gt_tlb_invalidation_fence_init(tile-
> >media_gt,
> +
> &fence[fence_id], true);
> +
> + err = xe_gt_tlb_invalidation_range(tile-
> >media_gt,
> +
> &fence[fence_id],
> +
> adj_start,
> + adj_end,
> + vm-
> >usm.asid);
> + if (WARN_ON_ONCE(err < 0))
> + goto wait;
> + ++fence_id;
> + }
> + }
> +
> +wait:
> + for (id = 0; id < fence_id; ++id)
> + xe_gt_tlb_invalidation_fence_wait(&fence[id]);
> +
> +range_notifier_event_end:
> + r = first;
> + drm_gpusvm_for_each_range(r, notifier, adj_start, adj_end)
> + xe_svm_range_notifier_event_end(vm, r, mmu_range);
> }
>
> static const struct drm_gpusvm_ops gpusvm_ops = {
> + .range_alloc = xe_svm_range_alloc,
> + .range_free = xe_svm_range_free,
> .invalidate = xe_svm_invalidate,
> };
>
> @@ -36,6 +206,11 @@ int xe_svm_init(struct xe_vm *vm)
>
> void xe_svm_close(struct xe_vm *vm)
> {
> + xe_assert(vm->xe, xe_vm_is_closed(vm));
> +
> + /* Flush running notifiers making xe_vm_close() visable */
> + drm_gpusvm_notifier_lock(&vm->svm.gpusvm);
> + drm_gpusvm_notifier_unlock(&vm->svm.gpusvm);
Calling mmu_notifier_read_begin() ensures that nothing is invalidating
on the range. Probably a better choice.
> }
>
> void xe_svm_fini(struct xe_vm *vm)
> @@ -44,3 +219,31 @@ void xe_svm_fini(struct xe_vm *vm)
>
> drm_gpusvm_fini(&vm->svm.gpusvm);
> }
> +
> +int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
> + struct xe_tile *tile, u64 fault_addr,
> + bool atomic)
> +{
> + struct drm_gpusvm_ctx ctx = { .read_only =
> xe_vma_read_only(vma), };
> + struct drm_gpusvm_range *r;
> + int err;
> +
> + lockdep_assert_held_write(&vm->lock);
> +
> +retry:
> + /* TODO: Run garbage collector */
> +
> + r = drm_gpusvm_range_find_or_insert(&vm->svm.gpusvm,
> fault_addr,
> + xe_vma_start(vma),
> xe_vma_end(vma),
> + &ctx);
> + if (IS_ERR(r))
> + return PTR_ERR(r);
> +
> + err = drm_gpusvm_range_get_pages(&vm->svm.gpusvm, r, false);
> + if (err == -EFAULT || err == -EPERM) /* Corner where CPU
> mappings have change */
s/change/changed/
> + goto retry;
> +
> + /* TODO: Issue bind */
> +
> + return err;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_svm.h
> b/drivers/gpu/drm/xe/xe_svm.h
> index 376e86876a11..c91c5f538024 100644
> --- a/drivers/gpu/drm/xe/xe_svm.h
> +++ b/drivers/gpu/drm/xe/xe_svm.h
> @@ -6,14 +6,27 @@
> #ifndef _XE_SVM_H_
> #define _XE_SVM_H_
>
> +#include "drm_gpusvm.h"
> #include "drm_pagemap.h"
>
> #define XE_INTERCONNECT_VRAM DRM_INTERCONNECT_DRIVER
Not used yet
>
> +struct xe_tile;
> struct xe_vm;
> +struct xe_vma;
> +
> +struct xe_svm_range {
> + struct drm_gpusvm_range base;
> + u8 tile_present;
> + u8 tile_invalidated;
> +};
Kerneldoc
>
> int xe_svm_init(struct xe_vm *vm);
> void xe_svm_fini(struct xe_vm *vm);
> void xe_svm_close(struct xe_vm *vm);
>
> +int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
> + struct xe_tile *tile, u64 fault_addr,
> + bool atomic);
> +
> #endif
Thanks,
Thomas
next prev parent reply other threads:[~2024-11-19 13:56 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-16 3:24 [PATCH v2 00/29] Introduce GPU SVM and Xe SVM implementation Matthew Brost
2024-10-16 3:24 ` [PATCH v2 01/29] drm/xe: Retry BO allocation Matthew Brost
2024-10-16 3:24 ` [PATCH v2 02/29] mm/migrate: Add migrate_device_prepopulated_range Matthew Brost
2024-10-16 4:04 ` Alistair Popple
2024-10-16 4:46 ` Matthew Brost
2024-10-17 0:56 ` Matthew Brost
2024-10-17 1:49 ` Alistair Popple
2024-10-17 2:45 ` Matthew Brost
2024-10-17 3:21 ` Alistair Popple
2024-10-17 4:07 ` Matthew Brost
2024-10-17 5:49 ` Alistair Popple
2024-10-17 15:40 ` Matthew Brost
2024-10-17 21:58 ` Alistair Popple
2024-10-18 0:54 ` Matthew Brost
2024-10-18 5:59 ` Alistair Popple
2024-10-18 6:39 ` Mika Penttilä
2024-10-18 7:16 ` Matthew Brost
2024-10-18 7:33 ` Matthew Brost
2024-10-18 7:34 ` Alistair Popple
2024-10-18 7:57 ` Matthew Brost
2024-10-18 4:02 ` Mika Penttilä
2024-10-18 5:55 ` Alistair Popple
2024-10-16 3:24 ` [PATCH v2 03/29] mm/migrate: Trylock device page in do_swap_page Matthew Brost
2024-10-16 4:00 ` Alistair Popple
2024-10-16 4:41 ` Matthew Brost
2024-10-17 1:51 ` Alistair Popple
2024-10-25 0:31 ` Matthew Brost
2024-10-29 6:37 ` Alistair Popple
2024-11-01 17:19 ` Matthew Brost
2024-11-28 23:31 ` Alistair Popple
2024-12-13 22:16 ` Matthew Brost
2024-12-14 5:59 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 04/29] drm/pagemap: Add DRM pagemap Matthew Brost
2024-10-16 3:24 ` [PATCH v2 05/29] drm/gpusvm: Add support for GPU Shared Virtual Memory Matthew Brost
2024-10-31 18:58 ` Thomas Hellström
2024-11-04 22:53 ` Matthew Brost
2024-11-04 15:25 ` Thomas Hellström
2024-11-04 17:21 ` Matthew Brost
2024-11-04 18:59 ` Thomas Hellström
2024-11-04 23:07 ` Matthew Brost
2024-11-05 10:22 ` Thomas Hellström
2024-11-05 16:12 ` Matthew Brost
2024-11-05 16:28 ` Thomas Hellström
2024-11-05 14:48 ` Thomas Hellström
2024-11-05 16:32 ` Matthew Brost
2024-11-20 3:00 ` Gwan-gyeong Mun
2024-11-29 0:00 ` Alistair Popple
2024-12-14 1:16 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 06/29] drm/xe/uapi: Add DRM_XE_VM_BIND_FLAG_SYSTEM_ALLOCATON flag Matthew Brost
2024-11-18 13:44 ` Thomas Hellström
2024-11-19 16:01 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 07/29] drm/xe: Add SVM init / close / fini to faulting VMs Matthew Brost
2024-11-19 12:13 ` Thomas Hellström
2024-11-19 16:22 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 08/29] drm/xe: Add dma_addr res cursor Matthew Brost
2024-11-19 12:15 ` Thomas Hellström
2024-11-19 16:24 ` Matthew Brost
2024-10-16 3:24 ` [PATCH v2 09/29] drm/xe: Add SVM range invalidation Matthew Brost
2024-11-19 13:56 ` Thomas Hellström [this message]
2024-12-11 19:01 ` Matthew Brost
2024-12-14 23:11 ` Matthew Brost
2024-12-16 10:01 ` Thomas Hellström
2024-12-16 16:09 ` Matthew Brost
2024-12-16 17:35 ` Thomas Hellström
2024-10-16 3:24 ` [PATCH v2 10/29] drm/gpuvm: Add DRM_GPUVA_OP_USER Matthew Brost
2024-11-19 13:57 ` Thomas Hellström
2024-11-19 16:26 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 11/29] drm/xe: Add (re)bind to SVM page fault handler Matthew Brost
2024-11-19 14:26 ` Thomas Hellström
2024-12-11 19:07 ` Matthew Brost
2024-12-16 10:03 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 12/29] drm/xe: Add SVM garbage collector Matthew Brost
2024-11-19 14:45 ` Thomas Hellström
2024-12-11 19:17 ` Matthew Brost
2024-12-16 10:36 ` Thomas Hellström
2024-12-16 23:46 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 13/29] drm/xe: Add unbind to " Matthew Brost
2024-11-19 15:31 ` Thomas Hellström
2024-11-19 23:44 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 14/29] drm/xe: Do not allow system allocator VMA unbind if the GPU has bindings Matthew Brost
2024-11-19 16:33 ` Thomas Hellström
2024-11-19 23:37 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 15/29] drm/xe: Enable system allocator uAPI Matthew Brost
2024-11-19 16:34 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 16/29] drm/xe: Add migrate layer functions for SVM support Matthew Brost
2024-11-19 16:45 ` Thomas Hellström
2024-11-19 23:08 ` Matthew Brost
2024-11-20 8:04 ` Thomas Hellström
2024-12-11 19:11 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 17/29] drm/xe: Add SVM device memory mirroring Matthew Brost
2024-11-19 16:50 ` Thomas Hellström
2024-11-20 3:05 ` Gwan-gyeong Mun
2024-12-11 19:44 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 18/29] drm/xe: Add drm_gpusvm_devmem to xe_bo Matthew Brost
2024-11-19 16:51 ` Thomas Hellström
2024-12-15 4:38 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 19/29] drm/xe: Add GPUSVM devic memory copy vfunc functions Matthew Brost
2024-12-02 10:13 ` Thomas Hellström
2024-12-12 3:59 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 20/29] drm/xe: Add drm_pagemap ops to SVM Matthew Brost
2024-10-16 3:25 ` [PATCH v2 21/29] drm/xe: Add Xe SVM populate_devmem_pfn vfunc Matthew Brost
2024-12-02 10:19 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 22/29] drm/xe: Add Xe SVM devmem_release vfunc Matthew Brost
2024-12-02 10:21 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 23/29] drm/xe: Add BO flags required for SVM Matthew Brost
2024-12-02 10:44 ` Thomas Hellström
2024-12-11 21:42 ` Matthew Brost
2024-12-16 10:44 ` Thomas Hellström
2024-10-16 3:25 ` [PATCH v2 24/29] drm/xe: Add SVM VRAM migration Matthew Brost
2024-12-02 12:06 ` Thomas Hellström
2024-12-11 20:17 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 25/29] drm/xe: Basic SVM BO eviction Matthew Brost
2024-12-02 12:27 ` Thomas Hellström
2024-12-11 19:47 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 26/29] drm/xe: Add SVM debug Matthew Brost
2024-12-02 12:33 ` Thomas Hellström
2024-12-17 1:05 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 27/29] drm/xe: Add modparam for SVM notifier size Matthew Brost
2024-12-02 12:37 ` Thomas Hellström
2024-12-11 19:50 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 28/29] drm/xe: Add always_migrate_to_vram modparam Matthew Brost
2024-12-02 12:40 ` Thomas Hellström
2024-12-11 19:51 ` Matthew Brost
2024-10-16 3:25 ` [PATCH v2 29/29] drm/doc: gpusvm: Add GPU SVM documentation Matthew Brost
2024-12-02 13:00 ` Thomas Hellström
2024-12-17 23:14 ` Matthew Brost
2024-10-16 3:30 ` ✓ CI.Patch_applied: success for Introduce GPU SVM and Xe SVM implementation (rev2) Patchwork
2024-10-16 3:31 ` ✗ CI.checkpatch: warning " Patchwork
2024-10-16 3:31 ` ✗ CI.KUnit: failure " Patchwork
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=12b541d3a1b46434032afc1bcb9ce90428aa24a5.camel@linux.intel.com \
--to=thomas.hellstrom@linux.intel.com \
--cc=airlied@gmail.com \
--cc=apopple@nvidia.com \
--cc=christian.koenig@amd.com \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=felix.kuehling@amd.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=matthew.brost@intel.com \
--cc=simona.vetter@ffwll.ch \
/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