Message ID | 20140805130646.GZ19379@twins.programming.kicks-ass.net |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
On Tue, Aug 5, 2014 at 5:06 PM, Peter Zijlstra <peterz@infradead.org> wrote: > On Tue, Aug 05, 2014 at 12:33:16PM +0400, Ilya Dryomov wrote: >> On Mon, Aug 4, 2014 at 2:30 PM, Peter Zijlstra <peterz@infradead.org> 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. OK, this one is a bit different. WARNING: CPU: 1 PID: 1744 at kernel/sched/core.c:7104 __might_sleep+0x58/0x90() do not call blocking ops when !TASK_RUNNING; state=1 set at [<ffffffff81070e10>] prepare_to_wait+0x50 /0xa0 Modules linked in: CPU: 1 PID: 1744 Comm: lt-ceph_test_li Not tainted 3.16.0-vm+ #113 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 0000000000001bc0 ffff88006c4479d8 ffffffff8156f455 0000000000000000 ffff88006c447a28 ffff88006c447a18 ffffffff81033357 0000000000000001 0000000000000000 0000000000000950 ffffffff817ee48a ffff88006dba6120 Call Trace: [<ffffffff8156f455>] dump_stack+0x4f/0x7c [<ffffffff81033357>] warn_slowpath_common+0x87/0xb0 [<ffffffff81033421>] warn_slowpath_fmt+0x41/0x50 [<ffffffff81078bb2>] ? trace_hardirqs_on_caller+0x182/0x1f0 [<ffffffff81070e10>] ? prepare_to_wait+0x50/0xa0 [<ffffffff81070e10>] ? prepare_to_wait+0x50/0xa0 [<ffffffff8105bc38>] __might_sleep+0x58/0x90 [<ffffffff8148c671>] lock_sock_nested+0x31/0xb0 [<ffffffff8148dfeb>] ? release_sock+0x1bb/0x200 [<ffffffff81498aaa>] sk_stream_wait_memory+0x18a/0x2d0 [<ffffffff810709a0>] ? woken_wake_function+0x10/0x10 [<ffffffff814e058f>] tcp_sendmsg+0xb6f/0xd70 [<ffffffff81509e9f>] inet_sendmsg+0xdf/0x100 [<ffffffff81509dc0>] ? inet_recvmsg+0x100/0x100 [<ffffffff81489f07>] sock_sendmsg+0x67/0x90 [<ffffffff810fe391>] ? might_fault+0x51/0xb0 [<ffffffff8148a252>] ___sys_sendmsg+0x2d2/0x2e0 [<ffffffff811428a0>] ? do_dup2+0xd0/0xd0 [<ffffffff811428a0>] ? do_dup2+0xd0/0xd0 [<ffffffff8105bfe0>] ? finish_task_switch+0x50/0x100 [<ffffffff811429d5>] ? __fget_light+0x45/0x60 [<ffffffff811429fe>] ? __fdget+0xe/0x10 [<ffffffff8148ad14>] __sys_sendmsg+0x44/0x70 [<ffffffff8148ad49>] SyS_sendmsg+0x9/0x10 [<ffffffff815764d2>] system_call_fastpath+0x16/0x1b Thanks, Ilya -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
--- 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