Messages in this thread Patch in this message | | | From | Seiji Aguchi <> | Date | Tue, 27 Sep 2011 13:14:59 -0400 | Subject | [RFC][PATCH -next] pstore: replace spin_lock with spin_trylock_irqsave in panic path |
| |
Hi,
[Problem] Currently, pstore takes spin_trylock(&psinfo->buf_lock) in NMI context. And it takes spin_lock(&psinfo->buf_lock) in other cases.
If there are some bugs in pstore and kernel panics, spin_lock(&psinfo->buf_lock) causes deadlock and panic_notifier_chain will not work.
[Patch Description] For solving this problem, this patch replaces spin_lock with spin_trylock_irqsave in panic path.
Dead lock in panic path will not happen by applying this patch.
Signed-off-by: Seiji Aguchi <seiji.aguchi@hds.com>
--- fs/pstore/platform.c | 17 ++++++++--------- 1 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 0472924..9882892 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -97,12 +97,15 @@ static void pstore_dump(struct kmsg_dumper *dumper, 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"); + if (reason == KMSG_DUMP_PANIC) { + is_locked = spin_trylock_irqsave(&psinfo->buf_lock, flags); + if (!is_locked) { + pr_err("pstore dump routine skipped in panic path\n"); + return; + } } else spin_lock_irqsave(&psinfo->buf_lock, flags); + oopscount++; while (total < kmsg_bytes) { dst = psinfo->buf; @@ -131,11 +134,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); } static struct kmsg_dumper pstore_dumper = { -- 1.7.1
| |