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....@citrix.com> --- Cc: Jan Beulich <jbeul...@suse.com> Cc: Andrew Cooper <andrew.coop...@citrix.com> --- 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@lists.xen.org https://lists.xen.org/xen-devel