Re: [PATCH v3 5/5] console: Introduce ->exit() callback

From: Sergey Senozhatsky
Date: Wed Jan 29 2020 - 10:12:49 EST


On (20/01/29 16:25), Andy Shevchenko wrote:
> I understand. Seems the ->setup() has to be idempotent. We can tell the same
> for ->exit() in some comment.
>
> Can you describe, btw, struct console in kernel doc format?
> It will be very helpful!

We probably need some documentation.

> > > In both cases we will get the console to have CON_ENABLED flag set.
> >
> > And there are sneaky consoles that have CON_ENABLED before we even
> > register them.
>
> So, taking into consideration my comment to the previous patch, what would be
> suggested guard here?
>
> For a starter something like this?
>
> if ((console->flags & CON_ENABLED) && console->exit)
> console->exit(console);

This will work if we also add something like this

---

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index a30ff46c0081..01ced6f38776 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2739,6 +2739,8 @@ void register_console(struct console *newcon)
}
}

+ newcon->flags &= ~CON_ENABLED;
+
if (console_drivers && console_drivers->flags & CON_BOOT)
bcon = console_drivers;


---

I don't know why some consoles set CON_ENABLED statically.

E.g. drivers/tty/serial/mux.c

static struct console mux_console = {
.name = "ttyB",
.write = mux_console_write,
.device = uart_console_device,
.setup = mux_console_setup,
.flags = CON_ENABLED | CON_PRINTBUFFER,
.index = 0,
.data = &mux_driver,
};

No idea...

Such consoles still will have CON_ENABLED even if registration failed
and we never ->setup() them.

-ss