Messages in this thread | | | Date | Fri, 4 Dec 2020 15:41:43 +0900 | From | Sergey Senozhatsky <> | Subject | Re: [PATCH next v2 3/3] printk: remove logbuf_lock, add syslog_lock |
| |
On (20/12/01 21:59), John Ogness wrote: > > +#ifdef CONFIG_PRINTK_NMI > +#define NUM_RECURSION_CTX 2 > +#else > +#define NUM_RECURSION_CTX 1 > +#endif > + > +struct printk_recursion { > + char count[NUM_RECURSION_CTX]; > +}; > + > +static DEFINE_PER_CPU(struct printk_recursion, percpu_printk_recursion); > +static char printk_recursion_count[NUM_RECURSION_CTX]; > + > +static char *get_printk_count(void)
A nit: I think get_foo() has some sort of special meaning and one would expect that there should be put_foo() as well, and that those have something to do with the ref counting.
> +{ > + struct printk_recursion *rec; > + char *count; > + > + if (!printk_percpu_data_ready()) { > + count = &printk_recursion_count[0]; > + } else { > + rec = this_cpu_ptr(&percpu_printk_recursion); > + > + count = &rec->count[0]; > + } > + > +#ifdef CONFIG_PRINTK_NMI > + if (in_nmi()) > + count++; > +#endif > + > + return count; > +} > + > +static bool printk_enter(unsigned long *flags)
This better explicitly state that it disables local IRQs
printk_enter_irqsave()
I'm not very certain that printk_enter/printk_exit are best names:
if (!printk_enter()) return;
Maybe it can spell out why we couldn't enter printk so the function name can contain recursion_limit or something.
> +{ > + char *count; > + > + local_irq_save(*flags); > + count = get_printk_count(); > + /* Only 1 level of recursion allowed. */ > + if (*count > 1) { > + local_irq_restore(*flags); > + return false; > + } > + (*count)++; > + > + return true; > +} > + > +static void printk_exit(unsigned long flags)
This enables local IRQs, so
printk_exit_irqrestore()
> +{ > + char *count; > + > + count = get_printk_count(); > + (*count)--; > + local_irq_restore(flags); > +}
-ss
| |