|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 8/8] xen/arm: acpi: route all unused IRQs to DOM0
On Tue, 7 Jun 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.
Yeah, it's a pity. The patch is certainly an improvement and it would
fix ACPI, which is currently broken, so I think it should go in pretty
much as is. (See only one small comment below.)
But I wonder if we could do something better by the next release. Have
you considered using something like a tasklet to call
route_irq_to_guest? The tasklet would be scheduled only after
vgic_enable_irqs is called.
Something like:
- guest writes to GICD_ISENABLER
- run vgic_enable_irqs
- enable tasklet
- tasklet run
- call route_irq_to_guest
?
> 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>
> ---
> xen/arch/arm/domain_build.c | 19 ++++++++-----------
> 1 file changed, 8 insertions(+), 11 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 00dc07a..76d503d 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -953,11 +953,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);
> @@ -977,7 +976,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",
> @@ -997,6 +996,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 )
> {
> @@ -1015,7 +1015,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;
> }
> @@ -1152,7 +1152,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;
> }
> @@ -1411,13 +1411,10 @@ static int acpi_permit_spi_access(struct domain *d)
I would rename acpi_permit_spi_access to acpi_route_spis_to_dom0 or
something like that, to reflect the change in behavior of the function.
> 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;
> - }
> }
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |