<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p style="font-family:Arial;font-size:11pt;color:#0078D7;margin:5pt;" align="Left">
[AMD Official Use Only - Internal Distribution Only]<br>
</p>
<br>
<div>
<div dir="auto" style="direction: ltr; margin: 0px; padding: 0px; font-family: sans-serif; font-size: 11pt; color: black; text-align: left;">
Hi,Andrey,<br>
</div>
<div dir="auto" style="direction: ltr; margin: 0; padding: 0; font-family: sans-serif; font-size: 11pt; color: black; ">
<br>
</div>
<div dir="auto" style="direction: ltr; margin: 0; padding: 0; font-family: sans-serif; font-size: 11pt; color: black; ">
Good catch,I will expore this corner case and give feedback soon~<br>
<br>
</div>
<div dir="auto" style="direction: ltr; margin: 0; padding: 0; font-family: sans-serif; font-size: 11pt; color: black; ">
Best,<br>
</div>
<div dir="auto" style="direction: ltr; margin: 0px; padding: 0px; font-family: sans-serif; font-size: 11pt; color: black; text-align: left;">
Jack<br>
</div>
<div dir="auto" style="direction: ltr; margin: 0; padding: 0; font-family: sans-serif; font-size: 11pt; color: black; ">
<br>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Grodzovsky, Andrey <Andrey.Grodzovsky@amd.com><br>
<b>Sent:</b> Wednesday, March 17, 2021 10:50:59 PM<br>
<b>To:</b> Christian König <ckoenig.leichtzumerken@gmail.com>; Zhang, Jack (Jian) <Jack.Zhang1@amd.com>; dri-devel@lists.freedesktop.org <dri-devel@lists.freedesktop.org>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>; Koenig, Christian <Christian.Koenig@amd.com>;
 Liu, Monk <Monk.Liu@amd.com>; Deng, Emily <Emily.Deng@amd.com>; Rob Herring <robh@kernel.org>; Tomeu Vizoso <tomeu.vizoso@collabora.com>; Steven Price <steven.price@arm.com><br>
