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:02:34 +0106 |
| |
Hi,
I forgot to re-lock the console... See below.
On 2022-11-16, John Ogness <john.ogness@linutronix.de> wrote: > 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. > */
Sorry. Here we lost the console_lock. Another acquire is needed here.
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
| |