lkml.org 
[lkml]   [2014]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v4 1/3] qspinlock: Introducing a 4-byte queue spinlock implementation
On 02/18/2014 04:37 PM, Peter Zijlstra wrote:
> On Tue, Feb 18, 2014 at 02:39:31PM -0500, Waiman Long wrote:
>>>> + /*
>>>> + * At the head of the wait queue now
>>>> + */
>>>> + while (true) {
>>>> + u32 qcode;
>>>> + int retval;
>>>> +
>>>> + retval = queue_get_lock_qcode(lock,&qcode, my_qcode);
>>>> + if (retval> 0)
>>>> + ; /* Lock not available yet */
>>>> + else if (retval< 0)
>>>> + /* Lock taken, can release the node& return */
>>>> + goto release_node;
>>>> + else if (qcode != my_qcode) {
>>>> + /*
>>>> + * Just get the lock with other spinners waiting
>>>> + * in the queue.
>>>> + */
>>>> + if (queue_spin_trylock_unfair(lock))
>>>> + goto notify_next;
>>> Why is this an option at all?
>>>
>>>
>> Are you referring to the case (qcode != my_qcode)? This condition will be
>> true if more than one tasks have queued up.
> But in no case should we revert to unfair spinning or stealing. We
> should always respect the queueing order.
>
> If the lock tail no longer points to us, then there's further waiters
> and we should wait for ->next and unlock it -- after we've taken the
> lock.
>

A task will be in this loop when it is already the head of a queue and
is entitled to take the lock. The condition (qcode != my_qcode) is to
decide whether it should just take the lock or take the lock & clear the
code simultaneously. I am a bit cautious to use
queue_spin_trylock_unfair() as there is a possibility that a CPU may run
out of the queue node and need to do unfair busy spinning.

-Longman


\
 
 \ /
  Last update: 2014-02-19 02:41    [W:0.118 / U:0.064 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site