]> xenbits.xensource.com Git - people/iwj/xen.git/commitdiff
ARM: Implement vcpu_kick()
authorAndre Przywara <andre.przywara@linaro.org>
Thu, 15 Mar 2018 20:30:07 +0000 (20:30 +0000)
committerJulien Grall <julien.grall@arm.com>
Tue, 20 Mar 2018 08:19:46 +0000 (08:19 +0000)
If we change something in a vCPU that affects its runnability or
otherwise needs the vCPU's attention, we might need to tell the scheduler
about it.
We are using this in one place (vIRQ injection) at the moment, but will
need this at more places soon.
So let's factor out this functionality, using the already existing
vcpu_kick() prototype (used in x86 only so far), to make this available
to the rest of the Xen code.
Also adjust the perfcounter name to reflect the new usage.

Signed-off-by: Andre Przywara <andre.przywara@linaro.org>
Reviewed-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
xen/arch/arm/domain.c
xen/arch/arm/vgic.c
xen/include/asm-arm/perfc_defn.h

index 7193531ca670c15eaf1a019fb08f06858aa8827b..ff97f2bc76dff719a0804645fcb803820cb1eccb 100644 (file)
@@ -966,6 +966,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
index eb09d9ca54253f091c2055923c3ca7aa8b3da03d..3fafdd0b66c38551d6ce1ec3946f91818eb9f6c7 100644 (file)
@@ -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;
 }
index 87866264ca3dae9f5239c26cbec860b3794d2f2e..8922e9525a444a5cecc66877b795794010c5231a 100644 (file)
@@ -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")