PM / Runtime: Don't enable interrupts while running in_interrupt
This patch (as1445) fixes a bug in the runtime PM core left over from the addition of the no_callbacks flag. If this flag is set then it is possible for rpm_suspend() to be called in_interrupt, so when releasing spinlocks it's important not to re-enable interrupts. To avoid an unnecessary save-and-restore of the interrupt flag, the patch also inlines a pm_request_idle() call. This fixes Bugzilla #27482. (The offending code was added in 2.6.37, so it's not necessary to apply this to any earlier stable kernels.) Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Reported-by: tim blechmann <tim@klingt.org> CC: <stable@kernel.org> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
This commit is contained in:
parent
c723fdab8a
commit
c3810c8878
|
@ -407,12 +407,15 @@ static int rpm_suspend(struct device *dev, int rpmflags)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Maybe the parent is now able to suspend. */
|
||||||
if (parent && !parent->power.ignore_children && !dev->power.irq_safe) {
|
if (parent && !parent->power.ignore_children && !dev->power.irq_safe) {
|
||||||
spin_unlock_irq(&dev->power.lock);
|
spin_unlock(&dev->power.lock);
|
||||||
|
|
||||||
pm_request_idle(parent);
|
spin_lock(&parent->power.lock);
|
||||||
|
rpm_idle(parent, RPM_ASYNC);
|
||||||
|
spin_unlock(&parent->power.lock);
|
||||||
|
|
||||||
spin_lock_irq(&dev->power.lock);
|
spin_lock(&dev->power.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Reference in a new issue