From: Pavel Machek Yep, here's the diff. It fixes it for me. I could not helf myself and fixed codingstyle a bit around that... feel free to take it or ignore it. Only important line is try_to_freeze(). Signed-off-by: Pavel Machek Cc: Alan Cox Signed-off-by: Andrew Morton --- drivers/edac/edac_mc.c | 22 ++++++++++------------ 1 files changed, 10 insertions(+), 12 deletions(-) diff -puN drivers/edac/edac_mc.c~edac-swsusp-fixes drivers/edac/edac_mc.c --- devel/drivers/edac/edac_mc.c~edac-swsusp-fixes 2006-01-08 10:50:26.000000000 -0800 +++ devel-akpm/drivers/edac/edac_mc.c 2006-01-08 10:50:26.000000000 -0800 @@ -45,8 +45,6 @@ int edac_debug_level = 1; EXPORT_SYMBOL(edac_debug_level); #endif -#define EDAC_THREAD_NAME "kedac" - /* EDAC Controls, setable by module parameter, and sysfs */ static int log_ue = 1; static int log_ce = 1; @@ -54,7 +52,7 @@ static int panic_on_ue = 1; static int poll_msec = 1000; static int check_pci_parity = 1; /* default YES check PCI parity */ -static int panic_on_pci_parity = 0; /* default no panic on PCI Parity */ +static int panic_on_pci_parity; /* default no panic on PCI Parity */ static atomic_t pci_parity_count = ATOMIC_INIT(0); /* lock to memory controller's control array */ @@ -138,13 +136,13 @@ static struct kobject edac_pci_kobj; static ssize_t memctrl_string_show(void *ptr, char *buffer) { char *value = (char*) ptr; - return sprintf(buffer,"%s\n",value); + return sprintf(buffer, "%s\n", value); } static ssize_t memctrl_int_show(void *ptr, char *buffer) { int *value = (int*) ptr; - return sprintf(buffer,"%d\n",*value); + return sprintf(buffer, "%d\n", *value); } static ssize_t memctrl_int_store(void *ptr, const char *buffer, size_t count) @@ -152,7 +150,7 @@ static ssize_t memctrl_int_store(void *p int *value = (int*) ptr; if (isdigit(*buffer)) - *value = simple_strtoul(buffer,NULL,0); + *value = simple_strtoul(buffer, NULL, 0); return count; } @@ -164,7 +162,7 @@ struct memctrl_dev_attribute { ssize_t (*store)(void *, const char *, size_t); }; -/* Set of show/store abstract level functions for memory control object */ +/* Set of show/store abstract level functions for memory control object */ static ssize_t memctrl_dev_show(struct kobject *kobj, struct attribute *attr, char *buffer) { @@ -2066,10 +2064,10 @@ static int edac_kernel_thread(void *arg) /* call the function to check the memory controllers */ run = thread->run; - if(run) + if (run) run(); - if(signal_pending(current)) + if (signal_pending(current)) flush_signals(current); /* ensure we are interruptable */ @@ -2077,6 +2075,7 @@ static int edac_kernel_thread(void *arg) /* goto sleep for the interval */ schedule_timeout((HZ * poll_msec) / 1000); + try_to_freeze(); } /* notify waiter that we are exiting */ @@ -2124,16 +2123,15 @@ static int __init edac_mc_init(void) /* Create our kernel thread */ init_completion(&event); bs_thread.event = &event; - bs_thread.name = EDAC_THREAD_NAME; + bs_thread.name = "kedac"; bs_thread.run = do_edac_check; /* create our kernel thread */ ret = kernel_thread(edac_kernel_thread, &bs_thread, CLONE_KERNEL); - if(ret < 0) { + if (ret < 0) { /* remove the sysfs entries */ edac_sysfs_memctrl_teardown(); edac_sysfs_pci_teardown(); - return -ENOMEM; } _