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/

Reply via email to