Message ID | 20190926231144.16297-7-sstabellini@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
Hi Stefano, On 9/27/19 12:11 AM, Stefano Stabellini wrote: > We don't have a clear way to know how many virtual SPIs we need for the > dom0-less domains. Introduce a new option under xen,domain to specify > the number of SPIs to allocate for a domain. > > The property is optional. When absent, we'll use the physical number of > GIC lines for dom0-less domains, or GUEST_VPL011_SPI+1 if vpl011 is > requested, whichever is greater. > > Remove the old setting of nr_spis based on the presence of the vpl011. > > The implication of this change is that without nr_spis dom0less domains > get the same amount of SPI allocated as dom0, regardless of how many > physical devices they have assigned, and regardless of whether they have > a virtual pl011 (which also needs an emulated SPI). This is done because > the SPIs allocation needs to be done before parsing any passthrough > information, so we have to account for any potential physical SPI > assigned to the domain. > > When nr_spis is present, the domain gets exactly nr_spis allocated SPIs. > If the number is too low, it might not be enough for the devices > assigned it to it. If the number is less than GUEST_VPL011_SPI, the > virtual pl011 won't work. > > Signed-off-by: Stefano Stabellini <stefanos@xilinx.com> > Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com> Acked-by: Julien Grall <julien.grall@arm.com> Cheers,
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index a461816345..40c4a782c9 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -2355,7 +2355,6 @@ void __init create_domUs(void) struct domain *d; struct xen_domctl_createdomain d_cfg = { .arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE, - .arch.nr_spis = 0, .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap, .max_evtchn_port = -1, .max_grant_frames = 64, @@ -2365,9 +2364,6 @@ void __init create_domUs(void) if ( !dt_device_is_compatible(node, "xen,domain") ) continue; - if ( dt_property_read_bool(node, "vpl011") ) - d_cfg.arch.nr_spis = GUEST_VPL011_SPI - 32 + 1; - if ( !dt_property_read_u32(node, "cpus", &d_cfg.max_vcpus) ) panic("Missing property 'cpus' for domain %s\n", dt_node_name(node)); @@ -2375,6 +2371,19 @@ void __init create_domUs(void) if ( dt_find_compatible_node(node, NULL, "multiboot,device-tree") ) d_cfg.flags |= XEN_DOMCTL_CDF_iommu; + if ( !dt_property_read_u32(node, "nr_spis", &d_cfg.arch.nr_spis) ) + { + d_cfg.arch.nr_spis = gic_number_lines() - 32; + + /* + * vpl011 uses one emulated SPI. If vpl011 is requested, make + * sure that we allocate enough SPIs for it. + */ + if ( dt_property_read_bool(node, "vpl011") ) + d_cfg.arch.nr_spis = MAX(d_cfg.arch.nr_spis, + GUEST_VPL011_SPI - 32 + 1); + } + d = domain_create(++max_init_domid, &d_cfg, false); if ( IS_ERR(d) ) panic("Error creating domain %s\n", dt_node_name(node));