On Wed, Dec 11, 2013 at 08:06:37PM -0500, Paul Gortmaker wrote: > +/* Adds w to head->task_list. Must be called with head->lock locked. */ > +static inline void __swait_enqueue(struct swait_queue_head *head, > + struct swaiter *w) > +{ > + list_add(&w->node, &head->task_list); > + /* We can't let the condition leak before the setting of head */ > + smp_mb(); > +}
> +unsigned int > +__swake_up_locked(struct swait_queue_head *head, unsigned int state, > + unsigned int num) > +{ > + struct swaiter *curr, *next; > + int woken = 0; > + > + list_for_each_entry_safe(curr, next, &head->task_list, node) { > + if (wake_up_state(curr->task, state)) { > + __swait_dequeue(curr); > + /* > + * The waiting task can free the waiter as > + * soon as curr->task = NULL is written, > + * without taking any locks. A memory barrier > + * is required here to prevent the following > + * store to curr->task from getting ahead of > + * the dequeue operation. > + */ > + smp_wmb(); > + curr->task = NULL; > + if (++woken == num) > + break; > + } > + } > + return woken; > +} Are these two barriers matched or are they both unmatched and thus probabyl wrong? In any case the comments need updating to be more explicit. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/