<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 8/28/2024 3:26 PM, Errabolu, Ramesh
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:DS7PR12MB832146FE01CC9CF5DF499D39E3952@DS7PR12MB8321.namprd12.prod.outlook.com">
      
      <meta name="Generator" content="Microsoft Word 15 (filtered medium)">
      <style>@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}@font-face
        {font-family:Aptos;}@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        font-size:10.0pt;
        font-family:"Courier New";}span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}span.EmailStyle22
        {mso-style-type:personal-compose;
        font-family:"Aptos",sans-serif;
        color:windowtext;}.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}div.WordSection1
        {page:WordSection1;}</style>
      <div class="WordSection1">
        <p class="MsoNormal"><span style="font-size:11.0pt">Responses
            inline<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
        <div>
          <p class="MsoNormal"><span style="font-size:11.0pt;color:black">Regards,</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><o:p></o:p></span></p>
          <p class="MsoNormal"><span style="font-size:11.0pt;color:black">Ramesh</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><o:p></o:p></span></p>
        </div>
        <p class="MsoNormal"><span style="font-size:11.0pt;color:black"> </span><span style="font-size:11.0pt"><o:p></o:p></span></p>
        <div>
          <div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
            <p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">
                Chen, Xiaogang <a class="moz-txt-link-rfc2396E" href="mailto:Xiaogang.Chen@amd.com"><Xiaogang.Chen@amd.com></a>
                <br>
                <b>Sent:</b> Wednesday, August 28, 2024 3:01 PM<br>
                <b>To:</b> Errabolu, Ramesh
                <a class="moz-txt-link-rfc2396E" href="mailto:Ramesh.Errabolu@amd.com"><Ramesh.Errabolu@amd.com></a>;
                <a class="moz-txt-link-abbreviated" href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a><br>
                <b>Subject:</b> Re: [PATCH v2] drm/amdgpu: Surface
                svm_attr_gobm, a RW module parameter<o:p></o:p></span></p>
          </div>
        </div>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p><o:p> </o:p></p>
        <div>
          <p class="MsoNormal">On 8/28/2024 2:52 PM, Errabolu, Ramesh
            wrote:<o:p></o:p></p>
        </div>
        <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
          <pre>Response inline<o:p></o:p></pre>
          <pre><o:p> </o:p></pre>
          <pre>Regards,<o:p></o:p></pre>
          <pre>Ramesh<o:p></o:p></pre>
          <pre> <o:p></o:p></pre>
          <pre>-----Original Message-----<o:p></o:p></pre>
          <pre>From: Chen, Xiaogang <a href="mailto:Xiaogang.Chen@amd.com" moz-do-not-send="true"><Xiaogang.Chen@amd.com></a> <o:p></o:p></pre>
          <pre>Sent: Wednesday, August 28, 2024 2:43 PM<o:p></o:p></pre>
          <pre>To: Errabolu, Ramesh <a href="mailto:Ramesh.Errabolu@amd.com" moz-do-not-send="true"><Ramesh.Errabolu@amd.com></a>; <a href="mailto:amd-gfx@lists.freedesktop.org" moz-do-not-send="true" class="moz-txt-link-freetext">amd-gfx@lists.freedesktop.org</a><o:p></o:p></pre>
          <pre>Subject: Re: [PATCH v2] drm/amdgpu: Surface svm_attr_gobm, a RW module parameter<o:p></o:p></pre>
          <pre><o:p> </o:p></pre>
          <pre><o:p> </o:p></pre>
          <pre>Why need this driver parameter? kfd has KFD_IOCTL_SVM_ATTR_GRANULARITY api that allows user space to set migration granularity per prange. If both got set which will take precedence?<o:p></o:p></pre>
          <pre><o:p> </o:p></pre>
          <pre>Ramesh: Use of Kfd Ioctl is available to users of registered memory. It allows users to control GOBM per buffer level, including overwriting default value. For ranges that do not specify GOBM, the default value will be found. <o:p></o:p></pre>
        </blockquote>
        <p>If user space use KFD_IOCTL_SVM_ATTR_GRANULARITY it will
          overwrite this parameter value for a prange, then how to know
          which granularity take effect? That is decided when user set
          this parameter and when the api got used.<o:p></o:p></p>
        <p><span style="font-size:11.0pt">Ramesh: The value bound by Kfd
            ioctl will take effect. In the life cycle of a prange it can
            go from the default value to one that is set by user via
            set_attr() call. However, it is generally understood that
            that users of set_attr() will not call it directly i.e. the
            rely on higher level apis from ROCr or HIP.</span></p>
      </div>
    </blockquote>
    <p>driver parameter can be set at run time, not only at boot time.
      It is not predictable  when user set this driver parameter and
      when the api got called.</p>
    <p>Regards</p>
    <p>Xiaogang<br>
    </p>
    <blockquote type="cite" cite="mid:DS7PR12MB832146FE01CC9CF5DF499D39E3952@DS7PR12MB8321.namprd12.prod.outlook.com">
      <div class="WordSection1">
        <p><span style="font-size:11.0pt"><o:p></o:p></span></p>
        <p>Regards<o:p></o:p></p>
        <p>Xiaogang<o:p></o:p></p>
        <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
          <pre><o:p> </o:p></pre>
          <pre><o:p> </o:p></pre>
          <pre>Regards<o:p></o:p></pre>
          <pre><o:p> </o:p></pre>
          <pre>Xiaogang<o:p></o:p></pre>
          <pre><o:p> </o:p></pre>
          <pre>On 8/26/2024 2:34 PM, Ramesh Errabolu wrote:<o:p></o:p></pre>
          <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
            <pre>Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>Enables users to update the default size of buffer used in migration <o:p></o:p></pre>
            <pre>either from Sysmem to VRAM or vice versa.<o:p></o:p></pre>
            <pre>The param GOBM refers to granularity of buffer migration, and is <o:p></o:p></pre>
            <pre>specified in terms of log(numPages(buffer)). It facilitates users of <o:p></o:p></pre>
            <pre>unregistered memory to control GOBM, albeit at a coarse level<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>Signed-off-by: Ramesh Errabolu <a href="mailto:Ramesh.Errabolu@amd.com" moz-do-not-send="true"><Ramesh.Errabolu@amd.com></a><o:p></o:p></pre>
            <pre>---<o:p></o:p></pre>
            <pre>  drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  4 ++++<o:p></o:p></pre>
            <pre>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 18 +++++++++++++++++<o:p></o:p></pre>
            <pre>  drivers/gpu/drm/amd/amdkfd/kfd_priv.h   | 12 ++++++++++++<o:p></o:p></pre>
            <pre>  drivers/gpu/drm/amd/amdkfd/kfd_svm.c    | 26 ++++++++++++++++---------<o:p></o:p></pre>
            <pre>  4 files changed, 51 insertions(+), 9 deletions(-)<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h <o:p></o:p></pre>
            <pre>b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></pre>
            <pre>index e8c284aea1f2..73dd816b01f2 100644<o:p></o:p></pre>
            <pre>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></pre>
            <pre>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h<o:p></o:p></pre>
            <pre>@@ -237,6 +237,7 @@ extern int sched_policy;<o:p></o:p></pre>
            <pre>  extern bool debug_evictions;<o:p></o:p></pre>
            <pre>  extern bool no_system_mem_limit;<o:p></o:p></pre>
            <pre>  extern int halt_if_hws_hang;<o:p></o:p></pre>
            <pre>+extern uint amdgpu_svm_attr_gobm;<o:p></o:p></pre>
            <pre>  #else<o:p></o:p></pre>
            <pre>  static const int __maybe_unused sched_policy = KFD_SCHED_POLICY_HWS;<o:p></o:p></pre>
            <pre>  static const bool __maybe_unused debug_evictions; /* = false */ @@ <o:p></o:p></pre>
            <pre>-313,6 +314,9 @@ extern int amdgpu_wbrf;<o:p></o:p></pre>
            <pre>  /* Extra time delay(in ms) to eliminate the influence of temperature momentary fluctuation */<o:p></o:p></pre>
            <pre>  #define AMDGPU_SWCTF_EXTRA_DELAY               50<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>+/* Default size of buffer to use in migrating buffer */<o:p></o:p></pre>
            <pre>+#define AMDGPU_SVM_ATTR_GOBM       9<o:p></o:p></pre>
            <pre>+<o:p></o:p></pre>
            <pre>  struct amdgpu_xcp_mgr;<o:p></o:p></pre>
            <pre>  struct amdgpu_device;<o:p></o:p></pre>
            <pre>  struct amdgpu_irq_src;<o:p></o:p></pre>
            <pre>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c <o:p></o:p></pre>
            <pre>b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<o:p></o:p></pre>
            <pre>index b9529948f2b2..09c501753a3b 100644<o:p></o:p></pre>
            <pre>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<o:p></o:p></pre>
            <pre>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<o:p></o:p></pre>
            <pre>@@ -169,6 +169,17 @@ uint amdgpu_sdma_phase_quantum = 32;<o:p></o:p></pre>
            <pre>  char *amdgpu_disable_cu;<o:p></o:p></pre>
            <pre>  char *amdgpu_virtual_display;<o:p></o:p></pre>
            <pre>  bool enforce_isolation;<o:p></o:p></pre>
            <pre>+<o:p></o:p></pre>
            <pre>+/* Specifies the default size of buffer to use in<o:p></o:p></pre>
            <pre>+ * migrating buffer from Sysmem to VRAM and vice<o:p></o:p></pre>
            <pre>+ * versa<o:p></o:p></pre>
            <pre>+ *<o:p></o:p></pre>
            <pre>+ * GOBM - Granularity of Buffer Migration<o:p></o:p></pre>
            <pre>+ *<o:p></o:p></pre>
            <pre>+ * Defined as log2(sizeof(buffer)/PAGE_SIZE)  */ uint <o:p></o:p></pre>
            <pre>+amdgpu_svm_attr_gobm = AMDGPU_SVM_ATTR_GOBM;<o:p></o:p></pre>
            <pre>+<o:p></o:p></pre>
            <pre>  /*<o:p></o:p></pre>
            <pre>   * OverDrive(bit 14) disabled by default<o:p></o:p></pre>
            <pre>   * GFX DCS(bit 19) disabled by default @@ -320,6 +331,13 @@ <o:p></o:p></pre>
            <pre>module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444);<o:p></o:p></pre>
            <pre>  MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");<o:p></o:p></pre>
            <pre>  module_param_named(msi, amdgpu_msi, int, 0444);<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>+/**<o:p></o:p></pre>
            <pre>+ * DOC: svm_attr_gobm (uint)<o:p></o:p></pre>
            <pre>+ * Size of buffer to use in migrating buffer from Sysmem to VRAM and <o:p></o:p></pre>
            <pre>+vice versa  */ MODULE_PARM_DESC(svm_attr_gobm, "Defined as <o:p></o:p></pre>
            <pre>+log2(sizeof(buffer)/PAGE_SIZE), e.g. 9 for 2 MiB"); <o:p></o:p></pre>
            <pre>+module_param_named(svm_attr_gobm, amdgpu_svm_attr_gobm, uint, 0644);<o:p></o:p></pre>
            <pre>+<o:p></o:p></pre>
            <pre>  /**<o:p></o:p></pre>
            <pre>   * DOC: lockup_timeout (string)<o:p></o:p></pre>
            <pre>   * Set GPU scheduler timeout value in ms.<o:p></o:p></pre>
            <pre>diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h <o:p></o:p></pre>
            <pre>b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h<o:p></o:p></pre>
            <pre>index 9ae9abc6eb43..c2e54b18c167 100644<o:p></o:p></pre>
            <pre>--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h<o:p></o:p></pre>
            <pre>+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h<o:p></o:p></pre>
            <pre>@@ -868,6 +868,18 @@ struct svm_range_list {<o:p></o:p></pre>
            <pre>         struct task_struct              *faulting_task;<o:p></o:p></pre>
            <pre>         /* check point ts decides if page fault recovery need be dropped */<o:p></o:p></pre>
            <pre>         uint64_t                        checkpoint_ts[MAX_GPU_INSTANCE];<o:p></o:p></pre>
            <pre>+<o:p></o:p></pre>
            <pre>+       /* Indicates the default size to use in migrating<o:p></o:p></pre>
            <pre>+        * buffers of a process from Sysmem to VRAM and vice<o:p></o:p></pre>
            <pre>+        * versa. The max legal value cannot be greater than<o:p></o:p></pre>
            <pre>+        * 0x3F<o:p></o:p></pre>
            <pre>+        *<o:p></o:p></pre>
            <pre>+        * @note: A side effect of this symbol being part of<o:p></o:p></pre>
            <pre>+        * struct svm_range_list is that it forces all buffers<o:p></o:p></pre>
            <pre>+        * of the process of unregistered kind to use the same<o:p></o:p></pre>
            <pre>+        * size in buffer migration<o:p></o:p></pre>
            <pre>+        */<o:p></o:p></pre>
            <pre>+       uint8_t attr_gobm;<o:p></o:p></pre>
            <pre>  };<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>  /* Process data */<o:p></o:p></pre>
            <pre>diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c <o:p></o:p></pre>
            <pre>b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c<o:p></o:p></pre>
            <pre>index b44dec90969f..78c78baddb1f 100644<o:p></o:p></pre>
            <pre>--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c<o:p></o:p></pre>
            <pre>+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c<o:p></o:p></pre>
            <pre>@@ -309,12 +309,11 @@ static void svm_range_free(struct svm_range *prange, bool do_unmap)<o:p></o:p></pre>
            <pre>  }<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>  static void<o:p></o:p></pre>
            <pre>-svm_range_set_default_attributes(int32_t *location, int32_t *prefetch_loc,<o:p></o:p></pre>
            <pre>-                                uint8_t *granularity, uint32_t *flags)<o:p></o:p></pre>
            <pre>+svm_range_set_default_attributes(int32_t *location,<o:p></o:p></pre>
            <pre>+                       int32_t *prefetch_loc, uint32_t *flags)<o:p></o:p></pre>
            <pre>  {<o:p></o:p></pre>
            <pre>         *location = KFD_IOCTL_SVM_LOCATION_UNDEFINED;<o:p></o:p></pre>
            <pre>         *prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED;<o:p></o:p></pre>
            <pre>-       *granularity = 9;<o:p></o:p></pre>
            <pre>         *flags =<o:p></o:p></pre>
            <pre>                 KFD_IOCTL_SVM_FLAG_HOST_ACCESS | KFD_IOCTL_SVM_FLAG_COHERENT;<o:p></o:p></pre>
            <pre>  }<o:p></o:p></pre>
            <pre>@@ -358,9 +357,9 @@ svm_range *svm_range_new(struct svm_range_list *svms, uint64_t start,<o:p></o:p></pre>
            <pre>                 bitmap_copy(prange->bitmap_access, svms->bitmap_supported,<o:p></o:p></pre>
            <pre>                             MAX_GPU_INSTANCE);<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>+       prange->granularity = svms->attr_gobm;<o:p></o:p></pre>
            <pre>         svm_range_set_default_attributes(&prange->preferred_loc,<o:p></o:p></pre>
            <pre>-                                        &prange->prefetch_loc,<o:p></o:p></pre>
            <pre>-                                        &prange->granularity, &prange->flags);<o:p></o:p></pre>
            <pre>+                               &prange->prefetch_loc, <o:p></o:p></pre>
            <pre>+ &prange->flags);<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>         pr_debug("svms 0x%p [0x%llx 0x%llx]\n", svms, start, last);<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>@@ -2693,10 +2692,12 @@ svm_range_get_range_boundaries(struct <o:p></o:p></pre>
            <pre>kfd_process *p, int64_t addr,<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>         *is_heap_stack = vma_is_initial_heap(vma) || <o:p></o:p></pre>
            <pre>vma_is_initial_stack(vma);<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>+       /* Determine the starting and ending page of prange */<o:p></o:p></pre>
            <pre>         start_limit = max(vma->vm_start >> PAGE_SHIFT,<o:p></o:p></pre>
            <pre>-                     (unsigned long)ALIGN_DOWN(addr, 2UL << 8));<o:p></o:p></pre>
            <pre>+                     (unsigned long)ALIGN_DOWN(addr, 1 << <o:p></o:p></pre>
            <pre>+ p->svms.attr_gobm));<o:p></o:p></pre>
            <pre>         end_limit = min(vma->vm_end >> PAGE_SHIFT,<o:p></o:p></pre>
            <pre>-                   (unsigned long)ALIGN(addr + 1, 2UL << 8));<o:p></o:p></pre>
            <pre>+                   (unsigned long)ALIGN(addr + 1, 1 << <o:p></o:p></pre>
            <pre>+ p->svms.attr_gobm));<o:p></o:p></pre>
            <pre>+<o:p></o:p></pre>
            <pre>         /* First range that starts after the fault address */<o:p></o:p></pre>
            <pre>         node = interval_tree_iter_first(&p->svms.objects, addr + 1, ULONG_MAX);<o:p></o:p></pre>
            <pre>         if (node) {<o:p></o:p></pre>
            <pre>@@ -3240,6 +3241,12 @@ int svm_range_list_init(struct kfd_process *p)<o:p></o:p></pre>
            <pre>                 if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev->adev))<o:p></o:p></pre>
            <pre>                         bitmap_set(svms->bitmap_supported, i, 1);<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>+       /* Bind granularity of buffer migration, either<o:p></o:p></pre>
            <pre>+        * the default size or one specified by the user<o:p></o:p></pre>
            <pre>+        */<o:p></o:p></pre>
            <pre>+       svms->attr_gobm = min_t(u8, amdgpu_svm_attr_gobm, 0x3F);<o:p></o:p></pre>
            <pre>+       pr_debug("Granularity Of Buffer Migration: %d\n", <o:p></o:p></pre>
            <pre>+ svms->attr_gobm);<o:p></o:p></pre>
            <pre>+<o:p></o:p></pre>
            <pre>         return 0;<o:p></o:p></pre>
            <pre>  }<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
            <pre>@@ -3767,8 +3774,9 @@ svm_range_get_attr(struct kfd_process *p, struct mm_struct *mm,<o:p></o:p></pre>
            <pre>         node = interval_tree_iter_first(&svms->objects, start, last);<o:p></o:p></pre>
            <pre>         if (!node) {<o:p></o:p></pre>
            <pre>                 pr_debug("range attrs not found return default values\n");<o:p></o:p></pre>
            <pre>-               svm_range_set_default_attributes(&location, &prefetch_loc,<o:p></o:p></pre>
            <pre>-                                                &granularity, &flags_and);<o:p></o:p></pre>
            <pre>+               granularity = svms->attr_gobm;<o:p></o:p></pre>
            <pre>+               svm_range_set_default_attributes(&location,<o:p></o:p></pre>
            <pre>+                                       &prefetch_loc, &flags_and);<o:p></o:p></pre>
            <pre>                 flags_or = flags_and;<o:p></o:p></pre>
            <pre>                 if (p->xnack_enabled)<o:p></o:p></pre>
            <pre>                         bitmap_copy(bitmap_access, <o:p></o:p></pre>
            <pre>svms->bitmap_supported,<o:p></o:p></pre>
            <pre>--<o:p></o:p></pre>
            <pre>2.34.1<o:p></o:p></pre>
            <pre><o:p> </o:p></pre>
          </blockquote>
        </blockquote>
      </div>
    </blockquote>
  </body>
</html>