On Thu 2022-11-10 17:09:12, John Ogness wrote: > On 2022-11-10, Petr Mladek <pmladek@xxxxxxxx> wrote: > >> +void console_force_preferred_locked(struct console *con) > >> +{ > >> + struct console *cur_pref_con; > >> + > >> + if (!console_is_registered_locked(con)) > >> + return; > >> + > >> + cur_pref_con = console_first(); > >> + > >> + /* Already preferred? */ > >> + if (cur_pref_con == con) > >> + return; > >> + > >> + hlist_del_init_rcu(&con->node); > > > > We actually should re-initialize the node only after all existing > > console list walks are finished. Se we should use here: > > > > hlist_del_rcu(&con->node); > > hlist_del_init_rcu() only re-initializes @pprev pointer. Ah, I was not aware of it. > But maybe you > are concerned that there is a window where list_unhashed() becomes true? > I agree that it should be changed to hlist_del_rcu() because there > should not be a window where this console appears unregistered. Makes sense. > >> + /* Only the new head can have CON_CONSDEV set. */ > >> + WRITE_ONCE(cur_pref_con->flags, cur_pref_con->flags & ~CON_CONSDEV); > > > > As mentioned in the reply for 7th patch, I would prefer to hide this > > WRITE_ONCE into a wrapper, e.g. console_set_flag(). It might also > > check that the console_list_lock is taken... > > Agreed. For v4 it will become: > > console_srcu_write_flags(cur_pref_con->flags & ~CON_CONSDEV); I am happy that your are going to introduce an API for this. Just to be sure. The _srcu_ in the name means that the write will use WRITE_ONCE() so that it can be read safely in SRCU context using READ_ONCE(). Do I get it correctly, please? I expect that the counter part will be console_srcu_read_flags(). I like the name. It is better than _unsafe_ that I proposed earlier. Best Regards, Petr