linux/drivers/xen/events
David Vrabel 8d3cbb9096 xen/events: don't bind non-percpu VIRQs with percpu chip
commit 77bb3dfdc0 upstream.

A non-percpu VIRQ (e.g., VIRQ_CONSOLE) may be freed on a different
VCPU than it is bound to.  This can result in a race between
handle_percpu_irq() and removing the action in __free_irq() because
handle_percpu_irq() does not take desc->lock.  The interrupt handler
sees a NULL action and oopses.

Only use the percpu chip/handler for per-CPU VIRQs (like VIRQ_TIMER).

  # cat /proc/interrupts | grep virq
   40:      87246          0  xen-percpu-virq      timer0
   44:          0          0  xen-percpu-virq      debug0
   47:          0      20995  xen-percpu-virq      timer1
   51:          0          0  xen-percpu-virq      debug1
   69:          0          0   xen-dyn-virq      xen-pcpu
   74:          0          0   xen-dyn-virq      mce
   75:         29          0   xen-dyn-virq      hvc_console

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-06-06 08:19:32 -07:00
..
Makefile xen/events: use the FIFO-based ABI if available 2014-01-06 10:07:57 -05:00
events_2l.c xen/events: Clear cpu_evtchn_mask before resuming 2015-05-17 09:53:49 -07:00
events_base.c xen/events: don't bind non-percpu VIRQs with percpu chip 2015-06-06 08:19:32 -07:00
events_fifo.c xen/events/fifo: reset control block and local HEADs on resume 2014-09-17 09:19:20 -07:00
events_internal.h xen/events: use the FIFO-based ABI if available 2014-01-06 10:07:57 -05:00