]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Revert "init/console: Use ttynull as a fallback when there is no console"
authorPetr Mladek <pmladek@suse.com>
Fri, 8 Jan 2021 11:48:47 +0000 (12:48 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Jan 2021 19:02:18 +0000 (11:02 -0800)
This reverts commit 4cd3cf5e470759479be0c8844813d1f2a36423f9.

The commit caused that ttynull was used as the default console
on several systems[1][2][3]. As a result, the console was
blank even when a better alternative existed.

It happened when there was no console configured
on the command line and ttynull_init() was the first initcall
calling register_console().

Or it happened when /dev/ did not exist when console_on_rootfs()
was called. It was not able to open /dev/console even though
a console driver was registered. It tried to add ttynull console
but it obviously did not help. But ttynull became the preferred
console and was used by /dev/console when it was available later.

The commit tried to fix a historical problem that have been there
for ages. The primary motivation was the commit fd6761cbe6ab4f7a7c5
("printk/console: Allow to disable console output by using console=""
 or console=null"). It provided a clean solution for a workaround
 that was widely used and worked only by chance.

This revert causes that the console="" or console=null command line
options will again work only by chance. These options will cause that
a particular console will be preferred and the default (tty) ones
will not get enabled. There will be no console registered at
all. As a result there won't be stdin, stdout, and stderr for
the init process. But it worked exactly this way even before.

The proper solution has to fulfill many conditions:

  + Register ttynull only when explicitly required or as
    the ultimate fallback.

  + ttynull should get associated with /dev/console but it must
    not become preferred console when used as a fallback.
    Especially, it must still be possible to replace it
    by a better console later.

Such a change requires clean up of the register_console() code.
Otherwise, it would be even harder to follow. Especially, the use
of has_preferred_console and CON_CONSDEV flag is tricky. The clean
up is risky. The ordering of consoles is not well defined. And
any changes tend to break existing user settings.

Do the revert at the least risky solution for now.

[1] https://lore.kernel.org/linux-kselftest/20201221144302.GR4077@smile.fi.intel.com/
[2] https://lore.kernel.org/lkml/d2a3b3c0-e548-7dd1-730f-59bc5c04e191@synopsys.com/
[3] https://patchwork.ozlabs.org/project/linux-um/patch/20210105120128.10854-1-thomas@m3y3r.de/

Reported-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reported-by: Vineet Gupta <vgupta@synopsys.com>
Reported-by: Thomas Meyer <thomas@m3y3r.de>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/tty/Kconfig
drivers/tty/Makefile
drivers/tty/ttynull.c
include/linux/console.h
init/main.c

index 47a6e42f0d04f1a4c8883511060add1ae7456d65..e15cd6b5bb99a896b21d98506a900d1ab6686cb6 100644 (file)
@@ -401,6 +401,20 @@ config MIPS_EJTAG_FDC_KGDB_CHAN
        help
          FDC channel number to use for KGDB.
 
+config NULL_TTY
+       tristate "NULL TTY driver"
+       help
+         Say Y here if you want a NULL TTY which simply discards messages.
+
+         This is useful to allow userspace applications which expect a console
+         device to work without modifications even when no console is
+         available or desired.
+
+         In order to use this driver, you should redirect the console to this
+         TTY, or boot the kernel with console=ttynull.
+
+         If unsure, say N.
+
 config TRACE_ROUTER
        tristate "Trace data router for MIPI P1149.7 cJTAG standard"
        depends on TRACE_SINK
index 3c1c5a9240a70279c9904445417e83e36b7f107c..b3ccae9326601cdbf13604f105bc08e2a1c27e35 100644 (file)
@@ -2,7 +2,7 @@
 obj-$(CONFIG_TTY)              += tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o \
                                   tty_buffer.o tty_port.o tty_mutex.o \
                                   tty_ldsem.o tty_baudrate.o tty_jobctrl.o \
-                                  n_null.o ttynull.o
+                                  n_null.o
 obj-$(CONFIG_LEGACY_PTYS)      += pty.o
 obj-$(CONFIG_UNIX98_PTYS)      += pty.o
 obj-$(CONFIG_AUDIT)            += tty_audit.o
@@ -25,6 +25,7 @@ obj-$(CONFIG_ISI)             += isicom.o
 obj-$(CONFIG_MOXA_INTELLIO)    += moxa.o
 obj-$(CONFIG_MOXA_SMARTIO)     += mxser.o
 obj-$(CONFIG_NOZOMI)           += nozomi.o
+obj-$(CONFIG_NULL_TTY)         += ttynull.o
 obj-$(CONFIG_ROCKETPORT)       += rocket.o
 obj-$(CONFIG_SYNCLINK_GT)      += synclink_gt.o
 obj-$(CONFIG_PPC_EPAPR_HV_BYTECHAN) += ehv_bytechan.o
index eced70ec54e174e0ae6d48ba90777ebcf08f5e4e..17f05b7eb6d3ede3790d98d9527c7221eb907405 100644 (file)
@@ -2,13 +2,6 @@
 /*
  * Copyright (C) 2019 Axis Communications AB
  *
- * The console is useful for userspace applications which expect a console
- * device to work without modifications even when no console is available
- * or desired.
- *
- * In order to use this driver, you should redirect the console to this
- * TTY, or boot the kernel with console=ttynull.
- *
  * Based on ttyprintk.c:
  *  Copyright (C) 2010 Samo Pogacnik
  */
@@ -66,17 +59,6 @@ static struct console ttynull_console = {
        .device = ttynull_device,
 };
 
-void __init register_ttynull_console(void)
-{
-       if (!ttynull_driver)
-               return;
-
-       if (add_preferred_console(ttynull_console.name, 0, NULL))
-               return;
-
-       register_console(&ttynull_console);
-}
-
 static int __init ttynull_init(void)
 {
        struct tty_driver *driver;
index dbe78e8e26029ef908d027deee29fec5c0e57638..20874db50bc8a5ad054bdc607e44d842fe5f7274 100644 (file)
@@ -186,12 +186,9 @@ extern int braille_register_console(struct console *, int index,
 extern int braille_unregister_console(struct console *);
 #ifdef CONFIG_TTY
 extern void console_sysfs_notify(void);
-extern void register_ttynull_console(void);
 #else
 static inline void console_sysfs_notify(void)
 { }
-static inline void register_ttynull_console(void)
-{ }
 #endif
 extern bool console_suspend_enabled;
 
index 421640fca3759f551b9d229317c3e3f513585752..c68d784376ca1058d58e3a6dfb664420c6ded461 100644 (file)
@@ -1480,14 +1480,8 @@ void __init console_on_rootfs(void)
        struct file *file = filp_open("/dev/console", O_RDWR, 0);
 
        if (IS_ERR(file)) {
-               pr_err("Warning: unable to open an initial console. Fallback to ttynull.\n");
-               register_ttynull_console();
-
-               file = filp_open("/dev/console", O_RDWR, 0);
-               if (IS_ERR(file)) {
-                       pr_err("Warning: Failed to add ttynull console. No stdin, stdout, and stderr for the init process!\n");
-                       return;
-               }
+               pr_err("Warning: unable to open an initial console.\n");
+               return;
        }
        init_dup(file);
        init_dup(file);