[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] On pirq enable/disable we fully unregister/reregister with Xen. This
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1195638071 0 # Node ID 51b2b0d0921c3aefb18e16a2eda68a5c3133e949 # Parent 037c44559e55120f9bb746383023670ae1582380 On pirq enable/disable we fully unregister/reregister with Xen. This causes the underlying IRQ to be properly masked/unmasked, thus avoiding deadlock scenarios if the IRQ is not EOIed. Based on a patch by Chris Lalancette <clalance@xxxxxxxxxx> Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxxxxx> --- drivers/xen/core/evtchn.c | 16 +++++----------- 1 files changed, 5 insertions(+), 11 deletions(-) diff -r 037c44559e55 -r 51b2b0d0921c drivers/xen/core/evtchn.c --- a/drivers/xen/core/evtchn.c Tue Nov 20 17:30:31 2007 +0000 +++ b/drivers/xen/core/evtchn.c Wed Nov 21 09:41:11 2007 +0000 @@ -782,20 +782,11 @@ static void shutdown_pirq(unsigned int i static void enable_pirq(unsigned int irq) { - int evtchn = evtchn_from_irq(irq); - - if (VALID_EVTCHN(evtchn)) { - unmask_evtchn(evtchn); - pirq_unmask_notify(irq_to_pirq(irq)); - } + startup_pirq(irq); } static void disable_pirq(unsigned int irq) { - int evtchn = evtchn_from_irq(irq); - - if (VALID_EVTCHN(evtchn)) - mask_evtchn(evtchn); } static void ack_pirq(unsigned int irq) @@ -814,7 +805,10 @@ static void end_pirq(unsigned int irq) { int evtchn = evtchn_from_irq(irq); - if (VALID_EVTCHN(evtchn) && !(irq_desc[irq].status & IRQ_DISABLED)) { + if ((irq_desc[irq].status & (IRQ_DISABLED|IRQ_PENDING)) == + (IRQ_DISABLED|IRQ_PENDING)) { + shutdown_pirq(irq); + } else if (VALID_EVTCHN(evtchn)) { unmask_evtchn(evtchn); pirq_unmask_notify(irq_to_pirq(irq)); } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |