Messages in this thread | | | From | John Ogness <> | Subject | Re: replay log: Re: [PATCH printk v4 38/39] printk: relieve console_lock of list synchronization duties | Date | Wed, 16 Nov 2022 10:14:35 +0106 |
| |
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(); }
John Ogness
| |