From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Mike Galbraith <mgalbraith@novell.com>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: Re: rcu: endless stalls
Date: Mon, 11 Jun 2012 06:39:53 -0700 [thread overview]
Message-ID: <20120611133953.GI2425@linux.vnet.ibm.com> (raw)
In-Reply-To: <1339409176.7350.26.camel@marge.simpson.net>
On Mon, Jun 11, 2012 at 12:06:16PM +0200, Mike Galbraith wrote:
> Greetings,
>
> I received a report of a 48 core UV box hitting a gripe, taking longer
> than timeout to emit same, so box griped endlessly, forcing reboot.
So it took minutes to print an RCU CPU stall warning? On only 48 CPUs?
If so, yow!!!
My guess is that rcu_cpu_stall_suppress must be manipulated atomically
for this to work reliably, for example, using xchg().
Thanx, Paul
> The below might prevent that.. and bust other stuff for free :)
>
> rcu: one gripe at a time please
>
> Not-compiled-by:
> Not-signed-off-by:
> Not-etc-by:
>
> diff --git a/kernel/rcutree.c b/kernel/rcutree.c
> index 0da7b88..6462056d6 100644
> --- a/kernel/rcutree.c
> +++ b/kernel/rcutree.c
> @@ -818,10 +818,25 @@ static void print_cpu_stall(struct rcu_state *rsp)
> set_need_resched(); /* kick ourselves to get things going. */
> }
>
> +/**
> + * rcu_cpu_stall_reset - prevent further stall warnings in current grace period
> + *
> + * Set the stall-warning timeout way off into the future, thus preventing
> + * any RCU CPU stall-warning messages from appearing in the current set of
> + * RCU grace periods.
> + *
> + * The caller must disable hard irqs.
> + */
> +void rcu_cpu_stall_reset(void)
> +{
> + rcu_sched_state.jiffies_stall = jiffies + ULONG_MAX / 2;
> + rcu_bh_state.jiffies_stall = jiffies + ULONG_MAX / 2;
> + rcu_preempt_stall_reset();
> +}
> +
> static void check_cpu_stall(struct rcu_state *rsp, struct rcu_data *rdp)
> {
> - unsigned long j;
> - unsigned long js;
> + unsigned long j, js, flags;
> struct rcu_node *rnp;
>
> if (rcu_cpu_stall_suppress)
> @@ -832,13 +847,23 @@ static void check_cpu_stall(struct rcu_state *rsp, struct rcu_data *rdp)
> if ((ACCESS_ONCE(rnp->qsmask) & rdp->grpmask) && ULONG_CMP_GE(j, js)) {
>
> /* We haven't checked in, so go dump stack. */
> + rcu_cpu_stall_suppress = 1;
> print_cpu_stall(rsp);
> + local_irq_save(flags);
> + rcu_cpu_stall_reset();
> + local_irq_restore(flags);
> + rcu_cpu_stall_suppress = 0;
>
> } else if (rcu_gp_in_progress(rsp) &&
> ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY)) {
>
> /* They had a few time units to dump stack, so complain. */
> + rcu_cpu_stall_suppress = 1;
> print_other_cpu_stall(rsp);
> + local_irq_save(flags);
> + rcu_cpu_stall_reset();
> + local_irq_restore(flags);
> + rcu_cpu_stall_suppress = 0;
> }
> }
>
> @@ -848,22 +873,6 @@ static int rcu_panic(struct notifier_block *this, unsigned long ev, void *ptr)
> return NOTIFY_DONE;
> }
>
> -/**
> - * rcu_cpu_stall_reset - prevent further stall warnings in current grace period
> - *
> - * Set the stall-warning timeout way off into the future, thus preventing
> - * any RCU CPU stall-warning messages from appearing in the current set of
> - * RCU grace periods.
> - *
> - * The caller must disable hard irqs.
> - */
> -void rcu_cpu_stall_reset(void)
> -{
> - rcu_sched_state.jiffies_stall = jiffies + ULONG_MAX / 2;
> - rcu_bh_state.jiffies_stall = jiffies + ULONG_MAX / 2;
> - rcu_preempt_stall_reset();
> -}
> -
> static struct notifier_block rcu_panic_block = {
> .notifier_call = rcu_panic,
> };
>
>
next prev parent reply other threads:[~2012-06-11 13:40 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-11 10:06 rcu: endless stalls Mike Galbraith
2012-06-11 13:39 ` Paul E. McKenney [this message]
2012-06-11 14:22 ` Mike Galbraith
2012-06-11 16:54 ` Paul E. McKenney
2012-06-11 17:20 ` Mike Galbraith
2012-06-11 18:01 ` Paul E. McKenney
2012-06-11 18:10 ` Mike Galbraith
2012-06-13 3:35 ` Mike Galbraith
2012-06-13 4:31 ` Hugh Dickins
2012-06-13 5:56 ` Mike Galbraith
2012-06-13 7:12 ` Mike Galbraith
2012-06-14 7:45 ` Mike Galbraith
2012-06-14 16:47 ` Paul E. McKenney
2012-06-14 21:34 ` Mike Galbraith
2012-06-15 7:49 ` Mike Galbraith
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=20120611133953.GI2425@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mgalbraith@novell.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox