]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
xen/events: don't bind non-percpu VIRQs with percpu chip
authorDavid Vrabel <david.vrabel@citrix.com>
Tue, 19 May 2015 17:40:49 +0000 (18:40 +0100)
committerSasha Levin <sasha.levin@oracle.com>
Tue, 9 Jun 2015 17:43:54 +0000 (13:43 -0400)
commitda9888ac0e1a4c923ad3c4978d310bbf7c32f0d7
treed686d800ba4db57081b5b5f6043876172cfd5eab
parentb9633548477bc537c11a171af6f6c7d39746ff4a
xen/events: don't bind non-percpu VIRQs with percpu chip

[ Upstream commit 77bb3dfdc0d554befad58fdefbc41be5bc3ed38a ]

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>
Cc: <stable@vger.kernel.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
drivers/tty/hvc/hvc_xen.c
drivers/xen/events/events_base.c
include/xen/events.h