mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
eb631bb5bf
Support for arch_irq_work_raise() was missing from
arm64 (a prerequisite for FULL_NOHZ).
This patch is based on the arm32 patch ARM 7872/1.
commit bf18525fd7
Author: Stephen Boyd <sboyd@codeaurora.org>
Date: Tue Oct 29 20:32:56 2013 +0100
ARM: 7872/1: Support arch_irq_work_raise() via self IPIs
By default, IRQ work is run from the tick interrupt (see
irq_work_run() in update_process_times()). When we're in full
NOHZ mode, restarting the tick requires the use of IRQ work and
if the only place we run IRQ work is in the tick interrupt we
have an unbreakable cycle. Implement arch_irq_work_raise() via
self IPIs to break this cycle and get the tick started again.
Note that we implement this via IPIs which are only available on
SMP builds. This shouldn't be a problem because full NOHZ is only
supported on SMP builds anyway.
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Reviewed-by: Kevin Hilman <khilman@linaro.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Larry Bassel <larry.bassel@linaro.org>
Reviewed-by: Kevin Hilman <khilman@linaro.org>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
58 lines
1.5 KiB
C
58 lines
1.5 KiB
C
/*
|
|
* Copyright (C) 2012 ARM Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef __ASM_HARDIRQ_H
|
|
#define __ASM_HARDIRQ_H
|
|
|
|
#include <linux/cache.h>
|
|
#include <linux/threads.h>
|
|
#include <asm/irq.h>
|
|
|
|
#define NR_IPI 6
|
|
|
|
typedef struct {
|
|
unsigned int __softirq_pending;
|
|
#ifdef CONFIG_SMP
|
|
unsigned int ipi_irqs[NR_IPI];
|
|
#endif
|
|
} ____cacheline_aligned irq_cpustat_t;
|
|
|
|
#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
|
|
|
|
#define __inc_irq_stat(cpu, member) __IRQ_STAT(cpu, member)++
|
|
#define __get_irq_stat(cpu, member) __IRQ_STAT(cpu, member)
|
|
|
|
#ifdef CONFIG_SMP
|
|
u64 smp_irq_stat_cpu(unsigned int cpu);
|
|
#define arch_irq_stat_cpu smp_irq_stat_cpu
|
|
#endif
|
|
|
|
#define __ARCH_IRQ_EXIT_IRQS_DISABLED 1
|
|
|
|
static inline void ack_bad_irq(unsigned int irq)
|
|
{
|
|
extern unsigned long irq_err_count;
|
|
irq_err_count++;
|
|
}
|
|
|
|
extern void handle_IRQ(unsigned int, struct pt_regs *);
|
|
|
|
/*
|
|
* No arch-specific IRQ flags.
|
|
*/
|
|
#define set_irq_flags(irq, flags)
|
|
|
|
#endif /* __ASM_HARDIRQ_H */
|