diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2011-11-09 08:53:09 +0000 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-11-26 09:10:36 -0800 |
commit | 5e87d8ee34e32fda720f3a4e4055f570b09230d6 (patch) | |
tree | 899c805d2fecbe75440ed2296cfb5e859be9081e /drivers | |
parent | 9e1300a17346bdef3c4edabf1cb8135e52ffeb33 (diff) |
genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier
commit 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a upstream
This adds a mechanism to resume selected IRQs during syscore_resume
instead of dpm_resume_noirq.
Under Xen we need to resume IRQs associated with IPIs early enough
that the resched IPI is unmasked and we can therefore schedule
ourselves out of the stop_machine where the suspend/resume takes
place.
This issue was introduced by 676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".
Back ported to 2.6.32 (which lacks syscore support) by calling the relavant
resume function directly from sysdev_resume).
v2: Fixed non-x86 build errors.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Link: http://lkml.kernel.org/r/1318713254.11016.52.camel@dagon.hellion.org.uk
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/base/sys.c | 6 | ||||
-rw-r--r-- | drivers/xen/events.c | 2 |
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/base/sys.c b/drivers/base/sys.c index 0d903909af7..3f202f71e4d 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c @@ -471,6 +471,12 @@ int sysdev_resume(void) { struct sysdev_class *cls; + /* + * Called from syscore in mainline but called directly here + * since syscore does not exist in this tree. + */ + irq_pm_syscore_resume(); + WARN_ONCE(!irqs_disabled(), "Interrupts enabled while resuming system devices\n"); diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 009ca4e78df..15ed43e47d7 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c @@ -536,7 +536,7 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi, if (irq < 0) return irq; - irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME; + irqflags |= IRQF_NO_SUSPEND | IRQF_FORCE_RESUME | IRQF_EARLY_RESUME; retval = request_irq(irq, handler, irqflags, devname, dev_id); if (retval != 0) { unbind_from_irq(irq); |