[PATCH] SWDEV-197284 - drm/amdgpu: Only use the peek function in productor side is not correct

Deng, Emily Emily.Deng at amd.com
Tue Aug 13 02:32:36 UTC 2019


Ok, please ignore this patch.


Best wishes
Emily Deng

>-----Original Message-----
>From: Christian König <ckoenig.leichtzumerken at gmail.com>
>Sent: Tuesday, August 13, 2019 1:00 AM
>To: Deng, Emily <Emily.Deng at amd.com>; amd-gfx at lists.freedesktop.org
>Subject: Re: [PATCH] SWDEV-197284 - drm/amdgpu: Only use the peek
>function in productor side is not correct
>
>Am 12.08.19 um 09:42 schrieb Emily Deng:
>> For spsc queue, use peek function would cause error in productor side.
>> As for the last element, when the push job is occurring during pop
>> job, the peek function will not be updated in time, and it will return NULL.
>>
>> So use queue count for double confirming the job queue is empty.
>
>For the upstream branch I'm going to push my patch which is not as invasive
>as this one.
>
>Christian.
>
>>
>> Signed-off-by: Emily Deng <Emily.Deng at amd.com>
>> ---
>>   drivers/gpu/drm/scheduler/sched_entity.c | 4 ++--
>>   include/drm/spsc_queue.h                 | 7 +++----
>>   2 files changed, 5 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/scheduler/sched_entity.c
>> b/drivers/gpu/drm/scheduler/sched_entity.c
>> index 35ddbec..e74894f 100644
>> --- a/drivers/gpu/drm/scheduler/sched_entity.c
>> +++ b/drivers/gpu/drm/scheduler/sched_entity.c
>> @@ -95,7 +95,7 @@ static bool drm_sched_entity_is_idle(struct
>drm_sched_entity *entity)
>>   	rmb(); /* for list_empty to work without lock */
>>
>>   	if (list_empty(&entity->list) ||
>> -	    spsc_queue_peek(&entity->job_queue) == NULL)
>> +	    ((spsc_queue_peek(&entity->job_queue) == NULL) &&
>> +!spsc_queue_count(&entity->job_queue)))
>>   		return true;
>>
>>   	return false;
>> @@ -281,7 +281,7 @@ void drm_sched_entity_fini(struct drm_sched_entity
>*entity)
>>   	/* Consumption of existing IBs wasn't completed. Forcefully
>>   	 * remove them here.
>>   	 */
>> -	if (spsc_queue_peek(&entity->job_queue)) {
>> +	if ((spsc_queue_peek(&entity->job_queue) == NULL) &&
>> +!spsc_queue_count(&entity->job_queue)) {
>>   		if (sched) {
>>   			/* Park the kernel for a moment to make sure it isn't
>processing
>>   			 * our enity.
>> diff --git a/include/drm/spsc_queue.h b/include/drm/spsc_queue.h index
>> 125f096..78092b9 100644
>> --- a/include/drm/spsc_queue.h
>> +++ b/include/drm/spsc_queue.h
>> @@ -54,9 +54,8 @@ static inline void spsc_queue_init(struct spsc_queue
>> *queue)
>>
>>   static inline struct spsc_node *spsc_queue_peek(struct spsc_queue *queue)
>>   {
>> -	return queue->head;
>> +	return READ_ONCE(queue->head);
>>   }
>> -
>>   static inline int spsc_queue_count(struct spsc_queue *queue)
>>   {
>>   	return atomic_read(&queue->job_count); @@ -70,9 +69,9 @@ static
>> inline bool spsc_queue_push(struct spsc_queue *queue, struct spsc_node
>> *n
>>
>>   	preempt_disable();
>>
>> +	atomic_inc(&queue->job_count);
>>   	tail = (struct spsc_node **)atomic_long_xchg(&queue->tail,
>(long)&node->next);
>>   	WRITE_ONCE(*tail, node);
>> -	atomic_inc(&queue->job_count);
>>
>>   	/*
>>   	 * In case of first element verify new node will be visible to the
>> consumer @@ -93,6 +92,7 @@ static inline struct spsc_node
>*spsc_queue_pop(struct spsc_queue *queue)
>>   	/* Verify reading from memory and not the cache */
>>   	smp_rmb();
>>
>> +	atomic_dec(&queue->job_count);
>>   	node = READ_ONCE(queue->head);
>>
>>   	if (!node)
>> @@ -113,7 +113,6 @@ static inline struct spsc_node
>*spsc_queue_pop(struct spsc_queue *queue)
>>   		}
>>   	}
>>
>> -	atomic_dec(&queue->job_count);
>>   	return node;
>>   }
>>



More information about the amd-gfx mailing list