<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Courier New";
        color:windowtext;}
p.msipheadera4477989, li.msipheadera4477989, div.msipheadera4477989
        {mso-style-name:msipheadera4477989;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="msipheadera4477989" style="margin:0in"><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:blue">[AMD Official Use Only]</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Based on my experiments I am able conclude that I can avoid validating the BO prior to pinning it. I don’t have the code history that led me to validating the BO in the first place. In any case I
 posted an updated patch to the DRM-NEXT branch in addition to a standalone patch for the DKMS branch as well.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Thanks for pointing this out.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">Ramesh<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><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>From:</b> Errabolu, Ramesh <Ramesh.Errabolu@amd.com> <br>
<b>Sent:</b> Tuesday, November 9, 2021 1:32 AM<br>
<b>To:</b> Yu, Lang <Lang.Yu@amd.com><br>
<b>Cc:</b> amd-gfx@lists.freedesktop.org<br>
<b>Subject:</b> Re: [PATCH] drm/amdgpu: Pin MMIO/DOORBELL BO's in GTT domain<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">I will experiment to see if it is not needed. Will update patch based on the results.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Regards, <o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Ramesh<o:p></o:p></span></p>
</div>
</div>
<div class="MsoNormal" align="center" style="text-align:center">
<hr size="1" width="98%" align="center">
</div>
<div id="divRplyFwdMsg">
<p class="MsoNormal"><b><span style="color:black">From:</span></b><span style="color:black"> Yu, Lang <<a href="mailto:Lang.Yu@amd.com">Lang.Yu@amd.com</a>><br>
<b>Sent:</b> Tuesday, November 9, 2021 12:44 AM<br>
<b>To:</b> Errabolu, Ramesh <<a href="mailto:Ramesh.Errabolu@amd.com">Ramesh.Errabolu@amd.com</a>><br>
<b>Cc:</b> <a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a> <<a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>><br>
<b>Subject:</b> Re: [PATCH] drm/amdgpu: Pin MMIO/DOORBELL BO's in GTT domain</span>
<o:p></o:p></p>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">On Tue, Nov 09, 2021 at 02:12:00PM +0800, Errabolu, Ramesh wrote:<br>
> [AMD Official Use Only]<br>
> <br>
> Responses in line<br>
> <br>
> -----Original Message-----<br>
> From: Yu, Lang <<a href="mailto:Lang.Yu@amd.com">Lang.Yu@amd.com</a>> <br>
> Sent: Monday, November 8, 2021 11:27 PM<br>
> To: Errabolu, Ramesh <<a href="mailto:Ramesh.Errabolu@amd.com">Ramesh.Errabolu@amd.com</a>><br>
> Cc: <a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a><br>
> Subject: Re: [PATCH] drm/amdgpu: Pin MMIO/DOORBELL BO's in GTT domain<br>
> <br>
> On Mon, Nov 08, 2021 at 07:37:44PM -0600, Ramesh Errabolu wrote:<br>
> > MMIO/DOORBELL BOs encode control data and should be pinned in GTT <br>
> > domain before enabling PCIe connected peer devices in accessing it<br>
> > <br>
> > Signed-off-by: Ramesh Errabolu <<a href="mailto:Ramesh.Errabolu@amd.com">Ramesh.Errabolu@amd.com</a>><br>
> > ---<br>
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h    | 25 +++++++++<br>
> >  .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 55 <br>
> > +++++++++++++++++++<br>
> >  2 files changed, 80 insertions(+)<br>
> > <br>
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h <br>
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h<br>
> > index 4c1d6536a7a5..d9a1cfd7876f 100644<br>
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h<br>
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h<br>
> > @@ -300,6 +300,31 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,<br>
> >                                    uint64_t va, void *drm_priv,<br>
> >                                    struct kgd_mem **mem, uint64_t *size,<br>
> >                                    uint64_t *mmap_offset);<br>
> > +<br>
> > +/**<br>
> > + * amdgpu_amdkfd_gpuvm_pin_bo() - Pins a BO using following criteria<br>
> > + * @bo: Handle of buffer object being pinned<br>
> > + * @domain: Domain into which BO should be pinned<br>
> > + *<br>
> > + *   - USERPTR BOs are UNPINNABLE and will return error<br>
> > + *   - All other BO types (GTT, VRAM, MMIO and DOORBELL) will have their<br>
> > + *     PIN count incremented. It is valid to PIN a BO multiple times<br>
> > + *<br>
> > + * Return: ZERO if successful in pinning, Non-Zero in case of error.<br>
> > + * Will return -EINVAL if input BO parameter is a USERPTR type.<br>
> > + */<br>
> > +int amdgpu_amdkfd_gpuvm_pin_bo(struct amdgpu_bo *bo, u32 domain);<br>
> > +<br>
> > +/**<br>
> > + * amdgpu_amdkfd_gpuvm_unpin_bo() - Unpins BO using following <br>
> > +criteria<br>
> > + * @bo: Handle of buffer object being unpinned<br>
> > + *<br>
> > + *   - Is a illegal request for USERPTR BOs and is ignored<br>
> > + *   - All other BO types (GTT, VRAM, MMIO and DOORBELL) will have their<br>
> > + *     PIN count decremented. Calls to UNPIN must balance calls to PIN<br>
> > + */<br>
> > +void amdgpu_amdkfd_gpuvm_unpin_bo(struct amdgpu_bo *bo);<br>
> > +<br>
> >  int amdgpu_amdkfd_get_tile_config(struct amdgpu_device *adev,<br>
> >                              struct tile_config *config);<br>
> >  void amdgpu_amdkfd_ras_poison_consumption_handler(struct <br>
> > amdgpu_device *adev); diff --git <br>
> > a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c <br>
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<br>
> > index 4fa814358552..f4ffc41873dd 100644<br>
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<br>
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<br>
> > @@ -1299,6 +1299,36 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info,<br>
> >      return ret;<br>
> >  }<br>
> >  <br>
> > +int amdgpu_amdkfd_gpuvm_pin_bo(struct amdgpu_bo *bo, u32 domain) {<br>
> > +   int ret = 0;<br>
> > +<br>
> > +   ret = amdgpu_bo_reserve(bo, false);<br>
> > +   if (unlikely(ret))<br>
> > +           return ret;<br>
> > +<br>
> > +   ret = amdgpu_bo_pin_restricted(bo, domain, 0, 0);<br>
> > +   if (ret)<br>
> > +           pr_err("Error in Pinning BO to domain: %d\n", domain);<br>
> > +<br>
> > +   amdgpu_bo_sync_wait(bo, AMDGPU_FENCE_OWNER_KFD, false);<br>
> > +   amdgpu_bo_unreserve(bo);<br>
> > +<br>
> > +   return ret;<br>
> > +}<br>
> > +<br>
> > +void amdgpu_amdkfd_gpuvm_unpin_bo(struct amdgpu_bo *bo) {<br>
> > +   int ret = 0;<br>
> > +<br>
> > +   ret = amdgpu_bo_reserve(bo, false);<br>
> > +   if (unlikely(ret))<br>
> > +           return;<br>
> > +<br>
> > +   amdgpu_bo_unpin(bo);<br>
> > +   amdgpu_bo_unreserve(bo);<br>
> > +}<br>
> > +<br>
> >  int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev,<br>
> >                                         struct file *filp, u32 pasid,<br>
> >                                         void **process_info,<br>
> > @@ -1525,6 +1555,23 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(<br>
> >      if (offset)<br>
> >              *offset = amdgpu_bo_mmap_offset(bo);<br>
> >  <br>
> > +   if (flags & (KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL |<br>
> > +                   KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP)) {<br>
> > +           ret = amdgpu_amdkfd_bo_validate(bo, AMDGPU_GEM_DOMAIN_GTT, false);<br>
> > +           if (ret) {<br>
> > +                   pr_err("Validating MMIO/DOORBELL BO during ALLOC FAILED\n");<br>
> > +                   goto err_node_allow;<br>
> > +           }<br>
> <br>
> amdgpu_amdkfd_gpuvm_pin_bo() will do ttm_bo_validate(),<br>
> amdgpu_amdkfd_bo_validate() seems redundant here.<br>
> <br>
> Ramesh: In my experiments I recall seeing an issue if BO was not validated in GTT domain prior to pinning. If my memory serves me correctly, the call to PIN will fail<br>
<br>
>From amdgpu_bo_pin_restricted() we can see, pin operation will<br>
<br>
If not pinned, <br>
1, validate the BO with requested domain<br>
2, increase pin count and update stats<br>
<br>
If already pinned,<br>
1, increase pin count<br>
<br>
So seems not necessarily to validate it twice.<br>
<br>
Regards,<br>
Lang<br>
 <br>
> > +<br>
> > +           ret = amdgpu_amdkfd_gpuvm_pin_bo(bo, AMDGPU_GEM_DOMAIN_GTT);<br>
> > +           if (ret) {<br>
> > +                   pr_err("Pinning MMIO/DOORBELL BO during ALLOC FAILED\n");<br>
> > +                   goto err_node_allow;<br>
> > +           }<br>
> > +           bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;<br>
> > +           bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;<br>
> > +   }<br>
> > +<br>
> >      return 0;<br>
> >  <br>
> >  allocate_init_user_pages_failed:<br>
> > @@ -1561,6 +1608,14 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(<br>
> >      bool is_imported = false;<br>
> >  <br>
> >      mutex_lock(&mem->lock);<br>
> > +<br>
> > +   /* Unpin MMIO/DOORBELL BO's that were pinnned during allocation */<br>
> > +   if (mem->alloc_flags &<br>
> > +       (KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL |<br>
> > +        KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP)) {<br>
> > +           amdgpu_amdkfd_gpuvm_unpin_bo(mem->bo);<br>
> > +   }<br>
> > +<br>
> >      mapped_to_gpu_memory = mem->mapped_to_gpu_memory;<br>
> >      is_imported = mem->is_imported;<br>
> >      mutex_unlock(&mem->lock);<br>
> > --<br>
> > 2.31.1<br>
> > <o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>