[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <Y3SyBk1VPVVT3h0J@alley>
Date: Wed, 16 Nov 2022 10:48:54 +0100
From: Petr Mladek <pmladek@...e.com>
To: John Ogness <john.ogness@...utronix.de>
Cc: Sergey Senozhatsky <senozhatsky@...omium.org>,
Steven Rostedt <rostedt@...dmis.org>,
Thomas Gleixner <tglx@...utronix.de>,
linux-kernel@...r.kernel.org
Subject: Re: replay log: Re: [PATCH printk v4 38/39] printk: relieve
console_lock of list synchronization duties
On Wed 2022-11-16 10:14:35, John Ogness wrote:
> Hi Petr,
>
> Sorry, console_flush_all() only loses the console_lock if there was a
> handover. Here is a new complete suggestion from me.
>
> if (newcon->flags & (CON_PRINTBUFFER | CON_BOOT)) {
> /* Get a consistent copy of @syslog_seq. */
> mutex_lock(&syslog_lock);
> newcon->seq = syslog_seq;
> mutex_unlock(&syslog_lock);
> } else {
> /* Begin with next message added to ringbuffer. */
> newcon->seq = prb_next_seq(prb);
>
> /*
> * If any enabled boot consoles are due to be unregistered
> * shortly, some may not be caught up and may be the same
> * device as @newcon. Since it is not known which boot console
> * is the same device, flush all consoles and, if necessary,
> * start with the message of the enabled boot console that is
> * the furthest behind.
> */
> if (bootcon_registered && !keep_bootcon) {
> bool handover;
>
> /*
> * Hold the console_lock to guarantee safe access to
> * console->seq.
> */
> console_lock();
>
> /*
> * Flush all consoles and set the console to start at
> * the next unprinted sequence number.
> */
> if (!console_flush_all(true, &newcon->seq, &handover)) {
> /*
> * Flushing failed. Just choose the lowest
> * sequence of the enabled boot consoles.
> */
>
> /*
> * If there was a handover, this context no
> * longer holds the console_lock.
> */
> if (handover)
> console_lock();
>
> newcon->seq = prb_next_seq(prb);
> for_each_console(con) {
> if ((con->flags & CON_BOOT) &&
> (con->flags & CON_ENABLED) &&
> con->seq < newcon->seq) {
> newcon->seq = con->seq;
> }
> }
> }
>
> console_unlock();
> }
It looks good to me.
Now, we just need to agree how to add this into the patchset.
My proposal is to:
1. patch: hide the original code into a function, .e.g. console_init_seq()
2. patch: move console_init_seq() and add the above trickery
Do both before the 3rd patch in this patchset. It moved the code
outside console_lock() guarded section.
Best Regards,
Petr
Powered by blists - more mailing lists