<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 2024-09-03 19:24, Ramesh Errabolu
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:20240903232447.389164-1-Ramesh.Errabolu@amd.com">
      <pre class="moz-quote-pre" wrap="">Enables users to update SVM's default granularity, used in
buffer migration and handling of recoverable page faults.
Param value is set in terms of log(numPages(buffer)),
e.g. 9 for a 2 MIB buffer

Signed-off-by: Ramesh Errabolu <a class="moz-txt-link-rfc2396E" href="mailto:Ramesh.Errabolu@amd.com"><Ramesh.Errabolu@amd.com></a></pre>
    </blockquote>
    <p>With 2 below nitpicks fixed, this patch is</p>
    <p>Reviewed-by: Philip Yang <a class="moz-txt-link-rfc2396E" href="mailto:Philip.Yang@amd.com"><Philip.Yang@amd.com></a></p>
    <p>change subject to "drm/amdkfd: Add svm_default_granularity module
      parameter"<br>
    </p>
    <blockquote type="cite" cite="mid:20240903232447.389164-1-Ramesh.Errabolu@amd.com">
      <pre class="moz-quote-pre" wrap="">
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 17 +++++++++++++++++
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h   |  6 ++++++
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c    | 23 +++++++++++++++--------
 4 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index e8c284aea1f2..8eb934af02f2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -237,6 +237,7 @@ extern int sched_policy;
 extern bool debug_evictions;
 extern bool no_system_mem_limit;
 extern int halt_if_hws_hang;
+extern uint amdgpu_svm_default_granularity;
 #else
 static const int __maybe_unused sched_policy = KFD_SCHED_POLICY_HWS;
 static const bool __maybe_unused debug_evictions; /* = false */
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index b9529948f2b2..442039436cb3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -169,6 +169,16 @@ uint amdgpu_sdma_phase_quantum = 32;
 char *amdgpu_disable_cu;
 char *amdgpu_virtual_display;
 bool enforce_isolation;
+
+/* Specifies the default granularity for SVM, used in buffer
+ * migration and restoration of backing memory when handling
+ * recoverable page faults.
+ *
+ * The value is given as log(numPages(buffer)); for a 2 MiB
+ * buffer it computes to be 9
+ */
+uint amdgpu_svm_default_granularity = 9;
+
 /*
  * OverDrive(bit 14) disabled by default
  * GFX DCS(bit 19) disabled by default
@@ -320,6 +330,13 @@ module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444);
 MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
 module_param_named(msi, amdgpu_msi, int, 0444);
 
+/**
+ * DOC: svm_default_granularity (uint)
+ * Used in buffer migration and handling of recoverable page faults
+ */
+MODULE_PARM_DESC(svm_default_granularity, "SVM's default granularity in log(2^Pages), default 9 = 2^9 = 2 MiB");
+module_param_named(svm_default_granularity, amdgpu_svm_default_granularity, uint, 0644);
+
 /**
  * DOC: lockup_timeout (string)
  * Set GPU scheduler timeout value in ms.
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 9ae9abc6eb43..d6530febabad 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -868,6 +868,12 @@ struct svm_range_list {
        struct task_struct              *faulting_task;
        /* check point ts decides if page fault recovery need be dropped */
        uint64_t                        checkpoint_ts[MAX_GPU_INSTANCE];
+
+       /* Default granularity to use in buffer migration
+        * and restoration of backing memory while handling
+        * recoverable page faults
+        */
+       uint8_t default_granularity;
 };
 
 /* Process data */
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index b44dec90969f..2bc2389cc7f0 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -309,12 +309,13 @@ static void svm_range_free(struct svm_range *prange, bool do_unmap)
 }
 
 static void
-svm_range_set_default_attributes(int32_t *location, int32_t *prefetch_loc,
-                                uint8_t *granularity, uint32_t *flags)
+svm_range_set_default_attributes(struct svm_range_list *svms, int32_t *location,
+                                int32_t *prefetch_loc, uint8_t *granularity,
+                                uint32_t *flags)
 {
        *location = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
        *prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
-       *granularity = 9;
+       *granularity = svms->default_granularity;
        *flags =
                KFD_IOCTL_SVM_FLAG_HOST_ACCESS | KFD_IOCTL_SVM_FLAG_COHERENT;
 }
@@ -358,9 +359,10 @@ svm_range *svm_range_new(struct svm_range_list *svms, uint64_t start,
                bitmap_copy(prange->bitmap_access, svms->bitmap_supported,
                            MAX_GPU_INSTANCE);
 
-       svm_range_set_default_attributes(&prange->preferred_loc,
+       svm_range_set_default_attributes(svms, &prange->preferred_loc,
                                         &prange->prefetch_loc,
-                                        &prange->granularity, &prange->flags);
+                                        &prange->granularity,
+                                        &prange->flags);</pre>
    </blockquote>
    unnecessary extra change.<br>
    <blockquote type="cite" cite="mid:20240903232447.389164-1-Ramesh.Errabolu@amd.com">
      <pre class="moz-quote-pre" wrap="">
 
        pr_debug("svms 0x%p [0x%llx 0x%llx]\n", svms, start, last);
 
@@ -2694,9 +2696,10 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,
        *is_heap_stack = vma_is_initial_heap(vma) || vma_is_initial_stack(vma);
 
        start_limit = max(vma->vm_start >> PAGE_SHIFT,
-                     (unsigned long)ALIGN_DOWN(addr, 2UL << 8));
+                     (unsigned long)ALIGN_DOWN(addr, 1UL << p->svms.default_granularity));
        end_limit = min(vma->vm_end >> PAGE_SHIFT,
-                   (unsigned long)ALIGN(addr + 1, 2UL << 8));
+                   (unsigned long)ALIGN(addr + 1, 1UL << p->svms.default_granularity));
+
        /* First range that starts after the fault address */
        node = interval_tree_iter_first(&p->svms.objects, addr + 1, ULONG_MAX);
        if (node) {
@@ -3240,6 +3243,10 @@ int svm_range_list_init(struct kfd_process *p)
                if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev->adev))
                        bitmap_set(svms->bitmap_supported, i, 1);
 
+       /* Update default granularity to one bound by user/driver */</pre>
    </blockquote>
    <p>This is more meaningful:<br>
    </p>
    <p>/* 0x1B is the largest number of pages supported with 4-level
      paging */</p>
    <p>Regards,</p>
    <p>Philip<br>
    </p>
    <blockquote type="cite" cite="mid:20240903232447.389164-1-Ramesh.Errabolu@amd.com">
      <pre class="moz-quote-pre" wrap="">
+       svms->default_granularity = min_t(u8, amdgpu_svm_default_granularity, 0x1B);
+       pr_debug("Default SVM Granularity to use: %d\n", svms->default_granularity);
+
        return 0;
 }
 
@@ -3767,7 +3774,7 @@ svm_range_get_attr(struct kfd_process *p, struct mm_struct *mm,
        node = interval_tree_iter_first(&svms->objects, start, last);
        if (!node) {
                pr_debug("range attrs not found return default values\n");
-               svm_range_set_default_attributes(&location, &prefetch_loc,
+               svm_range_set_default_attributes(svms, &location, &prefetch_loc,
                                                 &granularity, &flags_and);
                flags_or = flags_and;
                if (p->xnack_enabled)
</pre>
    </blockquote>
  </body>
</html>