All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
	linaro-sched-sig@lists.linaro.org,
	Alessio Igor Bogani <abogani@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Avi Kivity <avi@redhat.com>, Chris Metcalf <cmetcalf@tilera.com>,
	Christoph Lameter <cl@linux.com>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Geoff Levand <geoff@infradead.org>,
	Gilad Ben Yossef <gilad@benyossef.com>,
	Hakan Akkan <hakanakkan@gmail.com>,
	Ingo Molnar <mingo@kernel.org>, Kevin Hilman <khilman@ti.com>,
	Max Krasnyansky <maxk@qualcomm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Stephen Hemminger <shemminger@vyatta.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Sven-Thorsten Dietrich <thebigcorporation@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH 38/41] rcu: New rcu_user_enter_irq() and rcu_user_exit_irq() APIs
Date: Wed, 23 May 2012 16:31:55 +0200	[thread overview]
Message-ID: <20120523143144.GG1663@somewhere> (raw)
In-Reply-To: <20120522183352.GE8087@linux.vnet.ibm.com>

On Tue, May 22, 2012 at 11:33:52AM -0700, Paul E. McKenney wrote:
> On Tue, May 01, 2012 at 01:55:12AM +0200, Frederic Weisbecker wrote:
> > A CPU running in adaptive tickless mode wants to enter into
> > RCU extended quiescent state while running in userspace. This
> > way we can shut down the tick that is usually needed on each
> > CPU for the needs of RCU.
> > 
> > Typically, RCU enters the extended quiescent state when we resume
> > to userspace through a syscall or exception exit, this is done
> > using rcu_user_enter(). Then RCU exit this state by calling
> > rcu_user_exit() from syscall or exception entry.
> > 
> > However there are two other points where we may want to enter
> > or exit this state. Some remote CPU may require a tickless CPU
> > to restart its tick for any reason and send it an IPI for
> > this purpose. As we restart the tick, we don't want to resume
> > from the IPI in RCU extended quiescent state anymore.
> > Similarly we may stop the tick from an interrupt in userspace and
> > we need to be able to enter RCU extended quiescent state when we
> > resume from this interrupt to userspace.
> > 
> > To these ends, we provide two new APIs:
> > 
> > - rcu_user_enter_irq(). This must be called from a non-nesting
> > interrupt betwenn rcu_irq_enter() and rcu_irq_exit().
> > After the irq calls rcu_irq_exit(), we'll run into RCU extended
> > quiescent state.
> > 
> > - rcu_user_exit_irq(). This must be called from a non-nesting
> > interrupt, interrupting an RCU extended quiescent state, and
> > between rcu_irq_enter() and rcu_irq_exit(). After the irq calls
> > rcu_irq_exit(), we'll prevent from resuming the RCU extended
> > quiescent.
> 
> In both cases, the IRQ handler must correspond to an interrupt from
> task/thread/process/whatever level, so that it is illegal to call
> these from an interrupt handler that was invoked from within another
> interrupt.  Right?

Indeed.

