On Thu, Jul 21, 2011 at 04:36:43PM +0100, Avi Kivity wrote: > On 07/21/2011 06:32 PM, Will Deacon wrote: > > > > > > Using TIF_bits sounds like a much better solution for this, wakeups are > > > really rather expensive and its best to avoid extra if at all possible. > > > > The problem with using a TIF bit to tell a task that it needs to perform > > some preempt_notifier registrations is that you end up with something that > > looks a lot like preempt notifiers! You also don't escape the concurrent > > read/write to thelist of pending registrations. > > > > One thing I tried was simply using an RCU protected hlist for the preempt > > notifiers so that we don't have to worry about atomicity when reading the > > notifiers in finish_task_switch. It's a bit odd, since we know we only ever > > have a single reader, but I've included it below anyway. > > > > If anybody has any better ideas, I'm all ears. > > > +void preempt_notifier_register_task(struct preempt_notifier *notifier, > > + struct task_struct *tsk) > > +{ > > + mutex_lock(&tsk->preempt_notifiers_mutex); > > + hlist_add_head_rcu(¬ifier->link,&tsk->preempt_notifiers); > > + mutex_unlock(&tsk->preempt_notifiers_mutex); > > +} > > +EXPORT_SYMBOL_GPL(preempt_notifier_register_task); > > + > > +void preempt_notifier_unregister_task(struct preempt_notifier *notifier, > > + struct task_struct *tsk) > > +{ > > + mutex_lock(&tsk->preempt_notifiers_mutex); > > + hlist_del_rcu(¬ifier->link); > > + mutex_unlock(&tsk->preempt_notifiers_mutex); > > +} > > +EXPORT_SYMBOL_GPL(preempt_notifier_unregister_task); > > + > > /** > > * preempt_notifier_register - tell me when current is being preempted& rescheduled > > * @notifier: notifier struct to register > > */ > > void preempt_notifier_register(struct preempt_notifier *notifier) > > { > > - hlist_add_head(¬ifier->link,¤t->preempt_notifiers); > > + preempt_notifier_register_task(notifier, current); > > } > > EXPORT_SYMBOL_GPL(preempt_notifier_register); > > This is (and must be) called from a preempt disabled context, no mutexes > around here. Bah, yes, that is essential if you're dealing with current. Maybe use a spinlock instead? Will -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html