[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 23/28] xen/arm: ITS: Allocate pending_lpi descriptors for LPIs
From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> Allocate dynamically pending_lpi descriptors for LPIs Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> --- v8: - Dropped HAS_GICV3 config switch around pending_lpis[] --- xen/arch/arm/vgic-v3-its.c | 9 +++++++++ xen/arch/arm/vgic.c | 12 +++++++++--- xen/include/asm-arm/domain.h | 1 + xen/include/asm-arm/vgic.h | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index 1bb7674..41e0b2a 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -890,6 +890,14 @@ int vits_domain_init(struct domain *d) vits = d->arch.vgic.vits; + d->arch.vgic.pending_lpis = xzalloc_array(struct pending_irq, + d->arch.vgic.nr_lpis); + if ( d->arch.vgic.pending_lpis == NULL ) + return -ENOMEM; + + for ( i = 0; i < d->arch.vgic.nr_lpis; i++ ) + vgic_init_pending_irq(&d->arch.vgic.pending_lpis[i], i + FIRST_GIC_LPI); + spin_lock_init(&vits->lock); vits->collections = xzalloc_array(struct its_collection, @@ -918,6 +926,7 @@ int vits_domain_init(struct domain *d) void vits_domain_free(struct domain *d) { + xfree(d->arch.vgic.pending_lpis); xfree(d->arch.vgic.vits->collections); xfree(d->arch.vgic.vits); } diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 8d75d90..5b81583 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -73,7 +73,7 @@ static bool_t vgic_is_domain_lpi(struct domain *d, unsigned int lpi) (lpi < (d->arch.vgic.nr_lpis + FIRST_GIC_LPI))); } -static void vgic_init_pending_irq(struct pending_irq *p, unsigned int virq) +void vgic_init_pending_irq(struct pending_irq *p, unsigned int virq) { INIT_LIST_HEAD(&p->inflight); INIT_LIST_HEAD(&p->lr_queue); @@ -446,13 +446,19 @@ int vgic_to_sgi(struct vcpu *v, register_t sgir, enum gic_sgi_mode irqmode, int struct pending_irq *irq_to_pending(struct vcpu *v, unsigned int irq) { - struct pending_irq *n; + struct pending_irq *n = NULL; /* Pending irqs allocation strategy: the first vgic.nr_spis irqs - * are used for SPIs; the rests are used for per cpu irqs */ + * are used for SPIs; the rests are used for per cpu irqs. + * For LPIs pending_irq structures are allocated separately */ if ( irq < 32 ) n = &v->arch.vgic.pending_irqs[irq]; + else if ( vgic_is_domain_lpi(v->domain, irq) ) + n = &v->domain->arch.vgic.pending_lpis[irq - FIRST_GIC_LPI]; else n = &v->domain->arch.vgic.pending_irqs[irq - 32]; + + ASSERT(n != NULL); + return n; } diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 48dcd9a..42182a6 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -102,6 +102,7 @@ struct arch_domain * struct arch_vcpu. */ struct pending_irq *pending_irqs; + struct pending_irq *pending_lpis; /* Base address for guest GIC */ paddr_t dbase; /* Distributor base address */ #ifdef CONFIG_HAS_GICV3 diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index 473fd8e..4711d3a 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -323,6 +323,7 @@ extern int vgic_to_sgi(struct vcpu *v, register_t sgir, enum gic_sgi_mode irqmode, int virq, const struct sgi_target *target); extern void vgic_migrate_irq(struct vcpu *old, struct vcpu *new, unsigned int irq); +extern void vgic_init_pending_irq(struct pending_irq *p, unsigned int virq); /* Reserve a specific guest vIRQ */ extern bool_t vgic_reserve_virq(struct domain *d, unsigned int virq); -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |