[PATCH] drm/amdgpu: discard commands of killed processes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2017å¹´08æ??22æ?¥ 16:55, Christian König wrote:
> Am 22.08.2017 um 04:37 schrieb zhoucm1:
>>
>>
>> On 2017å¹´08æ??21æ?¥ 20:58, Christian König wrote:
>>> From: Christian König <christian.koenig at amd.com>
>>>
>>> When a process is killed we shouldn't submit all waiting jobs, but 
>>> instead
>>> clean up as fast as possible.
>>>
>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>> ---
>>>   drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 23 
>>> +++++++++++++++++++----
>>>   1 file changed, 19 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c 
>>> b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
>>> index 38cea6f..97c94f9 100644
>>> --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
>>> +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
>>> @@ -205,17 +205,32 @@ void amd_sched_entity_fini(struct 
>>> amd_gpu_scheduler *sched,
>>>                  struct amd_sched_entity *entity)
>>>   {
>>>       struct amd_sched_rq *rq = entity->rq;
>>> +    int r;
>>>         if (!amd_sched_entity_is_initialized(sched, entity))
>>>           return;
>>> -
>>>       /**
>>>        * The client will not queue more IBs during this fini, 
>>> consume existing
>>> -     * queued IBs
>>> +     * queued IBs or discard them on SIGKILL
>>>       */
>>> -    wait_event(sched->job_scheduled, 
>>> amd_sched_entity_is_idle(entity));
>>> -
>>> +    if ((current->flags & PF_SIGNALED) && current->exit_code == 
>>> SIGKILL)
>>> +        r = -ERESTARTSYS;
>>> +    else
>>> +        r = wait_event_killable(sched->job_scheduled,
>>> +                    amd_sched_entity_is_idle(entity));
>>>       amd_sched_rq_remove_entity(rq, entity);
>>> +    if (r) {
>>> +        struct amd_sched_job *job;
>>> +
>>> +        /* Park the kernel for a moment to make sure it isn't 
>>> processing
>>> +         * our enity.
>>> +         */
>>> +        kthread_park(sched->thread);
>>> +        kthread_unpark(sched->thread);
>> When entity has been removed, how does sched process entity? seems 
>> not need here.
>> otherwise looks good to me.
>
> It's possible that we race here, e.g. we removed the entity but the 
> scheduler is still processing one last job from that entity.
Fair, feel free to add my RB.

Regards,
David Zhou
>
> Regards,
> Christian.
>
>>
>> Regards,
>> David Zhou
>>> +        while (kfifo_out(&entity->job_queue, &job, sizeof(job)))
>>> +            sched->ops->free_job(job);
>>> +
>>> +    }
>>>       kfifo_free(&entity->job_queue);
>>>   }
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>
>



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux