Linus Torvalds
00845eb968
sched: don't cause task state changes in nested sleep debugging
Commit 8eb23b9f35 ("sched: Debug nested sleeps") added code to report
on nested sleep conditions, which we generally want to avoid because the
inner sleeping operation can re-set the thread state to TASK_RUNNING,
but that will then cause the outer sleep loop not actually sleep when it
calls schedule.
However, that's actually valid traditional behavior, with the inner
sleep being some fairly rare case (like taking a sleeping lock that
normally doesn't actually need to sleep).
And the debug code would actually change the state of the task to
TASK_RUNNING internally, which makes that kind of traditional and
working code not work at all, because now the nested sleep doesn't just
sometimes cause the outer one to not block, but will cause it to happen
every time.
In particular, it will cause the cardbus kernel daemon (pccardd) to
basically busy-loop doing scheduling, converting a laptop into a heater,
as reported by Bruno Prémont. But there may be other legacy uses of
that nested sleep model in other drivers that are also likely to never
get converted to the new model.
This fixes both cases:
- don't set TASK_RUNNING when the nested condition happens (note: even
if WARN_ONCE() only _warns_ once, the return value isn't whether the
warning happened, but whether the condition for the warning was true.
So despite the warning only happening once, the "if (WARN_ON(..))"
would trigger for every nested sleep.
- in the cases where we knowingly disable the warning by using
"sched_annotate_sleep()", don't change the task state (that is used
for all core scheduling decisions), instead use '->task_state_change'
that is used for the debugging decision itself.
(Credit for the second part of the fix goes to Oleg Nesterov: "Can't we
avoid this subtle change in behaviour DEBUG_ATOMIC_SLEEP adds?" with the
suggested change to use 'task_state_change' as part of the test)
Reported-and-bisected-by: Bruno Prémont <bonbons@linux-vserver.org>
Tested-by: Rafael J Wysocki <rjw@rjwysocki.net>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Cc: Ilya Dryomov <ilya.dryomov@inktank.com>,
Cc: Mike Galbraith <umgwanakikbuti@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Hurley <peter@hurleysoftware.com>,
Cc: Davidlohr Bueso <dave@stgolabs.net>,
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
2015-02-01 12:23:32 -08:00 |
| .. |
|
auto_group.c
|
sched: Change autogroup_move_group() to use for_each_thread()
|
2014-08-20 09:47:18 +02:00 |
|
auto_group.h
|
Revert "sched/autogroup: Fix crash on reboot when autogroup is disabled"
|
2012-12-11 10:23:45 +01:00 |
|
clock.c
|
time: Replace __get_cpu_var uses
|
2014-08-26 13:45:44 -04:00 |
|
completion.c
|
sched/completion: Document when to use wait_for_completion_io_*()
|
2014-11-16 10:58:54 +01:00 |
|
core.c
|
sched: don't cause task state changes in nested sleep debugging
|
2015-02-01 12:23:32 -08:00 |
|
cpuacct.c
|
cgroup: rename cgroup_subsys->base_cftypes to ->legacy_cftypes
|
2014-07-15 11:05:09 -04:00 |
|
cpuacct.h
|
sched/cpuacct: Initialize root cpuacct earlier
|
2013-04-10 13:54:20 +02:00 |
|
cpudeadline.c
|
sched/deadline: Fix inter- exclusive cpusets migrations
|
2014-09-24 14:46:57 +02:00 |
|
cpudeadline.h
|
sched/deadline: Remove unnecessary definitions in cpudeadline.h
|
2014-11-16 10:59:00 +01:00 |
|
cpupri.c
|
Merge commit '3cf2f34' into sched/core, to fix build error
|
2014-06-12 13:46:37 +02:00 |
|
cpupri.h
|
sched/cpupri: Remove unnecessary definitions in cpupri.h
|
2014-11-16 10:58:59 +01:00 |
|
cputime.c
|
sched, time: Fix build error with 64 bit cputime_t on 32 bit systems
|
2014-10-03 05:46:55 +02:00 |
|
deadline.c
|
sched/deadline: Avoid double-accounting in case of missed deadlines
|
2015-01-09 11:18:57 +01:00 |
|
debug.c
|
sched: Refactor task_struct to use numa_faults instead of numa_* pointers
|
2014-11-04 07:17:57 +01:00 |
|
fair.c
|
sched/fair: Fix RCU stall upon -ENOMEM in sched_create_group()
|
2015-01-09 11:19:00 +01:00 |
|
features.h
|
sched: Rename capacity related flags
|
2014-06-05 11:52:32 +02:00 |
|
idle.c
|
sched: Let the scheduler see CPU idle states
|
2014-09-24 14:46:58 +02:00 |
|
idle_task.c
|
sched: Provide update_curr callbacks for stop/idle scheduling classes
|
2014-11-23 14:14:40 -08:00 |
|
Makefile
|
sched/idle: Move cpu/idle.c to sched/idle.c
|
2014-02-11 09:58:30 +01:00 |
|
proc.c
|
cpuidle: menu: Lookup CPU runqueues less
|
2014-08-06 21:17:45 +02:00 |
|
rt.c
|
sched: Move p->nr_cpus_allowed check to select_task_rq()
|
2014-11-16 10:58:55 +01:00 |
|
sched.h
|
Merge branch 'sched/urgent' into sched/core, to pick up fixes before applying more changes
|
2014-11-16 10:50:25 +01:00 |
|
stats.c
|
kernel: audit/fix non-modular users of module_init in core code
|
2014-04-03 16:21:07 -07:00 |
|
stats.h
|
sched: Micro-optimize by dropping unnecessary task_rq() calls
|
2013-09-25 13:51:06 +02:00 |
|
stop_task.c
|
sched: Provide update_curr callbacks for stop/idle scheduling classes
|
2014-11-23 14:14:40 -08:00 |
|
wait.c
|
sched/wait: Fix a kthread race with wait_woken()
|
2014-11-04 07:17:44 +01:00 |