[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 09/16] gic-vgic:vgic: avoid excessive conversions
From: Andrii Anisov <andrii_anisov@xxxxxxxx> Avoid excessive conversions between pending_irq and irq number/priority. This simlifies functions interface and reduces under locks code size. Signed-off-by: Andrii Anisov <andrii_anisov@xxxxxxxx> --- xen/arch/arm/gic-vgic.c | 10 +++------- xen/arch/arm/vgic-v3-its.c | 2 +- xen/arch/arm/vgic.c | 6 +++--- xen/include/asm-arm/gic.h | 3 --- xen/include/asm-arm/vgic.h | 2 ++ 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/xen/arch/arm/gic-vgic.c b/xen/arch/arm/gic-vgic.c index 9bbd0c5..f0e6c6f 100644 --- a/xen/arch/arm/gic-vgic.c +++ b/xen/arch/arm/gic-vgic.c @@ -75,10 +75,8 @@ void gic_remove_from_lr_pending(struct vcpu *v, struct pending_irq *p) list_del_init(&p->lr_queue); } -void gic_raise_inflight_irq(struct vcpu *v, unsigned int virtual_irq) +void gic_raise_inflight_irq(struct vcpu *v, struct pending_irq *n) { - struct pending_irq *n = irq_to_pending(v, virtual_irq); - #ifdef CONFIG_GICV3 /* If an LPI has been removed meanwhile, there is nothing left to raise. */ if ( unlikely(!n) ) @@ -135,12 +133,10 @@ static unsigned int gic_find_unused_lr(struct vcpu *v, return lr; } -void gic_raise_guest_irq(struct vcpu *v, unsigned int virtual_irq, - unsigned int priority) +void gic_raise_guest_irq(struct vcpu *v, struct pending_irq *p) { int i; unsigned int nr_lrs = gic_get_nr_lrs(); - struct pending_irq *p = irq_to_pending(v, virtual_irq); ASSERT(spin_is_locked(&v->arch.vgic.lock)); @@ -233,7 +229,7 @@ static void gic_update_one_lr(struct vcpu *v, int i) if ( test_bit(GIC_IRQ_GUEST_ENABLED, &p->status) && test_bit(GIC_IRQ_GUEST_QUEUED, &p->status) && !test_bit(GIC_IRQ_GUEST_MIGRATING, &p->status) ) - gic_raise_guest_irq(v, irq, p->priority); + gic_raise_guest_irq(v, p); else { list_del_init(&p->inflight); /* diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index 3c6693d..f9bd27f 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -448,7 +448,7 @@ static void update_lpi_vgic_status(struct vcpu *v, struct pending_irq *p) { if ( !list_empty(&p->inflight) && !test_bit(GIC_IRQ_GUEST_VISIBLE, &p->status) ) - gic_raise_guest_irq(v, p->irq, p->lpi_priority); + gic_raise_guest_irq(v, p); } else gic_remove_from_lr_pending(v, p); diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index e30a518..c142476 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -434,7 +434,7 @@ void vgic_enable_irqs(struct vcpu *v, uint32_t r, int n) } out: if ( !list_empty(&p->inflight) && !test_bit(GIC_IRQ_GUEST_VISIBLE, &p->status) ) - gic_raise_guest_irq(v_target, irq, p->priority); + gic_raise_guest_irq(v_target, p); spin_unlock_irqrestore(&v_target->arch.vgic.lock, flags); if ( p->desc != NULL ) { @@ -608,14 +608,14 @@ void vgic_inject_irq(struct domain *d, struct vcpu *v, unsigned int virq, if ( !list_empty(&n->inflight) ) { - gic_raise_inflight_irq(v, virq); + gic_raise_inflight_irq(v, n); goto out; } priority = vgic_get_virq_priority(v, virq); n->priority = priority; - gic_raise_guest_irq(v, virq, priority); + gic_raise_guest_irq(v, n); list_for_each_entry ( iter, &v->arch.vgic.inflight_irqs, inflight ) { diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h index fab02f1..3d7394d 100644 --- a/xen/include/asm-arm/gic.h +++ b/xen/include/asm-arm/gic.h @@ -252,9 +252,6 @@ int gic_remove_irq_from_guest(struct domain *d, unsigned int virq, extern void gic_clear_pending_irqs(struct vcpu *v); extern void init_maintenance_interrupt(void); -extern void gic_raise_guest_irq(struct vcpu *v, unsigned int irq, - unsigned int priority); -extern void gic_raise_inflight_irq(struct vcpu *v, unsigned int virtual_irq); /* Accept an interrupt from the GIC and dispatch its handler */ extern void gic_interrupt(struct cpu_user_regs *regs, int is_fiq); diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index 7507162..a27a1a9 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -287,6 +287,8 @@ enum gic_sgi_mode; extern struct vcpu *vgic_get_target_vcpu(struct vcpu *v, unsigned int virq); extern void vgic_remove_irq_from_queues(struct vcpu *v, struct pending_irq *p); extern void gic_remove_from_lr_pending(struct vcpu *v, struct pending_irq *p); +extern void gic_raise_guest_irq(struct vcpu *v, struct pending_irq *p); +extern void gic_raise_inflight_irq(struct vcpu *v, struct pending_irq *n); extern void vgic_init_pending_irq(struct pending_irq *p, unsigned int virq); extern struct pending_irq *irq_to_pending(struct vcpu *v, unsigned int irq); extern struct pending_irq *spi_to_pending(struct domain *d, unsigned int irq); -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |