Message ID | 20241016032518.539495-8-matthew.brost@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Introduce GPU SVM and Xe SVM implementation | expand |
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@intel.com> > --- > 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 > +{ > + 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
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@intel.com> > > --- > > 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 >
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) +{ + 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 */
Add SVM init / close / fini to faulting VMs. Minimual implementation. v2: - Add close function Signed-off-by: Matthew Brost <matthew.brost@intel.com> --- 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