|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] missing vgic_unlock_rank in gic_remove_irq_from_guest
Hi Stefano
On 09.12.16 02:59, Stefano Stabellini wrote:
> Add missing vgic_unlock_rank on the error path in
> gic_remove_irq_from_guest.
>
> CID: 1381843
>
> Signed-off-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index 63c744a..a5348f2 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -205,7 +205,10 @@ int gic_remove_irq_from_guest(struct domain *d, unsigned
> int virq,
> */
> if ( test_bit(_IRQ_INPROGRESS, &desc->status) ||
> !test_bit(_IRQ_DISABLED, &desc->status) )
> + {
> + vgic_unlock_rank(v_target, rank, flags);
> return -EBUSY;
> + }
> }
>
> clear_bit(_IRQ_GUEST, &desc->status);
>
>
would it be better to do it in the same way it is done in
gic_route_irq_to_guest() just above the patched function?
Something like:
diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
index 63c744a..a9bf5d9 100644
--- a/xen/arch/arm/gic.c
+++ b/xen/arch/arm/gic.c
@@ -181,6 +181,7 @@ int gic_remove_irq_from_guest(struct domain *d, unsigned
int virq,
struct vgic_irq_rank *rank = vgic_rank_irq(v_target, virq);
struct pending_irq *p = irq_to_pending(v_target, virq);
unsigned long flags;
+ int res = -EBUSY;
ASSERT(spin_is_locked(&desc->lock));
ASSERT(test_bit(_IRQ_GUEST, &desc->status));
@@ -205,17 +206,19 @@ int gic_remove_irq_from_guest(struct domain *d, unsigned
int virq,
*/
if ( test_bit(_IRQ_INPROGRESS, &desc->status) ||
!test_bit(_IRQ_DISABLED, &desc->status) )
- return -EBUSY;
+ goto out;
}
clear_bit(_IRQ_GUEST, &desc->status);
desc->handler = &no_irq_type;
p->desc = NULL;
+ res = 0;
+out:
vgic_unlock_rank(v_target, rank, flags);
- return 0;
+ return res;
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |