On (20/10/22 13:42), Petr Mladek wrote:
> +static bool mute_console;
> +
> +static int __init mute_console_setup(char *str)
> +{
> +     mute_console = true;
> +     pr_info("All consoles muted.\n");
> +
> +     return 0;
> +}

First of all, thanks a lot for picking this up and for the patch set!

I've several thoughts and comments below.

>  static bool suppress_message_printing(int level)
>  {
> -     return (level >= console_loglevel && !ignore_loglevel);
> +     if (unlikely(mute_console))
> +             return true;
> +
> +     if (unlikely(ignore_loglevel))
> +             return false;
> +
> +     return (level >= console_loglevel);
>  }

This is one way of doing it. Another one is to clear CON_ENABLED bit
from all consoles (upon registration), one upside of this is that we
will signal user-space that consoles are disabled/muted (by removing
the E flag from /proc/consoles).

But, if I'm mistaken, but this mutes only printk side, consoles still
have uart running:
        printf -> tty -> uart -> serial_driver_IRQ() -> TX
        seriaal_driver_IRQ() -> RX -> uart -> tty

so user space, in theory, still can push messages to slow consoles,
AFAIU.

Thinking more about it. We are still relying on the fact that there is
anything registered as console driver, which is not necessarily the case,
we can have NULL console drivers list. So how about having a dummy struct
console in printk, with NOP read/write and NOP tty_driver and NOP
tty_operations. So that when init calls filp_open("/dev/console") and
we can't give tty anything but NULL, we'd just give tty back the dummy
NOP device.

        -ss

Reply via email to