[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/5] x86/dpci: allow hvm_irq_dpci to handle a variable number of GSIs
By making the girq array variable length. For the hardware domain this array is going to match the actual number of GSIs present on the system. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/arch/x86/physdev.c | 2 +- xen/drivers/passthrough/io.c | 8 +++++--- xen/include/xen/hvm/irq.h | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 6c15f9bf49..d12086d0ec 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -52,7 +52,7 @@ static int physdev_hvm_map_pirq( { const struct hvm_girq_dpci_mapping *girq; - BUILD_BUG_ON(ARRAY_SIZE(hvm_irq_dpci->girq) < NR_HVM_IRQS); + BUG_ON(hvm_domain_irq(d)->nr_gsis < NR_HVM_IRQS); list_for_each_entry ( girq, &hvm_irq_dpci->girq[*index], list ) diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/io.c index 50e2f00214..3345db5759 100644 --- a/xen/drivers/passthrough/io.c +++ b/xen/drivers/passthrough/io.c @@ -322,15 +322,17 @@ int pt_irq_create_bind( hvm_irq_dpci = domain_get_irq_dpci(d); if ( hvm_irq_dpci == NULL ) { - unsigned int i; + unsigned int i, nr_gsis; - hvm_irq_dpci = xzalloc(struct hvm_irq_dpci); + nr_gsis = is_hardware_domain(d) ? hvm_domain_irq(d)->nr_gsis + : NR_HVM_IRQS; + hvm_irq_dpci = xzalloc_bytes(hvm_irq_dpci_size(nr_gsis)); if ( hvm_irq_dpci == NULL ) { spin_unlock(&d->event_lock); return -ENOMEM; } - for ( i = 0; i < NR_HVM_IRQS; i++ ) + for ( i = 0; i < nr_gsis; i++ ) INIT_LIST_HEAD(&hvm_irq_dpci->girq[i]); d->arch.hvm_domain.irq->dpci = hvm_irq_dpci; diff --git a/xen/include/xen/hvm/irq.h b/xen/include/xen/hvm/irq.h index d3f8623c0c..8304cb5725 100644 --- a/xen/include/xen/hvm/irq.h +++ b/xen/include/xen/hvm/irq.h @@ -81,14 +81,16 @@ struct hvm_girq_dpci_mapping { /* Protected by domain's event_lock */ struct hvm_irq_dpci { - /* Guest IRQ to guest device/intx mapping. */ - struct list_head girq[NR_HVM_IRQS]; /* Record of mapped ISA IRQs */ DECLARE_BITMAP(isairq_map, NR_ISAIRQS); /* Record of mapped Links */ uint8_t link_cnt[NR_LINK]; + /* Guest IRQ to guest device/intx mapping. */ + struct list_head girq[]; }; +#define hvm_irq_dpci_size(cnt) offsetof(struct hvm_irq_dpci, girq[cnt]) + /* Machine IRQ to guest device/intx mapping. */ struct hvm_pirq_dpci { uint32_t flags; -- 2.12.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |