It may not be known at drm_gpusvm_init time.

Signed-off-by: Thomas Hellström <thomas.hellst...@linux.intel.com>
---
 drivers/gpu/drm/drm_gpusvm.c | 21 ++++++++++++---------
 drivers/gpu/drm/xe/xe_svm.c  |  5 +++--
 include/drm/drm_gpusvm.h     |  7 ++++---
 3 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
index d84e27283768..8d836248f5fe 100644
--- a/drivers/gpu/drm/drm_gpusvm.c
+++ b/drivers/gpu/drm/drm_gpusvm.c
@@ -416,7 +416,6 @@ static const struct mmu_interval_notifier_ops 
drm_gpusvm_notifier_ops = {
  * @name: Name of the GPU SVM.
  * @drm: Pointer to the DRM device structure.
  * @mm: Pointer to the mm_struct for the address space.
- * @device_private_page_owner: Device private pages owner.
  * @mm_start: Start address of GPU SVM.
  * @mm_range: Range of the GPU SVM.
  * @notifier_size: Size of individual notifiers.
@@ -432,7 +431,7 @@ static const struct mmu_interval_notifier_ops 
drm_gpusvm_notifier_ops = {
  */
 int drm_gpusvm_init(struct drm_gpusvm *gpusvm,
                    const char *name, struct drm_device *drm,
-                   struct mm_struct *mm, void *device_private_page_owner,
+                   struct mm_struct *mm,
                    unsigned long mm_start, unsigned long mm_range,
                    unsigned long notifier_size,
                    const struct drm_gpusvm_ops *ops,
@@ -444,7 +443,6 @@ int drm_gpusvm_init(struct drm_gpusvm *gpusvm,
        gpusvm->name = name;
        gpusvm->drm = drm;
        gpusvm->mm = mm;
-       gpusvm->device_private_page_owner = device_private_page_owner;
        gpusvm->mm_start = mm_start;
        gpusvm->mm_range = mm_range;
        gpusvm->notifier_size = notifier_size;
@@ -712,6 +710,7 @@ drm_gpusvm_range_alloc(struct drm_gpusvm *gpusvm,
  * @notifier: Pointer to the GPU SVM notifier structure
  * @start: Start address
  * @end: End address
+ * @dev_private_owner: The device private page owner
  *
  * Check if pages between start and end have been faulted in on the CPU. Use to
  * prevent migration of pages without CPU backing store.
@@ -720,14 +719,15 @@ drm_gpusvm_range_alloc(struct drm_gpusvm *gpusvm,
  */
 static bool drm_gpusvm_check_pages(struct drm_gpusvm *gpusvm,
                                   struct drm_gpusvm_notifier *notifier,
-                                  unsigned long start, unsigned long end)
+                                  unsigned long start, unsigned long end,
+                                  void *dev_private_owner)
 {
        struct hmm_range hmm_range = {
                .default_flags = 0,
                .notifier = &notifier->notifier,
                .start = start,
                .end = end,
-               .dev_private_owner = gpusvm->device_private_page_owner,
+               .dev_private_owner = dev_private_owner,
        };
        unsigned long timeout =
                jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
@@ -781,6 +781,7 @@ static bool drm_gpusvm_check_pages(struct drm_gpusvm 
*gpusvm,
  * @gpuva_start: Start address of GPUVA which mirrors CPU
  * @gpuva_end: End address of GPUVA which mirrors CPU
  * @check_pages_threshold: Check CPU pages for present threshold
+ * @dev_private_owner: The device private page owner
  *
  * This function determines the chunk size for the GPU SVM range based on the
  * fault address, GPU SVM chunk sizes, existing GPU SVM ranges, and the virtual
@@ -795,7 +796,8 @@ drm_gpusvm_range_chunk_size(struct drm_gpusvm *gpusvm,
                            unsigned long fault_addr,
                            unsigned long gpuva_start,
                            unsigned long gpuva_end,
-                           unsigned long check_pages_threshold)
+                           unsigned long check_pages_threshold,
+                           void *dev_private_owner)
 {
        unsigned long start, end;
        int i = 0;
@@ -842,7 +844,7 @@ drm_gpusvm_range_chunk_size(struct drm_gpusvm *gpusvm,
                 * process-many-malloc' mallocs at least 64k at a time.
                 */
                if (end - start <= check_pages_threshold &&
-                   !drm_gpusvm_check_pages(gpusvm, notifier, start, end)) {
+                   !drm_gpusvm_check_pages(gpusvm, notifier, start, end, 
dev_private_owner)) {
                        ++i;
                        goto retry;
                }
@@ -951,7 +953,8 @@ drm_gpusvm_range_find_or_insert(struct drm_gpusvm *gpusvm,
        chunk_size = drm_gpusvm_range_chunk_size(gpusvm, notifier, vas,
                                                 fault_addr, gpuva_start,
                                                 gpuva_end,
-                                                ctx->check_pages_threshold);
+                                                ctx->check_pages_threshold,
+                                                
ctx->device_private_page_owner);
        if (chunk_size == LONG_MAX) {
                err = -EINVAL;
                goto err_notifier_remove;
@@ -1207,7 +1210,7 @@ int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
                .notifier = notifier,
                .start = drm_gpusvm_range_start(range),
                .end = drm_gpusvm_range_end(range),
-               .dev_private_owner = gpusvm->device_private_page_owner,
+               .dev_private_owner = ctx->device_private_page_owner,
        };
        struct mm_struct *mm = gpusvm->mm;
        void *zdd;
diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index c49bcfea5644..20441da0aff7 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -657,8 +657,8 @@ int xe_svm_init(struct xe_vm *vm)
                return err;
 
        err = drm_gpusvm_init(&vm->svm.gpusvm, "Xe SVM", &vm->xe->drm,
-                             current->mm, xe_svm_devm_owner(vm->xe), 0,
-                             vm->size, xe_modparam.svm_notifier_size * SZ_1M,
+                             current->mm, 0, vm->size,
+                             xe_modparam.svm_notifier_size * SZ_1M,
                              &gpusvm_ops, fault_chunk_sizes,
                              ARRAY_SIZE(fault_chunk_sizes));
        if (err) {
@@ -841,6 +841,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma 
*vma,
        }
 
        range_debug(range, "GET PAGES");
+       ctx.device_private_page_owner = xe_svm_devm_owner(vm->xe);
        err = drm_gpusvm_range_get_pages(&vm->svm.gpusvm, r, &ctx);
        /* Corner where CPU mappings have changed */
        if (err == -EOPNOTSUPP || err == -EFAULT || err == -EPERM) {
diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
index 97c641bf49c5..729e5251b582 100644
--- a/include/drm/drm_gpusvm.h
+++ b/include/drm/drm_gpusvm.h
@@ -156,7 +156,6 @@ struct drm_gpusvm_range {
  * @name: Name of the GPU SVM
  * @drm: Pointer to the DRM device structure
  * @mm: Pointer to the mm_struct for the address space
- * @device_private_page_owner: Device private pages owner
  * @mm_start: Start address of GPU SVM
  * @mm_range: Range of the GPU SVM
  * @notifier_size: Size of individual notifiers
@@ -181,7 +180,6 @@ struct drm_gpusvm {
        const char *name;
        struct drm_device *drm;
        struct mm_struct *mm;
-       void *device_private_page_owner;
        unsigned long mm_start;
        unsigned long mm_range;
        unsigned long notifier_size;
@@ -203,6 +201,8 @@ struct drm_gpusvm {
 /**
  * struct drm_gpusvm_ctx - DRM GPU SVM context
  *
+ * @device_private_page_owner: The device-private page owner to use for
+ * this operation
  * @check_pages_threshold: Check CPU pages for present if chunk is less than or
  *                         equal to threshold. If not present, reduce chunk
  *                         size.
@@ -213,6 +213,7 @@ struct drm_gpusvm {
  * Context that is DRM GPUSVM is operating in (i.e. user arguments).
  */
 struct drm_gpusvm_ctx {
+       void *device_private_page_owner;
        unsigned long check_pages_threshold;
        unsigned int in_notifier :1;
        unsigned int read_only :1;
@@ -221,7 +222,7 @@ struct drm_gpusvm_ctx {
 
 int drm_gpusvm_init(struct drm_gpusvm *gpusvm,
                    const char *name, struct drm_device *drm,
-                   struct mm_struct *mm, void *device_private_page_owner,
+                   struct mm_struct *mm,
                    unsigned long mm_start, unsigned long mm_range,
                    unsigned long notifier_size,
                    const struct drm_gpusvm_ops *ops,
-- 
2.48.1

Reply via email to