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

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

 



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.

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