lkml.org 
[lkml]   [2010]   [Dec]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH 06/15] nohz_task: Keep the tick if rcu needs it
    On Mon, Dec 20, 2010 at 04:58:20PM +0100, Peter Zijlstra wrote:
    > On Mon, 2010-12-20 at 16:24 +0100, Frederic Weisbecker wrote:
    >
    > > @@ -1634,7 +1633,7 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp)
    > > * by the current CPU, returning 1 if so. This function is part of the
    > > * RCU implementation; it is -not- an exported member of the RCU API.
    > > */
    > > -static int rcu_pending(int cpu)
    > > +int rcu_pending(int cpu)
    >
    > /me wonders about that comment.
    >
    > > {
    > > return __rcu_pending(&rcu_sched_state, &per_cpu(rcu_sched_data, cpu)) ||
    > > __rcu_pending(&rcu_bh_state, &per_cpu(rcu_bh_data, cpu)) ||
    > > diff --git a/kernel/sched.c b/kernel/sched.c
    > > index 6dbae46..45bd6e2 100644
    > > --- a/kernel/sched.c
    > > +++ b/kernel/sched.c
    > > @@ -2470,10 +2470,16 @@ static void nohz_task_cpu_update(void *unused)
    > > int nohz_task_can_stop_tick(void)
    > > {
    > > struct rq *rq = this_rq();
    > > + int cpu;
    > >
    > > if (rq->nr_running > 1)
    > > return 0;
    > >
    > > + cpu = smp_processor_id();
    > > +
    > > + if (rcu_pending(cpu) || rcu_needs_cpu(cpu))
    > > + return 0;
    >
    > Arguable, rcu_needs_cpu() should imply rcu_pending(), because if there's
    > work still to be done, it needs the cpu, hmm?

    There are two cases:

    1. This CPU has callbacks. In this case, rcu_pending() returns 1.

    2. The RCU core needs something from this CPU. In this case,
    rcu_pending() returns 1.

    The trick is that in dyntick-idle mode, if we have #2 but not #1, other
    CPUs can (and will) act on the dyntick-idle CPU's behalf. However, when
    there is a task running, that task might do system calls, which can
    queue callbacks and can contain RCU read-side critical sections, neither
    of which can happen in dyntick-idle mode.

    So the one-task-running-on-this-CPU case above does need special
    handling.

    > > return 1;
    > > }
    > >
    >
    > This patch also implies you broke stuff with #4 because it would put the
    > machine to sleep while RCU still had bits to do, not very nice.

    Hmmm... I need to look at this after getting some sleep.

    Thanx, Paul


    \
     
     \ /
      Last update: 2010-12-21 09:13    [W:0.024 / U:59.144 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site