Re: semaphore: lockless fastpath using atomic_{inc,dec}_return
From: Bruno Santos
Date: Wed Jul 09 2008 - 11:40:05 EST
Hi,
>hi,
>
>not to ruin the party but... how is this lockless? An atomic variable
>is every bit a "lock" as a spinlock is... and very much equally
>expensive as well for most cases ;-(
Perhaps not the best the choice of words, I should have omitted the word
lockless. But it seems my understanding of lockless and yours is different.
And indeed, it's very expensive as a spinlock, but comparatively, is
only one operation, that if successful doesn't have to lock and then
unlock (that's why I called it lockless ...).
The mutex takes the same approach, however it uses it's own flavour of
atomic ops. What I'm really interested is if this brings any benefit in
terms of performance.
> And is this safe? It seems that we can always be rescheduled after
the atomic operation and
> interrupts can occur too. You need to tell us why this is safe in all
cases.
The slowpaths take care of that:
In 'down' slowpath after acquiring the spinlock the semaphore may have
been unlocked ("we can always be rescheduled after the atomic operation
and interrupts can occur too"), so we test again doing an
atomic_dec_return, like in fastpath case, if it fails we proced to wait
list and wait loop until someone wake us, if we get
task_interrupted/timeout we just abandon the wait list.
In 'up' slowpath after acquiring the spinlock we wake up one waiter,
however the list may be empty because we acquired the lock faster than a
possible waiter(s) or the waiter(s) abandoned the wait list, in such
case we atomic_inc the count to value that is >= 1 (taking into account
another 'up').
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/