> 
> A couple more questions and comments below.
> 
> 							Thanx, Paul
> 
> > Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> > Cc: Alessio Igor Bogani <abogani@kernel.org>
> > Cc: Andrew Morton <akpm@linux-foundation.org>
> > Cc: Avi Kivity <avi@redhat.com>
> > Cc: Chris Metcalf <cmetcalf@tilera.com>
> > Cc: Christoph Lameter <cl@linux.com>
> > Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
> > Cc: Geoff Levand <geoff@infradead.org>
> > Cc: Gilad Ben Yossef <gilad@benyossef.com>
> > Cc: Hakan Akkan <hakanakkan@gmail.com>
> > Cc: Ingo Molnar <mingo@kernel.org>
> > Cc: Kevin Hilman <khilman@ti.com>
> > Cc: Max Krasnyansky <maxk@qualcomm.com>
> > Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> > Cc: Peter Zijlstra <peterz@infradead.org>
> > Cc: Stephen Hemminger <shemminger@vyatta.com>
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: Sven-Thorsten Dietrich <thebigcorporation@gmail.com>
> > Cc: Thomas Gleixner <tglx@linutronix.de>
> > ---
> >  include/linux/rcupdate.h |    2 ++
> >  kernel/rcutree.c         |   24 ++++++++++++++++++++++++
> >  2 files changed, 26 insertions(+), 0 deletions(-)
> > 
> > diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
> > index 6539290..3cf1d51 100644
> > --- a/include/linux/rcupdate.h
> > +++ b/include/linux/rcupdate.h
> > @@ -194,6 +194,8 @@ extern void rcu_irq_exit(void);
> >  #ifdef CONFIG_CPUSETS_NO_HZ
> >  void rcu_user_enter(void);
> >  void rcu_user_exit(void);
> > +void rcu_user_enter_irq(void);
> > +void rcu_user_exit_irq(void);
> >  #endif
> > 
> >  /*
> > diff --git a/kernel/rcutree.c b/kernel/rcutree.c
> > index cba1332..2adc5a0 100644
> > --- a/kernel/rcutree.c
> > +++ b/kernel/rcutree.c
> > @@ -429,6 +429,18 @@ void rcu_user_enter(void)
> >  	__rcu_idle_enter();
> >  }
> > 
> > +void rcu_user_enter_irq(void)
> 
> It took me a bit to correctly parse the name, which goes something
> like RCU adaptive-tick user enter while in an IRQ handler.  A header
> comment would help.  (I can supply one when it is time for this to
> go into -rcu.)

Sure. I must confess I haven't focused on comments for now but this
will need some before getting merged anywhere.


> 
> > +{
> > +	unsigned long flags;
> > +	struct rcu_dynticks *rdtp;
> > +
> > +	local_irq_save(flags);
> > +	rdtp = &__get_cpu_var(rcu_dynticks);
> > +	WARN_ON_ONCE(rdtp->dynticks_nesting == 1);
> > +	rdtp->dynticks_nesting = 1;
> > +	local_irq_restore(flags);
> > +}
> > +
> >  /**
> >   * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle
> >   *
> > @@ -543,6 +555,18 @@ void rcu_user_exit(void)
> >  	local_irq_restore(flags);
> >  }
> > 
> > +void rcu_user_exit_irq(void)
> > +{
> > +	unsigned long flags;
> > +	struct rcu_dynticks *rdtp;
> > +
> > +	local_irq_save(flags);
> > +	rdtp = &__get_cpu_var(rcu_dynticks);
> > +	WARN_ON_ONCE(rdtp->dynticks_nesting == 0);
> 
> For symmetry, wouldn't this be as follows?
> 
> 	WARN_ON_ONCE(rdtp->dynticks_nesting >= LLONG_MAX / 4);
> 
> In other words, complain if the task is trying to exit RCU-idle state when
> it has already exited from RCU-idle state?

May be yeah. Note this was done before your patch
"rcu: Allow nesting of rcu_idle_enter() and rcu_idle_exit()" so I may need
to rebase and check my patch is still correct on top of yours.

> 
> Of course, it had better not be zero as well.  Or negative, for that
> matter.
> 
> > +	rdtp->dynticks_nesting = (LLONG_MAX / 2) + 1;
> > +	local_irq_restore(flags);
> > +}
> > +
> >  /**
> >   * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle
> >   *
> > -- 
> > 1.7.5.4
> > 
> 

  reply	other threads:[~2012-05-23 14:32 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-30 23:54 [RFC][PATCH 00/41] Nohz cpusets v3 (adaptive tickless kernel) Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 01/41] nohz: Separate idle sleeping time accounting from nohz logic Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 02/41] nohz: Make nohz API agnostic against idle ticks cputime accounting Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 03/41] nohz: Rename ts->idle_tick to ts->last_tick Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 04/41] nohz: Move nohz load balancer selection into idle logic Frederic Weisbecker
2012-05-07 15:51   ` Christoph Lameter
2012-04-30 23:54 ` [PATCH 05/41] nohz: Move ts->idle_calls incrementation into strict " Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 06/41] nohz: Move next idle expiry time record into idle logic area Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 07/41] cpuset: Set up interface for nohz flag Frederic Weisbecker
2012-05-07 15:55   ` Christoph Lameter
2012-05-08 14:20     ` Frederic Weisbecker
2012-05-08 14:50       ` Peter Zijlstra
2012-05-08 15:18         ` Christoph Lameter
2012-05-08 15:27           ` Peter Zijlstra
2012-05-08 15:38             ` Christoph Lameter
2012-05-08 15:48               ` Peter Zijlstra
2012-05-08 15:57                 ` Christoph Lameter
2012-05-08 16:16                   ` Peter Zijlstra
2012-05-08 16:25                     ` Peter Zijlstra
2012-05-08 19:50                     ` Mike Galbraith
2012-05-08 20:45                       ` Christoph Lameter
2012-05-09  4:21                         ` Mike Galbraith
2012-05-09 11:02                           ` Frederic Weisbecker
2012-05-09 11:07                           ` Frederic Weisbecker
2012-05-09 14:23                             ` Christoph Lameter
2012-05-09 14:22                           ` Christoph Lameter
2012-05-09 14:47                             ` Mike Galbraith
2012-05-09 15:05                               ` Christoph Lameter
2012-05-09 15:33                                 ` Mike Galbraith
2012-05-09 15:40                                   ` Christoph Lameter
2012-05-08 15:16       ` Christoph Lameter
2012-04-30 23:54 ` [PATCH 08/41] nohz: Try not to give the timekeeping duty to an adaptive tickless cpu Frederic Weisbecker
2012-05-07 16:02   ` Christoph Lameter
2012-05-08 17:35     ` Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 09/41] x86: New cpuset nohz irq vector Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 10/41] nohz: Adaptive tick stop and restart on nohz cpuset Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 11/41] nohz/cpuset: Don't turn off the tick if rcu needs it Frederic Weisbecker
2012-05-22 17:16   ` Paul E. McKenney
2012-05-23 13:52     ` Frederic Weisbecker
2012-05-23 15:15       ` Paul E. McKenney
2012-05-23 16:06         ` Frederic Weisbecker
2012-05-23 16:27           ` Paul E. McKenney
2012-05-31 16:01             ` Frederic Weisbecker
2012-05-31 22:02               ` Paul E. McKenney
2012-04-30 23:54 ` [PATCH 12/41] nohz/cpuset: Wake up adaptive nohz CPU when a timer gets enqueued Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 13/41] nohz/cpuset: Don't stop the tick if posix cpu timers are running Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 14/41] nohz/cpuset: Restart tick when nohz flag is cleared on cpuset Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 15/41] nohz/cpuset: Restart the tick if printk needs it Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 16/41] rcu: Restart the tick on non-responding adaptive nohz CPUs Frederic Weisbecker
2012-05-22 17:20   ` Paul E. McKenney
2012-05-23 13:57     ` Frederic Weisbecker
2012-05-23 15:20       ` Paul E. McKenney
2012-05-23 15:57         ` Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 17/41] rcu: Restart tick if we enqueue a callback in a nohz/cpuset CPU Frederic Weisbecker
2012-05-22 17:27   ` Paul E. McKenney
2012-05-22 17:30     ` Paul E. McKenney
2012-05-23 14:03       ` Frederic Weisbecker
2012-05-23 16:15         ` Paul E. McKenney
2012-05-31 15:56           ` Frederic Weisbecker
2012-05-23 14:00     ` Frederic Weisbecker
2012-05-23 16:01       ` Paul E. McKenney
2012-04-30 23:54 ` [PATCH 18/41] nohz: Generalize tickless cpu time accounting Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 19/41] nohz/cpuset: Account user and system times in adaptive nohz mode Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 20/41] nohz/cpuset: New API to flush cputimes on nohz cpusets Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 21/41] nohz/cpuset: Flush cputime on threads in nohz cpusets when waiting leader Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 22/41] nohz/cpuset: Flush cputimes on procfs stat file read Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 23/41] nohz/cpuset: Flush cputimes for getrusage() and times() syscalls Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 24/41] x86: Syscall hooks for nohz cpusets Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 25/41] x86: Exception " Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 26/41] x86: Add adaptive tickless hooks on do_notify_resume() Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 27/41] nohz/cpuset: enable addition&removal of cpus while in adaptive nohz mode Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 28/41] nohz: Don't restart the tick before scheduling to idle Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 29/41] sched: Comment on rq->clock correctness in ttwu_do_wakeup() in nohz Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 30/41] sched: Update rq clock on nohz CPU before migrating tasks Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 31/41] sched: Update rq clock on nohz CPU before setting fair group shares Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 32/41] sched: Update rq clock on tickless CPUs before calling check_preempt_curr() Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 33/41] sched: Update rq clock earlier in unthrottle_cfs_rq Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 34/41] sched: Update clock of nohz busiest rq before balancing Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 35/41] sched: Update rq clock before idle balancing Frederic Weisbecker
2012-05-02  3:36   ` Michael Wang
2012-05-02 10:55     ` Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 36/41] sched: Update nohz rq clock before searching busiest group on load balancing Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 37/41] rcu: New rcu_user_enter() and rcu_user_exit() APIs Frederic Weisbecker
2012-05-22 18:23   ` Paul E. McKenney
2012-05-23 14:22     ` Frederic Weisbecker
2012-05-23 16:28       ` Paul E. McKenney
2012-04-30 23:55 ` [PATCH 38/41] rcu: New rcu_user_enter_irq() and rcu_user_exit_irq() APIs Frederic Weisbecker
2012-05-22 18:33   ` Paul E. McKenney
2012-05-23 14:31     ` Frederic Weisbecker [this message]
2012-04-30 23:55 ` [PATCH 39/41] rcu: Switch to extended quiescent state in userspace from nohz cpuset Frederic Weisbecker
2012-05-22 18:36   ` Paul E. McKenney
2012-05-22 23:04     ` Paul E. McKenney
2012-05-23 14:33     ` Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 40/41] nohz: Exit RCU idle mode when we schedule before resuming userspace Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 41/41] nohz/cpuset: Disable under some configs Frederic Weisbecker
2012-05-07 22:10 ` [RFC][PATCH 00/41] Nohz cpusets v3 (adaptive tickless kernel) Geoff Levand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120523143144.GG1663@somewhere \
    --to=fweisbec@gmail.com \
    --cc=abogani@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=avi@redhat.com \
    --cc=cl@linux.com \
    --cc=cmetcalf@tilera.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=geoff@infradead.org \
    --cc=gilad@benyossef.com \
    --cc=hakanakkan@gmail.com \
    --cc=khilman@ti.com \
    --cc=linaro-sched-sig@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxk@qualcomm.com \
    --cc=mingo@kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=shemminger@vyatta.com \
    --cc=tglx@linutronix.de \
    --cc=thebigcorporation@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.