From: Sergey Senozhatsky <senozhatsky@chromium.org>
To: John Ogness <john.ogness@linutronix.de>
Cc: Petr Mladek <pmladek@suse.com>,
Sergey Senozhatsky <senozhatsky@chromium.org>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>,
linux-kernel@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Masahiro Yamada <masahiroy@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Nick Desaulniers <ndesaulniers@google.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>,
Vitor Massaru Iha <vitor@massaru.org>,
Sedat Dilek <sedat.dilek@gmail.com>,
Changbin Du <changbin.du@intel.com>
Subject: Re: [PATCH printk v1 07/10] console: add write_atomic interface
Date: Tue, 31 Aug 2021 11:55:01 +0900 [thread overview]
Message-ID: <YS2aBeymxuiW3CIw@google.com> (raw)
In-Reply-To: <20210803131301.5588-8-john.ogness@linutronix.de>
On (21/08/03 15:18), John Ogness wrote:
[..]
> @@ -1993,6 +1993,16 @@ static int console_trylock_spinning(void)
> bool spin = false;
> unsigned long flags;
>
> +#ifdef CONFIG_SMP
> + /*
> + * CPUs holding the printk cpulock must not spin on any lock. Even
> + * console_trylock() must not be called because its implementation
> + * uses spinlocks.
> + */
> + if (atomic_read(&printk_cpulock_owner) == smp_processor_id())
> + return 0;
> +#endif
> +
> if (console_trylock())
> return 1;
>
> @@ -2719,7 +2729,17 @@ static int have_callable_console(void)
> */
> static inline int can_use_console(void)
> {
> - return cpu_online(raw_smp_processor_id()) || have_callable_console();
> + int cpu = raw_smp_processor_id();
> +#ifdef CONFIG_SMP
> + /*
> + * CPUs holding the printk cpulock must not spin on any lock.
> + * Allowing console usage could call into the spinlocks of the
> + * various console drivers.
> + */
> + if (atomic_read(&printk_cpulock_owner) == cpu)
> + return 0;
I guess the only reason this is done in can_use_console() is
console_flush_on_panic()?
Because otherwise, I think, we can move this check to vprintk_emit().
can_use_console() can be called from preemptible() context. But
if it's called from preemptible() then we know that this is not
printk()/NMI path (but console_device() and friends instead) and
that this CPU is definitely not holding printk CPU lock.
console_trylock_spinning() and console_unlock()->can_use_console()
follow each other
if (console_trylock_spinning())
console_unlock();
so a single `atomic_read(&printk_cpulock_owner) == cpu` can suffice.
Now we get to the console_flush_on_panic(), which still calls console_unlock(),
iterates over messages, but when called by the CPU that owns printk_lock,
just skips all the messages. But there is no point in calling console_unlock()
in such a case, we can check if we're printk_cpulock_owner and bail out if so.
Or am I missing something?
next prev parent reply other threads:[~2021-08-31 2:55 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-03 13:12 [PATCH printk v1 00/10] printk: introduce atomic consoles and sync mode John Ogness
2021-08-03 13:12 ` John Ogness
2021-08-03 13:12 ` John Ogness
2021-08-03 13:12 ` [PATCH printk v1 01/10] printk: relocate printk cpulock functions John Ogness
2021-08-04 9:24 ` Petr Mladek
2021-08-03 13:12 ` [PATCH printk v1 02/10] printk: rename printk cpulock API and always disable interrupts John Ogness
2021-08-04 9:52 ` Petr Mladek
2021-08-03 13:12 ` [PATCH printk v1 03/10] kgdb: delay roundup if holding printk cpulock John Ogness
2021-08-03 13:12 ` John Ogness
2021-08-03 14:25 ` Daniel Thompson
2021-08-03 14:25 ` Daniel Thompson
2021-08-03 15:30 ` John Ogness
2021-08-03 15:30 ` John Ogness
2021-08-04 11:31 ` Daniel Thompson
2021-08-04 11:31 ` Daniel Thompson
2021-08-04 12:12 ` Petr Mladek
2021-08-04 12:12 ` Petr Mladek
2021-08-04 15:04 ` Daniel Thompson
2021-08-04 15:04 ` Daniel Thompson
2021-08-05 3:46 ` John Ogness
2021-08-05 3:46 ` John Ogness
2021-08-06 12:06 ` Daniel Thompson
2021-08-06 12:06 ` Daniel Thompson
2021-08-04 12:31 ` Petr Mladek
2021-08-04 12:31 ` Petr Mladek
2021-08-03 13:12 ` [PATCH printk v1 04/10] printk: relocate printk_delay() John Ogness
2021-08-04 13:07 ` Petr Mladek
2021-08-03 13:12 ` [PATCH printk v1 05/10] printk: call boot_delay_msec() in printk_delay() John Ogness
2021-08-04 13:09 ` Petr Mladek
2021-08-31 1:04 ` Sergey Senozhatsky
2021-08-03 13:12 ` [PATCH printk v1 06/10] printk: use seqcount_latch for console_seq John Ogness
2021-08-05 12:16 ` Petr Mladek
2021-08-05 15:26 ` John Ogness
2021-08-06 15:56 ` Petr Mladek
2021-08-31 3:05 ` Sergey Senozhatsky
2021-08-03 13:12 ` [PATCH printk v1 07/10] console: add write_atomic interface John Ogness
2021-08-03 14:02 ` Andy Shevchenko
2021-08-06 10:56 ` John Ogness
2021-08-06 11:18 ` Andy Shevchenko
2021-08-31 2:55 ` Sergey Senozhatsky [this message]
2021-08-03 13:12 ` [PATCH printk v1 08/10] printk: introduce kernel sync mode John Ogness
2021-08-05 17:11 ` Petr Mladek
2021-08-05 21:25 ` John Ogness
2021-08-03 13:13 ` [PATCH printk v1 09/10] kdb: if available, only use atomic consoles for output mirroring John Ogness
2021-08-03 13:13 ` [PATCH printk v1 10/10] serial: 8250: implement write_atomic John Ogness
2021-08-03 13:13 ` John Ogness
2021-08-03 13:13 ` John Ogness
2021-08-03 14:07 ` Andy Shevchenko
2021-08-03 14:07 ` Andy Shevchenko
2021-08-03 14:07 ` Andy Shevchenko
2021-08-05 7:47 ` Jiri Slaby
2021-08-05 7:47 ` Jiri Slaby
2021-08-05 7:47 ` Jiri Slaby
2021-08-05 8:26 ` John Ogness
2021-08-05 8:26 ` John Ogness
2021-08-05 8:26 ` John Ogness
2021-08-03 13:52 ` [PATCH printk v1 00/10] printk: introduce atomic consoles and sync mode Andy Shevchenko
2021-08-03 13:52 ` Andy Shevchenko
2021-08-03 13:52 ` Andy Shevchenko
2021-08-05 15:47 ` Petr Mladek
2021-08-05 15:47 ` Petr Mladek
2021-08-05 15:47 ` Petr Mladek
2021-08-31 0:33 ` Sergey Senozhatsky
2021-08-31 0:33 ` Sergey Senozhatsky
2021-08-31 0:33 ` Sergey Senozhatsky
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=YS2aBeymxuiW3CIw@google.com \
--to=senozhatsky@chromium.org \
--cc=akpm@linux-foundation.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=changbin.du@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=masahiroy@kernel.org \
--cc=ndesaulniers@google.com \
--cc=paulmck@kernel.org \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=peterz@infradead.org \
--cc=pmladek@suse.com \
--cc=rostedt@goodmis.org \
--cc=sedat.dilek@gmail.com \
--cc=tglx@linutronix.de \
--cc=vitor@massaru.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.