Add patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Jul 2012 18:29:08 +0000 (11:29 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Jul 2012 18:29:08 +0000 (11:29 -0700)
patches.kernel.org/arm-fix-rcu-stalls-on-smp-platforms.patch [new file with mode: 0644]
patches.kzm9g/0157-ARM-7123-1-smp-Add-an-IPI-handler-callable-from-C-co.patch
patches.kzm9g/0158-ARM-7124-1-smp-Add-a-localtimer-handler-callable-fro.patch
patches.kzm9g/0159-ARM-gic-consolidate-PPI-handling.patch
patches.kzm9g/0164-ARM-gic-local-timers-use-the-request_percpu_irq-inte.patch
series

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 (file)
index 0000000..e2c6270
--- /dev/null
@@ -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:
index 6f64a72..327aac5 100644 (file)
@@ -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
-
index d260cb8..1309618 100644 (file)
@@ -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
-
index 28b7f97..a1e1cfe 100644 (file)
@@ -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
-
index e01ad13..8ac729d 100644 (file)
@@ -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 c0ccd98..e326ac9 100644 (file)
--- 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.
 #