From fd47aaf8e76221439e21fd1dc4875f54f05d77c6 Mon Sep 17 00:00:00 2001 From: Borislav Petkov Date: Sun, 26 Sep 2010 12:42:23 +0200 Subject: [PATCH] amd64_edac: Fix driver module removal 64aaff2abe9ba958bc4976821fb470614f39db2b removed the edac polling mechanism in favor of using a notifier chain for conveying MCE information to edac. However, the module removal path didn't test whether the driver had setup the polling function workqueue at all and the rmmod process was hanging in the kernel at try_to_del_timer_sync() in the cancel_delayed_work() path, trying to cancel an uninitialized work struct. Fix that by adding a balancing check to the workqueue removal path. Signed-off-by: Borislav Petkov --- drivers/edac/edac_mc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index 3630308e7b811..6b21e25f7a84c 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c @@ -339,6 +339,9 @@ static void edac_mc_workq_teardown(struct mem_ctl_info *mci) { int status; + if (mci->op_state != OP_RUNNING_POLL) + return; + status = cancel_delayed_work(&mci->work); if (status == 0) { debugf0("%s() not canceled, flush the queue\n", -- 2.39.5