<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: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;}
/* 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.EmailStyle21
        {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:#008000;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[Public]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><font size="2" face="Arial"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">The big thing is that HMM doesn’t support a lack of read permissions. So does it make sense to make any HMM calls or set any HMM flags if it’s an
 unsupported configuration that it will fault on? That was why I went down this path, since trying to remove the READ permissions here while still using HMM calls could go sideways, if HMM will automatically fail if READ permissions are missing.
<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" face="Arial"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></font></p>
<p class="MsoNormal"><font size="2" face="Arial"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">Kent<o:p></o:p></span></font></p>
<p class="MsoNormal"><font size="2" face="Arial"><span style="font-size:11.0pt;font-family:"Arial",sans-serif"><o:p> </o:p></span></font></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><font size="2" face="Calibri"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;font-weight:bold">From:</span></font></b><font size="2" face="Calibri"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Chen,
 Xiaogang <Xiaogang.Chen@amd.com> <br>
<b><span style="font-weight:bold">Sent:</span></b> Tuesday, July 22, 2025 6:46 PM<br>
<b><span style="font-weight:bold">To:</span></b> Russell, Kent <Kent.Russell@amd.com>; amd-gfx@lists.freedesktop.org<br>
<b><span style="font-weight:bold">Cc:</span></b> Kuehling, Felix <Felix.Kuehling@amd.com><br>
<b><span style="font-weight:bold">Subject:</span></b> Re: [PATCH] drm/amdkfd: Handle lack of READ permissions in SVM mapping<o:p></o:p></span></font></p>
</div>
</div>
<p class="MsoNormal"><font size="3" face="Aptos"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
<p><font size="3" face="Aptos"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
<div>
<p class="MsoNormal"><font size="3" face="Aptos"><span style="font-size:12.0pt">On 7/22/2025 11:24 AM, Kent Russell wrote:<o:p></o:p></span></font></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">HMM assumes that pages have READ permissions by default. Inside<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">svm_range_validate_and_map, we add READ permissions then add WRITE<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">permissions if the VMA isn't read-only. This will conflict with regions<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">that only have PROT_WRITE or have PROT_NONE. When that happens,<o:p></o:p></span></font></pre>
</blockquote>
<p class="MsoNormal"><font size="3" face="Aptos"><span style="font-size:12.0pt">Why read-only conflict with PROT_WRITE or have PROT_NONE? They are vma->vm_flags that specifies the vma protection. User can change its value at runtime. Is user not allowed to
 change it from read-only to PROT_NONE? <o:p></o:p></span></font></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt"><o:p> </o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">svm_range_validate_and_map will continue to retry, silently, giving the<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">impression of a hang.<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt"><o:p> </o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">If pages don't have READ permissions, simply unmap them and continue. If<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">they weren't mapped in the first place, this would be a no-op. Since x86<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">doesn't support write-only, and PROT_NONE doesn't allow reads or writes<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">anyways, this will allow the svm range validation to continue without<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">getting stuck in a loop forever on mappings we can't use with HMM.<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt"><o:p> </o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">Signed-off-by: Kent Russell <a href="mailto:kent.russell@amd.com"><kent.russell@amd.com></a><o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">---<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt"> drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 18 ++++++++++++++++++<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt"> 1 file changed, 18 insertions(+)<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt"><o:p> </o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">index e23b5a0f31f2..10b70b941b11 100644<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">@@ -1713,6 +1713,24 @@ static int svm_range_validate_and_map(struct mm_struct *mm,<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt"> <o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">                        next = min(vma->vm_end, end);<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">                        npages = (next - addr) >> PAGE_SHIFT;<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                       /* HMM requires at least READ permissions. If provided with PROT_NONE,<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                        * unmap the memory. If it's not already mapped, this is a no-op<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                        * If PROT_WRITE is provided without READ, warn first then unmap<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                        */<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                       if (!(vma->vm_flags & VM_READ)) {<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                              unsigned long e, s;<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                              if (vma->vm_flags & VM_WRITE)<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                                      pr_warn("VM_WRITE without VM_READ is not supported");<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                              s = max(start, prange->start);<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                              e = min(end, prange->last);<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                              if (e >= s)<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                               svm_range_unmap_from_gpus(prange, s, e,<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                                                     KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU);<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                              addr = next;<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                              continue;<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+                       }<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">+<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">                        WRITE_ONCE(p->svms.faulting_task, current);<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">                        r = amdgpu_hmm_range_get_pages(&prange->notifier, addr, npages,<o:p></o:p></span></font></pre>
<pre><font size="2" face="Courier New"><span style="font-size:10.0pt">                                                      readonly, owner, NULL,<o:p></o:p></span></font></pre>
</blockquote>
<p><font size="3" face="Aptos"><span style="font-size:12.0pt">It seems the real problem is at amdgpu_hmm_range_get_pages. It always set HMM_PFN_REQ_FAULT to hmm_range->default_flags. HMM_PFN_REQ_FAULT means the page is faultable and a future call with HMM_PFN_REQ_FAULT
 could succeed. When vma->vm_flags is PROT_NONE the vma is not faultable, so hmm_range->default_flags should be not set to HMM_PFN_REQ_FAULT to avoid hmm_range_fault fault this vma.
<o:p></o:p></span></font></p>
<p><font size="3" face="Aptos"><span style="font-size:12.0pt">Regards<o:p></o:p></span></font></p>
<p><font size="3" face="Aptos"><span style="font-size:12.0pt">Xiaogang<o:p></o:p></span></font></p>
<p><font size="3" face="Aptos"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
<p><font size="3" face="Aptos"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
<p><font size="3" face="Aptos"><span style="font-size:12.0pt"><o:p> </o:p></span></font></p>
</div>
</div>
</div>
</body>
</html>