From: Petr Mladek <pmladek@suse.com>
To: John Ogness <john.ogness@linutronix.de>
Cc: 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>
Subject: Re: two locations: was: Re: [PATCH printk v1 03/13] printk: use percpu flag instead of cpu_online()
Date: Fri, 4 Mar 2022 17:14:14 +0100 [thread overview]
Message-ID: <YiI61ppIW+FsrzPu@alley> (raw)
In-Reply-To: <87v8wwh0jw.fsf@jogness.linutronix.de>
On Wed 2022-03-02 15:55:23, John Ogness wrote:
> On 2022-02-16, Petr Mladek <pmladek@suse.com> wrote:
> >> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> >> index d1b773823d63..b346e60e9e51 100644
> >> --- a/kernel/printk/printk.c
> >> +++ b/kernel/printk/printk.c
> >> @@ -2577,11 +2577,11 @@ static int have_callable_console(void)
> >> *
> >> * Console drivers may assume that per-cpu resources have been allocated. So
> >> * unless they're explicitly marked as being able to cope (CON_ANYTIME) don't
> >> - * call them until this CPU is officially up.
> >> + * call them until per-cpu resources have been allocated.
> >> */
> >> static inline int can_use_console(void)
> >> {
> >> - return cpu_online(raw_smp_processor_id()) || have_callable_console();
> >> + return (printk_percpu_data_ready() || have_callable_console());
> >> }
> >
> > cpu_online(raw_smp_processor_id()) check is used also in
> > call_console_drivers(). The same logic should be used in both
> > locations.
> >
> > I found this when reviewing 6th patch that replaced both checks
> > with a single one.
> >
> > Note that I am still not sure if this change is correct at all.
> > It will allow to always call the console during CPU hotplug
> > and I am not sure if it is safe. IMHO, it might cause problems when
> > a console driver uses, for example, CPU-bound workqueues.
>
> You are correct. We must take hotplug into account for !CON_ANYTIME
> consoles. There may be some hotplug callbacks that make memory
> unavailable for the console.
>
> However, I will add the use of printk_percpu_data_ready() in the
> check. !CON_ANYTIME consoles also should not be called until the per-cpu
> areas are ready. For example, it would be bad if a console queued
> irq_work before per-cpu areas are setup (cpu_online() is true during
> this time).
>
> One of my main concerns was that raw_smp_processor_id() was used for the
> check. It is conceptually wrong to exclude certain consoles based on a
> current CPU when migration is still enabled. I understand that the use
> of can_use_console() is an optimization to avoid doing extra work where
> there are no consoles available. But the task could be preemptible there
> and _conceptually_, could get moved to another CPU before its write()
> callback is called. The cpu_online() check belongs in code where
> preemption is disabled.
>
> If the context is preemptible, I do not think it will ever see
> !cpu_online(). So I think if the cpu_online() check is limited to
> unlocking when console_trylock() was used, it will be correct.
This would require calling console_lock()/console_unlock()
in a hotplug code when cpu_online() already returns false.
Do I get it correctly?
I agree that it should not happen. console_lock() must be called in
a preemptible context. And CPU should not be in a pre-emptible
context when cpu_online() returns false. To be honest, I did
not check the code. It just does not make much sense.
> In the current implementation of printk(), it would be odd to do this
> conditional check (perhaps by passing @do_cond_resched to
> can_use_console()). But my series does significant refactoring and
> actually does need to distinguish between console_lock() and
> console_trylock() due to the kthreads and supporting the handover. So it
> should work well that the cpu_online() check for !CON_ANYTIME is only
> performed when !preemptible.
>
> Regardless, my v2 will keep cpu_online() checks since they are necessary
> for hotplug support.
Yes, I would do it to stay on the safe side.
Best Regards,
Petr
next prev parent reply other threads:[~2022-03-04 16:14 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-07 19:43 [PATCH printk v1 00/13] implement threaded console printing John Ogness
2022-02-07 19:43 ` [PATCH printk v1 01/13] printk: rename cpulock functions John Ogness
2022-02-11 12:44 ` Petr Mladek
2022-02-11 14:42 ` John Ogness
2022-02-11 20:57 ` Steven Rostedt
2022-02-11 21:04 ` Peter Zijlstra
2022-02-15 9:32 ` Petr Mladek
2022-02-15 9:13 ` Petr Mladek
2022-02-14 6:49 ` Sergey Senozhatsky
2022-02-14 9:45 ` John Ogness
2022-02-15 9:29 ` Petr Mladek
2022-02-16 3:27 ` Sergey Senozhatsky
2022-02-17 14:34 ` John Ogness
2022-02-07 19:43 ` [PATCH printk v1 02/13] printk: cpu sync always disable interrupts John Ogness
2022-02-11 12:58 ` Petr Mladek
2022-02-14 6:36 ` Sergey Senozhatsky
2022-02-07 19:43 ` [PATCH printk v1 03/13] printk: use percpu flag instead of cpu_online() John Ogness
2022-02-11 16:05 ` Petr Mladek
2022-02-14 7:08 ` Sergey Senozhatsky
2022-02-14 7:35 ` Sergey Senozhatsky
2022-02-15 10:38 ` Petr Mladek
2022-02-16 3:29 ` Sergey Senozhatsky
2022-03-02 14:21 ` John Ogness
2022-03-04 15:56 ` Petr Mladek
2022-03-05 17:05 ` Jason A. Donenfeld
2022-03-07 16:14 ` Petr Mladek
2022-02-16 13:58 ` two locations: was: " Petr Mladek
2022-03-02 14:49 ` John Ogness
2022-03-04 16:14 ` Petr Mladek [this message]
2022-03-07 10:06 ` John Ogness
2022-03-08 16:08 ` Petr Mladek
2022-02-07 19:43 ` [PATCH printk v1 04/13] printk: get caller_id/timestamp after migration disable John Ogness
2022-02-15 5:53 ` Sergey Senozhatsky
2022-02-15 11:56 ` Petr Mladek
2022-02-07 19:43 ` [PATCH printk v1 05/13] printk: call boot_delay_msec() in printk_delay() John Ogness
2022-02-15 5:58 ` Sergey Senozhatsky
2022-02-15 14:59 ` Petr Mladek
2022-02-16 3:21 ` Sergey Senozhatsky
2022-02-15 15:03 ` Petr Mladek
2022-02-07 19:43 ` [PATCH printk v1 06/13] printk: refactor and rework printing logic John Ogness
2022-02-16 15:43 ` Petr Mladek
2022-03-02 16:10 ` John Ogness
2022-02-07 19:43 ` [PATCH printk v1 07/13] printk: move buffer definitions into console_emit_next_record() caller John Ogness
2022-02-16 16:10 ` Petr Mladek
2022-03-02 16:25 ` John Ogness
2022-02-07 19:43 ` [PATCH printk v1 08/13] printk: add pr_flush() John Ogness
2022-02-17 10:11 ` Petr Mladek
2022-03-02 17:23 ` John Ogness
2022-03-04 13:24 ` Petr Mladek
2022-02-07 19:43 ` [PATCH printk v1 09/13] printk: add functions to allow direct printing John Ogness
2022-02-17 12:52 ` Petr Mladek
2022-02-18 9:00 ` David Laight
2022-02-18 12:52 ` Petr Mladek
2022-03-03 14:37 ` John Ogness
2022-02-07 19:43 ` [PATCH printk v1 10/13] printk: add kthread console printers John Ogness
2022-02-18 9:00 ` early start: was: " Petr Mladek
2022-02-18 9:04 ` start&stop: " Petr Mladek
2022-02-18 9:08 ` main loop: " Petr Mladek
2022-02-18 9:12 ` wake_up_all: " Petr Mladek
2022-02-07 19:43 ` [PATCH printk v1 11/13] printk: reimplement console_lock for proper kthread support John Ogness
2022-02-18 16:20 ` Petr Mladek
2022-02-18 21:41 ` John Ogness
2022-02-18 22:03 ` John Ogness
2022-02-22 11:42 ` Petr Mladek
2022-02-23 17:20 ` John Ogness
2022-02-24 8:27 ` Petr Mladek
2022-02-23 10:19 ` Petr Mladek
2022-03-09 13:56 ` John Ogness
2022-03-10 14:34 ` Petr Mladek
2022-03-10 16:08 ` John Ogness
2022-03-11 10:26 ` Petr Mladek
2022-03-11 13:28 ` John Ogness
2022-03-11 16:17 ` Petr Mladek
2022-03-11 22:21 ` John Ogness
2022-03-14 14:08 ` Petr Mladek
2022-03-14 14:43 ` John Ogness
2022-03-14 15:53 ` Petr Mladek
2022-03-11 18:41 ` Petr Mladek
2022-02-07 19:43 ` [PATCH printk v1 12/13] printk: remove @console_locked John Ogness
2022-02-23 12:17 ` Petr Mladek
2022-02-07 19:43 ` [PATCH printk v1 13/13] console: introduce CON_MIGHT_SLEEP for vt John Ogness
2022-02-23 13:37 ` Petr Mladek
2022-02-23 18:31 ` Greg Kroah-Hartman
[not found] ` <20220208083620.2736-1-hdanton@sina.com>
2022-02-08 11:08 ` [PATCH printk v1 10/13] printk: add kthread console printers John Ogness
2022-02-08 14:53 ` Petr Mladek
2022-02-14 6:12 ` Sergey Senozhatsky
2022-02-14 10:02 ` Petr Mladek
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=YiI61ppIW+FsrzPu@alley \
--to=pmladek@suse.com \
--cc=gregkh@linuxfoundation.org \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=senozhatsky@chromium.org \
--cc=tglx@linutronix.de \
/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.