]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
EDAC: Robustify workqueues destruction
authorBorislav Petkov <bp@suse.de>
Fri, 27 Nov 2015 09:38:38 +0000 (10:38 +0100)
committerSasha Levin <sasha.levin@oracle.com>
Mon, 1 Feb 2016 16:37:44 +0000 (11:37 -0500)
commit94fde0abd09b14f0e50efe87edb36ec0d1e88510
tree265134758d0bdcccdd5c873eb834a9b8874ee21b
parenteddf977af760a73a9072299e5a41bdb3de4c3930
EDAC: Robustify workqueues destruction

[ Upstream commit fcd5c4dd8201595d4c598c9cca5e54760277d687 ]

EDAC workqueue destruction is really fragile. We cancel delayed work
but if it is still running and requeues itself, we still go ahead and
destroy the workqueue and the queued work explodes when workqueue core
attempts to run it.

Make the destruction more robust by switching op_state to offline so
that requeuing stops. Cancel any pending work *synchronously* too.

  EDAC i7core: Driver loaded.
  general protection fault: 0000 [#1] SMP
  CPU 12
  Modules linked in:
  Supported: Yes
  Pid: 0, comm: kworker/0:1 Tainted: G          IE   3.0.101-0-default #1 HP ProLiant DL380 G7
  RIP: 0010:[<ffffffff8107dcd7>]  [<ffffffff8107dcd7>] __queue_work+0x17/0x3f0
  < ... regs ...>
  Process kworker/0:1 (pid: 0, threadinfo ffff88019def6000, task ffff88019def4600)
  Stack:
   ...
  Call Trace:
   call_timer_fn
   run_timer_softirq
   __do_softirq
   call_softirq
   do_softirq
   irq_exit
   smp_apic_timer_interrupt
   apic_timer_interrupt
   intel_idle
   cpuidle_idle_call
   cpu_idle
  Code: ...
  RIP  __queue_work
   RSP <...>

Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: <stable@vger.kernel.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
drivers/edac/edac_device.c
drivers/edac/edac_mc.c
drivers/edac/edac_pci.c