[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-4.1-testing] Clear IRQ_GUEST in irq_desc->status when setting action to NULL.
# HG changeset patch # User Igor Mammedov <imammedo@xxxxxxxxxx> # Date 1317655792 -3600 # Node ID 2a0cd93f7ed9666ac60baa19c69bd89cad63c79e # Parent 5c395e993fe4064f0e3e13af70af9e440dc00689 Clear IRQ_GUEST in irq_desc->status when setting action to NULL. Looking more closely at usage of action field with relation to IRQ_GUEST flag. It appears that set IRQ_GUEST implies that action is not NULL. As result it is not safe to set action to NULL and leave IRQ_GUEST set. Hence IRQ_GUEST should be cleared in dynamic_irq_cleanup where action is set to NULL. An addition remove BUGON at __pirq_guest_unbind that appears to be bogus and not needed anymore. Thanks Paolo Bonzini for NACKing previous patch, and pointing at the correct solution. Signed-off-by: Igor Mammedov <imammedo@xxxxxxxxxx> Reinstate the BUG_ON, but after the action==NULL check. Since we then go and start interpreting action as an irq_guest_action_t, the BUG_ON is relevant here. More generally, the brute-force nature of dynamic_irq_cleanup() looks a bit worrying. Possibly there should be more integratioin with pirq_guest_unbind() logic, for cleaning up un-acked EOIs and the like. Signed-off-by: Keir Fraser <keir@xxxxxxx> xen-unstable changeset: 23852:c944e82bb092 xen-unstable date: Sun Sep 18 00:00:26 2011 +0100 --- diff -r 5c395e993fe4 -r 2a0cd93f7ed9 xen/arch/x86/irq.c --- a/xen/arch/x86/irq.c Tue Sep 27 17:27:17 2011 +0100 +++ b/xen/arch/x86/irq.c Mon Oct 03 16:29:52 2011 +0100 @@ -152,6 +152,7 @@ spin_lock_irqsave(&desc->lock, flags); desc->status |= IRQ_DISABLED; + desc->status &= ~IRQ_GUEST; desc->handler->shutdown(irq); action = desc->action; desc->action = NULL; @@ -1288,8 +1289,6 @@ cpumask_t cpu_eoi_map; int i; - BUG_ON(!(desc->status & IRQ_GUEST)); - action = (irq_guest_action_t *)desc->action; irq = desc - irq_desc; @@ -1300,6 +1299,8 @@ return NULL; } + BUG_ON(!(desc->status & IRQ_GUEST)); + for ( i = 0; (i < action->nr_guests) && (action->guest[i] != d); i++ ) continue; BUG_ON(i == action->nr_guests); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |