Re: [PATCH printk v2 04/11] printk: nbcon: Provide functions to mark atomic write sections

From: John Ogness
Date: Mon Sep 25 2023 - 05:26:05 EST


On 2023-09-22, Petr Mladek <pmladek@xxxxxxxx> wrote:
>> Note that when a CPU is in a priority elevated state, flushing
>> only occurs when dropping back to a lower priority. This allows
>> the full set of printk records (WARN/OOPS/PANIC output) to be
>> stored in the ringbuffer before beginning to flush the backlog.
>
> The above paragraph is a bit confusing. The code added by this patch
> does not do any flushing.

You are right. I should put this patch after patch 5 "printk: nbcon:
Provide function for atomic flushing" to simplify the introduction.

> I guess that this last paragraph is supposed to explain why the
> "nesting" array is needed.

No, it is explaining how this feature works in general. The term
"priority elevated state" means the CPU is in an atomic write section.

The "nesting" array is needed in order to support a feature that is not
explained in the commit message: If nested OOPS/WARN/PANIC occur, only
the outermost OOPS/WARN/PANIC will do the flushing. I will add this
information to the commit message.

>> +static __ref struct nbcon_cpu_state *nbcon_get_cpu_state(void)
>> +{
>> + if (!printk_percpu_data_ready())
>> + return &early_nbcon_pcpu_state;
>
> it might worth a comment. Something like:
>
> /*
> * The value of __printk_percpu_data_ready is modified in normal
> * context. As a result it could never change inside a nbcon
> * atomic context.
> */
> if (!printk_percpu_data_ready())
> return &early_nbcon_pcpu_state;

OK.

>> +void nbcon_atomic_exit(enum nbcon_prio prio, enum nbcon_prio prev_prio)
>> +{
>> + struct nbcon_cpu_state *cpu_state;
>> +
>> + cpu_state = nbcon_get_cpu_state();
>
> I would add a consistency check:
>
> WARN_ON_ONCE(cpu_state->nesting[cpu_state->prio] <= 0)

OK.

John