Messages in this thread | | | Date | Mon, 1 Mar 2021 17:16:34 +0100 | From | Petr Mladek <> | Subject | Re: [PATCH next v3 01/15] um: synchronize kmsg_dumper |
| |
On Thu 2021-02-25 21:24:24, John Ogness wrote: > The kmsg_dumper can be called from any context and CPU, possibly > from multiple CPUs simultaneously. Since a static buffer is used > to retrieve the kernel logs, this buffer must be protected against > simultaneous dumping. Skip dumping if another context is already > dumping. > > Signed-off-by: John Ogness <john.ogness@linutronix.de> > Reviewed-by: Petr Mladek <pmladek@suse.com> > --- > arch/um/kernel/kmsg_dump.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/arch/um/kernel/kmsg_dump.c b/arch/um/kernel/kmsg_dump.c > index 6516ef1f8274..4869e2cc787c 100644 > --- a/arch/um/kernel/kmsg_dump.c > +++ b/arch/um/kernel/kmsg_dump.c > @@ -1,5 +1,6 @@ > // SPDX-License-Identifier: GPL-2.0 > #include <linux/kmsg_dump.h> > +#include <linux/spinlock.h> > #include <linux/console.h> > #include <linux/string.h> > #include <shared/init.h> > @@ -9,6 +10,7 @@ > static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, > enum kmsg_dump_reason reason) > { > + static DEFINE_SPINLOCK(lock); > static char line[1024]; > struct console *con; > size_t len = 0; > @@ -29,11 +31,16 @@ static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, > if (con) > return; > > + if (!spin_trylock(&lock))
I have almost missed this. It is wrong. The last version correctly used
if (!spin_trylock_irqsave(&lock, flags))
kmsg_dump(KMSG_DUMP_PANIC) is called in panic() with interrupts disabled. We have to store the flags here.
Best Regards, Petr
| |