diff mbox

[Xen-devel,v4,1/2] xen/arm : Adding helper function for WFI

Message ID 1405345914-7189-1-git-send-email-parth.dixit@linaro.org
State New
Headers show

Commit Message

Parth Dixit July 14, 2014, 1:51 p.m. UTC
WFI functionality is required at different places in xen.
Moving it to seperate helper function so that it is easier
to call WFI function and avoid duplication of code

- renamed vcpu_block_event to vcpu_block_unless_event_pending

Signed-off-by: Parth Dixit <parth.dixit@linaro.org>
---
Changelog v4
- added space in comments
- renamed vcpu_block_event to vcpu_block_unless_event_pending
Changelog v3 :
- new patch for helper function, this functionality existed in same patch in v2

xen/arch/arm/domain.c       | 13 +++++++++++++
 xen/arch/arm/traps.c        | 10 +---------
 xen/include/asm-arm/event.h |  1 +
 3 files changed, 15 insertions(+), 9 deletions(-)

Comments

Ian Campbell July 16, 2014, 2:54 p.m. UTC | #1
On Mon, 2014-07-14 at 19:21 +0530, Parth Dixit wrote:
> WFI functionality is required at different places in xen.
> Moving it to seperate helper function so that it is easier
> to call WFI function and avoid duplication of code
> 
> - renamed vcpu_block_event to vcpu_block_unless_event_pending
> 
> Signed-off-by: Parth Dixit <parth.dixit@linaro.org>

Acked + Applied, thanks.
diff mbox

Patch

diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 2ae6941..7ddd2d8 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -779,6 +779,19 @@  void vcpu_mark_events_pending(struct vcpu *v)
     vgic_vcpu_inject_irq(v, v->domain->arch.evtchn_irq, 1);
 }
 
+/* The ARM spec declares that even if local irqs are masked in
+ * the CPSR register, an irq should wake up a cpu from WFI anyway.
+ * For this reason we need to check for irqs that need delivery,
+ * ignoring the CPSR register, *after* calling SCHEDOP_block to
+ * avoid races with vgic_vcpu_inject_irq.
+ */
+void vcpu_block_unless_event_pending(struct vcpu *v)
+{
+    vcpu_block();
+    if ( local_events_need_delivery_nomask() )
+        vcpu_unblock(current);
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
index 03a3da6..8102540 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -1670,15 +1670,7 @@  asmlinkage void do_trap_hypervisor(struct cpu_user_regs *regs)
             return;
         }
         /* at the moment we only trap WFI */
-        vcpu_block();
-        /* The ARM spec declares that even if local irqs are masked in
-         * the CPSR register, an irq should wake up a cpu from WFI anyway.
-         * For this reason we need to check for irqs that need delivery,
-         * ignoring the CPSR register, *after* calling SCHEDOP_block to
-         * avoid races with vgic_vcpu_inject_irq.
-         */
-        if ( local_events_need_delivery_nomask() )
-            vcpu_unblock(current);
+        vcpu_block_unless_event_pending(current);
         advance_pc(regs, hsr);
         break;
     case HSR_EC_CP15_32:
diff --git a/xen/include/asm-arm/event.h b/xen/include/asm-arm/event.h
index dd3ad13..5330dfe 100644
--- a/xen/include/asm-arm/event.h
+++ b/xen/include/asm-arm/event.h
@@ -6,6 +6,7 @@ 
 
 void vcpu_kick(struct vcpu *v);
 void vcpu_mark_events_pending(struct vcpu *v);
+void vcpu_block_unless_event_pending(struct vcpu *v);
 
 static inline int vcpu_event_delivery_is_enabled(struct vcpu *v)
 {