From: John Ogness <john.ogness@linutronix.de>
To: Petr Mladek <pmladek@suse.com>
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: [PATCH printk v1 11/13] printk: reimplement console_lock for proper kthread support
Date: Wed, 09 Mar 2022 15:02:07 +0106 [thread overview]
Message-ID: <87tuc7xma0.fsf@jogness.linutronix.de> (raw)
In-Reply-To: <YhYKP/UuSKENGwfj@alley>
On 2022-02-23, Petr Mladek <pmladek@suse.com> wrote:
>> +/*
>> + * A variant of console_trylock() that allows specifying if the context may
>> + * sleep. If yes, a trylock on @console_sem is attempted and if successful,
>> + * the threaded printers are paused. This is important to ensure that
>> + * sleepable contexts do not become involved in console_lock handovers and
>> + * will call cond_resched() during the printing loop.
>> + */
>> +static int console_trylock_sched(bool may_schedule)
>> +{
>> + if (!may_schedule)
>> + return console_trylock();
>> +
>> + might_sleep();
>> +
>> + if (down_trylock_console_sem())
>> + return 0;
>> + if (console_suspended) {
>> + up_console_sem();
>> + return 0;
>> + }
>> + pause_all_consoles();
>
> This is weird. Any trylock function should be fast and non-blocking.
> But pause_all_consoles() uses mutex_lock().
>
> My expectation would be that console_trylock_sched() behaves
> excatly the same as console_trylock() except that it will
> set console_may_schedule by the given parameter.
>
> I would do it the other way. Rename console_trylock() and
> implement:
>
> int console_trylock(void)
> {
> return console_trylock_sched(false);
> }
>
> LATER: I got it. It is used by console_trylock_sched() called
> in console_unlock() when "do_cond_resched == true". In this
> case, the trylock might wait for the mutexes. It will prevent
> transfering console_lock from schedulable to atomic context
> by the check in console_emit_next_record().
Yes!
> Hmm, I would still prefer to keep console_trylock_sched()
> behavior sane: non-blocking in all situations. It means
> that we actually do not need it and console_trylock()
> is enough.
>
> It will allow to steal console_lock() from schedulable
> context. But it is not a regression. And it is only
> a corner case when console_unlock() re-takes the semaphore
> after releasing it.
A console waiter must not wait on a schedulable context. The console
waiter is burning the CPU waiting for a transfer. If the console owner
gets scheduled away while still holding the console lock, that is bad.
> We could do the same optimization in console_unlock() by
> calling console_emit_next_record() with NULL handover pointer
> when do_cond_resched == true. But we should do it
> as a separate patch later.
It is not an optimization, it is needed. Passing a NULL handover pointer
when do_cond_resched == true would handle it correctly, but this feels
like a workaround to me.
The reason for adding console_trylock_sched() is because a context that
previously acquired the console lock via console_lock() wants to try to
reacquire it. If it reacquires the console lock using the kthread
mutexes, the locking scenario returns to the same as it was
before... all kthreads are blocked via their mutex.
You are suggesting that a console_lock() context later tries to
reacquire the console lock, but using the console_trylock() method
(atomic counter) and keeping console_may_schedule=1.
IMHO, _this_ is a weird variant that requires passing in a NULL handover
pointer as a workaround. It introduces a third locking scenario where a
schedulable context is using functions created for atomic use.
Also, as I mentioned in the percpu thread [0], I think we need to avoid
console_trylock() usage in schedulable contexts. Functions need to be
aware in what contexts they are running and call the appropriate
functions for it.
>> @@ -2856,6 +2957,10 @@ void console_unblank(void)
>> if (oops_in_progress) {
>> if (down_trylock_console_sem() != 0)
>> return;
>> + if (!console_excl_trylock()) {
>> + up_console_sem();
>> + return;
>> + }
>
> It would be better to use
>
> if (oops_in_progress) {
> if (!console_trylock())
> return;
>
Well that is slightly different. It would mean that @console_suspended
is now also considered. I will investigate if that matters, but
currently it is not considered.
John
[0] https://lore.kernel.org/lkml/87mti22i20.fsf@jogness.linutronix.de
next prev parent reply other threads:[~2022-03-09 13:56 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
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 [this message]
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=87tuc7xma0.fsf@jogness.linutronix.de \
--to=john.ogness@linutronix.de \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pmladek@suse.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®