|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 8/9] xen/arm: acpi: route all unused IRQs to DOM0
On Thu, 14 Jul 2016, Julien Grall wrote:
> It is not possible to know which IRQs will be used by DOM0 when ACPI is
> inuse. The approach implemented by this patch, will route all unused
> IRQs to DOM0 before it has booted.
>
> The number of IRQs routed is based on the maximum SPIs supported by the
> hardware (up to ~1000). However, some of them might not be wired. So we
> would allocate resource for nothing.
>
> For each IRQ routed, Xen is allocating memory for irqaction (40 bytes)
> and irq_guest (16 bytes). So in the worst case scenario ~54KB of memory
> will be allocated. Given that ACPI will mostly be used by server, I
> think it is a small drawback.
>
> map_irq_to_domain is slightly reworked to remove the dependency on
> device-tree. So the function can be also be used for ACPI and will
> avoid code duplication.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> Changes in v2:
> - Rename acpi_permit_spi_access to acpi_route_spis
> - Update the comment in the function acpi_route_spis
> ---
> xen/arch/arm/domain_build.c | 28 ++++++++++++----------------
> 1 file changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 60db9e4..5b2f8ad 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -903,11 +903,10 @@ static int make_timer_node(const struct domain *d, void
> *fdt,
> return res;
> }
>
> -static int map_irq_to_domain(const struct dt_device_node *dev,
> - struct domain *d, unsigned int irq)
> +static int map_irq_to_domain(struct domain *d, unsigned int irq,
> + bool_t need_mapping, const char *devname)
>
> {
> - bool_t need_mapping = !dt_device_for_passthrough(dev);
> int res;
>
> res = irq_permit_access(d, irq);
> @@ -927,7 +926,7 @@ static int map_irq_to_domain(const struct dt_device_node
> *dev,
> */
> vgic_reserve_virq(d, irq);
>
> - res = route_irq_to_guest(d, irq, irq, dt_node_name(dev));
> + res = route_irq_to_guest(d, irq, irq, devname);
> if ( res < 0 )
> {
> printk(XENLOG_ERR "Unable to map IRQ%"PRId32" to dom%d\n",
> @@ -947,6 +946,7 @@ static int map_dt_irq_to_domain(const struct
> dt_device_node *dev,
> struct domain *d = data;
> unsigned int irq = dt_irq->irq;
> int res;
> + bool_t need_mapping = !dt_device_for_passthrough(dev);
>
> if ( irq < NR_LOCAL_IRQS )
> {
> @@ -965,7 +965,7 @@ static int map_dt_irq_to_domain(const struct
> dt_device_node *dev,
> return res;
> }
>
> - res = map_irq_to_domain(dev, d, irq);
> + res = map_irq_to_domain(d, irq, need_mapping, dt_node_name(dev));
>
> return 0;
> }
> @@ -1103,7 +1103,7 @@ static int handle_device(struct domain *d, struct
> dt_device_node *dev)
> return res;
> }
>
> - res = map_irq_to_domain(dev, d, res);
> + res = map_irq_to_domain(d, res, need_mapping, dt_node_name(dev));
> if ( res )
> return res;
> }
> @@ -1343,15 +1343,14 @@ static int acpi_iomem_deny_access(struct domain *d)
> return gic_iomem_deny_access(d);
> }
>
> -static int acpi_permit_spi_access(struct domain *d)
> +static int acpi_route_spis(struct domain *d)
> {
> int i, res;
> struct irq_desc *desc;
>
> /*
> - * Here just permit Dom0 to access the SPIs which Xen doesn't use. Then
> when
> - * Dom0 configures the interrupt, set the interrupt type and route it to
> - * Dom0.
> + * Route the IRQ to hardware domain and permit the access.
> + * The interrupt type will be set by set by the hardware domain.
> */
> for( i = NR_LOCAL_IRQS; i < vgic_num_irqs(d); i++ )
> {
> @@ -1362,13 +1361,10 @@ static int acpi_permit_spi_access(struct domain *d)
> if ( desc->action != NULL)
> continue;
>
> - res = irq_permit_access(d, i);
> + /* XXX: Shall we use a proper devname? */
> + res = map_irq_to_domain(d, i, true, "ACPI");
> if ( res )
> - {
> - printk(XENLOG_ERR "Unable to permit to dom%u access to IRQ %u\n",
> - d->domain_id, i);
> return res;
> - }
> }
>
> return 0;
> @@ -1902,7 +1898,7 @@ static int prepare_acpi(struct domain *d, struct
> kernel_info *kinfo)
> if ( rc != 0 )
> return rc;
>
> - rc = acpi_permit_spi_access(d);
> + rc = acpi_route_spis(d);
> if ( rc != 0 )
> return rc;
>
> --
> 1.9.1
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |