<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.EmailStyle22
{mso-style-type:personal-compose;
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">Good catch . Thanks . I will sent out another review for that .
<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">Regards<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif">Shaoyun.liu<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>
<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 <Philip.Yang@amd.com>
<br>
<b>Sent:</b> Thursday, October 17, 2024 3:47 PM<br>
<b>To:</b> Liu, Shaoyun <Shaoyun.Liu@amd.com>; amd-gfx@lists.freedesktop.org<br>
<b>Subject:</b> Re: [PATCH] drm/amd/amdkfd: add/remove kfd queues on start/stop KFD scheduling<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 2024-10-17 12:12, Shaoyun Liu wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>From: shaoyunl <a href="mailto:shaoyun.liu@amd.com"><shaoyun.liu@amd.com></a><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Add back kfd queues in start scheduling that originally been<o:p></o:p></pre>
<pre>removed on stop scheduling.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Signed-off-by: Shaoyun Liu <a href="mailto:shaoyun.liu@amd.com"><shaoyun.liu@amd.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> .../drm/amd/amdkfd/kfd_device_queue_manager.c | 40 +++++++++++++++++--<o:p></o:p></pre>
<pre> 1 file changed, 37 insertions(+), 3 deletions(-)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c<o:p></o:p></pre>
<pre>index b2b16a812e73..542363b4712e 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c<o:p></o:p></pre>
<pre>@@ -204,6 +204,8 @@ static int add_queue_mes(struct device_queue_manager *dqm, struct queue *q,<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> if (!down_read_trylock(&adev->reset_domain->sem))<o:p></o:p></pre>
<pre> return -EIO;<o:p></o:p></pre>
<pre>+ if (!dqm->sched_running || dqm->sched_halt) {<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal"> up_read(&adev->reset_domain->sem); <o:p>
</o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+ return 0;<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal"> }<br>
<br>
<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> memset(&queue_input, 0x0, sizeof(struct mes_add_queue_input));<o:p></o:p></pre>
<pre> queue_input.process_id = qpd->pqm->process->pasid;<o:p></o:p></pre>
<pre>@@ -272,6 +274,8 @@ static int remove_queue_mes(struct device_queue_manager *dqm, struct queue *q,<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> if (!down_read_trylock(&adev->reset_domain->sem))<o:p></o:p></pre>
<pre> return -EIO;<o:p></o:p></pre>
<pre>+ if (!dqm->sched_running || dqm->sched_halt) {<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal"> up_read(&adev->reset_domain->sem);<br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+ return 0;<o:p></o:p></pre>
</blockquote>
<p> }<o:p></o:p></p>
<p>It is simpler to move sched_halt/running check outside reset sem lock, but not sure if it is safe.<o:p></o:p></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> <o:p></o:p></pre>
<pre> memset(&queue_input, 0x0, sizeof(struct mes_remove_queue_input));<o:p></o:p></pre>
<pre> queue_input.doorbell_offset = q->properties.doorbell_off;<o:p></o:p></pre>
<pre>@@ -292,7 +296,7 @@ static int remove_queue_mes(struct device_queue_manager *dqm, struct queue *q,<o:p></o:p></pre>
<pre> return r;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-static int remove_all_queues_mes(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre>+static int remove_all_kfd_queues_mes(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct device_process_node *cur;<o:p></o:p></pre>
<pre> struct device *dev = dqm->dev->adev->dev;<o:p></o:p></pre>
<pre>@@ -319,6 +323,33 @@ static int remove_all_queues_mes(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre> return retval;<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>+static int add_all_kfd_queues_mes(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+ struct device_process_node *cur;<o:p></o:p></pre>
<pre>+ struct device *dev = dqm->dev->adev->dev;<o:p></o:p></pre>
<pre>+ struct qcm_process_device *qpd;<o:p></o:p></pre>
<pre>+ struct queue *q;<o:p></o:p></pre>
<pre>+ int retval = 0;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ list_for_each_entry(cur, &dqm->queues, list) {<o:p></o:p></pre>
<pre>+ qpd = cur->qpd;<o:p></o:p></pre>
<pre>+ list_for_each_entry(q, &qpd->queues_list, list) {<o:p></o:p></pre>
<pre>+ if (!q->properties.is_active)<o:p></o:p></pre>
<pre>+ continue;<o:p></o:p></pre>
<pre>+ retval = add_queue_mes(dqm, q, qpd);<o:p></o:p></pre>
<pre>+ if (retval) {<o:p></o:p></pre>
<pre>+ dev_err(dev, "%s: Failed to add queue %d for dev %d",<o:p></o:p></pre>
<pre>+ __func__,<o:p></o:p></pre>
<pre>+ q->properties.queue_id,<o:p></o:p></pre>
<pre>+ dqm->dev->id);<o:p></o:p></pre>
<pre>+ return retval;<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ return retval;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> static int suspend_all_queues_mes(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;<o:p></o:p></pre>
<pre>@@ -1742,7 +1773,7 @@ static int halt_cpsch(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre> KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0,<o:p></o:p></pre>
<pre> USE_DEFAULT_GRACE_PERIOD, false);<o:p></o:p></pre>
<pre> else<o:p></o:p></pre>
<pre>- ret = remove_all_queues_mes(dqm);<o:p></o:p></pre>
<pre>+ ret = remove_all_kfd_queues_mes(dqm);<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> dqm->sched_halt = true;<o:p></o:p></pre>
<pre> dqm_unlock(dqm);<o:p></o:p></pre>
<pre>@@ -1768,6 +1799,9 @@ static int unhalt_cpsch(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre> ret = execute_queues_cpsch(dqm,<o:p></o:p></pre>
<pre> KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES,<o:p></o:p></pre>
<pre> 0, USE_DEFAULT_GRACE_PERIOD);<o:p></o:p></pre>
<pre>+ else<o:p></o:p></pre>
<pre>+ ret = add_all_kfd_queues_mes(dqm);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> dqm_unlock(dqm);<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> return ret;<o:p></o:p></pre>
<pre>@@ -1867,7 +1901,7 @@ static int stop_cpsch(struct device_queue_manager *dqm)<o:p></o:p></pre>
<pre> if (!dqm->dev->kfd->shared_resources.enable_mes)<o:p></o:p></pre>
<pre> unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD, false);<o:p></o:p></pre>
<pre> else<o:p></o:p></pre>
<pre>- remove_all_queues_mes(dqm);<o:p></o:p></pre>
<pre>+ remove_all_kfd_queues_mes(dqm);<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> dqm->sched_running = false;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
</blockquote>
</div>
</div>
</body>
</html>