From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752705AbcAQOZU (ORCPT ); Sun, 17 Jan 2016 09:25:20 -0500 Received: from mail-pa0-f47.google.com ([209.85.220.47]:35806 "EHLO mail-pa0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752235AbcAQOZS (ORCPT ); Sun, 17 Jan 2016 09:25:18 -0500 Date: Sun, 17 Jan 2016 23:23:32 +0900 From: Sergey Senozhatsky To: Sergey Senozhatsky Cc: Sergey Senozhatsky , Andrew Morton , Tejun Heo , Jan Kara , Petr Mladek , Kyle McMartin , Dave Jones , Calvin Owens , linux-kernel@vger.kernel.org Subject: Re: [RFC][PATCH -next 2/2] printk: set may_schedule for some of console_trylock callers Message-ID: <20160117142332.GA543@swordfish> References: <1452747443-9927-1-git-send-email-sergey.senozhatsky@gmail.com> <1452747443-9927-3-git-send-email-sergey.senozhatsky@gmail.com> <20160117141137.GA631@swordfish> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160117141137.GA631@swordfish> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On (01/17/16 23:11), Sergey Senozhatsky wrote: [..] > console_locked = 1; > - console_may_schedule = 0; > + console_may_schedule = !(oops_in_progress || > + irqs_disabled() || > + in_atomic(), ^^^^ fat fingers, obviously. || > + rcu_preempt_depth()); sorry. ===8<===8<=== 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 --- V2: rcu_preempt_depth() on preempt RCU kernels 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 ae641d7..9ac05e0 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1777,20 +1777,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(); } @@ -2123,7 +2115,10 @@ int console_trylock(void) return 0; } console_locked = 1; - console_may_schedule = 0; + console_may_schedule = !(oops_in_progress || + irqs_disabled() || + in_atomic() || + rcu_preempt_depth()); return 1; } EXPORT_SYMBOL(console_trylock); -- 2.7.0