Merge branch 'devel-stable' into for-next
authorRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 12 Nov 2013 10:58:59 +0000 (10:58 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 12 Nov 2013 10:58:59 +0000 (10:58 +0000)
Conflicts:
arch/arm/include/asm/atomic.h
arch/arm/include/asm/hardirq.h
arch/arm/kernel/smp.c

13 files changed:
1  2 
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/common/mcpm_entry.c
arch/arm/include/asm/Kbuild
arch/arm/include/asm/atomic.h
arch/arm/include/asm/hardirq.h
arch/arm/include/asm/mcpm.h
arch/arm/include/asm/spinlock.h
arch/arm/kernel/head.S
arch/arm/kernel/setup.c
arch/arm/kernel/smp.c
arch/arm/net/bpf_jit_32.c
tools/perf/config/feature-tests.mak

Simple merge
Simple merge
Simple merge
Simple merge
@@@ -256,10 -283,11 +259,11 @@@ static inline long long atomic64_read(c
        return result;
  }
  
 -static inline void atomic64_set(atomic64_t *v, u64 i)
 +static inline void atomic64_set(atomic64_t *v, long long i)
  {
 -      u64 tmp;
 +      long long tmp;
  
+       prefetchw(&v->counter);
        __asm__ __volatile__("@ atomic64_set\n"
  "1:   ldrexd  %0, %H0, [%2]\n"
  "     strexd  %0, %3, %H3, [%2]\n"
  }
  #endif
  
 -static inline void atomic64_add(u64 i, atomic64_t *v)
 +static inline void atomic64_add(long long i, atomic64_t *v)
  {
 -      u64 result;
 +      long long result;
        unsigned long tmp;
  
+       prefetchw(&v->counter);
        __asm__ __volatile__("@ atomic64_add\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
- "     adds    %0, %0, %4\n"
- "     adc     %H0, %H0, %H4\n"
+ "     adds    %Q0, %Q0, %Q4\n"
+ "     adc     %R0, %R0, %R4\n"
  "     strexd  %1, %0, %H0, [%3]\n"
  "     teq     %1, #0\n"
  "     bne     1b"
@@@ -311,15 -340,16 +316,16 @@@ static inline long long atomic64_add_re
        return result;
  }
  
 -static inline void atomic64_sub(u64 i, atomic64_t *v)
 +static inline void atomic64_sub(long long i, atomic64_t *v)
  {
 -      u64 result;
 +      long long result;
        unsigned long tmp;
  
+       prefetchw(&v->counter);
        __asm__ __volatile__("@ atomic64_sub\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
- "     subs    %0, %0, %4\n"
- "     sbc     %H0, %H0, %H4\n"
+ "     subs    %Q0, %Q0, %Q4\n"
+ "     sbc     %R0, %R0, %R4\n"
  "     strexd  %1, %0, %H0, [%3]\n"
  "     teq     %1, #0\n"
  "     bne     1b"
@@@ -5,7 -5,7 +5,7 @@@
  #include <linux/threads.h>
  #include <asm/irq.h>
  
--#define NR_IPI        7
++#define NR_IPI        8
  
  typedef struct {
        unsigned int __softirq_pending;
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -67,7 -66,7 +67,8 @@@ enum ipi_msg_type 
        IPI_CALL_FUNC,
        IPI_CALL_FUNC_SINGLE,
        IPI_CPU_STOP,
 +      IPI_IRQ_WORK,
+       IPI_COMPLETION,
  };
  
  static DECLARE_COMPLETION(cpu_running);
@@@ -466,7 -457,7 +467,8 @@@ static const char *ipi_types[NR_IPI] = 
        S(IPI_CALL_FUNC, "Function call interrupts"),
        S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"),
        S(IPI_CPU_STOP, "CPU stop interrupts"),
 +      S(IPI_IRQ_WORK, "IRQ work interrupts"),
+       S(IPI_COMPLETION, "completion interrupts"),
  };
  
  void show_ipi_list(struct seq_file *p, int prec)
@@@ -576,14 -580,12 +591,20 @@@ void handle_IPI(int ipinr, struct pt_re
                irq_exit();
                break;
  
 +#ifdef CONFIG_IRQ_WORK
 +      case IPI_IRQ_WORK:
 +              irq_enter();
 +              irq_work_run();
 +              irq_exit();
 +              break;
 +#endif
 +
+       case IPI_COMPLETION:
+               irq_enter();
+               ipi_complete(cpu);
+               irq_exit();
+               break;
        default:
                printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%x\n",
                       cpu, ipinr);
Simple merge
Simple merge