On Thu, Jan 29, 2015 at 5:12 PM, Linus Torvalds wrote: > > The WARN() was already changed to a WARN_ONCE(). Oh, but I notice that the "__set_current_state(TASK_RUNNING) ends up always happening. So I think the right fix is to: - warn once like we do - but *not* do that __set_current_state() which was always total crap anyway Why do I say "total crap"? Because of two independent issues: (a) it actually changes behavior for a debug vs non-debug kernel, which is a really bad idea to begin with (b) it's really wrong. The whole "nested sleep" case was never a major bug to begin with, just a possible inefficiency where constant nested sleeps would possibly make the outer sleep not sleep. But that "could possibly make" case was the unlikely case, and the debug patch made it happen *all* the time by explicitly setting things running. So I think the proper patch is the attached. The comment is also crap. The comment says "Blocking primitives will set (and therefore destroy) current->state [...]" but the reality is that they *may* set it, and only in the unlikely slow-path where they actually block. So doing this in "__may_sleep()" is just bogus and horrible horrible crap. It turns the "harmless ugliness" into a real *harmful* bug. The key word of "__may_sleep()" is that "MAY" part. It's a debug thing to make relatively rare cases show up. PeterZ, please don't make "debugging" patches like this. Ever again. Because this was just stupid, and it took me too long to realize that despite the warning being shut up, the debug patch was still actively doing bad bad things. Ingo, maybe you'd want to apply this through the scheduler tree, the way you already did the WARN_ONCE() thing. Bruno, does this finally actually fix your pccard thing? Linus