[Re: [PATCH 3/7] wait.[ch]: Introduce the simple waitqueue (swait) implementation] On 18/10/2014 (Sat 23:34) Peter Zijlstra wrote: > On Fri, Oct 17, 2014 at 08:22:58PM -0400, Paul Gortmaker wrote: > > @@ -75,6 +123,32 @@ static void __cwake_up_common(struct cwait_head *q, unsigned int mode, > > } > > } > > > > +static void __swake_up_common(struct swait_head *q, unsigned int mode, > > + int nr_exclusive) > > +{ > > + struct swait *curr, *next; > > + int woken = 0; > > + > > + list_for_each_entry_safe(curr, next, &q->task_list, node) { > > + if (wake_up_state(curr->task, mode)) { /* <-- calls ttwu() */ > > + __remove_swait(q, curr); > > + curr->task = NULL; > > + /* > > + * 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(); > > + if (++woken == nr_exclusive) > > + break; > > + } > > + > > + } > > +} > > + > > /** > > * __cwake_up - wake up threads blocked on a waitqueue. > > * @q: the complex waitqueue > > @@ -96,6 +170,19 @@ void __cwake_up(struct cwait_head *q, unsigned int mode, int nr_exclusive, > > } > > EXPORT_SYMBOL(__cwake_up); > > > > +void __swake_up(struct swait_head *q, unsigned int mode, int nr_exclusive) > > +{ > > + unsigned long flags; > > + > > + if (!swait_active(q)) > > + return; > > + > > + raw_spin_lock_irqsave(&q->lock, flags); > > + __swake_up_common(q, mode, nr_exclusive); > > + raw_spin_unlock_irqrestore(&q->lock, flags); > > +} > > +EXPORT_SYMBOL(__swake_up); > > Same comment as before, that is an unbounded loop in a non preemptible > section and therefore violates RT design principles. Yep, I hadn't forgot about that ; see patch 6/7 -- which has your tentative solution from before. I didn't want to squish that into here and lose sight of it ; same for the smp barriers - I wanted to ensure we didn't lose visibility of things needing discussion. > > We actually did talk about ways of fixing that. I'll follow up to Steve's comment on what he described. > > Also, I'm not entirely sure we want to do the cwait thing, it looks > painful. The simplewait vs. complex wait as a whole, or just the rework to make it more aligned with the existing code? FWIW, I'm not married to this particular implementation; so if ideas have changed since, and the plan is different than what v2 implements, that is no problem. P. -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html