On (20/10/08 01:29), Sergey Senozhatsky wrote:
> On (20/10/07 08:57), Guenter Roeck wrote:
> > On 10/7/20 5:30 AM, Sergey Senozhatsky wrote:
> 
> [..]
> 
> > I can see to options: Link /dev/console to /dev/null if there is no console,
> > or do something like
> > 
> >     if (IS_ERR(file)) {
> >                 pr_warn("Warning: unable to open an initial console.\n");
> >                 file = filp_open("/dev/null", O_RDWR, 0);
> >             if (IS_ERR(file))
> >                     return;
> >         }
> 
> As far as I can tell, /dev/null does not exist yet on this stage
> (at least not in my system). But generally the idea looks interesting.

Hmm. How about this. console= is undocumented and unspecified - it
may work sometimes or it may kill the system (and theoretically even
corrupt some files, depending on what fd 1 and fd 2 point to). So
maybe we can document console= and handle it in printk, rather than
somewhere deep in init/main.c

IOW add one more flag (yeah, I know) and set it when console_setup()
sees console= boot param. The idea is allow console registration,
but all consoles should be disabled (cleared CON_ENABLED bit). This
would be easier to document, at least.

Schematically:

---
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 929e86a01148..b71ff9d87693 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -281,6 +281,7 @@ static struct console_cmdline 
console_cmdline[MAX_CMDLINECONSOLES];
 
 static int preferred_console = -1;
 static bool has_preferred_console;
+static bool mute_consoles = false;
 int console_set_on_cmdline;
 EXPORT_SYMBOL(console_set_on_cmdline);
 
@@ -2141,6 +2142,9 @@ static int __add_preferred_console(char *name, int idx, 
char *options,
        struct console_cmdline *c;
        int i;
 
+       if (mute_consoles)
+               return;
+
        /*
         *      See if this tty is not yet registered, and
         *      if we have a slot free.
@@ -2189,6 +2193,11 @@ static int __init console_setup(char *str)
        char *s, *options, *brl_options = NULL;
        int idx;
 
+       if (str[0] == 0) {
+               mute_consoles = true;
+               return 0;
+       }
+
        if (_braille_console_setup(&str, &brl_options))
                return 1;
 
@@ -2630,6 +2639,9 @@ EXPORT_SYMBOL(console_stop);
 
 void console_start(struct console *console)
 {
+       if (mute_consoles)
+               return;
+
        console_lock();
        console->flags |= CON_ENABLED;
        console_unlock();
@@ -2811,6 +2823,9 @@ void register_console(struct console *newcon)
                console_drivers->next = newcon;
        }
 
+       if (mute_consoles)
+               newcon->flags &= ~CON_ENABLED;
+
        if (newcon->flags & CON_EXTENDED)
                nr_ext_console_drivers++;
 

Reply via email to