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 <[email protected]>
---
 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.1.4

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to