<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)">
<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:DengXian;
        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:Aptos;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
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.EmailStyle23
        {mso-style-type:personal-reply;
        font-family:"Arial",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@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="blue" vlink="purple" style="word-wrap:break-word">
<p style="font-family:Calibri;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - AMD Internal Distribution Only]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">Hi Philip,<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">It still has the deadlock, maybe the best way is trying to remove the delayed free pt work.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000000>] INFO: task kfdtest:5827 blocked for more than 122 seconds.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000290>]       Tainted: G           OE K   5.10.134-17.2.al8.x86_64 #1<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000243>] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000317>] task:kfdtest         state:D stack:    0 pid: 5827 ppid:  5756 flags:0x00004080<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>] Call Trace:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000006>]  __schedule+0x1ba/0x490<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  ? usleep_range+0x90/0x90<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  schedule+0x46/0xb0<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>]  schedule_timeout+0x12a/0x140<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000003>]  ? __prepare_to_swait+0x4f/0x70<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  __wait_for_common+0xb1/0x160<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000004>]  flush_workqueue+0x12f/0x410<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000126>]  svm_range_map_to_gpu+0x1b8/0x730 [amdgpu]<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000078>]  svm_range_validate_and_map+0x978/0xd30 [amdgpu]<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000065>]  svm_range_set_attr+0x55f/0xb20 [amdgpu]<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000060>]  kfd_ioctl+0x208/0x540 [amdgpu]<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000058>]  ? kfd_ioctl_set_xnack_mode+0xd0/0xd0 [amdgpu]<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000004>]  ? vm_mmap_pgoff+0xf2/0x120<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  __x64_sys_ioctl+0x88/0xc0<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000003>]  do_syscall_64+0x2e/0x50<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  entry_SYSCALL_64_after_hwframe+0x62/0xc7<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000008>] RIP: 0033:0x7f8c472617db<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>] RSP: 002b:00007ffd2908a688 EFLAGS: 00000246 ORIG_RAX: 0000000000000010<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>] RAX: ffffffffffffffda RBX: 00007ffd2908a6fc RCX: 00007f8c472617db<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>] RDX: 00007ffd2908a6c0 RSI: 00000000c0384b20 RDI: 0000000000000003<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000000>] RBP: 00007ffd2908a6c0 R08: 0000000000000000 R09: 0000000000000000<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>] R10: 00007f70f467f000 R11: 0000000000000246 R12: 00000000c0384b20<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000000>] R13: 0000000000000003 R14: 0000000000200000 R15: 00007ffd2908a770<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000003>] INFO: task kworker/u129:7:5942 blocked for more than 122 seconds.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.001897>]       Tainted: G           OE K   5.10.134-17.2.al8.x86_64 #1<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000247>] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000315>] task:kworker/u129:7  state:D stack:    0 pid: 5942 ppid:     2 flags:0x00004080<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000067>] Workqueue: amdgpu_recycle amdgpu_vm_pt_free_work [amdgpu]<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>] Call Trace:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000003>]  __schedule+0x1ba/0x490<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  ? newidle_balance+0x16a/0x3b0<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>]  schedule+0x46/0xb0<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  schedule_preempt_disabled+0xa/0x10<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>]  __ww_mutex_lock.constprop.0+0x390/0x6e0<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000045>]  amdgpu_vm_pt_free_work+0x97/0x160 [amdgpu]<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000003>]  process_one_work+0x1ad/0x380<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>]  worker_thread+0x49/0x310<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>]  ? process_one_work+0x380/0x380<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000001>]  kthread+0x118/0x140<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent:12.0pt"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  ? __kthread_bind_mask+0x60/0x60<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Wed Jan  8 10:35:44 2025 <    0.000002>]  ret_from_fork+0x1f/0x30<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-ligatures:standardcontextual">Emily Deng<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-ligatures:standardcontextual">Best Wishes<o:p></o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<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"> amd-gfx <amd-gfx-bounces@lists.freedesktop.org>
<b>On Behalf Of </b>Deng, Emily<br>
<b>Sent:</b> Wednesday, January 8, 2025 8:34 AM<br>
<b>To:</b> Yang, Philip <Philip.Yang@amd.com>; Kuehling, Felix <Felix.Kuehling@amd.com>; amd-gfx@lists.freedesktop.org; Koenig, Christian <Christian.Koenig@amd.com><br>
<b>Subject:</b> RE: [PATCH v2] drm/amdgpu: Fix the looply call svm_range_restore_pages issue<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p style="margin:5.0pt"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif;color:blue">[AMD Official Use Only - AMD Internal Distribution Only]<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p style="margin:5.0pt"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif;color:blue">[AMD Official Use Only - AMD Internal Distribution Only]<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<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"> Yang, Philip <<a href="mailto:Philip.Yang@amd.com">Philip.Yang@amd.com</a>>
<br>
<b>Sent:</b> Tuesday, January 7, 2025 11:19 PM<br>
<b>To:</b> Deng, Emily <<a href="mailto:Emily.Deng@amd.com">Emily.Deng@amd.com</a>>; Kuehling, Felix <<a href="mailto:Felix.Kuehling@amd.com">Felix.Kuehling@amd.com</a>>;
<a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>; Yang, Philip <<a href="mailto:Philip.Yang@amd.com">Philip.Yang@amd.com</a>>; Koenig, Christian <<a href="mailto:Christian.Koenig@amd.com">Christian.Koenig@amd.com</a>><br>
<b>Subject:</b> Re: [PATCH v2] drm/amdgpu: Fix the looply call svm_range_restore_pages issue<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 2025-01-07 07:30, Deng, Emily wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>[AMD Official Use Only - AMD Internal Distribution Only]<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Hi Felix,<o:p></o:p></pre>
<pre>    You are right, it is easily to hit deadlock, don't know why LOCKDEP doesn't catch this. Need to find another solution.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Hi Philip,<o:p></o:p></pre>
<pre>     Do you have a solution for this delay free pt?<o:p></o:p></pre>
</blockquote>
<p>Thanks for debugging this case, I had a patch to not free PTB bo when unmapping from GPU, but it will waste VRAM memory. My test case also passed with the tlb flush fence fix, I don't see the no-retry fault generated any more.<o:p></o:p></p>
<p>The deadlock is probably from svm_range_unmap_from_gpu -> flush_workqueue(adev->wq), this is from mmu notifier callback, actually we only need flush pt_free_work before mapping to gpu, please remove the flush_workqueue in unmap from gpu. If deadlock still
 happens, please post the backtrace.<o:p></o:p></p>
