From f562243ef087c8645591a7babb61cfb96158b19a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 5 Jul 2012 11:29:08 -0700 Subject: [PATCH] Add patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch --- .../arm-fix-rcu-stalls-on-smp-platforms.patch | 67 ++++++++++++++++++ ...smp-Add-an-IPI-handler-callable-from-C-co.patch | 15 ++-- ...smp-Add-a-localtimer-handler-callable-fro.patch | 13 +--- .../0159-ARM-gic-consolidate-PPI-handling.patch | 81 +++++++--------------- ...al-timers-use-the-request_percpu_irq-inte.patch | 65 ++++++----------- series | 14 +++- 6 files changed, 134 insertions(+), 121 deletions(-) create mode 100644 patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch 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 0000000..e2c6270 --- /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 +Date: Thu, 19 Jan 2012 15:20:58 +0000 +Subject: ARM: fix rcu stalls on SMP platforms + +From: Russell King + +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 +Signed-off-by: UCHINO Satoshi +Signed-off-by: Greg Kroah-Hartman + +--- + 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 6f64a72..327aac5 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 Signed-off-by: Simon Horman --- - 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 d260cb8..1309618 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 Signed-off-by: Simon Horman --- - 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 28b7f97..a1e1cfe 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 --- - 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 e01ad13..8ac729d 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 Signed-off-by: Simon Horman --- - 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 c0ccd98..e326ac98 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. # -- 2.7.4