On Thu 2018-05-31 15:49:11, Maninder Singh wrote:
> This patch make sure printing of log if loglevel at time of storing
> log is greater than current console loglevel.
> 
> @why
> In case of async printk, printk thread can miss logs because it checks
> current log level at time of console_unlock.
> 
> func()
> {
> ....
> ....
>       console_verbose();  // user wants to have all the logs on console.
>       pr_alert();
>       pr_info();
>       dump_backtrace(); // prints with default loglevel.
>       pr_info();
>       pr_emerg();
>       pr_info();
>       ...
>       ...
>       ...
>       pr_info();
>       console_silent(); // stop all logs from printing on console.
> }
> 
> Now if printk thread is scheduled after setting console loglevel
> to silent, then user's requirement will be in waste, because it will not
> print logs on console at time of printk thread scheduling.

A better text would be something like:

Now if console_lock was owned by another process, the messages might
be handled after the consoles were silenced.

> @how
> use one bit of flags field to store whether its console print
> or not(console_print) by checking current console loglevel with 
> message's level at time of log.
> At time of print check this flag for printing message on console.
> 
> Signed-off-by: Vaneet Narang <v.nar...@samsung.com>
> Signed-off-by: Maninder Singh <maninder...@samsung.com>
> ---
>  kernel/printk/printk.c | 33 +++++++++++++++++++++++----------
>  1 file changed, 23 insertions(+), 10 deletions(-)
> 
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index ab15903..4e0be66e 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -360,8 +360,16 @@ struct printk_log {
>       u16 text_len;           /* length of text buffer */
>       u16 dict_len;           /* length of dictionary buffer */
>       u8 facility;            /* syslog facility */
> -     u8 flags:5;             /* internal record flags */
> +     u8 flags:4;             /* internal record flags */
>       u8 level:3;             /* syslog level */
> +     /*
> +      * whether to print this msg on console or not?
> +      * due to async printk, printk thread can miss
> +      * prints at the time of console_flush because of
> +      * change in print level afterwards.
> +      */
> +     u8 console_print:1;

We should be careful with changing the structure. It is accessed
by external tools, like "crash".

IMHO, it is perfectly fine to handle this by a flag, e.g.
add LOG_CON_SUPPRESS.

> +
>  }
>  #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
>  __packed __aligned(4)
> @@ -623,7 +631,12 @@ static int log_store(int facility, int level,
>       msg->dict_len = dict_len;
>       msg->facility = facility;
>       msg->level = level & 7;
> -     msg->flags = flags & 0x1f;
> +     if (msg->level >= console_loglevel)
> +             msg->console_print = 0;
> +     else
> +             msg->console_print = 1;

We are going to decide about the visibility when the message is
stored. Let's handle it completely and make it easier later.

We could keep suppress_message_printing() as is and do the following
in vprintk_emit():

        if (suppress_message_printing(level)
                lflags |= LOG_CON_SUPPRESS;

> @@ -2354,7 +2367,7 @@ void console_unlock(void)
>                       break;
>  
>               msg = log_from_idx(console_idx);
> -             if (suppress_message_printing(msg->level)) {
> +             if (suppress_message_printing(msg->console_print)) {

Then it is enough to do

-               if (suppress_message_printing(msg->level)) {
+               if (msg->flags & LOG_CON_SUPRESSED) {

Best Regards,
Petr

                        /*
>                        * Skip record we have buffered and already printed
>                        * directly to the console when we received it, and
> -- 
> 1.9.1
> 

Reply via email to