From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934002AbcI3PTk (ORCPT ); Fri, 30 Sep 2016 11:19:40 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:33719 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933938AbcI3PTa (ORCPT ); Fri, 30 Sep 2016 11:19:30 -0400 From: Sergey Senozhatsky To: Petr Mladek , Jan Kara Cc: Andrew Morton , Tejun Heo , Calvin Owens , Thomas Gleixner , Mel Gorman , Steven Rostedt , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Sergey Senozhatsky Subject: [RFC][PATCHv2 7/7] printk: remove zap_locks() function Date: Sat, 1 Oct 2016 00:17:58 +0900 Message-Id: <20160930151758.8965-8-sergey.senozhatsky@gmail.com> X-Mailer: git-send-email 2.10.0.372.g6fe1b14 In-Reply-To: <20160930151758.8965-1-sergey.senozhatsky@gmail.com> References: <20160930151758.8965-1-sergey.senozhatsky@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We use alt_printk now which makes printk-recursion detection code in vprintk_emit() is unreachable. The tricky thing here is that, apart from detecting and reporting printk recursions, that code also used to zap_lockc() in case of panic. However, zap_locks() does not look to be needed anymore: 1) Since 08d78658f393 ('panic: release stale console lock to always get the logbuf printed out') panic flushing of `logbuf' to console ignores the state of `console_sem' by doing panic() console_trylock(); console_unlock(); 2) Since cf9b1106c81c ('printk/nmi: flush NMI messages on the system panic') panic attempts to zap the `logbuf_lock' spin_lock to successfully flush nmi messages to `logbuf'. Basically, it seems that we either already do what zap_locks() used to do but in other places or we ignore the state of the lock. May be we still would want to do sema_init() in alt_printk_flush_on_panic(), just in case. Signed-off-by: Sergey Senozhatsky --- kernel/printk/printk.c | 63 -------------------------------------------------- 1 file changed, 63 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index b99d6b3..fb2d26b 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1600,28 +1600,6 @@ static void call_console_drivers(int level, } } -/* - * Zap console related locks when oopsing. - * To leave time for slow consoles to print a full oops, - * only zap at most once every 30 seconds. - */ -static void zap_locks(void) -{ - static unsigned long oops_timestamp; - - if (time_after_eq(jiffies, oops_timestamp) && - !time_after(jiffies, oops_timestamp + 30 * HZ)) - return; - - oops_timestamp = jiffies; - - debug_locks_off(); - /* If a crash is occurring, make sure we can't deadlock */ - raw_spin_lock_init(&logbuf_lock); - /* And make sure that we print immediately */ - sema_init(&console_sem, 1); -} - int printk_delay_msec __read_mostly; static inline void printk_delay(void) @@ -1748,18 +1726,13 @@ asmlinkage int vprintk_emit(int facility, int level, const char *dict, size_t dictlen, const char *fmt, va_list args) { - static bool recursion_bug; static char textbuf[LOG_LINE_MAX]; char *text = textbuf; size_t text_len = 0; enum log_flags lflags = 0; - unsigned long flags; - int this_cpu; int printed_len = 0; int nmi_message_lost; bool in_sched = false; - /* cpu currently holding logbuf_lock in this function */ - static unsigned int logbuf_cpu = UINT_MAX; if (level == LOGLEVEL_SCHED) { level = LOGLEVEL_DEFAULT; @@ -1769,43 +1742,9 @@ asmlinkage int vprintk_emit(int facility, int level, boot_delay_msec(level); printk_delay(); - local_irq_save(flags); - this_cpu = smp_processor_id(); - - /* - * Ouch, printk recursed into itself! - */ - if (unlikely(logbuf_cpu == this_cpu)) { - /* - * If a crash is occurring during printk() on this CPU, - * then try to get the crash message out but make sure - * we can't deadlock. Otherwise just return to avoid the - * recursion and return - but flag the recursion so that - * it can be printed at the next appropriate moment: - */ - if (!oops_in_progress && !lockdep_recursing(current)) { - recursion_bug = true; - local_irq_restore(flags); - return 0; - } - zap_locks(); - } - alt_printk_enter(); /* This stops the holder of console_sem just where we want him */ raw_spin_lock(&logbuf_lock); - logbuf_cpu = this_cpu; - - if (unlikely(recursion_bug)) { - static const char recursion_msg[] = - "BUG: recent printk recursion!"; - - recursion_bug = false; - /* emit KERN_CRIT message */ - printed_len += log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0, - NULL, 0, recursion_msg, - strlen(recursion_msg)); - } nmi_message_lost = get_nmi_message_lost(); if (unlikely(nmi_message_lost)) { @@ -1898,10 +1837,8 @@ asmlinkage int vprintk_emit(int facility, int level, dict, dictlen, text, text_len); } - logbuf_cpu = UINT_MAX; raw_spin_unlock(&logbuf_lock); alt_printk_exit(); - local_irq_restore(flags); /* If called from the scheduler, we can not call up(). */ if (!in_sched) { -- 2.10.0.372.g6fe1b14