From patchwork Tue Aug 5 13:06:46 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Zijlstra X-Patchwork-Id: 376698 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 90E511400F1 for ; Tue, 5 Aug 2014 23:07:47 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754764AbaHENHA (ORCPT ); Tue, 5 Aug 2014 09:07:00 -0400 Received: from casper.infradead.org ([85.118.1.10]:38010 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754399AbaHENG6 (ORCPT ); Tue, 5 Aug 2014 09:06:58 -0400 Received: from dhcp-077-248-225-117.chello.nl ([77.248.225.117] helo=twins) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1XEeS7-0000wn-Us; Tue, 05 Aug 2014 13:06:56 +0000 Received: by twins (Postfix, from userid 1000) id 1EB9B8007C07; Tue, 5 Aug 2014 15:06:46 +0200 (CEST) Date: Tue, 5 Aug 2014 15:06:46 +0200 From: Peter Zijlstra To: Ilya Dryomov Cc: Ingo Molnar , oleg@redhat.com, Linus Torvalds , tglx@linutronix.de, Mike Galbraith , Linux Kernel Mailing List , netdev@vger.kernel.org, linux-mm@kvack.org Subject: Re: [RFC][PATCH 0/7] nested sleeps, fixes and debug infra Message-ID: <20140805130646.GZ19379@twins.programming.kicks-ass.net> References: <20140804103025.478913141@infradead.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2012-12-30) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Tue, Aug 05, 2014 at 12:33:16PM +0400, Ilya Dryomov wrote: > On Mon, Aug 4, 2014 at 2:30 PM, Peter Zijlstra wrote: > > Hi, > > > > Ilya recently tripped over a nested sleep which made Ingo suggest we should > > have debug checks for that. So I did some, see patch 7. Of course that > > triggered a whole bunch of fail the instant I tried to boot my machine. > > > > With this series I can boot my test box and build a kernel on it, I'm fairly > > sure that's far too limited a test to have found all, but its a start. > > FWIW, I'm getting a lot of these during light rbd testing. CC'ed > netdev and linux-mm. Both are cond_resched() calls, and that's not blocking as such, just a preemption point, so lets exclude those. From the school of '_' are free: --- include/linux/kernel.h | 3 +++ include/linux/sched.h | 6 +++--- kernel/sched/core.c | 12 +++++++++--- 3 files changed, 15 insertions(+), 6 deletions(-) --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -162,6 +162,7 @@ extern int _cond_resched(void); #endif #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + void ___might_sleep(const char *file, int line, int preempt_offset); void __might_sleep(const char *file, int line, int preempt_offset); /** * might_sleep - annotation for functions that can sleep @@ -176,6 +177,8 @@ extern int _cond_resched(void); # define might_sleep() \ do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) #else + static inline void ___might_sleep(const char *file, int line, + int preempt_offset) { } static inline void __might_sleep(const char *file, int line, int preempt_offset) { } # define might_sleep() do { might_resched(); } while (0) --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2754,7 +2754,7 @@ static inline int signal_pending_state(l extern int _cond_resched(void); #define cond_resched() ({ \ - __might_sleep(__FILE__, __LINE__, 0); \ + ___might_sleep(__FILE__, __LINE__, 0); \ _cond_resched(); \ }) @@ -2767,14 +2767,14 @@ extern int __cond_resched_lock(spinlock_ #endif #define cond_resched_lock(lock) ({ \ - __might_sleep(__FILE__, __LINE__, PREEMPT_LOCK_OFFSET); \ + ___might_sleep(__FILE__, __LINE__, PREEMPT_LOCK_OFFSET);\ __cond_resched_lock(lock); \ }) extern int __cond_resched_softirq(void); #define cond_resched_softirq() ({ \ - __might_sleep(__FILE__, __LINE__, SOFTIRQ_DISABLE_OFFSET); \ + ___might_sleep(__FILE__, __LINE__, SOFTIRQ_DISABLE_OFFSET); \ __cond_resched_softirq(); \ }) --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -7078,8 +7078,6 @@ static inline int preempt_count_equals(i void __might_sleep(const char *file, int line, int preempt_offset) { - static unsigned long prev_jiffy; /* ratelimiting */ - /* * Blocking primitives will set (and therefore destroy) current->state, * since we will exit with TASK_RUNNING make sure we enter with it, @@ -7093,6 +7091,14 @@ void __might_sleep(const char *file, int (void *)current->task_state_change)) __set_current_state(TASK_RUNNING); + ___might_sleep(file, line, preempt_offset); +} +EXPORT_SYMBOL(__might_sleep); + +void ___might_sleep(const char *file, int line, int preempt_offset) +{ + static unsigned long prev_jiffy; /* ratelimiting */ + rcu_sleep_check(); /* WARN_ON_ONCE() by default, no rate limit reqd. */ if ((preempt_count_equals(preempt_offset) && !irqs_disabled() && !is_idle_task(current)) || @@ -7122,7 +7128,7 @@ void __might_sleep(const char *file, int #endif dump_stack(); } -EXPORT_SYMBOL(__might_sleep); +EXPORT_SYMBOL(___might_sleep); #endif #ifdef CONFIG_MAGIC_SYSRQ