lkml.org 
[lkml]   [2011]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/3] perf: add context field to perf_event
    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(&notifier->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(&notifier->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(&notifier->link,&current->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


    \
     
     \ /
      Last update: 2011-07-21 17:49    [W:0.034 / U:29.996 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site