<b>Subject:</b> Re: [PATCH v3] drm/scheduler re-insert Bailing job to avoid memleak</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">I actually have a race condition concern here - see bellow -<br>
<br>
On 2021-03-17 3:43 a.m., Christian König wrote:<br>
> I was hoping Andrey would take a look since I'm really busy with other <br>
> work right now.<br>
><br>
> Regards,<br>
> Christian.<br>
><br>
> Am 17.03.21 um 07:46 schrieb Zhang, Jack (Jian):<br>
>> Hi, Andrey/Crhistian and Team,<br>
>><br>
>> I didn't receive the reviewer's message from maintainers on panfrost <br>
>> driver for several days.<br>
>> Due to this patch is urgent for my current working project.<br>
>> Would you please help to give some review ideas?<br>
>><br>
>> Many Thanks,<br>
>> Jack<br>
>> -----Original Message-----<br>
>> From: Zhang, Jack (Jian)<br>
>> Sent: Tuesday, March 16, 2021 3:20 PM<br>
>> To: dri-devel@lists.freedesktop.org; amd-gfx@lists.freedesktop.org; <br>
>> Koenig, Christian <Christian.Koenig@amd.com>; Grodzovsky, Andrey <br>
>> <Andrey.Grodzovsky@amd.com>; Liu, Monk <Monk.Liu@amd.com>; Deng, <br>
>> Emily <Emily.Deng@amd.com>; Rob Herring <robh@kernel.org>; Tomeu <br>
>> Vizoso <tomeu.vizoso@collabora.com>; Steven Price <steven.price@arm.com><br>
>> Subject: RE: [PATCH v3] drm/scheduler re-insert Bailing job to avoid <br>
>> memleak<br>
>><br>
>> [AMD Public Use]<br>
>><br>
>> Ping<br>
>><br>
>> -----Original Message-----<br>
>> From: Zhang, Jack (Jian)<br>
>> Sent: Monday, March 15, 2021 1:24 PM<br>
>> To: Jack Zhang <Jack.Zhang1@amd.com>; <br>
>> dri-devel@lists.freedesktop.org; amd-gfx@lists.freedesktop.org; <br>
>> Koenig, Christian <Christian.Koenig@amd.com>; Grodzovsky, Andrey <br>
>> <Andrey.Grodzovsky@amd.com>; Liu, Monk <Monk.Liu@amd.com>; Deng, <br>
>> Emily <Emily.Deng@amd.com>; Rob Herring <robh@kernel.org>; Tomeu <br>
>> Vizoso <tomeu.vizoso@collabora.com>; Steven Price <steven.price@arm.com><br>
>> Subject: RE: [PATCH v3] drm/scheduler re-insert Bailing job to avoid <br>
>> memleak<br>
>><br>
>> [AMD Public Use]<br>
>><br>
>> Hi, Rob/Tomeu/Steven,<br>
>><br>
>> Would you please help to review this patch for panfrost driver?<br>
>><br>
>> Thanks,<br>
>> Jack Zhang<br>
>><br>
>> -----Original Message-----<br>
>> From: Jack Zhang <Jack.Zhang1@amd.com><br>
>> Sent: Monday, March 15, 2021 1:21 PM<br>
>> To: dri-devel@lists.freedesktop.org; amd-gfx@lists.freedesktop.org; <br>
>> Koenig, Christian <Christian.Koenig@amd.com>; Grodzovsky, Andrey <br>
>> <Andrey.Grodzovsky@amd.com>; Liu, Monk <Monk.Liu@amd.com>; Deng, <br>
>> Emily <Emily.Deng@amd.com><br>
>> Cc: Zhang, Jack (Jian) <Jack.Zhang1@amd.com><br>
>> Subject: [PATCH v3] drm/scheduler re-insert Bailing job to avoid memleak<br>
>><br>
>> re-insert Bailing jobs to avoid memory leak.<br>
>><br>
>> V2: move re-insert step to drm/scheduler logic<br>
>> V3: add panfrost's return value for bailing jobs in case it hits the <br>
>> memleak issue.<br>
>><br>
>> Signed-off-by: Jack Zhang <Jack.Zhang1@amd.com><br>
>> ---<br>
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 +++-<br>
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_job.c    | 8 ++++++--<br>
>>   drivers/gpu/drm/panfrost/panfrost_job.c    | 4 ++--<br>
>>   drivers/gpu/drm/scheduler/sched_main.c     | 8 +++++++-<br>
>>   include/drm/gpu_scheduler.h                | 1 +<br>
>>   5 files changed, 19 insertions(+), 6 deletions(-)<br>
>><br>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c <br>
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
>> index 79b9cc73763f..86463b0f936e 100644<br>
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
>> @@ -4815,8 +4815,10 @@ int amdgpu_device_gpu_recover(struct <br>
>> amdgpu_device *adev,<br>
>>                       job ? job->base.id : -1);<br>
>>             /* even we skipped this reset, still need to set the job <br>
>> to guilty */<br>
>> -        if (job)<br>
>> +        if (job) {<br>
>>               drm_sched_increase_karma(&job->base);<br>
>> +            r = DRM_GPU_SCHED_STAT_BAILING;<br>
>> +        }<br>
>>           goto skip_recovery;<br>
>>       }<br>
>>   diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c <br>
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c<br>
>> index 759b34799221..41390bdacd9e 100644<br>
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c<br>
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c<br>
>> @@ -34,6 +34,7 @@ static enum drm_gpu_sched_stat <br>
>> amdgpu_job_timedout(struct drm_sched_job *s_job)<br>
>>       struct amdgpu_job *job = to_amdgpu_job(s_job);<br>
>>       struct amdgpu_task_info ti;<br>
>>       struct amdgpu_device *adev = ring->adev;<br>
>> +    int ret;<br>
>>         memset(&ti, 0, sizeof(struct amdgpu_task_info));<br>
>>   @@ -52,8 +53,11 @@ static enum drm_gpu_sched_stat <br>
>> amdgpu_job_timedout(struct drm_sched_job *s_job)<br>
>>             ti.process_name, ti.tgid, ti.task_name, ti.pid);<br>
>>         if (amdgpu_device_should_recover_gpu(ring->adev)) {<br>
>> -        amdgpu_device_gpu_recover(ring->adev, job);<br>
>> -        return DRM_GPU_SCHED_STAT_NOMINAL;<br>
>> +        ret = amdgpu_device_gpu_recover(ring->adev, job);<br>
>> +        if (ret == DRM_GPU_SCHED_STAT_BAILING)<br>
>> +            return DRM_GPU_SCHED_STAT_BAILING;<br>
>> +        else<br>
>> +            return DRM_GPU_SCHED_STAT_NOMINAL;<br>
>>       } else {<br>
>>           drm_sched_suspend_timeout(&ring->sched);<br>
>>           if (amdgpu_sriov_vf(adev))<br>
>> diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c <br>
>> b/drivers/gpu/drm/panfrost/panfrost_job.c<br>
>> index 6003cfeb1322..e2cb4f32dae1 100644<br>
>> --- a/drivers/gpu/drm/panfrost/panfrost_job.c<br>
>> +++ b/drivers/gpu/drm/panfrost/panfrost_job.c<br>
>> @@ -444,7 +444,7 @@ static enum drm_gpu_sched_stat <br>
>> panfrost_job_timedout(struct drm_sched_job<br>
>>        * spurious. Bail out.<br>
>>        */<br>
>>       if (dma_fence_is_signaled(job->done_fence))<br>
>> -        return DRM_GPU_SCHED_STAT_NOMINAL;<br>
>> +        return DRM_GPU_SCHED_STAT_BAILING;<br>
>>         dev_err(pfdev->dev, "gpu sched timeout, js=%d, config=0x%x, <br>
>> status=0x%x, head=0x%x, tail=0x%x, sched_job=%p",<br>
>>           js,<br>
>> @@ -456,7 +456,7 @@ static enum drm_gpu_sched_stat <br>
>> panfrost_job_timedout(struct drm_sched_job<br>
>>         /* Scheduler is already stopped, nothing to do. */<br>
>>       if (!panfrost_scheduler_stop(&pfdev->js->queue[js], sched_job))<br>
>> -        return DRM_GPU_SCHED_STAT_NOMINAL;<br>
>> +        return DRM_GPU_SCHED_STAT_BAILING;<br>
>>         /* Schedule a reset if there's no reset in progress. */<br>
>>       if (!atomic_xchg(&pfdev->reset.pending, 1)) diff --git <br>
>> a/drivers/gpu/drm/scheduler/sched_main.c <br>
>> b/drivers/gpu/drm/scheduler/sched_main.c<br>
>> index 92d8de24d0a1..a44f621fb5c4 100644<br>
>> --- a/drivers/gpu/drm/scheduler/sched_main.c<br>
>> +++ b/drivers/gpu/drm/scheduler/sched_main.c<br>
>> @@ -314,6 +314,7 @@ static void drm_sched_job_timedout(struct <br>
>> work_struct *work)  {<br>
>>       struct drm_gpu_scheduler *sched;<br>
>>       struct drm_sched_job *job;<br>
>> +    int ret;<br>
>>         sched = container_of(work, struct drm_gpu_scheduler, <br>
>> work_tdr.work);<br>
>>   @@ -331,8 +332,13 @@ static void drm_sched_job_timedout(struct <br>
>> work_struct *work)<br>
>>           list_del_init(&job->list);<br>
>>           spin_unlock(&sched->job_list_lock);<br>
>>   -        job->sched->ops->timedout_job(job);<br>
>> +        ret = job->sched->ops->timedout_job(job);<br>
>>   +        if (ret == DRM_GPU_SCHED_STAT_BAILING) {<br>
>> +            spin_lock(&sched->job_list_lock);<br>
>> +            list_add(&job->node, &sched->ring_mirror_list);<br>
>> +            spin_unlock(&sched->job_list_lock);<br>
>> +        }<br>
<br>
<br>
At this point we don't hold GPU reset locks anymore, and so we could<br>
be racing against another TDR thread from another scheduler ring of same <br>
device<br>
or another XGMI hive member. The other thread might be in the middle of <br>
luckless<br>
iteration of mirror list (drm_sched_stop, drm_sched_start and <br>
drm_sched_resubmit)<br>
and so locking job_list_lock will not help. Looks like it's required to <br>
take all GPU rest locks<br>
here.<br>
<br>
Andrey<br>
<br>
<br>
>>           /*<br>
>>            * Guilty job did complete and hence needs to be manually <br>
>> removed<br>
>>            * See drm_sched_stop doc.<br>
>> diff --git a/include/drm/gpu_scheduler.h <br>
>> b/include/drm/gpu_scheduler.h index 4ea8606d91fe..8093ac2427ef 100644<br>
>> --- a/include/drm/gpu_scheduler.h<br>
>> +++ b/include/drm/gpu_scheduler.h<br>
>> @@ -210,6 +210,7 @@ enum drm_gpu_sched_stat {<br>
>>       DRM_GPU_SCHED_STAT_NONE, /* Reserve 0 */<br>
>>       DRM_GPU_SCHED_STAT_NOMINAL,<br>
>>       DRM_GPU_SCHED_STAT_ENODEV,<br>
>> +    DRM_GPU_SCHED_STAT_BAILING,<br>
>>   };<br>
>>     /**<br>
>> -- <br>
>> 2.25.1<br>
>> _______________________________________________<br>
>> amd-gfx mailing list<br>
>> amd-gfx@lists.freedesktop.org<br>
>> <a href="https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=04%7C01%7CAndrey.Grodzovsky%40amd.com%7Ce90f30af0f43444c6aea08d8e91860c4%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637515638213180413%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=NnLqtz%2BZ8%2BweYwCqRinrfkqmhzibNAF6CYSdVqL6xi0%3D&amp;reserved=0">
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=04%7C01%7CAndrey.Grodzovsky%40amd.com%7Ce90f30af0f43444c6aea08d8e91860c4%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637515638213180413%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&amp;sdata=NnLqtz%2BZ8%2BweYwCqRinrfkqmhzibNAF6CYSdVqL6xi0%3D&amp;reserved=0</a>
<br>
>><br>
><br>
</div>
</span></font></div>
</div>
</body>
</html>