Hi, The suspend/hibernation is broken on SMP due to:
commit 3540af8ffddcdbc7573451ac0b5cd57a2eaf8af5 tifm: replace per-adapter kthread with freezeable workqueue Well, it looks like freezable worqueues still deadlock with CPU hotplug when worker threads are frozen. The appended patch fixes the issue, but I think we could even avoid the killing of frozen worker threads. Greetings, Rafael --- Prevent freezable worqueues from deadlocking with CPU hotplug during a suspend/hibernation by thawing their worker threads before they get stopped. Signed-off-by: Rafael J. Wysocki <[EMAIL PROTECTED]> --- kernel/workqueue.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) Index: linux-2.6.22-rc1/kernel/workqueue.c =================================================================== --- linux-2.6.22-rc1.orig/kernel/workqueue.c +++ linux-2.6.22-rc1/kernel/workqueue.c @@ -799,9 +799,7 @@ static int __devinit workqueue_cpu_callb struct cpu_workqueue_struct *cwq; struct workqueue_struct *wq; - action &= ~CPU_TASKS_FROZEN; - - switch (action) { + switch (action & ~CPU_TASKS_FROZEN) { case CPU_LOCK_ACQUIRE: mutex_lock(&workqueue_mutex); return NOTIFY_OK; @@ -819,20 +817,29 @@ static int __devinit workqueue_cpu_callb switch (action) { case CPU_UP_PREPARE: + case CPU_UP_PREPARE_FROZEN: if (!create_workqueue_thread(cwq, cpu)) break; printk(KERN_ERR "workqueue for %i failed\n", cpu); return NOTIFY_BAD; case CPU_ONLINE: + case CPU_ONLINE_FROZEN: start_workqueue_thread(cwq, cpu); break; case CPU_UP_CANCELED: + case CPU_UP_CANCELED_FROZEN: start_workqueue_thread(cwq, -1); case CPU_DEAD: cleanup_workqueue_thread(cwq, cpu); break; + + case CPU_DEAD_FROZEN: + if (wq->freezeable) + thaw_process(cwq->thread); + cleanup_workqueue_thread(cwq, cpu); + break; } } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/