|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v8 19/26] xen/domain: allocate d->irq_caps before arch-specific initialization
From: Denis Mukhin <dmukhin@xxxxxxxx>
To do that, move per-domain interrupt rangeset allocation before
arch-specific code. Add irqs_setup_access() to setup the initial
rangeset.
Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
xen/arch/x86/dom0_build.c | 1 -
xen/arch/x86/hvm/dom0_build.c | 7 +++++++
xen/arch/x86/include/asm/irq.h | 2 ++
xen/arch/x86/irq.c | 8 ++++++++
xen/arch/x86/pv/dom0_build.c | 3 +++
xen/common/domain.c | 8 ++++++--
6 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c
index e8f783d533af..035d2db72788 100644
--- a/xen/arch/x86/dom0_build.c
+++ b/xen/arch/x86/dom0_build.c
@@ -454,7 +454,6 @@ int __init dom0_setup_permissions(struct domain *d)
rc |= iomem_permit_access(d, 0UL,
PFN_DOWN(1UL << domain_max_paddr_bits(d)) - 1);
- rc |= irqs_permit_access(d, 1, nr_irqs_gsi - 1);
/* Local APIC. */
if ( mp_lapic_addr != 0 )
diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
index f536f5dcc444..5708caf752cb 100644
--- a/xen/arch/x86/hvm/dom0_build.c
+++ b/xen/arch/x86/hvm/dom0_build.c
@@ -1352,6 +1352,13 @@ int __init dom0_construct_pvh(const struct boot_domain
*bd)
*/
pvh_setup_mmcfg(d);
+ rc = irqs_setup_access(d);
+ if ( rc )
+ {
+ printk("%pd unable to setup IRQ rangeset: %d\n", d, rc);
+ return rc;
+ }
+
/*
* Setup permissions early so that calls to add MMIO regions to the
* p2m as part of vPCI setup don't fail due to permission checks.
diff --git a/xen/arch/x86/include/asm/irq.h b/xen/arch/x86/include/asm/irq.h
index 7315150b66b4..d26cb5c1daba 100644
--- a/xen/arch/x86/include/asm/irq.h
+++ b/xen/arch/x86/include/asm/irq.h
@@ -232,4 +232,6 @@ int allocate_and_map_gsi_pirq(struct domain *d, int index,
int *pirq_p);
int allocate_and_map_msi_pirq(struct domain *d, int index, int *pirq_p,
int type, struct msi_info *msi);
+int irqs_setup_access(struct domain *d);
+
#endif /* _ASM_HW_IRQ_H */
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
index 32a75f77a46d..3fcff671c27f 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -3082,3 +3082,11 @@ int allocate_and_map_msi_pirq(struct domain *d, int
index, int *pirq_p,
return ret;
}
+
+int irqs_setup_access(struct domain *d)
+{
+ if ( is_hardware_domain(d) )
+ return irqs_permit_access(d, 1, nr_irqs_gsi - 1);
+
+ return 0;
+}
diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index 385802c65abc..50c311f0a490 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -1029,6 +1029,9 @@ static int __init dom0_construct(const struct boot_domain
*bd)
rc = ioports_setup_access(d);
BUG_ON(rc != 0);
+ rc = irqs_setup_access(d);
+ BUG_ON(rc != 0);
+
rc = dom0_setup_permissions(d);
BUG_ON(rc != 0);
diff --git a/xen/common/domain.c b/xen/common/domain.c
index f3a2634d5f98..18c5674f6439 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -1031,6 +1031,11 @@ struct domain *domain_create(domid_t domid,
radix_tree_init(&d->pirq_tree);
#endif
+ err = -ENOMEM;
+ d->irq_caps = rangeset_new(d, "Interrupts", 0);
+ if ( !d->irq_caps )
+ goto fail;
+
if ( (err = arch_domain_create(d, config, flags)) != 0 )
goto fail;
init_status |= INIT_arch;
@@ -1040,8 +1045,7 @@ struct domain *domain_create(domid_t domid,
err = -ENOMEM;
d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex);
- d->irq_caps = rangeset_new(d, "Interrupts", 0);
- if ( !d->iomem_caps || !d->irq_caps )
+ if ( !d->iomem_caps )
goto fail;
if ( (err = xsm_domain_create(XSM_HOOK, d, config->ssidref)) != 0 )
--
2.56.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |