From c8a9a6f84885c366160a394aaaf08715e426eaf4 Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Thu, 16 Jun 2016 16:22:49 +0200 Subject: [PATCH 1/1] arm: Remove try_inject parameter from irqchip_set_pending We can only perform injection (and we also always want to) if target CPU equals caller CPU, and this is better checked inside the function. Signed-off-by: Jan Kiszka --- hypervisor/arch/arm/control.c | 2 +- hypervisor/arch/arm/gic-common.c | 2 +- hypervisor/arch/arm/include/asm/irqchip.h | 2 +- hypervisor/arch/arm/irqchip.c | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/hypervisor/arch/arm/control.c b/hypervisor/arch/arm/control.c index 1c17c31..918704c 100644 --- a/hypervisor/arch/arm/control.c +++ b/hypervisor/arch/arm/control.c @@ -329,7 +329,7 @@ bool arch_handle_phys_irq(struct per_cpu *cpu_data, u32 irqn) cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_VIRQ]++; - irqchip_set_pending(cpu_data, irqn, true); + irqchip_set_pending(cpu_data, irqn); return false; } diff --git a/hypervisor/arch/arm/gic-common.c b/hypervisor/arch/arm/gic-common.c index 7bb6cd3..958102c 100644 --- a/hypervisor/arch/arm/gic-common.c +++ b/hypervisor/arch/arm/gic-common.c @@ -293,7 +293,7 @@ void gic_handle_sgir_write(struct sgi *sgi, bool virt_input) if (sgi->routing_mode == 0 && !is_target) continue; - irqchip_set_pending(per_cpu(cpu), sgi->id, false); + irqchip_set_pending(per_cpu(cpu), sgi->id); sgi->targets |= (1 << cpu); } diff --git a/hypervisor/arch/arm/include/asm/irqchip.h b/hypervisor/arch/arm/include/asm/irqchip.h index f0f0e7a..bfee624 100644 --- a/hypervisor/arch/arm/include/asm/irqchip.h +++ b/hypervisor/arch/arm/include/asm/irqchip.h @@ -79,7 +79,7 @@ void irqchip_handle_irq(struct per_cpu *cpu_data); void irqchip_eoi_irq(u32 irqn, bool deactivate); void irqchip_inject_pending(struct per_cpu *cpu_data); -void irqchip_set_pending(struct per_cpu *cpu_data, u16 irq_id, bool try_inject); +void irqchip_set_pending(struct per_cpu *cpu_data, u16 irq_id); bool spi_in_cell(struct cell *cell, unsigned int spi); diff --git a/hypervisor/arch/arm/irqchip.c b/hypervisor/arch/arm/irqchip.c index 538bbc0..bec3d95 100644 --- a/hypervisor/arch/arm/irqchip.c +++ b/hypervisor/arch/arm/irqchip.c @@ -49,11 +49,12 @@ bool spi_in_cell(struct cell *cell, unsigned int spi) return spi_mask & (1 << (spi & 31)); } -void irqchip_set_pending(struct per_cpu *cpu_data, u16 irq_id, bool try_inject) +void irqchip_set_pending(struct per_cpu *cpu_data, u16 irq_id) { + bool local_injection = (this_cpu_data() == cpu_data); unsigned int new_tail; - if (try_inject && irqchip.inject_irq(cpu_data, irq_id) != -EBUSY) + if (local_injection && irqchip.inject_irq(cpu_data, irq_id) != -EBUSY) return; spin_lock(&cpu_data->pending_irqs_lock); -- 2.39.2