From: Andrew Morton <akpm@linux-foundation.org>
To: Seiji Aguchi <seiji.aguchi@hds.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"Luck, Tony" <tony.luck@intel.com>,
Don Zickus <dzickus@redhat.com>, Matthew Garrett <mjg@redhat.com>,
Vivek Goyal <vgoyal@redhat.com>,
"Chen, Gong" <gong.chen@intel.com>,
"len.brown@intel.com" <len.brown@intel.com>,
"ying.huang@intel.com" <ying.huang@intel.com>,
"ak@linux.intel.com" <ak@linux.intel.com>,
"hughd@chromium.org" <hughd@chromium.org>,
"mingo@elte.hu" <mingo@elte.hu>,
"jmorris@namei.org" <jmorris@namei.org>,
"a.p.zijlstra@chello.nl" <a.p.zijlstra@chello.nl>,
"namhyung@gmail.com" <namhyung@gmail.com>,
"dle-develop@lists.sourceforge.net"
<dle-develop@lists.sourceforge.net>,
Satoru Moriya <satoru.moriya@hds.com>
Subject: Re: [RFC][PATCH -next] make pstore/kmsg_dump run after stopping other cpus in panic path
Date: Mon, 17 Oct 2011 16:47:15 -0700 [thread overview]
Message-ID: <20111017164715.e42591d5.akpm@linux-foundation.org> (raw)
In-Reply-To: <5C4C569E8A4B9B42A84A977CF070A35B2C5747DC7B@USINDEVS01.corp.hds.com>
On Fri, 14 Oct 2011 16:53:05 -0400
Seiji Aguchi <seiji.aguchi@hds.com> wrote:
> Hi,
>
> As Don mentioned in following thread, it would be nice for pstore/kmsg_dump to serialize
> panic path and have one cpu running because they can log messages reliably.
>
> https://lkml.org/lkml/2011/10/13/427
>
> For realizing this idea, we have to move kmsg_dump below smp_send_stop() and bust some locks
> of kmsg_dump/pstore in panic path.
>
> This patch does followings.
>
> - moving kmsg_dump(KMSG_DUMP_PANIC) below smp_send_stop.
> - busting logbuf_lock of kmsg_dump() in panic path for avoiding deadlock.
> - busting psinfo->buf_lock of pstore_dump() in panic path for avoiding deadlock.
>
> Any comments are welcome.
>
> ...
>
> --- a/fs/pstore/platform.c
> +++ b/fs/pstore/platform.c
> @@ -90,19 +90,21 @@ static void pstore_dump(struct kmsg_dumper *dumper,
> int hsize, ret;
> unsigned int part = 1;
> unsigned long flags = 0;
> - int is_locked = 0;
>
> if (reason < ARRAY_SIZE(reason_str))
> why = reason_str[reason];
> else
> why = "Unknown";
>
> - if (in_nmi()) {
> - is_locked = spin_trylock(&psinfo->buf_lock);
> - if (!is_locked)
> - pr_err("pstore dump routine blocked in NMI, may corrupt error record\n");
> - } else
> - spin_lock_irqsave(&psinfo->buf_lock, flags);
> + /*
> + * pstore_dump() is called after smp_send_stop() in panic path.
> + * So, spin_lock should be bust for avoiding deadlock.
> + */
> + if (reason == KMSG_DUMP_PANIC)
> + spin_lock_init(&psinfo->buf_lock);
> +
> + spin_lock_irqsave(&psinfo->buf_lock, flags);
> +
> oopscount++;
> while (total < kmsg_bytes) {
> dst = psinfo->buf;
> @@ -131,11 +133,7 @@ static void pstore_dump(struct kmsg_dumper *dumper,
> total += l1_cpy + l2_cpy;
> part++;
> }
> - if (in_nmi()) {
> - if (is_locked)
> - spin_unlock(&psinfo->buf_lock);
> - } else
> - spin_unlock_irqrestore(&psinfo->buf_lock, flags);
> + spin_unlock_irqrestore(&psinfo->buf_lock, flags);
> }
afacit this assumes that (reason == KMSG_DUMP_PANIC) if in_nmi(). Is
that always the case, and will it always be the case in the future?
I felt that the spin_trylock() approach was less horrid than this. I
assume that the new approach will cause lockdep to go berzerk?
> --- a/kernel/printk.c
> +++ b/kernel/printk.c
> @@ -1732,6 +1732,13 @@ void kmsg_dump(enum kmsg_dump_reason reason)
> unsigned long l1, l2;
> unsigned long flags;
>
> + /*
> + * kmsg_dump() is called after smp_send_stop() in panic path.
> + * So, spin_lock should be bust for avoiding deadlock.
> + */
> + if (reason == KMSG_DUMP_PANIC)
> + raw_spin_lock_init(&logbuf_lock);
> +
> /* Theoretically, the log could move on after we do this, but
> there's not a lot we can do about that. The new messages
> will overwrite the start of what we dump. */
I suggest you do some research into bust_spinlocks() and how it has
changed over time. I think that code used to fiddle with log levels
and once upon a time it might have fiddled with logbuf_lock.
next prev parent reply other threads:[~2011-10-17 23:52 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-14 20:53 [RFC][PATCH -next] make pstore/kmsg_dump run after stopping other cpus in panic path Seiji Aguchi
2011-10-17 6:21 ` Chen Gong
2011-10-17 14:10 ` Seiji Aguchi
2011-10-18 7:28 ` Chen Gong
2011-10-17 16:09 ` Don Zickus
2011-10-17 16:56 ` Luck, Tony
2011-10-17 17:22 ` Don Zickus
2011-10-17 17:34 ` Seiji Aguchi
2011-10-17 23:47 ` Andrew Morton [this message]
2011-10-18 12:49 ` Don Zickus
2011-10-18 14:52 ` Seiji Aguchi
2011-10-18 15:10 ` Don Zickus
2011-10-20 15:13 ` Seiji Aguchi
2011-10-20 17:48 ` Don Zickus
2011-10-20 18:39 ` Seiji Aguchi
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=20111017164715.e42591d5.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=a.p.zijlstra@chello.nl \
--cc=ak@linux.intel.com \
--cc=dle-develop@lists.sourceforge.net \
--cc=dzickus@redhat.com \
--cc=gong.chen@intel.com \
--cc=hughd@chromium.org \
--cc=jmorris@namei.org \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mjg@redhat.com \
--cc=namhyung@gmail.com \
--cc=satoru.moriya@hds.com \
--cc=seiji.aguchi@hds.com \
--cc=tony.luck@intel.com \
--cc=vgoyal@redhat.com \
--cc=ying.huang@intel.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.