<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=utf-8">
<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:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:等线;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@等线";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:宋体;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:宋体;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:等线;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
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="ZH-CN" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线">Hi  Xinhui<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线">Sure, can you submit one patch for it</span><span style="font-size:10.5pt;font-family:等线">?
<span lang="EN-US">I want to test it on my local server. Thanks in advance.<o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线">Best Regards<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线">Yintian Tao<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt;font-family:等线"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Pan, Xinhui <Xinhui.Pan@amd.com>
<br>
<b>Sent:</b> 2020</span><span style="font-size:11.0pt">年</span><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">3</span><span style="font-size:11.0pt">月</span><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">16</span><span style="font-size:11.0pt">日</span><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">
 17:51<br>
<b>To:</b> Koenig, Christian <Christian.Koenig@amd.com>; Tao, Yintian <Yintian.Tao@amd.com><br>
<b>Cc:</b> Deucher, Alexander <Alexander.Deucher@amd.com>; Kuehling, Felix <Felix.Kuehling@amd.com>; amd-gfx@lists.freedesktop.org<br>
<b>Subject:</b> Re: [PATCH v4 2/2] drm/amdgpu: unref pt bo after job submit<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p style="margin:15.0pt"><span lang="EN-US" style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#0078D7">[AMD Official Use Only - Internal Distribution Only]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Arial",sans-serif;color:black">I still hit page fault with option 1 while running oclperf test.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Arial",sans-serif;color:black">Looks like we need sync fence after commit.<o:p></o:p></span></p>
</div>
<div class="MsoNormal" align="center" style="text-align:center"><span lang="EN-US">
<hr size="2" width="98%" align="center">
</span></div>
<div id="divRplyFwdMsg">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:black"> Tao, Yintian <<a href="mailto:Yintian.Tao@amd.com">Yintian.Tao@amd.com</a>><br>
<b>Sent:</b> Monday, March 16, 2020 4:15:01 PM<br>
<b>To:</b> Pan, Xinhui <<a href="mailto:Xinhui.Pan@amd.com">Xinhui.Pan@amd.com</a>>; Koenig, Christian <<a href="mailto:Christian.Koenig@amd.com">Christian.Koenig@amd.com</a>><br>
<b>Cc:</b> Deucher, Alexander <<a href="mailto:Alexander.Deucher@amd.com">Alexander.Deucher@amd.com</a>>; Kuehling, Felix <<a href="mailto:Felix.Kuehling@amd.com">Felix.Kuehling@amd.com</a>>; Pan, Xinhui <<a href="mailto:Xinhui.Pan@amd.com">Xinhui.Pan@amd.com</a>>;
<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 v4 2/2] drm/amdgpu: unref pt bo after job submit</span><span lang="EN-US">
<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-US"> <o:p></o:p></span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Hi Xinhui<br>
<br>
<br>
I encounter the same problem(page fault) when test vk_example benchmark.<br>
I use your first option which can fix the problem. Can you help submit one patch?<br>
<br>
<br>
-       if (flags & AMDGPU_PTE_VALID) {<br>
-               struct amdgpu_bo *root = vm->root.base.bo;<br>
-               if (!dma_fence_is_signaled(vm->last_direct))<br>
-                       amdgpu_bo_fence(root, vm->last_direct, true);<br>
+       if (!dma_fence_is_signaled(vm->last_direct))<br>
+               amdgpu_bo_fence(root, vm->last_direct, true);<br>
 <br>
-               if (!dma_fence_is_signaled(vm->last_delayed))<br>
-                       amdgpu_bo_fence(root, vm->last_delayed, true);<br>
-       }<br>
+       if (!dma_fence_is_signaled(vm->last_delayed))<br>
+               amdgpu_bo_fence(root, vm->last_delayed, true);<br>
<br>
<br>
Best Regards<br>
Yintian Tao<br>
<br>
-----Original Message-----<br>
From: amd-gfx <<a href="mailto:amd-gfx-bounces@lists.freedesktop.org">amd-gfx-bounces@lists.freedesktop.org</a>> On Behalf Of Pan, Xinhui<br>
Sent: 2020</span><span style="font-size:11.0pt">年<span lang="EN-US">3</span>月<span lang="EN-US">14</span>日<span lang="EN-US"> 21:07<br>
To: Koenig, Christian <<a href="mailto:Christian.Koenig@amd.com">Christian.Koenig@amd.com</a>><br>
Cc: Deucher, Alexander <<a href="mailto:Alexander.Deucher@amd.com">Alexander.Deucher@amd.com</a>>; Kuehling, Felix <<a href="mailto:Felix.Kuehling@amd.com">Felix.Kuehling@amd.com</a>>; Pan, Xinhui <<a href="mailto:Xinhui.Pan@amd.com">Xinhui.Pan@amd.com</a>>;
<a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a><br>
Subject: Re: [PATCH v4 2/2] drm/amdgpu: unref pt bo after job submit<br>
<br>
hi, All<br>
I think I found the root cause. here is what happened.<br>
<br>
user: alloc/mapping memory<br>
          kernel: validate memory and update the bo mapping, and update the page table<br>
                        -> amdgpu_vm_bo_update_mapping<br>
                                -> amdgpu_vm_update_ptes<br>
                                        -> amdgpu_vm_alloc_pts<br>
                                                -> amdgpu_vm_clear_bo // it will submit a job and we have a fence. BUT it is NOT added in resv.<br>
