[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC v2 02/16] gic-vgic:vgic: avoid excessive conversions
From: Andrii Anisov <andrii_anisov@xxxxxxxx> Avoid excessive conversions between `pending_irq` and irq number and priority. This is a tiny but pure optimization. Also it aligns a `gic_raise_guest_irq()` function interface to its current implementation in the meaning that it is removed a clearly ignored priority argument. Seeing a call to this function from a GICv3 code with an `p->lpi_priority` passed, it is assumed that LPI priority should be used for prioritization in an `lr_pending` queue. But the `lr_pending` queue is only sorted by `p->priority`, so it is supposed that `p->lpi_priority` should be casted to `p->priority` by GICv3 code to achieve expected behavior. On other hand, for LPIs, `p->lpi_priority` might be still honored in the `gic_raise_guest_irq()` functions, because it is still in the `pending_irq`. But that fix should be made aside this patch. Signed-off-by: Andrii Anisov <andrii_anisov@xxxxxxxx> --- Its a patch [1] with an improved message which also reflects what was discussed in the thread here [2]. [1] https://lists.xenproject.org/archives/html/xen-devel/2018-11/msg03289.html [2] https://lists.xenproject.org/archives/html/xen-devel/2018-11/msg02031.html --- 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 74b5fae..471e2d0 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) ) @@ -139,12 +137,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)); @@ -240,7 +236,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 5b73c4e..193a28f 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -447,7 +447,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 dd35695..458b2a8 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -420,7 +420,7 @@ void vgic_enable_irqs(struct vcpu *v, uint32_t r, int n) p = irq_to_pending(v_target, irq); set_bit(GIC_IRQ_GUEST_ENABLED, &p->status); 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 ) { @@ -589,7 +589,7 @@ 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; } @@ -598,7 +598,7 @@ void vgic_inject_irq(struct domain *d, struct vcpu *v, unsigned int virq, /* the irq is enabled */ if ( test_bit(GIC_IRQ_GUEST_ENABLED, &n->status) ) - 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 c5cb63f..0b1f519 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -286,6 +286,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 |