Message ID | 1404390158-21542-1-git-send-email-parth.dixit@linaro.org |
---|---|
State | New |
Headers | show |
On Thu, 2014-07-03 at 17:52 +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 > > Signed-off-by: Parth Dixit <parth.dixit@linaro.org> > --- > 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(-) > > diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c > index 2ae6941..bc5e56d 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. There should be a space before each of the continuation lines' *. > +*/ > +void vcpu_block_event(struct vcpu *v) Can anyone think of a more descriptive name for this function? vcpu_block_unless_event_pending() is a bit of a mouthful. Ian.
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 2ae6941..bc5e56d 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_event(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..8d2e308 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_event(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..a94ba2e 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_event(struct vcpu *v); static inline int vcpu_event_delivery_is_enabled(struct vcpu *v) {
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 Signed-off-by: Parth Dixit <parth.dixit@linaro.org> --- 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(-)