On Fri, Feb 07, 2014 at 04:18:47PM +0100, Peter Zijlstra wrote:
> void ticket_lock(tickets_t *lock)
> {
>       tickets_t t;
> 
>       /*
>        * Because @head is MSB, the direct increment wrap doesn't disturb
>        * @tail.
>        */
>       t.pair = xadd(&lock->pair, 1<<16);
> 
>       if (likely(t.head == t.tail)) {
>               __lwsync(); /* acquire */
>               return;
>       }
> 
>       while (smp_load_acquire(&lock->tail) != t.tail)
>               cpu_relax();

That should be "!= t.head", for that contains our ticket.

I'm hopelessly scatter brained today it seems :/


> }
> 
> void ticket_unlock(tickets_t *lock)
> {
>       ticket_t tail = lock->tail + 1;
> 
>       /*
>        * The store is save against the xadd for it will make the ll/sc fail
>        * and try again. Aside from that PowerISA guarantees single-copy
>        * atomicy for half-word writes.
>        *
>        * And since only the lock owner will ever write the tail, we're good.
>        */
>       smp_store_release(&lock->tail, tail);
> }
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to