summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2015-05-19 18:40:49 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-06-06 08:20:52 -0700
commita4b513b2a434a02381f2c981a3aba6ecb000118e (patch)
tree6bf061471cb53c5af1f695823ed3800cea838e66 /include
parent68482f12d90fb757eef19493fb7bf7fdc1029a7a (diff)
downloadlinux-exynos-a4b513b2a434a02381f2c981a3aba6ecb000118e.tar.gz
linux-exynos-a4b513b2a434a02381f2c981a3aba6ecb000118e.tar.bz2
linux-exynos-a4b513b2a434a02381f2c981a3aba6ecb000118e.zip
xen/events: don't bind non-percpu VIRQs with percpu chip
commit 77bb3dfdc0d554befad58fdefbc41be5bc3ed38a 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>
Diffstat (limited to 'include')
-rw-r--r--include/xen/events.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/include/xen/events.h b/include/xen/events.h
index 5321cd9636e6..7d95fdf9cf3e 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -17,7 +17,7 @@ int bind_evtchn_to_irqhandler(unsigned int evtchn,
irq_handler_t handler,
unsigned long irqflags, const char *devname,
void *dev_id);
-int bind_virq_to_irq(unsigned int virq, unsigned int cpu);
+int bind_virq_to_irq(unsigned int virq, unsigned int cpu, bool percpu);
int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu,
irq_handler_t handler,
unsigned long irqflags, const char *devname,