| From bb31b3122c0dd07d2d958da17a50ad771ce79e2b Mon Sep 17 00:00:00 2001 |
| From: Borislav Petkov <borislav.petkov@amd.com> |
| Date: Thu, 2 Dec 2010 17:48:35 +0100 |
| Subject: EDAC: Fix workqueue-related crashes |
| |
| From: Borislav Petkov <borislav.petkov@amd.com> |
| |
| commit bb31b3122c0dd07d2d958da17a50ad771ce79e2b upstream. |
| |
| 00740c58541b6087d78418cebca1fcb86dc6077d changed edac_core to |
| un-/register a workqueue item only if a lowlevel driver supplies a |
| polling routine. Normally, when we remove a polling low-level driver, we |
| go and cancel all the queued work. However, the workqueue unreg happens |
| based on the ->op_state setting, and edac_mc_del_mc() sets this to |
| OP_OFFLINE _before_ we cancel the work item, leading to NULL ptr oops on |
| the workqueue list. |
| |
| Fix it by putting the unreg stuff in proper order. |
| |
| Reported-and-tested-by: Tobias Karnat <tobias.karnat@googlemail.com> |
| LKML-Reference: <1291201307.3029.21.camel@Tobias-Karnat> |
| Signed-off-by: Borislav Petkov <borislav.petkov@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/edac/edac_mc.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/edac/edac_mc.c |
| +++ b/drivers/edac/edac_mc.c |
| @@ -578,14 +578,16 @@ struct mem_ctl_info *edac_mc_del_mc(stru |
| return NULL; |
| } |
| |
| - /* marking MCI offline */ |
| - mci->op_state = OP_OFFLINE; |
| - |
| del_mc_from_global_list(mci); |
| mutex_unlock(&mem_ctls_mutex); |
| |
| - /* flush workq processes and remove sysfs */ |
| + /* flush workq processes */ |
| edac_mc_workq_teardown(mci); |
| + |
| + /* marking MCI offline */ |
| + mci->op_state = OP_OFFLINE; |
| + |
| + /* remove from sysfs */ |
| edac_remove_sysfs_mci_device(mci); |
| |
| edac_printk(KERN_INFO, EDAC_MC, |