All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>,
	linux-kernel@vger.kernel.org, Ingo Molnar <mingo@elte.hu>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: Re: rcu warnings cause stack overflow
Date: Fri, 3 Feb 2012 10:33:35 -0800	[thread overview]
Message-ID: <20120203183334.GG2382@linux.vnet.ibm.com> (raw)
In-Reply-To: <20120203093214.GA2471@osiris.boeblingen.de.ibm.com>

On Fri, Feb 03, 2012 at 10:32:14AM +0100, Heiko Carstens wrote:
> On Thu, Feb 02, 2012 at 11:11:16AM -0800, Paul E. McKenney wrote:
> > On Thu, Feb 02, 2012 at 03:52:20PM +0100, Frederic Weisbecker wrote:
> > > On Thu, Feb 02, 2012 at 01:27:42PM +0100, Heiko Carstens wrote:
> > > > On Wed, Feb 01, 2012 at 04:14:48PM +0100, Frederic Weisbecker wrote:
> > > > > > Removing the WARN_ON_ONCE will fix this and, if lockdep is turned on, still
> > > > > > will find illegal uses. But it won't work for lockdep off configs...
> > > > > > So we probably want something better than the patch below.
> > > > > 
> > > > > Ah ok. Hmm, but why are you using an exception to implement WARN_ON()
> > > > > in s390? Is it to have a whole new stack for the warning path in order
> > > > > to avoid stack overflow from the place that called the WARN_ON() ?
> > > > 
> > > > The reason was to reduce the code footprint of the WARN_ON() and also
> > > > be able to print the register contents at the time the warning happened.
> > > 
> > > Ah ok, makes sense.
> > 
> > So Frederic should push his anti-recursion patch, then?
> 
> Yes, please.
> 
> Tested-by: Heiko Carstens <heiko.carstens@de.ibm.com>
> 
> It still generates recursive warnings because the WARNON_ONCE is inlined and
> every different usage will generate an exception, but it didn't produce a
> stack overflow anymore.
> To avoid the recursive warning the patch below would help. Not sure if it's
> worth it...
> 
> Subject: [PATCH] rcu: move rcu_is_cpu_idle() check warning into C file
> 
> From: Heiko Carstens <heiko.carstens@de.ibm.com>
> 
> rcu_read_lock() and rcu_read_unlock() generate a warning if a cpu is in
> extended quiescant state. Since these functions are inlined this can cause
> a lot of warnings if in the processing of the WARN_ON_ONCE() there is
> another usage of e.g. rcu_read_lock(). To make sure we only get one
> warning (and avoid possible stack overflows) uninline the check.
> 
> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
> ---
>  include/linux/rcupdate.h |    9 +++++++--
>  kernel/rcupdate.c        |    6 ++++++
>  2 files changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
> index 81c04f4..9fe7be5 100644
> --- a/include/linux/rcupdate.h
> +++ b/include/linux/rcupdate.h
> @@ -230,22 +230,27 @@ static inline void destroy_rcu_head_on_stack(struct rcu_head *head)
> 
>  #ifdef CONFIG_PROVE_RCU
>  extern int rcu_is_cpu_idle(void);
> +extern void rcu_warn_if_is_cpu_idle(void);
>  #else /* !CONFIG_PROVE_RCU */
>  static inline int rcu_is_cpu_idle(void)
>  {
>  	return 0;
>  }
> +
> +static inline void rcu_warn_if_is_cpu_idle(void)
> +{
> +}
>  #endif /* else !CONFIG_PROVE_RCU */
> 
>  static inline void rcu_lock_acquire(struct lockdep_map *map)
>  {
> -	WARN_ON_ONCE(rcu_is_cpu_idle());
> +	rcu_warn_if_is_cpu_idle();

Thank you for the patch, but this WARN_ON_ONCE() has now been removed
in favor of lockdep-RCU checks elsewhere.  This has the advantage of
leveraging lockdep's splat-once and anti-recursion facilities.

So I believe that current -rcu covers this.  (And yes, I do need to
push my most recent changes out.)

							Thanx, Paul

>  	lock_acquire(map, 0, 0, 2, 1, NULL, _THIS_IP_);
>  }
> 
>  static inline void rcu_lock_release(struct lockdep_map *map)
>  {
> -	WARN_ON_ONCE(rcu_is_cpu_idle());
> +	rcu_warn_if_is_cpu_idle();
>  	lock_release(map, 1, _THIS_IP_);
>  }
> 
> diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c
> index 2bc4e13..5deca18 100644
> --- a/kernel/rcupdate.c
> +++ b/kernel/rcupdate.c
> @@ -141,6 +141,12 @@ int rcu_my_thread_group_empty(void)
>  	return thread_group_empty(current);
>  }
>  EXPORT_SYMBOL_GPL(rcu_my_thread_group_empty);
> +
> +void rcu_warn_if_is_cpu_idle(void)
> +{
> +	WARN_ON_ONCE(rcu_is_cpu_idle());
> +}
> +EXPORT_SYMBOL_GPL(rcu_warn_if_is_cpu_idle);
>  #endif /* #ifdef CONFIG_PROVE_RCU */
> 
>  #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD


  reply	other threads:[~2012-02-03 18:34 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-01 10:06 rcu warnings cause stack overflow Heiko Carstens
2012-02-01 15:14 ` Frederic Weisbecker
2012-02-01 17:18   ` Paul E. McKenney
2012-02-01 18:08     ` Frederic Weisbecker
2012-02-01 18:22       ` Paul E. McKenney
2012-02-01 18:31         ` Frederic Weisbecker
2012-02-02 12:27   ` Heiko Carstens
2012-02-02 14:52     ` Frederic Weisbecker
2012-02-02 19:11       ` Paul E. McKenney
2012-02-03  9:32         ` Heiko Carstens
2012-02-03 18:33           ` Paul E. McKenney [this message]
2012-02-04 13:13             ` Frederic Weisbecker
2012-02-04 16:52               ` Paul E. McKenney

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=20120203183334.GG2382@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=fweisbec@gmail.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    /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.