From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933976AbcI0OYV (ORCPT ); Tue, 27 Sep 2016 10:24:21 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:33111 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932491AbcI0OXe (ORCPT ); Tue, 27 Sep 2016 10:23:34 -0400 From: Sergey Senozhatsky To: Petr Mladek , Jan Kara Cc: Andrew Morton , Tejun Heo , Calvin Owens , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Sergey Senozhatsky Subject: [RFC][PATCH 0/7] printk: use alt_printk to handle printk() recursive calls Date: Tue, 27 Sep 2016 23:22:30 +0900 Message-Id: <20160927142237.5539-1-sergey.senozhatsky@gmail.com> X-Mailer: git-send-email 2.10.0.372.g6fe1b14 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, RFC This patch set extends a lock-less NMI per-cpu buffers idea to handle recursive printk() calls. The basic mechanism is pretty much the same -- at the beginning of a deadlock-prone section we switch to lock-less printk callback, and return back to a default printk implementation at the end; the messages are getting flushed to a logbuf buffer from a safer context. Deadlocks scenarios that alt_printk can handle: a) printk recursion from logbuf_lock spin_lock section in printk() printk() raw_spin_lock(&logbuf_lock); WARN_ON(1); raw_spin_unlock(&logbuf_lock); b) printk from sem->lock spin_lock section printk() console_trylock() down_trylock() raw_spin_lock_irqsave(&sem->lock, flags); WARN_ON(1); raw_spin_unlock_irqrestore(&sem->lock, flags); c) printk from logbuf_lock spin_lock section in console_unlock() printk() console_unlock() raw_spin_lock(&logbuf_lock); WARN_ON(1); raw_spin_unlock(&logbuf_lock); d) printk from ->pi_lock from semaphore up printk() console_unlock() up() try_to_wake_up() raw_spin_lock_irqsave(&p->pi_lock, flags); WARN_ON(1); raw_spin_unlock_irqrestore(&p->pi_lock, flags); and some other. [[against next-20160927]] Sergey Senozhatsky (7): printk: use vprintk_func in vprintk() printk: rename nmi.c and exported api printk: introduce per-cpu alt_print seq buffer printk: make alt_printk available when config printk set printk: drop vprintk_func function printk: use alternative printk buffers printk: new printk() recursion detection include/linux/printk.h | 14 +- init/Kconfig | 16 +- init/main.c | 2 +- kernel/kexec_core.c | 2 +- kernel/panic.c | 4 +- kernel/printk/Makefile | 2 +- kernel/printk/alt_printk.c | 432 +++++++++++++++++++++++++++++++++++++++++++++ kernel/printk/internal.h | 26 ++- kernel/printk/nmi.c | 268 ---------------------------- kernel/printk/printk.c | 67 +++---- lib/nmi_backtrace.c | 2 +- 11 files changed, 495 insertions(+), 340 deletions(-) create mode 100644 kernel/printk/alt_printk.c delete mode 100644 kernel/printk/nmi.c -- 2.10.0.372.g6fe1b14