On Tue, Nov 19, 2024 at 01:13:26PM +0100, Thomas Hellström wrote: > On Tue, 2024-10-15 at 20:24 -0700, Matthew Brost wrote: > > Add SVM init / close / fini to faulting VMs. Minimual implementation. > > > > v2: > > - Add close function > > > > Signed-off-by: Matthew Brost <matthew.brost@xxxxxxxxx> > > --- > > drivers/gpu/drm/xe/Makefile | 1 + > > drivers/gpu/drm/xe/xe_svm.c | 46 > > ++++++++++++++++++++++++++++++++ > > drivers/gpu/drm/xe/xe_svm.h | 15 +++++++++++ > > drivers/gpu/drm/xe/xe_vm.c | 12 +++++++++ > > drivers/gpu/drm/xe/xe_vm_types.h | 7 +++++ > > 5 files changed, 81 insertions(+) > > create mode 100644 drivers/gpu/drm/xe/xe_svm.c > > create mode 100644 drivers/gpu/drm/xe/xe_svm.h > > > > diff --git a/drivers/gpu/drm/xe/Makefile > > b/drivers/gpu/drm/xe/Makefile > > index 8d991d4a92a5..c3e85bcfd4d1 100644 > > --- a/drivers/gpu/drm/xe/Makefile > > +++ b/drivers/gpu/drm/xe/Makefile > > @@ -96,6 +96,7 @@ xe-y += drm_gpusvm.o \ > > xe_sa.o \ > > xe_sched_job.o \ > > xe_step.o \ > > + xe_svm.o \ > > xe_sync.o \ > > xe_tile.o \ > > xe_tile_sysfs.o \ > > diff --git a/drivers/gpu/drm/xe/xe_svm.c > > b/drivers/gpu/drm/xe/xe_svm.c > > new file mode 100644 > > index 000000000000..57b740367843 > > --- /dev/null > > +++ b/drivers/gpu/drm/xe/xe_svm.c > > @@ -0,0 +1,46 @@ > > +// SPDX-License-Identifier: MIT > > +/* > > + * Copyright © 2024 Intel Corporation > > + */ > > + > > +#include "drm_gpusvm.h" > > + > > +#include "xe_svm.h" > > +#include "xe_vm.h" > > +#include "xe_vm_types.h" > > + > > +static void xe_svm_invalidate(struct drm_gpusvm *gpusvm, > > + struct drm_gpusvm_notifier *notifier, > > + const struct mmu_notifier_range > > *mmu_range) > > +{ > > + /* TODO: Implement */ > > +} > > + > > +static const struct drm_gpusvm_ops gpusvm_ops = { > > + .invalidate = xe_svm_invalidate, > > +}; > > + > > +static const u64 fault_chunk_sizes[] = { > > + SZ_2M, > > + SZ_64K, > > + SZ_4K, > > +}; > > + > > +int xe_svm_init(struct xe_vm *vm) > Kerneldoc + other undocumented extern funcs > This whole series going to be missing kernel doc aside from GPUSVM. Aware of the issue, will fixup all kernel doc in next rev. Matt > > +{ > > + return drm_gpusvm_init(&vm->svm.gpusvm, "Xe SVM", &vm->xe- > > >drm, > > + current->mm, NULL, 0, vm->size, > > + SZ_512M, &gpusvm_ops, > > fault_chunk_sizes, > > + ARRAY_SIZE(fault_chunk_sizes)); > > +} > > + > > +void xe_svm_close(struct xe_vm *vm) > > > +{ > > +} > > + > > +void xe_svm_fini(struct xe_vm *vm) > > +{ > > + xe_assert(vm->xe, xe_vm_is_closed(vm)); > > + > > + drm_gpusvm_fini(&vm->svm.gpusvm); > > +} > > diff --git a/drivers/gpu/drm/xe/xe_svm.h > > b/drivers/gpu/drm/xe/xe_svm.h > > new file mode 100644 > > index 000000000000..979f2322eeba > > --- /dev/null > > +++ b/drivers/gpu/drm/xe/xe_svm.h > > @@ -0,0 +1,15 @@ > > +/* SPDX-License-Identifier: MIT */ > > +/* > > + * Copyright © 2024 Intel Corporation > > + */ > > + > > +#ifndef _XE_SVM_H_ > > +#define _XE_SVM_H_ > > + > > +struct xe_vm; > > + > > +int xe_svm_init(struct xe_vm *vm); > > +void xe_svm_fini(struct xe_vm *vm); > > +void xe_svm_close(struct xe_vm *vm); > > + > > +#endif > > diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c > > index 0d887fb9de59..b11fb0ac9520 100644 > > --- a/drivers/gpu/drm/xe/xe_vm.c > > +++ b/drivers/gpu/drm/xe/xe_vm.c > > @@ -35,6 +35,7 @@ > > #include "xe_preempt_fence.h" > > #include "xe_pt.h" > > #include "xe_res_cursor.h" > > +#include "xe_svm.h" > > #include "xe_sync.h" > > #include "xe_trace_bo.h" > > #include "xe_wa.h" > > @@ -1503,6 +1504,12 @@ struct xe_vm *xe_vm_create(struct xe_device > > *xe, u32 flags) > > } > > } > > > > + if (flags & XE_VM_FLAG_FAULT_MODE) { > > + err = xe_svm_init(vm); > > + if (err) > > + goto err_close; > > + } > > + > > if (number_tiles > 1) > > vm->composite_fence_ctx = > > dma_fence_context_alloc(1); > > > > @@ -1548,6 +1555,8 @@ void xe_vm_close_and_put(struct xe_vm *vm) > > xe_vm_close(vm); > > if (xe_vm_in_preempt_fence_mode(vm)) > > flush_work(&vm->preempt.rebind_work); > > + if (xe_vm_in_fault_mode(vm)) > > + xe_svm_close(vm); > > > > down_write(&vm->lock); > > for_each_tile(tile, xe, id) { > > @@ -1616,6 +1625,9 @@ void xe_vm_close_and_put(struct xe_vm *vm) > > xe_vma_destroy_unlocked(vma); > > } > > > > + if (xe_vm_in_fault_mode(vm)) > > + xe_svm_fini(vm); > > + > > up_write(&vm->lock); > > > > down_write(&xe->usm.lock); > > diff --git a/drivers/gpu/drm/xe/xe_vm_types.h > > b/drivers/gpu/drm/xe/xe_vm_types.h > > index 1764781c376b..bd1c0e368238 100644 > > --- a/drivers/gpu/drm/xe/xe_vm_types.h > > +++ b/drivers/gpu/drm/xe/xe_vm_types.h > > @@ -6,6 +6,7 @@ > > #ifndef _XE_VM_TYPES_H_ > > #define _XE_VM_TYPES_H_ > > > > +#include "drm_gpusvm.h" > > #include <drm/drm_gpuvm.h> > > > > #include <linux/dma-resv.h> > > @@ -140,6 +141,12 @@ struct xe_vm { > > /** @gpuvm: base GPUVM used to track VMAs */ > > struct drm_gpuvm gpuvm; > > > > + /** @svm: Shared virtual memory state */ > > + struct { > > + /** @svm.gpusvm: base GPUSVM used to track fault > > allocations */ > > + struct drm_gpusvm gpusvm; > > + } svm; > > + > > struct xe_device *xe; > > > > /* exec queue used for (un)binding vma's */ > > Thanks, > Thomas >