On (09/29/16 15:00), Petr Mladek wrote: [..] > > @@ -1791,7 +1791,7 @@ asmlinkage int vprintk_emit(int facility, int level, > > zap_locks(); > > } > > > > - lockdep_off(); > > + alt_printk_enter(); > > IMHO, we could not longer enter vprintk_emit() recursively. The same > section that was guarded by logbuf_cpu is guarded by > alt_printk_enter()/exit() now.
you might be very right here. I'll take a look. > IMHO, we could remove all the logic around the recursion. Then we > could even disable/enable irqs inside alt_printk_enter()/exit(). I was thinking of doing something like this; but that would require storing 'unsigned long' flags in per-cpu data alt_enter() { unsinged long flags; local_irq_save(flags); ctx = this_cpu_ptr(); ctx->flags = flags; ... } alt_exit() { ctx = this_cpu_ptr(); ... local_irq_restore(ctx->flags); } and the decision was to keep `unsigned long flags' on stack in the alt_enter/exit caller. besides in most of the cases we already have it (in vprintk_emit() and console_unlock()). but I can certainly hide these details in alt_enter/exit. > And to correct myself from the previous mail. It is enough to disable > IRQs. It is enough to make sure that we will not preempt and will > stay on the same CPU. ah, no prob. > > @@ -2479,7 +2490,9 @@ void console_unlock(void) > > */ > > raw_spin_lock(&logbuf_lock); > > retry = console_seq != log_next_seq; > > - raw_spin_unlock_irqrestore(&logbuf_lock, flags); > > + raw_spin_unlock(&logbuf_lock); > > + alt_printk_exit(); > > + local_irq_restore(flags); > > We should mention that this patch makes an obsolete artefact from > printk_deferred(). It opens the door for another big cleanup and > relief. do you mean that, once alt_printk is done properly, we can drop printk_deferred()? I was thinking of it, but decided not to mention/touch it in this patch set. -ss