On Fri, Nov 22, 2013 at 4:56 PM, Davidlohr Bueso<davidlohr@xxxxxx> wrote:In futex_wake() there is clearly no point in taking the hb->lock ifHmm. Why? Afaik, you only care about "empty or not". And if you don't
we know beforehand that there are no tasks to be woken. This comes
at the smaller cost of doing some atomic operations to keep track of
the list's size.
need the serialization from locking, then afaik you can just do a
"plist_head_empty()" without holding the lock.
NOTE!
The "list_empty()" function is very much designed to work even without
holding a lock (as long as the head itself exists reliably, of course)
BUT you have to then guarantee yourself that your algorithm doesn't
have any races wrt other CPU's adding an entry to the list at the same
time. Not holding a lock obviously means that you are not serialized
against that.. We've had problems with people doing
if (!list_empty(waiters))
wake_up_list(..)
because they wouldn't wake people up who just got added.
But considering that your atomic counter checking has the same lack of
serialization, at least the plist_head_empty() check shouldn't be any
worse than that counter thing.. And doesn't need any steenking atomic
ops or a new counter field.
Linus