Thread (3 messages) 3 messages, 3 authors, 2006-07-08

RE: [BUG] sleeping function called from invalid context during resume

From: Brown, Len <hidden>
Date: 2006-07-08 00:22:35
Also in: linux-acpi, lkml

quoted
quoted
quoted
I think we need to get rid of the acpi_in_resume hack
and use system_state != SYSTEM_RUNNING to address this.
Well if hacks are OK it'd actually be reliable to do

/* comment goes here */
kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);

because the irqs_disabled() thing happens for well-defined reasons. 
Certainly that's better than looking at system_state (and I 
don't think we
leave SYSTEM_RUNNING during suspend/resume anyway).
If system_state != SYSTEM_RUNNING on resume, theen __might_sleep()
would not have spit out the dump_stack() above.

This is exactly like boot -- we are bringing up the system
and we need to configure interrupts, which runs AML,
which calls kmalloc in a variety of ways, all of which call
__might_sleep.

It seems simplest to have resume admit that it is like boot
and that the early allocations with interrupts off simply
must succeed or it is game-off.
No, we shouldn't expand the use of system_state.  Code continues to be
merged which uses it.  If we also merge code which enhances 
its semantics then we're getting into quadratically-increasing
nastiness rather than linearly-increasing.

Callers should tell callees what to do.  Callees shouldn't be 
peeking at globals to work out what to do.

Lacking any other caller-passed indication, it would be much better for
acpi to look at irqs_disabled().  That's effectively a task-local,
cpu-local argument which was passed down to callees.  It's hacky - it's
like the PF_foo flags.  But it's heaps better than having all 
the kernel fight over the state of a global.
I didn't propose that kmalloc callers peek at system_state.
I proposed that system_state be set properly on resume
exactly like it is set on boot -- SYSTEM_RUNNING means
we are up with interrupts enabled.

Note that this issue is not specific to ACPI, any other code
that calls kmalloc during resume will hit __might_sleep().
This is taken care of by system_state in the case of boot
and the callers don't know anything about it -- resume
is the same case and should work the same way.

-Len
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help