---
Changelog v1 ... v2:
- use vcpu_kick() name from x86 and existing prototype
- rename performance counter
xen/arch/arm/domain.c | 12 ++++++++++++
xen/arch/arm/vgic.c | 11 +++--------
xen/include/asm-arm/perfc_defn.h | 3 ++-
3 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index bc10f412ba..4462e62599 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -967,6 +967,18 @@ void vcpu_block_unless_event_pending(struct vcpu *v)
vcpu_unblock(current);
}
+void vcpu_kick(struct vcpu *vcpu)
+{
+ bool running = vcpu->is_running;
+
+ vcpu_unblock(vcpu);
+ if ( running && vcpu != current )
+ {
+ perfc_incr(vcpu_kick);
+ smp_send_event_check_mask(cpumask_of(vcpu->processor));
+ }
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c
index eb09d9ca54..3fafdd0b66 100644
--- a/xen/arch/arm/vgic.c
+++ b/xen/arch/arm/vgic.c
@@ -26,6 +26,7 @@
#include <xen/sched.h>
#include <xen/perfc.h>
+#include <asm/event.h>
#include <asm/current.h>
#include <asm/mmio.h>
@@ -530,7 +531,6 @@ void vgic_inject_irq(struct domain *d, struct vcpu *v,
unsigned int virq,
uint8_t priority;
struct pending_irq *iter, *n;
unsigned long flags;
- bool running;
/*
* For edge triggered interrupts we always ignore a "falling edge".
@@ -590,14 +590,9 @@ void vgic_inject_irq(struct domain *d, struct vcpu *v,
unsigned int virq,
list_add_tail(&n->inflight, &v->arch.vgic.inflight_irqs);
out:
spin_unlock_irqrestore(&v->arch.vgic.lock, flags);
+
/* we have a new higher priority irq, inject it into the guest */
- running = v->is_running;
- vcpu_unblock(v);
- if ( running && v != current )
- {
- perfc_incr(vgic_cross_cpu_intr_inject);
- smp_send_event_check_mask(cpumask_of(v->processor));
- }
+ vcpu_kick(v);
return;
}
diff --git a/xen/include/asm-arm/perfc_defn.h b/xen/include/asm-arm/perfc_defn.h
index 87866264ca..8922e9525a 100644
--- a/xen/include/asm-arm/perfc_defn.h
+++ b/xen/include/asm-arm/perfc_defn.h
@@ -33,6 +33,8 @@ PERFCOUNTER(vpsci_cpu_suspend, "vpsci: cpu_suspend")
PERFCOUNTER(vpsci_cpu_affinity_info, "vpsci: cpu_affinity_info")
PERFCOUNTER(vpsci_features, "vpsci: features")
+PERFCOUNTER(vcpu_kick, "vcpu: notify other vcpu")
+
PERFCOUNTER(vgicd_reads, "vgicd: read")
PERFCOUNTER(vgicd_writes, "vgicd: write")
PERFCOUNTER(vgicr_reads, "vgicr: read")
@@ -44,7 +46,6 @@ PERFCOUNTER(vgic_sysreg_writes, "vgic: sysreg write")
PERFCOUNTER(vgic_sgi_list , "vgic: SGI send to list")
PERFCOUNTER(vgic_sgi_others, "vgic: SGI send to others")
PERFCOUNTER(vgic_sgi_self, "vgic: SGI send to self")
-PERFCOUNTER(vgic_cross_cpu_intr_inject, "vgic: cross-CPU irq inject")
PERFCOUNTER(vgic_irq_migrates, "vgic: irq migration")
PERFCOUNTER(vuart_reads, "vuart: read")