From: Frederic Weisbecker <fweisbec@gmail.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
"H. Peter Anvin" <hpa@linux.intel.com>,
Ingo Molnar <mingo@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Andrew Morton <akpm@linux-foundation.org>,
"Liu, Chuansheng" <chuansheng.liu@intel.com>
Subject: Re: [PATCH] bug: Use xchg() to update WARN_ON_ONCE() static variable
Date: Tue, 15 Oct 2013 22:18:48 +0200 [thread overview]
Message-ID: <20131015201816.GA3269@localhost.localdomain> (raw)
In-Reply-To: <20131015155806.04e2613f@gandalf.local.home>
On Tue, Oct 15, 2013 at 03:58:06PM -0400, Steven Rostedt wrote:
> The WARN_ON_ONCE() code is to trigger a waring only once when some
> condition happens. But due to the way it is written it is racy.
>
> if (unlikely(condition)) {
> if (WARN(!__warned))
> __warned = true;
> }
>
> The problem is that multiple CPUs could hit the same warning and
> produce multiple output dumps of the same warning, or an interrupt could
> happen and hit the same warning and do the warning in the middle of a
> previous one, especially since the WARN() does a dump of the current
> stack.
>
> Even more of a problem, a recent WARN_ON_ONCE() that was in the page
> fault handler triggered and the stack dump of the WARN() caused the
> same WARN_ON_ONCE() get hit again. Since the __warned = true is not
> updated until after the WARN() is completed, each WARN() triggered
> another page fault causing the stack to be filled and crashed the box.
>
> The point of WARN_ON() is to warn the user and not to crash the box.
>
> The easy fix is to update the __warned variable with a xchg(). This way
> only one WARN_ON_ONCE() will actually happen, and prevents any issues
> of the WARN() causing the same WARN() to be hit and crash the system.
How about just updating __warned without a cmpxchg. It's not that critical
if the update is not seen immediately to other CPUs. OTOH it's critical
that's it is visible immediately to the current CPU
I mean some warrning can be hard to reproduce and happen to some users
while staying for several kernel releases. If it's repetitive, the xchg
might impact the performance.
I may be overly paranoid, but I think barrier() (so that at least
we don't recurse locally) alone would be better.
next prev parent reply other threads:[~2013-10-15 20:18 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-15 19:58 [PATCH] bug: Use xchg() to update WARN_ON_ONCE() static variable Steven Rostedt
2013-10-15 20:12 ` Andrew Morton
2013-10-15 20:21 ` Frederic Weisbecker
2013-10-15 20:36 ` Steven Rostedt
2013-10-15 20:41 ` Frederic Weisbecker
2013-10-15 20:35 ` Steven Rostedt
2013-10-15 20:18 ` Frederic Weisbecker [this message]
2013-10-15 20:25 ` Steven Rostedt
2013-10-15 20:37 ` Frederic Weisbecker
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=20131015201816.GA3269@localhost.localdomain \
--to=fweisbec@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=chuansheng.liu@intel.com \
--cc=hpa@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/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.