diff options
author | Paul Gortmaker <paul.gortmaker@windriver.com> | 2012-05-15 18:02:38 -0400 |
---|---|---|
committer | Paul Gortmaker <paul.gortmaker@windriver.com> | 2012-05-15 18:02:38 -0400 |
commit | cc9b3a262581aa1c174c8f87ad3fad6d5b74e18f (patch) | |
tree | eb6b2306b5189ced30929e362770d9d2922208a6 | |
parent | d6b2017bec9d2be76e863179d4c16aaef5f26f1d (diff) | |
download | longterm-queue-2.6.34-cc9b3a262581aa1c174c8f87ad3fad6d5b74e18f.tar.gz |
Add IRQF_RESUME_EARLY patch
I originally didn't add this since it was clearly reverted in 2.6.32.x
However it was re-added in a subsequent 2.6.32.(x+n) as a v2 patch.
I hadn't got that far into the 32.x audit to see that yet.
The only difference between 32 and 34 was context, as a spinlock
was upgraded to a raw type.
Thanks to Jonathan Nieder <jrnieder@gmail.com> for bringing
it to my attention.
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
-rw-r--r-- | queue/genirq-Add-IRQF_RESUME_EARLY-and-resume-such-IRQs-ea.patch | 162 | ||||
-rw-r--r-- | queue/series | 1 |
2 files changed, 163 insertions, 0 deletions
diff --git a/queue/genirq-Add-IRQF_RESUME_EARLY-and-resume-such-IRQs-ea.patch b/queue/genirq-Add-IRQF_RESUME_EARLY-and-resume-such-IRQs-ea.patch new file mode 100644 index 0000000..9e91942 --- /dev/null +++ b/queue/genirq-Add-IRQF_RESUME_EARLY-and-resume-such-IRQs-ea.patch @@ -0,0 +1,162 @@ +From f38cb216027d7c8622c3c71772e480eb4c0c21fe Mon Sep 17 00:00:00 2001 +From: Ian Campbell <ian.campbell@citrix.com> +Date: Wed, 9 Nov 2011 08:53:09 +0000 +Subject: [PATCH] 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> +[PG: this v2 backport taken from v2.6.32.49 stable, commit 5e87d8ee34e3] +Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> + +diff --git a/drivers/base/sys.c b/drivers/base/sys.c +index 9354dc1..1752b55 100644 +--- a/drivers/base/sys.c ++++ b/drivers/base/sys.c +@@ -477,6 +477,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 9b471cc..6a934ee 100644 +--- a/drivers/xen/events.c ++++ b/drivers/xen/events.c +@@ -537,7 +537,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); +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index 953ff1c..aa60704 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -54,6 +54,8 @@ + * irq line disabled until the threaded handler has been run. + * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend + * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set ++ * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device ++ * resume time. + */ + #define IRQF_DISABLED 0x00000020 + #define IRQF_SAMPLE_RANDOM 0x00000040 +@@ -66,6 +68,7 @@ + #define IRQF_ONESHOT 0x00002000 + #define IRQF_NO_SUSPEND 0x00004000 + #define IRQF_FORCE_RESUME 0x00008000 ++#define IRQF_EARLY_RESUME 0x00020000 + + #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND) + +@@ -198,13 +201,16 @@ extern void suspend_device_irqs(void); + extern void resume_device_irqs(void); + #ifdef CONFIG_PM_SLEEP + extern int check_wakeup_irqs(void); ++extern void irq_pm_syscore_resume(void); + #else + static inline int check_wakeup_irqs(void) { return 0; } ++static inline void irq_pm_syscore_resume(void) { }; + #endif + #else + static inline void suspend_device_irqs(void) { }; + static inline void resume_device_irqs(void) { }; + static inline int check_wakeup_irqs(void) { return 0; } ++static inline void irq_pm_syscore_resume(void) { }; + #endif + + #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS) +diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c +index d6bfb89..7f95fae 100644 +--- a/kernel/irq/pm.c ++++ b/kernel/irq/pm.c +@@ -39,25 +39,46 @@ void suspend_device_irqs(void) + } + EXPORT_SYMBOL_GPL(suspend_device_irqs); + +-/** +- * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs() +- * +- * Enable all interrupt lines previously disabled by suspend_device_irqs() that +- * have the IRQ_SUSPENDED flag set. +- */ +-void resume_device_irqs(void) ++static void resume_irqs(bool want_early) + { + struct irq_desc *desc; + int irq; + + for_each_irq_desc(irq, desc) { + unsigned long flags; ++ bool is_early = desc->action && ++ desc->action->flags & IRQF_EARLY_RESUME; ++ ++ if (is_early != want_early) ++ continue; + + raw_spin_lock_irqsave(&desc->lock, flags); + __enable_irq(desc, irq, true); + raw_spin_unlock_irqrestore(&desc->lock, flags); + } + } ++ ++/** ++ * irq_pm_syscore_ops - enable interrupt lines early ++ * ++ * Enable all interrupt lines with %IRQF_EARLY_RESUME set. ++ */ ++void irq_pm_syscore_resume(void) ++{ ++ resume_irqs(true); ++} ++ ++/** ++ * resume_device_irqs - enable interrupt lines disabled by suspend_device_irqs() ++ * ++ * Enable all non-%IRQF_EARLY_RESUME interrupt lines previously ++ * disabled by suspend_device_irqs() that have the IRQS_SUSPENDED flag ++ * set as well as those with %IRQF_FORCE_RESUME. ++ */ ++void resume_device_irqs(void) ++{ ++ resume_irqs(false); ++} + EXPORT_SYMBOL_GPL(resume_device_irqs); + + /** +-- +1.7.9.6 + diff --git a/queue/series b/queue/series index 14d01f2..61168a1 100644 --- a/queue/series +++ b/queue/series @@ -72,6 +72,7 @@ netfilter-IPv6-fix-DSCP-mangle-code.patch xen-events-do-not-unmask-event-channels-on-resume.patch genirq-Add-IRQF_FORCE_RESUME.patch xen-Use-IRQF_FORCE_RESUME.patch +genirq-Add-IRQF_RESUME_EARLY-and-resume-such-IRQs-ea.patch time-Compensate-for-rounding-on-odd-frequency-clocks.patch ksm-fix-NULL-pointer-dereference-in-scan_get_next_rm.patch migrate-don-t-account-swapcache-as-shmem.patch |