<p><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Emily]Yes, you are right, will try to remove
</span>flush_workqueue in unmap from gpu to have a try. Will send a v3.<span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p></o:p></span></p>
<p>I think you don't need add new adev->wq, use default system_wq and flush_work.<o:p></o:p></p>
<p><span style="font-size:11.0pt;font-family:"Arial",sans-serif">[Emily]No, it doesn’t allow to flush a system_wq in driver, it will trigger a kernel warning, as lots of other work will be put in system_wq. I have tried this.<o:p></o:p></span></p>
<p>Regards,<o:p></o:p></p>
<p>Philip<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>Emily Deng<o:p></o:p></pre>
<pre>Best Wishes<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>-----Original Message-----<o:p></o:p></pre>
<pre>From: Deng, Emily <a href="mailto:Emily.Deng@amd.com"><Emily.Deng@amd.com></a><o:p></o:p></pre>
<pre>Sent: Tuesday, January 7, 2025 10:34 AM<o:p></o:p></pre>
<pre>To: Deng, Emily <a href="mailto:Emily.Deng@amd.com"><Emily.Deng@amd.com></a>; Kuehling, Felix<o:p></o:p></pre>
<pre><a href="mailto:Felix.Kuehling@amd.com"><Felix.Kuehling@amd.com></a>; <a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>; Yang, Philip<o:p></o:p></pre>
<pre><a href="mailto:Philip.Yang@amd.com"><Philip.Yang@amd.com></a>; Koenig, Christian <a href="mailto:Christian.Koenig@amd.com"><Christian.Koenig@amd.com></a><o:p></o:p></pre>
<pre>Subject: RE: [PATCH v2] drm/amdgpu: Fix the looply call svm_range_restore_pages<o:p></o:p></pre>
<pre>issue<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>[AMD Official Use Only - AMD Internal Distribution Only]<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Ping....<o:p></o:p></pre>
<pre>How about this? Currently it is easily to reproduce the issue on our environment. We<o:p></o:p></pre>
<pre>need this change to fix it.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Emily Deng<o:p></o:p></pre>
<pre>Best Wishes<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>-----Original Message-----<o:p></o:p></pre>
<pre>From: amd-gfx <a href="mailto:amd-gfx-bounces@lists.freedesktop.org"><amd-gfx-bounces@lists.freedesktop.org></a> On Behalf Of<o:p></o:p></pre>
<pre>Deng, Emily<o:p></o:p></pre>
<pre>Sent: Monday, January 6, 2025 9:52 AM<o:p></o:p></pre>
<pre>To: Kuehling, Felix <a href="mailto:Felix.Kuehling@amd.com"><Felix.Kuehling@amd.com></a>;<o:p></o:p></pre>
<pre><a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>; Yang, Philip <a href="mailto:Philip.Yang@amd.com"><Philip.Yang@amd.com></a>;<o:p></o:p></pre>
<pre>Koenig, Christian <a href="mailto:Christian.Koenig@amd.com"><Christian.Koenig@amd.com></a><o:p></o:p></pre>
<pre>Subject: RE: [PATCH v2] drm/amdgpu: Fix the looply call<o:p></o:p></pre>
<pre>svm_range_restore_pages issue<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>[AMD Official Use Only - AMD Internal Distribution Only]<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>[AMD Official Use Only - AMD Internal Distribution Only]<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>-----Original Message-----<o:p></o:p></pre>
<pre>From: Kuehling, Felix <a href="mailto:Felix.Kuehling@amd.com"><Felix.Kuehling@amd.com></a><o:p></o:p></pre>
<pre>Sent: Saturday, January 4, 2025 7:18 AM<o:p></o:p></pre>
<pre>To: Deng, Emily <a href="mailto:Emily.Deng@amd.com"><Emily.Deng@amd.com></a>; <a href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>;<o:p></o:p></pre>
<pre>Yang, Philip <a href="mailto:Philip.Yang@amd.com"><Philip.Yang@amd.com></a>; Koenig, Christian<o:p></o:p></pre>
<pre><a href="mailto:Christian.Koenig@amd.com"><Christian.Koenig@amd.com></a><o:p></o:p></pre>
<pre>Subject: Re: [PATCH v2] drm/amdgpu: Fix the looply call<o:p></o:p></pre>
<pre>svm_range_restore_pages issue<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre><o:p> </o:p></pre>
<pre>On 2025-01-02 21:26, Emily Deng wrote:<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>As the delayed free pt, the wanted freed bo has been reused which<o:p></o:p></pre>
<pre>will cause unexpected page fault, and then call svm_range_restore_pages.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Detail as below:<o:p></o:p></pre>
<pre>1.It wants to free the pt in follow code, but it is not freed<o:p></o:p></pre>
<pre>immediately and used “schedule_work(&vm->pt_free_work);”.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>[   92.276838] Call Trace:<o:p></o:p></pre>
<pre>[   92.276841]  dump_stack+0x63/0xa0<o:p></o:p></pre>
<pre>[   92.276887]  amdgpu_vm_pt_free_list+0xfb/0x120 [amdgpu]<o:p></o:p></pre>
<pre>[   92.276932]  amdgpu_vm_update_range+0x69c/0x8e0 [amdgpu]<o:p></o:p></pre>
<pre>[   92.276990]  svm_range_unmap_from_gpus+0x112/0x310 [amdgpu]<o:p></o:p></pre>
<pre>[   92.277046]  svm_range_cpu_invalidate_pagetables+0x725/0x780 [amdgpu]<o:p></o:p></pre>
<pre>[   92.277050]  ? __alloc_pages_nodemask+0x19f/0x3e0<o:p></o:p></pre>
<pre>[   92.277051]  mn_itree_invalidate+0x72/0xc0<o:p></o:p></pre>
<pre>[   92.277052]  __mmu_notifier_invalidate_range_start+0x48/0x60<o:p></o:p></pre>
<pre>[   92.277054]  migrate_vma_collect+0xf6/0x100<o:p></o:p></pre>
<pre>[   92.277055]  migrate_vma_setup+0xcf/0x120<o:p></o:p></pre>
<pre>[   92.277109]  svm_migrate_ram_to_vram+0x256/0x6b0 [amdgpu]<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>2.Call svm_range_map_to_gpu->amdgpu_vm_update_range to update the<o:p></o:p></pre>
<pre>page table, at this time it will use the same entry bo which is the<o:p></o:p></pre>
<pre>want free bo in step1.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>3.Then it executes the pt_free_work to free the bo. At this time,<o:p></o:p></pre>
<pre>the GPU access memory will cause page fault as pt bo has been freed.<o:p></o:p></pre>
<pre>And then it will call svm_range_restore_pages again.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>How to fix?<o:p></o:p></pre>
<pre>Add a workqueue, and flush the workqueue each time before updating page<o:p></o:p></pre>
</blockquote>
</blockquote>
</blockquote>
<pre>table.<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>I think this is kind of a known issue in the GPUVM code. Philip was<o:p></o:p></pre>
<pre>looking at it before.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Just flushing a workqueue may seem like a simple and elegant solution,<o:p></o:p></pre>
<pre>but I'm afraid it introduces lock dependency issues. By flushing the<o:p></o:p></pre>
<pre>workqueue, you're effectively creating a lock dependency of the MMU<o:p></o:p></pre>
<pre>notifier on any locks held inside the worker function. You now get a<o:p></o:p></pre>
<pre>circular lock dependency with any of those locks and memory reclaim. I<o:p></o:p></pre>
<pre>think LOCKDEP would be able to catch that if you compile your kernel<o:p></o:p></pre>
<pre>with that<o:p></o:p></pre>
</blockquote>
<pre>feature enabled.<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>The proper solution is to prevent delayed freeing of page tables if<o:p></o:p></pre>
<pre>they happened to get reused, or prevent reuse of page tables if they<o:p></o:p></pre>
<pre>are flagged for<o:p></o:p></pre>
</blockquote>
<pre>delayed freeing.<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>Regards,<o:p></o:p></pre>
<pre>  Felix<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
</blockquote>
<pre>Thanks, already enabled LOCKDEP while compiling the kernel. The delay<o:p></o:p></pre>
<pre>work seems for other reasons, I am not sure whether it could be deleted completely.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Emily Deng<o:p></o:p></pre>
<pre>Best Wishes<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>Signed-off-by: Emily Deng <a href="mailto:Emily.Deng@amd.com"><Emily.Deng@amd.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre>  drivers/gpu/drm/amd/amdgpu/amdgpu.h              | 1 +<o:p></o:p></pre>
<pre>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 1 +<o:p></o:p></pre>
<pre>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c           | 7 +++++--<o:p></o:p></pre>
<pre>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c        | 6 +++++-<o:p></o:p></pre>
<pre>  drivers/gpu/drm/amd/amdkfd/kfd_svm.c             | 3 +++<o:p></o:p></pre>
<pre>  5 files changed, 15 insertions(+), 3 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 93c352b08969..cbf68ad1c8d0 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>@@ -1188,6 +1188,7 @@ struct amdgpu_device {<o:p></o:p></pre>
<pre>     struct mutex                    enforce_isolation_mutex;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     struct amdgpu_init_level *init_lvl;<o:p></o:p></pre>
<pre>+    struct workqueue_struct *wq;<o:p></o:p></pre>
<pre>  };<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>  static inline uint32_t amdgpu_ip_version(const struct<o:p></o:p></pre>
<pre>amdgpu_device *adev, diff --git<o:p></o:p></pre>
<pre>a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<o:p></o:p></pre>
<pre>b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<o:p></o:p></pre>
<pre>index f30548f4c3b3..5b4835bc81b3 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c<o:p></o:p></pre>
<pre>@@ -2069,6 +2069,7 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(<o:p></o:p></pre>
<pre>             if (ret)<o:p></o:p></pre>
<pre>                     goto out;<o:p></o:p></pre>
<pre>     }<o:p></o:p></pre>
<pre>+    flush_workqueue(adev->wq);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     ret = reserve_bo_and_vm(mem, avm, &ctx);<o:p></o:p></pre>
<pre>     if (unlikely(ret))<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<o:p></o:p></pre>
<pre>b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<o:p></o:p></pre>
<pre>index 9d6ffe38b48a..500d97cd9114 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<o:p></o:p></pre>
<pre>@@ -2607,7 +2607,7 @@ void amdgpu_vm_fini(struct amdgpu_device<o:p></o:p></pre>
<pre>*adev,<o:p></o:p></pre>
</blockquote>
<pre>struct amdgpu_vm *vm)<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>     amdgpu_amdkfd_gpuvm_destroy_cb(adev, vm);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     flush_work(&vm->pt_free_work);<o:p></o:p></pre>
<pre>-<o:p></o:p></pre>
<pre>+    cancel_work_sync(&vm->pt_free_work);<o:p></o:p></pre>
<pre>     root = amdgpu_bo_ref(vm->root.bo);<o:p></o:p></pre>
<pre>     amdgpu_bo_reserve(root, true);<o:p></o:p></pre>
<pre>     amdgpu_vm_put_task_info(vm->task_info);<o:p></o:p></pre>
<pre>@@ -2708,6 +2708,8 @@ void amdgpu_vm_manager_init(struct<o:p></o:p></pre>
<pre>amdgpu_device<o:p></o:p></pre>
</blockquote>
<pre>*adev)<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>  #endif<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     xa_init_flags(&adev->vm_manager.pasids, XA_FLAGS_LOCK_IRQ);<o:p></o:p></pre>
<pre>+    adev->wq = alloc_workqueue("amdgpu_recycle",<o:p></o:p></pre>
<pre>+                               WQ_MEM_RECLAIM | WQ_HIGHPRI |<o:p></o:p></pre>
</blockquote>
<pre>WQ_UNBOUND, 16);<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>  }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>  /**<o:p></o:p></pre>
<pre>@@ -2721,7 +2723,8 @@ void amdgpu_vm_manager_fini(struct<o:p></o:p></pre>
<pre>amdgpu_device<o:p></o:p></pre>
</blockquote>
<pre>*adev)<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>  {<o:p></o:p></pre>
<pre>     WARN_ON(!xa_empty(&adev->vm_manager.pasids));<o:p></o:p></pre>
<pre>     xa_destroy(&adev->vm_manager.pasids);<o:p></o:p></pre>
<pre>-<o:p></o:p></pre>
<pre>+    flush_workqueue(adev->wq);<o:p></o:p></pre>
<pre>+    destroy_workqueue(adev->wq);<o:p></o:p></pre>
<pre>     amdgpu_vmid_mgr_fini(adev);<o:p></o:p></pre>
<pre>  }<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c<o:p></o:p></pre>
<pre>b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c<o:p></o:p></pre>
<pre>index f78a0434a48f..1204406215ee 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c<o:p></o:p></pre>
<pre>@@ -554,15 +554,19 @@ void amdgpu_vm_pt_free_work(struct work_struct<o:p></o:p></pre>
<pre>*work)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     vm = container_of(work, struct amdgpu_vm, pt_free_work);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>+    printk("Emily:%s\n", __func__);<o:p></o:p></pre>
<pre>     spin_lock(&vm->status_lock);<o:p></o:p></pre>
<pre>     list_splice_init(&vm->pt_freed, &pt_freed);<o:p></o:p></pre>
<pre>     spin_unlock(&vm->status_lock);<o:p></o:p></pre>
<pre>+    printk("Emily:%s 1\n", __func__);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     /* flush_work in amdgpu_vm_fini ensure vm->root.bo is valid. */<o:p></o:p></pre>
<pre>     amdgpu_bo_reserve(vm->root.bo, true);<o:p></o:p></pre>
<pre>+    printk("Emily:%s 2\n", __func__);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     list_for_each_entry_safe(entry, next, &pt_freed, vm_status)<o:p></o:p></pre>
<pre>             amdgpu_vm_pt_free(entry);<o:p></o:p></pre>
<pre>+    printk("Emily:%s 3\n", __func__);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     amdgpu_bo_unreserve(vm->root.bo);<o:p></o:p></pre>
<pre>  }<o:p></o:p></pre>
<pre>@@ -589,7 +593,7 @@ void amdgpu_vm_pt_free_list(struct amdgpu_device<o:p></o:p></pre>
</blockquote>
<pre>*adev,<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>             spin_lock(&vm->status_lock);<o:p></o:p></pre>
<pre>             list_splice_init(&params->tlb_flush_waitlist, &vm->pt_freed);<o:p></o:p></pre>
<pre>             spin_unlock(&vm->status_lock);<o:p></o:p></pre>
<pre>-            schedule_work(&vm->pt_free_work);<o:p></o:p></pre>
<pre>+            queue_work(adev->wq, &vm->pt_free_work);<o:p></o:p></pre>
<pre>             return;<o:p></o:p></pre>
<pre>     }<o:p></o:p></pre>
<pre><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 3e2911895c74..55edf96d5a95 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>@@ -1314,6 +1314,7 @@ svm_range_unmap_from_gpu(struct amdgpu_device<o:p></o:p></pre>
</blockquote>
<pre>*adev, struct amdgpu_vm *vm,<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>     uint64_t init_pte_value = 0;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     pr_debug("[0x%llx 0x%llx]\n", start, last);<o:p></o:p></pre>
<pre>+    flush_workqueue(adev->wq);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>     return amdgpu_vm_update_range(adev, vm, false, true, true,<o:p></o:p></pre>
<pre>false, NULL,<o:p></o:p></pre>
</blockquote>
<pre>start,<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>                                   last, init_pte_value, 0, 0, NULL,<o:p></o:p></pre>
<pre>NULL, @@ -1422,6<o:p></o:p></pre>
</blockquote>
<pre>+1423,8<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>@@ svm_range_map_to_gpu(struct kfd_process_device *pdd, struct<o:p></o:p></pre>
<pre>svm_range<o:p></o:p></pre>
</blockquote>
<pre>*prange,<o:p></o:p></pre>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>              * different memory partition based on fpfn/lpfn, we should use<o:p></o:p></pre>
<pre>              * same vm_manager.vram_base_offset regardless memory partition.<o:p></o:p></pre>
<pre>              */<o:p></o:p></pre>
<pre>+            flush_workqueue(adev->wq);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>             r = amdgpu_vm_update_range(adev, vm, false, false, flush_tlb, true,<o:p></o:p></pre>
<pre>                                        NULL, last_start, prange->start + i,<o:p></o:p></pre>
<pre>                                        pte_flags,<o:p></o:p></pre>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<pre><o:p> </o:p></pre>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>