From: Russell King Date: Tue, 12 Nov 2013 10:58:59 +0000 (+0000) Subject: Merge branch 'devel-stable' into for-next X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=df762eccbadf87850fbee444d729e0f1b1e946f1;p=linux.git Merge branch 'devel-stable' into for-next Conflicts: arch/arm/include/asm/atomic.h arch/arm/include/asm/hardirq.h arch/arm/kernel/smp.c --- df762eccbadf87850fbee444d729e0f1b1e946f1 diff --cc arch/arm/include/asm/atomic.h index f8a4336ed8fca,134aa28b6f643..62d2cb53b0693 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h @@@ -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" @@@ -271,15 -299,16 +275,16 @@@ } #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" diff --cc arch/arm/include/asm/hardirq.h index 3d7351c844aac,3d7351c844aac..fe3ea776dc342 --- a/arch/arm/include/asm/hardirq.h +++ b/arch/arm/include/asm/hardirq.h @@@ -5,7 -5,7 +5,7 @@@ #include #include --#define NR_IPI 7 ++#define NR_IPI 8 typedef struct { unsigned int __softirq_pending; diff --cc arch/arm/kernel/smp.c index e115cbb0d25a5,5c820cbcf9181..dc894ab3622b1 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@@ -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);