From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753924AbcANE5J (ORCPT ); Wed, 13 Jan 2016 23:57:09 -0500 Received: from mail-pf0-f180.google.com ([209.85.192.180]:34403 "EHLO mail-pf0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753656AbcANE42 (ORCPT ); Wed, 13 Jan 2016 23:56:28 -0500 From: Sergey Senozhatsky X-Google-Original-From: Sergey Senozhatsky To: Andrew Morton Cc: Tejun Heo , Jan Kara , Petr Mladek , Kyle McMartin , Dave Jones , Calvin Owens , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Sergey Senozhatsky Subject: [RFC][PATCH -next 2/2] printk: set may_schedule for some of console_trylock callers Date: Thu, 14 Jan 2016 13:57:23 +0900 Message-Id: <1452747443-9927-3-git-send-email-sergey.senozhatsky@gmail.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1452747443-9927-1-git-send-email-sergey.senozhatsky@gmail.com> References: <1452747443-9927-1-git-send-email-sergey.senozhatsky@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org console_unlock() allows to cond_resched() if its caller has set `console_may_schedule' to 1 (this functionality present since commit 'printk: do cond_resched() between lines while outputting to consoles'). The rules are: -- console_lock() always sets `console_may_schedule' to 1 -- console_trylock() always sets `console_may_schedule' to 0 However, console_trylock() callers (among them is printk()) are not necessarily executing in atomic contexts, and some of them can cond_resched() in console_unlock(). So console_trylock() can set `console_may_schedule' to 0 only if cond_resched() is invalid in the current context, and set it to 1 otherwise. The patch also drops explicit preempt_disable()/preempt_enable() calls in vprintk_emit(). Signed-off-by: Sergey Senozhatsky --- kernel/printk/printk.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 5cc0ce6..d0f5a73 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1792,20 +1792,12 @@ asmlinkage int vprintk_emit(int facility, int level, if (!in_sched) { lockdep_off(); /* - * Disable preemption to avoid being preempted while holding - * console_sem which would prevent anyone from printing to - * console - */ - preempt_disable(); - - /* * Try to acquire and then immediately release the console * semaphore. The release will print out buffers and wake up * /dev/kmsg and syslog() users. */ if (console_trylock_for_printk()) console_unlock(); - preempt_enable(); lockdep_on(); } @@ -2138,7 +2130,10 @@ int console_trylock(void) return 0; } console_locked = 1; - console_may_schedule = 0; + console_may_schedule = !(oops_in_progress || + in_interrupt() || + irqs_disabled() || + in_atomic()); return 1; } EXPORT_SYMBOL(console_trylock); -- 2.7.0