user: free/unmapping memory<br>
                kernel: unmapping mmeory and udpate the page table<br>
                        -> amdgpu_vm_bo_update_mapping<br>
                        sync last_delay fence if flag & AMDGPU_PTE_VALID // of source we did not sync it here, as this is unmapping.<br>
                                -> amdgpu_vm_update_ptes<br>
                                        -> amdgpu_vm_free_pts // unref page table bo.<br>
<br>
So from the sequence above, we know there is a race betwen bo releasing and bo clearing.<br>
bo might have been released before job running.<br>
<br>
we can fix it in several ways,<br>
1) sync last_delay in both mapping and unmapping case.<br>
 Chris, you just sync last_delay in mapping case, should it be ok to sync it also in unmapping case?<br>
<br>
2) always add fence to resv after commit. <br>
 this is done by patchset v4. And only need patch 1. no need to move unref bo after commit.<br>
<br>
3) move unref bo after commit, and add the last delay fence to resv. <br>
This is done by patchset V1. <br>
<br>
<br>
any ideas?<br>
<br>
thanks<br>
xinhui<br>
<br>
> 2020</span>年<span lang="EN-US">3</span>月<span lang="EN-US">14</span>日<span lang="EN-US"> 02:05</span>,<span lang="EN-US">Koenig, Christian <<a href="mailto:Christian.Koenig@amd.com">Christian.Koenig@amd.com</a>>
</span>写道:<span lang="EN-US"><br>
> <br>
> The page table is not updated and then freed. A higher level PDE is updated and because of this the lower level page tables is freed.<br>
> <br>
> Without this it could be that the memory backing the freed page table is reused while the PDE is still pointing to it.<br>
> <br>
> Rather unlikely that this causes problems, but better save than sorry.<br>
> <br>
> Regards,<br>
> Christian.<br>
> <br>
> Am 13.03.20 um 18:36 schrieb Felix Kuehling:<br>
>> This seems weird. This means that we update a page table, and then free it in the same amdgpu_vm_update_ptes call? That means the update is redundant. Can we eliminate the redundant PTE update if the page table is about to be freed anyway?<br>
>> <br>
>> Regards,<br>
>>   Felix<br>
>> <br>
>> On 2020-03-13 12:09, xinhui pan wrote:<br>
>>> Free page table bo before job submit is insane.<br>
>>> We might touch invalid memory while job is runnig.<br>
>>> <br>
>>> we now have individualized bo resv during bo releasing.<br>
>>> So any fences added to root PT bo is actually untested when a normal <br>
>>> PT bo is releasing.<br>
>>> <br>
>>> We might hit gmc page fault or memory just got overwrited.<br>
>>> <br>
>>> Cc: Christian König <<a href="mailto:christian.koenig@amd.com">christian.koenig@amd.com</a>><br>
>>> Cc: Alex Deucher <<a href="mailto:alexander.deucher@amd.com">alexander.deucher@amd.com</a>><br>
>>> Cc: Felix Kuehling <<a href="mailto:Felix.Kuehling@amd.com">Felix.Kuehling@amd.com</a>><br>
>>> Signed-off-by: xinhui pan <<a href="mailto:xinhui.pan@amd.com">xinhui.pan@amd.com</a>><br>
>>> ---<br>
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 24 +++++++++++++++++++++---<br>
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h |  3 +++<br>
>>>   2 files changed, 24 insertions(+), 3 deletions(-)<br>
>>> <br>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c <br>
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<br>
>>> index 73398831196f..346e2f753474 100644<br>
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<br>
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<br>
>>> @@ -937,6 +937,21 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,<br>
>>>       return r;<br>
>>>   }<br>
>>>   +static void amdgpu_vm_free_zombie_bo(struct amdgpu_device *adev,<br>
>>> +        struct amdgpu_vm *vm)<br>
>>> +{<br>
>>> +    struct amdgpu_vm_pt *entry;<br>
>>> +<br>
>>> +    while (!list_empty(&vm->zombies)) {<br>
>>> +        entry = list_first_entry(&vm->zombies, struct amdgpu_vm_pt,<br>
>>> +                base.vm_status);<br>
>>> +        list_del(&entry->base.vm_status);<br>
>>> +<br>
>>> +        amdgpu_bo_unref(&entry->base.bo->shadow);<br>
>>> +        amdgpu_bo_unref(&entry->base.bo);<br>
>>> +    }<br>
>>> +}<br>
>>> +<br>
>>>   /**<br>
>>>    * amdgpu_vm_free_table - fre one PD/PT<br>
>>>    *<br>
>>> @@ -945,10 +960,9 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,<br>
>>>   static void amdgpu_vm_free_table(struct amdgpu_vm_pt *entry)<br>
>>>   {<br>
>>>       if (entry->base.bo) {<br>
>>> +        list_move(&entry->base.vm_status, <br>
>>> + &entry->base.bo->vm_bo->vm->zombies);<br>
>>>           entry->base.bo->vm_bo = NULL;<br>
>>> -        list_del(&entry->base.vm_status);<br>
>>> -        amdgpu_bo_unref(&entry->base.bo->shadow);<br>
>>> -        amdgpu_bo_unref(&entry->base.bo);<br>
>>>       }<br>
>>>       kvfree(entry->entries);<br>
>>>       entry->entries = NULL;<br>
>>> @@ -1624,6 +1638,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,<br>
>>>       r = vm->update_funcs->commit(&params, fence);<br>
>>>     error_unlock:<br>
>>> +    amdgpu_vm_free_zombie_bo(adev, vm);<br>
>>>       amdgpu_vm_eviction_unlock(vm);<br>
>>>       return r;<br>
>>>   }<br>
>>> @@ -2807,6 +2822,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,<br>
>>>       INIT_LIST_HEAD(&vm->invalidated);<br>
>>>       spin_lock_init(&vm->invalidated_lock);<br>
>>>       INIT_LIST_HEAD(&vm->freed);<br>
>>> +    INIT_LIST_HEAD(&vm->zombies);<br>
>>>           /* create scheduler entities for page table updates */ @@ <br>
>>> -3119,6 +3135,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)<br>
>>>       }<br>
>>>         amdgpu_vm_free_pts(adev, vm, NULL);<br>
>>> +    amdgpu_vm_free_zombie_bo(adev, vm);<br>
>>> +<br>
>>>       amdgpu_bo_unreserve(root);<br>
>>>       amdgpu_bo_unref(&root);<br>
>>>       WARN_ON(vm->root.base.bo);<br>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h <br>
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h<br>
>>> index b5705fcfc935..9baf44fa16f0 100644<br>
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h<br>
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h<br>
>>> @@ -269,6 +269,9 @@ struct amdgpu_vm {<br>
>>>       /* BO mappings freed, but not yet updated in the PT */<br>
>>>       struct list_head    freed;<br>
>>>   +    /* BO will be freed soon */<br>
>>> +    struct list_head    zombies;<br>
>>> +<br>
>>>       /* contains the page directory */<br>
>>>       struct amdgpu_vm_pt     root;<br>
>>>       struct dma_fence    *last_update;<br>
> <br>
<br>
_______________________________________________<br>
amd-gfx mailing list<br>
<a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a><br>
<a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=02%7C01%7Cyintian.tao%40amd.com%7C580c8ec15d484bf546b208d7c8188cc2%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637197880120611671&amp;sdata=dqSLasyuZhQskB38Kib6g8lQR9iMnyxFxfHGXXENoDc%3D&amp;reserved=0">https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=02%7C01%7Cyintian.tao%40amd.com%7C580c8ec15d484bf546b208d7c8188cc2%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637197880120611671&amp;sdata=dqSLasyuZhQskB38Kib6g8lQR9iMnyxFxfHGXXENoDc%3D&amp;reserved=0</a><o:p></o:p></span></span></p>
</div>
</div>
</div>
</div>
</body>
</html>