From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de ([195.135.220.15]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1lGlDp-0001Eb-5h for linux-um@lists.infradead.org; Mon, 01 Mar 2021 16:16:38 +0000 Date: Mon, 1 Mar 2021 17:16:34 +0100 From: Petr Mladek Subject: Re: [PATCH next v3 01/15] um: synchronize kmsg_dumper Message-ID: References: <20210225202438.28985-1-john.ogness@linutronix.de> <20210225202438.28985-2-john.ogness@linutronix.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20210225202438.28985-2-john.ogness@linutronix.de> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-um" Errors-To: linux-um-bounces+geert=linux-m68k.org@lists.infradead.org To: John Ogness Cc: Sergey Senozhatsky , Richard Weinberger , Jeff Dike , linux-um@lists.infradead.org, linux-kernel@vger.kernel.org, Steven Rostedt , Sergey Senozhatsky , Thomas Gleixner , Andy Shevchenko , Thomas Meyer , Anton Ivanov 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 > Reviewed-by: Petr Mladek > --- > 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 > +#include > #include > #include > #include > @@ -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 _______________________________________________ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um