--- /dev/null
+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:
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);
/*
* 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)
{
unsigned int cpu = smp_processor_id();
struct pt_regs *old_regs = set_irq_regs(regs);
---
-1.7.10.2.565.gbd578b5
-
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);
#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)
{
struct pt_regs *old_regs = set_irq_regs(regs);
int cpu = smp_processor_id();
---
-1.7.10.2.565.gbd578b5
-
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 @@
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);
}
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;
#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;
/*
* 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.
*/
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 @@
#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 @@
#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 @@
- 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 @@
#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);
-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
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)
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);
}
#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 @@
- 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)
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);
}
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 @@
- 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 @@
#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 @@
- .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 @@
-
.macro arch_ret_to_user, tmp1, tmp2
.endm
---
-1.7.10.2.565.gbd578b5
-
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 @@
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);
}
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;
}
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;
}
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]);
}
#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);
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;
#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;
}
#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;
+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
#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);
}
#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 @@
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
}
}
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);
- 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];
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);
}
}
#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 {
+ union {
+ struct clock_event_device *evt;
+ struct clock_event_device __percpu **percpu_evt;
-+ };
++ };
};
enum {
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);
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);
}
#endif
---
-1.7.10.2.565.gbd578b5
-
# 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.
#