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 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.


    --
    error compiling committee.c: too many arguments to function



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