aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-07-05 11:29:08 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-07-05 11:29:08 -0700
commitf562243ef087c8645591a7babb61cfb96158b19a (patch)
tree8aa3339d470edf12ef6cf76dd86e50fd36e90c8d
parent9e5b14bdba6b91524fc6a6f0989b8457f8de2d30 (diff)
downloadltsi-kernel-f562243ef087c8645591a7babb61cfb96158b19a.tar.gz
Add patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch
-rw-r--r--patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch67
-rw-r--r--patches.kzm9g/0157-ARM-7123-1-smp-Add-an-IPI-handler-callable-from-C-co.patch15
-rw-r--r--patches.kzm9g/0158-ARM-7124-1-smp-Add-a-localtimer-handler-callable-fro.patch13
-rw-r--r--patches.kzm9g/0159-ARM-gic-consolidate-PPI-handling.patch81
-rw-r--r--patches.kzm9g/0164-ARM-gic-local-timers-use-the-request_percpu_irq-inte.patch65
-rw-r--r--series14
6 files changed, 134 insertions, 121 deletions
diff --git a/patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch b/patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch
new file mode 100644
index 00000000000000..e2c6270437c688
--- /dev/null
+++ b/patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch
@@ -0,0 +1,67 @@
+From 7deabca0acfe02b8e18f59a4c95676012f49a304 Mon Sep 17 00:00:00 2001
+From: Russell King <rmk+kernel@arm.linux.org.uk>
+Date: Thu, 19 Jan 2012 15:20:58 +0000
+Subject: ARM: fix rcu stalls on SMP platforms
+
+From: Russell King <rmk+kernel@arm.linux.org.uk>
+
+commit 7deabca0acfe02b8e18f59a4c95676012f49a304 upstream.
+
+We can stall RCU processing on SMP platforms if a CPU sits in its idle
+loop for a long time. This happens because we don't call irq_enter()
+and irq_exit() around generic_smp_call_function_interrupt() and
+friends. Add the necessary calls, and remove the one from within
+ipi_timer(), so that they're all in a common place.
+
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+Signed-off-by: UCHINO Satoshi <satoshi.uchino@toshiba.co.jp>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/arm/kernel/smp.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/kernel/smp.c
++++ b/arch/arm/kernel/smp.c
+@@ -445,9 +445,7 @@ static DEFINE_PER_CPU(struct clock_event
+ static void ipi_timer(void)
+ {
+ struct clock_event_device *evt = &__get_cpu_var(percpu_clockevent);
+- irq_enter();
+ evt->event_handler(evt);
+- irq_exit();
+ }
+
+ #ifdef CONFIG_LOCAL_TIMERS
+@@ -568,7 +566,9 @@ asmlinkage void __exception_irq_entry do
+
+ switch (ipinr) {
+ case IPI_TIMER:
++ irq_enter();
+ ipi_timer();
++ irq_exit();
+ break;
+
+ case IPI_RESCHEDULE:
+@@ -576,15 +576,21 @@ asmlinkage void __exception_irq_entry do
+ break;
+
+ case IPI_CALL_FUNC:
++ irq_enter();
+ generic_smp_call_function_interrupt();
++ irq_exit();
+ break;
+
+ case IPI_CALL_FUNC_SINGLE:
++ irq_enter();
+ generic_smp_call_function_single_interrupt();
++ irq_exit();
+ break;
+
+ case IPI_CPU_STOP:
++ irq_enter();
+ ipi_cpu_stop(cpu);
++ irq_exit();
+ break;
+
+ default:
diff --git a/patches.kzm9g/0157-ARM-7123-1-smp-Add-an-IPI-handler-callable-from-C-co.patch b/patches.kzm9g/0157-ARM-7123-1-smp-Add-an-IPI-handler-callable-from-C-co.patch
index 6f64a72920a5a6..327aac56649ce7 100644
--- a/patches.kzm9g/0157-ARM-7123-1-smp-Add-an-IPI-handler-callable-from-C-co.patch
+++ b/patches.kzm9g/0157-ARM-7123-1-smp-Add-an-IPI-handler-callable-from-C-co.patch
@@ -12,15 +12,13 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Simon Horman <horms@verge.net.au>
---
- arch/arm/include/asm/smp.h | 5 +++++
- arch/arm/kernel/smp.c | 5 +++++
+ arch/arm/include/asm/smp.h | 5 +++++
+ arch/arm/kernel/smp.c | 5 +++++
2 files changed, 10 insertions(+)
-diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h
-index 674ebcd..0a17b62 100644
--- a/arch/arm/include/asm/smp.h
+++ b/arch/arm/include/asm/smp.h
-@@ -33,6 +33,11 @@ extern void show_ipi_list(struct seq_file *, int);
+@@ -33,6 +33,11 @@ extern void show_ipi_list(struct seq_fil
asmlinkage void do_IPI(int ipinr, struct pt_regs *regs);
/*
@@ -32,11 +30,9 @@ index 674ebcd..0a17b62 100644
* Setup the set of possible CPUs (via set_cpu_possible)
*/
extern void smp_init_cpus(void);
-diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
-index 4db266c..74ac4bb 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
-@@ -580,6 +580,11 @@ static void ipi_cpu_stop(unsigned int cpu)
+@@ -578,6 +578,11 @@ static void ipi_cpu_stop(unsigned int cp
*/
asmlinkage void __exception_irq_entry do_IPI(int ipinr, struct pt_regs *regs)
{
@@ -48,6 +44,3 @@ index 4db266c..74ac4bb 100644
unsigned int cpu = smp_processor_id();
struct pt_regs *old_regs = set_irq_regs(regs);
---
-1.7.10.2.565.gbd578b5
-
diff --git a/patches.kzm9g/0158-ARM-7124-1-smp-Add-a-localtimer-handler-callable-fro.patch b/patches.kzm9g/0158-ARM-7124-1-smp-Add-a-localtimer-handler-callable-fro.patch
index d260cb8b62f735..1309618162715f 100644
--- a/patches.kzm9g/0158-ARM-7124-1-smp-Add-a-localtimer-handler-callable-fro.patch
+++ b/patches.kzm9g/0158-ARM-7124-1-smp-Add-a-localtimer-handler-callable-fro.patch
@@ -13,12 +13,10 @@ Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Simon Horman <horms@verge.net.au>
---
- arch/arm/include/asm/localtimer.h | 4 ++++
- arch/arm/kernel/smp.c | 5 +++++
+ arch/arm/include/asm/localtimer.h | 4 ++++
+ arch/arm/kernel/smp.c | 5 +++++
2 files changed, 9 insertions(+)
-diff --git a/arch/arm/include/asm/localtimer.h b/arch/arm/include/asm/localtimer.h
-index 080d74f..3306f28 100644
--- a/arch/arm/include/asm/localtimer.h
+++ b/arch/arm/include/asm/localtimer.h
@@ -22,6 +22,10 @@ void percpu_timer_setup(void);
@@ -32,11 +30,9 @@ index 080d74f..3306f28 100644
#ifdef CONFIG_LOCAL_TIMERS
-diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
-index 74ac4bb..53aaa59 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
-@@ -473,6 +473,11 @@ static void ipi_timer(void)
+@@ -471,6 +471,11 @@ static void ipi_timer(void)
#ifdef CONFIG_LOCAL_TIMERS
asmlinkage void __exception_irq_entry do_local_timer(struct pt_regs *regs)
{
@@ -48,6 +44,3 @@ index 74ac4bb..53aaa59 100644
struct pt_regs *old_regs = set_irq_regs(regs);
int cpu = smp_processor_id();
---
-1.7.10.2.565.gbd578b5
-
diff --git a/patches.kzm9g/0159-ARM-gic-consolidate-PPI-handling.patch b/patches.kzm9g/0159-ARM-gic-consolidate-PPI-handling.patch
index 28b7f97e736e35..a1e1cfee7f439b 100644
--- a/patches.kzm9g/0159-ARM-gic-consolidate-PPI-handling.patch
+++ b/patches.kzm9g/0159-ARM-gic-consolidate-PPI-handling.patch
@@ -31,24 +31,22 @@ Conflicts:
Signed-off-by: Simon Horman <horms@verge.net.au>
---
- arch/arm/common/gic.c | 75 ++++++++++++++++++++++-
- arch/arm/include/asm/entry-macro-multi.S | 7 ---
- arch/arm/include/asm/hardirq.h | 3 -
- arch/arm/include/asm/hardware/entry-macro-gic.S | 19 +-----
- arch/arm/include/asm/localtimer.h | 11 ++--
- arch/arm/include/asm/smp.h | 5 --
- arch/arm/kernel/irq.c | 3 -
- arch/arm/kernel/smp.c | 32 ++--------
- arch/arm/mach-exynos4/include/mach/entry-macro.S | 13 +---
- arch/arm/mach-msm/board-msm8x60.c | 11 ----
- arch/arm/mach-msm/include/mach/entry-macro-qgic.S | 73 +---------------------
- arch/arm/mach-omap2/include/mach/entry-macro.S | 14 +----
- arch/arm/mach-shmobile/entry-intc.S | 3 -
- arch/arm/mach-shmobile/include/mach/entry-macro.S | 3 -
+ arch/arm/common/gic.c | 75 +++++++++++++++++++++-
+ arch/arm/include/asm/entry-macro-multi.S | 7 --
+ arch/arm/include/asm/hardirq.h | 3
+ arch/arm/include/asm/hardware/entry-macro-gic.S | 19 -----
+ arch/arm/include/asm/localtimer.h | 11 +--
+ arch/arm/include/asm/smp.h | 5 -
+ arch/arm/kernel/irq.c | 3
+ arch/arm/kernel/smp.c | 32 +--------
+ arch/arm/mach-exynos4/include/mach/entry-macro.S | 13 ---
+ arch/arm/mach-msm/board-msm8x60.c | 11 ---
+ arch/arm/mach-msm/include/mach/entry-macro-qgic.S | 73 ---------------------
+ arch/arm/mach-omap2/include/mach/entry-macro.S | 14 ----
+ arch/arm/mach-shmobile/entry-intc.S | 3
+ arch/arm/mach-shmobile/include/mach/entry-macro.S | 3
14 files changed, 88 insertions(+), 184 deletions(-)
-diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
-index 8b5be72..95ad8d1 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -29,10 +29,14 @@
@@ -66,7 +64,7 @@ index 8b5be72..95ad8d1 100644
static DEFINE_SPINLOCK(irq_controller_lock);
-@@ -256,6 +260,32 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
+@@ -256,6 +260,32 @@ void __init gic_cascade_irq(unsigned int
irq_set_chained_handler(irq, gic_handle_cascade_irq);
}
@@ -99,7 +97,7 @@ index 8b5be72..95ad8d1 100644
static void __init gic_dist_init(struct gic_chip_data *gic,
unsigned int irq_start)
{
-@@ -263,6 +293,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic,
+@@ -263,6 +293,7 @@ static void __init gic_dist_init(struct
u32 cpumask;
void __iomem *base = gic->dist_base;
u32 cpu = 0;
@@ -107,7 +105,7 @@ index 8b5be72..95ad8d1 100644
#ifdef CONFIG_SMP
cpu = cpu_logical_map(smp_processor_id());
-@@ -286,6 +317,33 @@ static void __init gic_dist_init(struct gic_chip_data *gic,
+@@ -286,6 +317,33 @@ static void __init gic_dist_init(struct
gic->gic_irqs = gic_irqs;
/*
@@ -141,7 +139,7 @@ index 8b5be72..95ad8d1 100644
* Set all global interrupts to be level triggered, active low.
*/
for (i = 32; i < gic_irqs; i += 16)
-@@ -320,7 +378,22 @@ static void __init gic_dist_init(struct gic_chip_data *gic,
+@@ -320,7 +378,22 @@ static void __init gic_dist_init(struct
/*
* Setup the Linux IRQ subsystem.
*/
@@ -165,8 +163,6 @@ index 8b5be72..95ad8d1 100644
irq_set_chip_and_handler(i, &gic_chip, handle_fasteoi_irq);
irq_set_chip_data(i, gic);
set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
-diff --git a/arch/arm/include/asm/entry-macro-multi.S b/arch/arm/include/asm/entry-macro-multi.S
-index 2f1e209..88d6181 100644
--- a/arch/arm/include/asm/entry-macro-multi.S
+++ b/arch/arm/include/asm/entry-macro-multi.S
@@ -25,13 +25,6 @@
@@ -183,8 +179,6 @@ index 2f1e209..88d6181 100644
#endif
9997:
.endm
-diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h
-index 89ad180..ddf07a9 100644
--- a/arch/arm/include/asm/hardirq.h
+++ b/arch/arm/include/asm/hardirq.h
@@ -9,9 +9,6 @@
@@ -197,8 +191,6 @@ index 89ad180..ddf07a9 100644
#ifdef CONFIG_SMP
unsigned int ipi_irqs[NR_IPI];
#endif
-diff --git a/arch/arm/include/asm/hardware/entry-macro-gic.S b/arch/arm/include/asm/hardware/entry-macro-gic.S
-index c115b82..74ebc80 100644
--- a/arch/arm/include/asm/hardware/entry-macro-gic.S
+++ b/arch/arm/include/asm/hardware/entry-macro-gic.S
@@ -22,15 +22,11 @@
@@ -242,8 +234,6 @@ index c115b82..74ebc80 100644
- streq \irqstat, [\base, #GIC_CPU_EOI]
- cmp \tmp, #0
- .endm
-diff --git a/arch/arm/include/asm/localtimer.h b/arch/arm/include/asm/localtimer.h
-index 3306f28..5c8acb4 100644
--- a/arch/arm/include/asm/localtimer.h
+++ b/arch/arm/include/asm/localtimer.h
@@ -10,6 +10,8 @@
@@ -272,11 +262,9 @@ index 3306f28..5c8acb4 100644
#ifdef CONFIG_LOCAL_TIMERS
-diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h
-index 0a17b62..1e5717a 100644
--- a/arch/arm/include/asm/smp.h
+++ b/arch/arm/include/asm/smp.h
-@@ -99,9 +99,4 @@ extern void platform_cpu_enable(unsigned int cpu);
+@@ -99,9 +99,4 @@ extern void platform_cpu_enable(unsigned
extern void arch_send_call_function_single_ipi(int cpu);
extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
@@ -286,11 +274,9 @@ index 0a17b62..1e5717a 100644
-extern void show_local_irqs(struct seq_file *, int);
-
#endif /* ifndef __ASM_ARM_SMP_H */
-diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
-index 3e34b1f..0ad5e98 100644
--- a/arch/arm/kernel/irq.c
+++ b/arch/arm/kernel/irq.c
-@@ -59,9 +59,6 @@ int arch_show_interrupts(struct seq_file *p, int prec)
+@@ -59,9 +59,6 @@ int arch_show_interrupts(struct seq_file
#ifdef CONFIG_SMP
show_ipi_list(p, prec);
#endif
@@ -300,8 +286,6 @@ index 3e34b1f..0ad5e98 100644
seq_printf(p, "%*s: %10lu\n", prec, "Err", irq_err_count);
return 0;
}
-diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
-index 53aaa59..7db7120 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -450,10 +450,6 @@ u64 smp_irq_stat_cpu(unsigned int cpu)
@@ -315,18 +299,18 @@ index 53aaa59..7db7120 100644
return sum;
}
-@@ -471,34 +467,16 @@ static void ipi_timer(void)
+@@ -469,34 +465,16 @@ static void ipi_timer(void)
}
#ifdef CONFIG_LOCAL_TIMERS
-asmlinkage void __exception_irq_entry do_local_timer(struct pt_regs *regs)
--{
++irqreturn_t percpu_timer_handler(int irq, void *dev_id)
+ {
- handle_local_timer(regs);
-}
-
-void handle_local_timer(struct pt_regs *regs)
-+irqreturn_t percpu_timer_handler(int irq, void *dev_id)
- {
+-{
- struct pt_regs *old_regs = set_irq_regs(regs);
- int cpu = smp_processor_id();
+ struct clock_event_device *evt = &__get_cpu_var(percpu_clockevent);
@@ -355,8 +339,6 @@ index 53aaa59..7db7120 100644
}
#endif
-diff --git a/arch/arm/mach-exynos4/include/mach/entry-macro.S b/arch/arm/mach-exynos4/include/mach/entry-macro.S
-index d8f38c2..9be072f 100644
--- a/arch/arm/mach-exynos4/include/mach/entry-macro.S
+++ b/arch/arm/mach-exynos4/include/mach/entry-macro.S
@@ -50,7 +50,7 @@
@@ -383,8 +365,6 @@ index d8f38c2..9be072f 100644
- streq \irqstat, [\base, #GIC_CPU_EOI]
- cmp \tmp, #0
- .endm
-diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c
-index 1163b6f..d70a2f6 100644
--- a/arch/arm/mach-msm/board-msm8x60.c
+++ b/arch/arm/mach-msm/board-msm8x60.c
@@ -36,8 +36,6 @@ static void __init msm8x60_map_io(void)
@@ -396,7 +376,7 @@ index 1163b6f..d70a2f6 100644
gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
(void *)MSM_QGIC_CPU_BASE);
-@@ -49,15 +47,6 @@ static void __init msm8x60_init_irq(void)
+@@ -49,15 +47,6 @@ static void __init msm8x60_init_irq(void
*/
if (!machine_is_msm8x60_sim())
writel(0x0000FFFF, MSM_QGIC_DIST_BASE + GIC_DIST_ENABLE_SET);
@@ -412,8 +392,6 @@ index 1163b6f..d70a2f6 100644
}
static void __init msm8x60_init(void)
-diff --git a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S b/arch/arm/mach-msm/include/mach/entry-macro-qgic.S
-index 1246715..717076f 100644
--- a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S
+++ b/arch/arm/mach-msm/include/mach/entry-macro-qgic.S
@@ -8,81 +8,10 @@
@@ -499,8 +477,6 @@ index 1246715..717076f 100644
- streq \irqstat, [\base, #GIC_CPU_EOI]
- cmp \tmp, #0
- .endm
-diff --git a/arch/arm/mach-omap2/include/mach/entry-macro.S b/arch/arm/mach-omap2/include/mach/entry-macro.S
-index a48690b..22d86ef 100644
--- a/arch/arm/mach-omap2/include/mach/entry-macro.S
+++ b/arch/arm/mach-omap2/include/mach/entry-macro.S
@@ -78,7 +78,7 @@
@@ -531,8 +507,6 @@ index a48690b..22d86ef 100644
#endif /* CONFIG_SMP */
#else /* MULTI_OMAP2 */
-diff --git a/arch/arm/mach-shmobile/entry-intc.S b/arch/arm/mach-shmobile/entry-intc.S
-index cac0a7a..1a1c00c 100644
--- a/arch/arm/mach-shmobile/entry-intc.S
+++ b/arch/arm/mach-shmobile/entry-intc.S
@@ -51,7 +51,4 @@
@@ -543,8 +517,6 @@ index cac0a7a..1a1c00c 100644
- .endm
-
arch_irq_handler shmobile_handle_irq_intc
-diff --git a/arch/arm/mach-shmobile/include/mach/entry-macro.S b/arch/arm/mach-shmobile/include/mach/entry-macro.S
-index d791f10..8d4a416 100644
--- a/arch/arm/mach-shmobile/include/mach/entry-macro.S
+++ b/arch/arm/mach-shmobile/include/mach/entry-macro.S
@@ -27,8 +27,5 @@
@@ -556,6 +528,3 @@ index d791f10..8d4a416 100644
-
.macro arch_ret_to_user, tmp1, tmp2
.endm
---
-1.7.10.2.565.gbd578b5
-
diff --git a/patches.kzm9g/0164-ARM-gic-local-timers-use-the-request_percpu_irq-inte.patch b/patches.kzm9g/0164-ARM-gic-local-timers-use-the-request_percpu_irq-inte.patch
index e01ad13c8e072e..8ac729d89bf87a 100644
--- a/patches.kzm9g/0164-ARM-gic-local-timers-use-the-request_percpu_irq-inte.patch
+++ b/patches.kzm9g/0164-ARM-gic-local-timers-use-the-request_percpu_irq-inte.patch
@@ -24,18 +24,16 @@ Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
---
- arch/arm/common/gic.c | 52 ----------------------------
- arch/arm/include/asm/hardware/gic.h | 1 -
- arch/arm/include/asm/localtimer.h | 16 ++++-----
- arch/arm/include/asm/smp_twd.h | 2 +-
- arch/arm/kernel/smp.c | 16 +--------
- arch/arm/kernel/smp_twd.c | 47 +++++++++++++++++++++++--
- arch/arm/mach-exynos4/mct.c | 7 ++--
- arch/arm/mach-msm/timer.c | 69 +++++++++++++++++++++----------------
+ arch/arm/common/gic.c | 52 ---------------------------
+ arch/arm/include/asm/hardware/gic.h | 1
+ arch/arm/include/asm/localtimer.h | 16 +++-----
+ arch/arm/include/asm/smp_twd.h | 2 -
+ arch/arm/kernel/smp.c | 16 --------
+ arch/arm/kernel/smp_twd.c | 47 +++++++++++++++++++++++-
+ arch/arm/mach-exynos4/mct.c | 7 ++-
+ arch/arm/mach-msm/timer.c | 69 ++++++++++++++++++++----------------
8 files changed, 99 insertions(+), 111 deletions(-)
-diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
-index 7a73799..5f7b4e2 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -35,7 +35,6 @@
@@ -46,7 +44,7 @@ index 7a73799..5f7b4e2 100644
static DEFINE_SPINLOCK(irq_controller_lock);
-@@ -285,32 +284,6 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
+@@ -285,32 +284,6 @@ void __init gic_cascade_irq(unsigned int
irq_set_chained_handler(irq, gic_handle_cascade_irq);
}
@@ -79,7 +77,7 @@ index 7a73799..5f7b4e2 100644
static void __init gic_dist_init(struct gic_chip_data *gic,
unsigned int irq_start)
{
-@@ -353,16 +326,6 @@ static void __init gic_dist_init(struct gic_chip_data *gic,
+@@ -353,16 +326,6 @@ static void __init gic_dist_init(struct
BUG();
ppi_base = gic->irq_offset + 32 - nrppis;
@@ -96,7 +94,7 @@ index 7a73799..5f7b4e2 100644
}
pr_info("Configuring GIC with %d sources (%d PPIs)\n",
-@@ -405,17 +368,12 @@ static void __init gic_dist_init(struct gic_chip_data *gic,
+@@ -405,17 +368,12 @@ static void __init gic_dist_init(struct
*/
for (i = 0; i < nrppis; i++) {
int ppi = i + ppi_base;
@@ -114,7 +112,7 @@ index 7a73799..5f7b4e2 100644
}
for (i = irq_start + nrppis; i < irq_limit; i++) {
-@@ -661,16 +619,6 @@ void __cpuinit gic_secondary_init(unsigned int gic_nr)
+@@ -661,16 +619,6 @@ void __cpuinit gic_secondary_init(unsign
gic_cpu_init(&gic_data[gic_nr]);
}
@@ -131,8 +129,6 @@ index 7a73799..5f7b4e2 100644
#ifdef CONFIG_SMP
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
{
-diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h
-index 615c336..a61f11e 100644
--- a/arch/arm/include/asm/hardware/gic.h
+++ b/arch/arm/include/asm/hardware/gic.h
@@ -41,7 +41,6 @@ void gic_secondary_init(unsigned int);
@@ -143,8 +139,6 @@ index 615c336..a61f11e 100644
struct gic_chip_data {
unsigned int irq_offset;
-diff --git a/arch/arm/include/asm/localtimer.h b/arch/arm/include/asm/localtimer.h
-index 5c8acb4..f5e1cec 100644
--- a/arch/arm/include/asm/localtimer.h
+++ b/arch/arm/include/asm/localtimer.h
@@ -19,26 +19,20 @@ struct clock_event_device;
@@ -177,7 +171,7 @@ index 5c8acb4..f5e1cec 100644
#endif
-@@ -53,6 +47,10 @@ static inline int local_timer_setup(struct clock_event_device *evt)
+@@ -53,6 +47,10 @@ static inline int local_timer_setup(stru
{
return -ENXIO;
}
@@ -188,8 +182,6 @@ index 5c8acb4..f5e1cec 100644
#endif
#endif
-diff --git a/arch/arm/include/asm/smp_twd.h b/arch/arm/include/asm/smp_twd.h
-index fed9981..ef9ffba9 100644
--- a/arch/arm/include/asm/smp_twd.h
+++ b/arch/arm/include/asm/smp_twd.h
@@ -22,7 +22,7 @@ struct clock_event_device;
@@ -201,12 +193,10 @@ index fed9981..ef9ffba9 100644
+void twd_timer_stop(struct clock_event_device *);
#endif
-diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
-index 7db7120..083d36e 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
-@@ -466,20 +466,6 @@ static void ipi_timer(void)
- irq_exit();
+@@ -464,20 +464,6 @@ static void ipi_timer(void)
+ evt->event_handler(evt);
}
-#ifdef CONFIG_LOCAL_TIMERS
@@ -226,7 +216,7 @@ index 7db7120..083d36e 100644
#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
static void smp_timer_broadcast(const struct cpumask *mask)
{
-@@ -530,7 +516,7 @@ static void percpu_timer_stop(void)
+@@ -528,7 +514,7 @@ static void percpu_timer_stop(void)
unsigned int cpu = smp_processor_id();
struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu);
@@ -235,8 +225,6 @@ index 7db7120..083d36e 100644
}
#endif
-diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
-index 01c1862..a8a6682 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -19,6 +19,7 @@
@@ -269,7 +257,7 @@ index 01c1862..a8a6682 100644
static void __cpuinit twd_calibrate_rate(void)
{
unsigned long count;
-@@ -119,11 +128,43 @@ static void __cpuinit twd_calibrate_rate(void)
+@@ -119,11 +128,43 @@ static void __cpuinit twd_calibrate_rate
}
}
@@ -313,7 +301,7 @@ index 01c1862..a8a6682 100644
twd_calibrate_rate();
clk->name = "local_timer";
-@@ -137,8 +178,10 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk)
+@@ -137,8 +178,10 @@ void __cpuinit twd_timer_setup(struct cl
clk->max_delta_ns = clockevent_delta2ns(0xffffffff, clk);
clk->min_delta_ns = clockevent_delta2ns(0xf, clk);
@@ -326,11 +314,9 @@ index 01c1862..a8a6682 100644
- gic_enable_ppi(clk->irq);
+ enable_percpu_irq(clk->irq, 0);
}
-diff --git a/arch/arm/mach-exynos4/mct.c b/arch/arm/mach-exynos4/mct.c
-index 1ae059b..85a1bb7 100644
--- a/arch/arm/mach-exynos4/mct.c
+++ b/arch/arm/mach-exynos4/mct.c
-@@ -380,9 +380,11 @@ static void exynos4_mct_tick_init(struct clock_event_device *evt)
+@@ -380,9 +380,11 @@ static void exynos4_mct_tick_init(struct
if (cpu == 0) {
mct_tick0_event_irq.dev_id = &mct_tick[cpu];
@@ -342,7 +328,7 @@ index 1ae059b..85a1bb7 100644
setup_irq(IRQ_MCT_L1, &mct_tick1_event_irq);
irq_set_affinity(IRQ_MCT_L1, cpumask_of(1));
}
-@@ -394,9 +396,10 @@ void __cpuinit local_timer_setup(struct clock_event_device *evt)
+@@ -394,9 +396,10 @@ void __cpuinit local_timer_setup(struct
exynos4_mct_tick_init(evt);
}
@@ -355,8 +341,6 @@ index 1ae059b..85a1bb7 100644
}
#endif /* CONFIG_LOCAL_TIMERS */
-diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c
-index 63621f1..afeeca5 100644
--- a/arch/arm/mach-msm/timer.c
+++ b/arch/arm/mach-msm/timer.c
@@ -71,12 +71,16 @@ enum timer_location {
@@ -373,7 +357,7 @@ index 63621f1..afeeca5 100644
+ union {
+ struct clock_event_device *evt;
+ struct clock_event_device __percpu **percpu_evt;
-+ };
++ };
};
enum {
@@ -464,7 +448,7 @@ index 63621f1..afeeca5 100644
struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER];
/* Use existing clock_event for cpu 0 */
-@@ -281,12 +291,13 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)
+@@ -281,12 +291,13 @@ int __cpuinit local_timer_setup(struct c
writel(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL);
@@ -480,7 +464,7 @@ index 63621f1..afeeca5 100644
evt->name = "local_timer";
evt->features = CLOCK_EVT_FEAT_ONESHOT;
evt->rating = clock->clockevent.rating;
-@@ -298,17 +309,17 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)
+@@ -298,17 +309,17 @@ int __cpuinit local_timer_setup(struct c
clockevent_delta2ns(0xf0000000 >> clock->shift, evt);
evt->min_delta_ns = clockevent_delta2ns(4, evt);
@@ -503,6 +487,3 @@ index 63621f1..afeeca5 100644
}
#endif
---
-1.7.10.2.565.gbd578b5
-
diff --git a/series b/series
index c0ccd9818ce61b..e326ac986944a5 100644
--- a/series
+++ b/series
@@ -2,12 +2,22 @@
# LTSI patch queue series
#
-#
+#############################################################################
# LTSI project specific patches
#
-
patches.ltsi/ltsi-makefile-addition.patch
+
+#############################################################################
+# Patches that are upstream for the next -stable release, but are added here
+# before a stable tree can be released.
+#
+# Also, any needed reverts that we don't want from the -stable releases should
+# go here.
+#
+patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch
+
+
#############################################################################
# Android patches.
#