summaryrefslogtreecommitdiffstats
path: root/drivers/xen
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2010-08-21 04:10:01 +0200
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2010-08-24 20:14:12 +0200
commitdffe2e1e1a1ddb566a76266136c312801c66dcf7 (patch)
tree2c78da36fc090fff84ff316899f261d221155136 /drivers/xen
parentxen: use percpu interrupts for IPIs and VIRQs (diff)
downloadlinux-dffe2e1e1a1ddb566a76266136c312801c66dcf7.tar.xz
linux-dffe2e1e1a1ddb566a76266136c312801c66dcf7.zip
xen: handle events as edge-triggered
Xen events are logically edge triggered, as Xen only calls the event upcall when an event is newly set, but not continuously as it remains set. As a result, use handle_edge_irq rather than handle_level_irq. This has the important side-effect of fixing a long-standing bug of events getting lost if: - an event's interrupt handler is running - the event is migrated to a different vcpu - the event is re-triggered The most noticable symptom of these lost events is occasional lockups of blkfront. Many thanks to Tom Kopec and Daniel Stodden in tracking this down. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: Tom Kopec <tek@acm.org> Cc: Daniel Stodden <daniel.stodden@citrix.com> Cc: Stable Kernel <stable@kernel.org>
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/events.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 0923ccb26121..13365ba35218 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -378,7 +378,7 @@ int bind_evtchn_to_irq(unsigned int evtchn)
irq = find_unbound_irq();
set_irq_chip_and_handler_name(irq, &xen_dynamic_chip,
- handle_level_irq, "event");
+ handle_edge_irq, "event");
evtchn_to_irq[evtchn] = irq;
irq_info[irq] = mk_evtchn_info(evtchn);