[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20110816202005.GH2404@linux.vnet.ibm.com>
Date: Tue, 16 Aug 2011 13:20:05 -0700
From: "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>
To: Frederic Weisbecker <fweisbec@...il.com>
Cc: LKML <linux-kernel@...r.kernel.org>,
Andrew Morton <akpm@...ux-foundation.org>,
Anton Blanchard <anton@....ibm.com>,
Avi Kivity <avi@...hat.com>, Ingo Molnar <mingo@...e.hu>,
Lai Jiangshan <laijs@...fujitsu.com>,
Paul Menage <menage@...gle.com>,
Peter Zijlstra <a.p.zijlstra@...llo.nl>,
Stephen Hemminger <shemminger@...tta.com>,
Thomas Gleixner <tglx@...utronix.de>,
Tim Pepper <lnxninja@...ux.vnet.ibm.com>
Subject: Re: [PATCH 22/32] rcu: Restart tick if we enqueue a callback in a
nohz/cpuset CPU
On Mon, Aug 15, 2011 at 05:52:19PM +0200, Frederic Weisbecker wrote:
> If we enqueue an rcu callback, we need the CPU tick to stay
> alive until we take care of those by completing the appropriate
> grace period.
>
> Thus, when we call_rcu(), send a self IPI that checks rcu_needs_cpu()
> so that we restore a periodic tick behaviour that can take care of
> everything.
One question below.
Thanx, Paul
> Signed-off-by: Frederic Weisbecker <fweisbec@...il.com>
> Cc: Andrew Morton <akpm@...ux-foundation.org>
> Cc: Anton Blanchard <anton@....ibm.com>
> Cc: Avi Kivity <avi@...hat.com>
> Cc: Ingo Molnar <mingo@...e.hu>
> Cc: Lai Jiangshan <laijs@...fujitsu.com>
> Cc: Paul E . McKenney <paulmck@...ux.vnet.ibm.com>
> Cc: Paul Menage <menage@...gle.com>
> Cc: Peter Zijlstra <a.p.zijlstra@...llo.nl>
> Cc: Stephen Hemminger <shemminger@...tta.com>
> Cc: Thomas Gleixner <tglx@...utronix.de>
> Cc: Tim Pepper <lnxninja@...ux.vnet.ibm.com>
> ---
> kernel/rcutree.c | 8 ++++++++
> 1 files changed, 8 insertions(+), 0 deletions(-)
>
> diff --git a/kernel/rcutree.c b/kernel/rcutree.c
> index d496c70..b5643ce2 100644
> --- a/kernel/rcutree.c
> +++ b/kernel/rcutree.c
> @@ -51,6 +51,7 @@
> #include <linux/kthread.h>
> #include <linux/prefetch.h>
> #include <linux/cpuset.h>
> +#include <linux/tick.h>
>
> #include "rcutree.h"
>
> @@ -1546,6 +1547,13 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu),
> rdp->nxttail[RCU_NEXT_TAIL] = &head->next;
> rdp->qlen++;
>
> + /* Restart the timer if needed to handle the callbacks */
> + if (tick_nohz_adaptive_mode()) {
> + /* Make updates on nxtlist visible to self IPI */
> + barrier();
> + smp_cpuset_update_nohz(smp_processor_id());
> + }
> +
But this must be happening in a system call or interrupt handler, right?
If so, won't we get a chance to check things on exit from the system call
or interrupt? Or are you hooking only into syscall entry?
> /* If interrupts were disabled, don't dive into RCU core. */
> if (irqs_disabled_flags(flags)) {
> local_irq_restore(flags);
> --
> 1.7.5.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists