|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC XEN PATCH v3 08/11] xen: arm: vgic: don't fail if IRQ is already connected
On Fri, 15 Nov 2019, Stewart Hildebrand wrote:
> There are some IRQs that happen to have multiple "interrupts = < ... >;"
> properties with the same IRQ in the device tree. For example:
>
> interrupts = <0 123 4>,
> <0 123 4>,
> <0 123 4>,
> <0 123 4>,
> <0 123 4>;
>
> In this case it seems that we are invoking vgic_connect_hw_irq multiple
> times for the same IRQ.
>
> Rework the checks to allow booting in this scenario.
>
> I have not seen any cases where the pre-existing p->desc is any different from
> the new desc, so BUG() out if they're different for now.
>
> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxxxxxxxxxx>
>
> ---
> v3: new patch
>
> I tested on Xilinx Zynq UltraScale+ with the old vGIC. I have not fully
> tested with CONFIG_NEW_VGIC. This hack only became necessary after
> introducing the PPI series, and I'm not entirely sure what the reason
> is for that.
I think the reason is actually very simple: with the previous code if
the irq was already setup and the details matched it would "goto out"
all the way out of route_irq_to_guest.
Now with the new code, it would "goto out" of setup_guest_irq returning
zero, which means that gic_route_irq_to_guest is actually going to be
called anyway, which is a mistake. I think we want to avoid that by
returning an appropriate error condition from setup_guest_irq so that we
also return early from route_irq_to_guest.
> I'm also unsure if BUG()ing out is the right thing to do in case of
> desc != p->desc, or what conditions would even trigger this? Is this
> function exposed to guests?
I think the original code printed a warning and returned an error.
That's probably still what we want.
> ---
> xen/arch/arm/gic-vgic.c | 9 +++++++--
> xen/arch/arm/vgic/vgic.c | 4 ++++
> 2 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/xen/arch/arm/gic-vgic.c b/xen/arch/arm/gic-vgic.c
> index 2c66a8fa92..5c16e66b32 100644
> --- a/xen/arch/arm/gic-vgic.c
> +++ b/xen/arch/arm/gic-vgic.c
> @@ -460,9 +460,14 @@ int vgic_connect_hw_irq(struct domain *d, struct vcpu
> *v, unsigned int virq,
> if ( connect )
> {
> /* The VIRQ should not be already enabled by the guest */
> - if ( !p->desc &&
> - !test_bit(GIC_IRQ_GUEST_ENABLED, &p->status) )
> + if ( !test_bit(GIC_IRQ_GUEST_ENABLED, &p->status) )
> + {
> + if (p->desc && p->desc != desc)
Code style
> + {
> + BUG();
> + }
> p->desc = desc;
> + }
> else
> ret = -EBUSY;
> }
> diff --git a/xen/arch/arm/vgic/vgic.c b/xen/arch/arm/vgic/vgic.c
> index f0f2ea5021..aa775f7668 100644
> --- a/xen/arch/arm/vgic/vgic.c
> +++ b/xen/arch/arm/vgic/vgic.c
> @@ -882,6 +882,10 @@ int vgic_connect_hw_irq(struct domain *d, struct vcpu
> *vcpu,
> irq->hw = true;
> irq->hwintid = desc->irq;
> }
> + else if ( irq->hw && !irq->enabled && irq->hwintid == desc->irq )
> + {
> + /* The IRQ was already connected. No action is necessary. */
> + }
> else
> ret = -EBUSY;
> }
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |