aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBorislav Petkov <borislav.petkov@amd.com>2010-09-26 12:42:23 +0200
committerBorislav Petkov <borislav.petkov@amd.com>2010-09-27 12:52:58 +0200
commit00740c58541b6087d78418cebca1fcb86dc6077d (patch)
tree0d66f4d50dac7ad66997429e1f6ed702ec74afa5
parentLinux 2.6.36-rc5 (diff)
downloadlinux-dev-00740c58541b6087d78418cebca1fcb86dc6077d.tar.xz
linux-dev-00740c58541b6087d78418cebca1fcb86dc6077d.zip
amd64_edac: Fix driver module removal
f4347553b30ec66530bfe63c84530afea3803396 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 <borislav.petkov@amd.com>
-rw-r--r--drivers/edac/edac_mc.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index 3630308e7b81..6b21e25f7a84 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",