From: Rafael J. Wysocki Add try_to_freeze() calls to the remaining kernel threads that do not call try_to_freeze() already, although they set PF_NOFREEZE. In the future we are going to replace PF_NOFREEZE with a set of flags that will be set to indicate in which situations the task should not be frozen (for example, there can be a task that should be frozen for the CPU hotplugging and should not be frozen for the system suspend). For this reason every kernel thread should be able to freeze itself (ie. call try_to_freeze()), so that it can be frozen whenever necessary. Signed-off-by: Rafael J. Wysocki Acked-by: Pavel Machek Cc: Oleg Nesterov Cc: Aneesh Kumar Cc: "Paul E. McKenney" Cc: Srivatsa Vaddagiri Cc: Gautham R Shenoy Cc: Stefan Richter Cc: Neil Brown Cc: Pierre Ossman Cc: David Woodhouse Cc: James Bottomley Cc: Greg KH Cc: Ingo Molnar Signed-off-by: Andrew Morton --- arch/i386/kernel/apm.c | 2 ++ drivers/block/loop.c | 2 ++ drivers/char/apm-emulation.c | 3 +++ drivers/ieee1394/ieee1394_core.c | 3 +++ drivers/md/md.c | 2 ++ drivers/mmc/card/queue.c | 3 +++ drivers/mtd/mtd_blkdevs.c | 3 +++ drivers/scsi/libsas/sas_scsi_host.c | 2 ++ drivers/scsi/scsi_error.c | 3 +++ drivers/usb/storage/usb.c | 2 ++ kernel/softirq.c | 2 ++ kernel/softlockup.c | 2 ++ 12 files changed, 29 insertions(+) diff -puN arch/i386/kernel/apm.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads arch/i386/kernel/apm.c --- a/arch/i386/kernel/apm.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/arch/i386/kernel/apm.c @@ -226,6 +226,7 @@ #include #include #include +#include #include #include @@ -1393,6 +1394,7 @@ static void apm_mainloop(void) add_wait_queue(&apm_waitqueue, &wait); set_current_state(TASK_INTERRUPTIBLE); for (;;) { + try_to_freeze(); schedule_timeout(APM_CHECK_TIMEOUT); if (kthread_should_stop()) break; diff -puN drivers/block/loop.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/block/loop.c --- a/drivers/block/loop.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/block/loop.c @@ -74,6 +74,7 @@ #include #include #include +#include #include @@ -590,6 +591,7 @@ static int loop_thread(void *data) set_user_nice(current, -20); while (!kthread_should_stop() || lo->lo_bio) { + try_to_freeze(); wait_event_interruptible(lo->lo_event, lo->lo_bio || kthread_should_stop()); diff -puN drivers/char/apm-emulation.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/char/apm-emulation.c --- a/drivers/char/apm-emulation.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/char/apm-emulation.c @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -539,6 +540,8 @@ static int kapmd(void *arg) apm_event_t event; int ret; + try_to_freeze(); + wait_event_interruptible(kapmd_wait, !queue_empty(&kapmd_queue) || kthread_should_stop()); diff -puN drivers/ieee1394/ieee1394_core.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/ieee1394/ieee1394_core.c --- a/drivers/ieee1394/ieee1394_core.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/ieee1394/ieee1394_core.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -1147,6 +1148,8 @@ static int hpsbpkt_thread(void *__hi) packet->complete_routine(packet->complete_data); } + try_to_freeze(); + set_current_state(TASK_INTERRUPTIBLE); spin_lock_irq(&pending_packets_lock); may_schedule = list_empty(&hpsbpkt_queue); diff -puN drivers/md/md.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/md/md.c --- a/drivers/md/md.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/md/md.c @@ -4559,6 +4559,8 @@ static int md_thread(void * arg) || kthread_should_stop(), thread->timeout); + try_to_freeze(); + clear_bit(THREAD_WAKEUP, &thread->flags); thread->run(thread->mddev); diff -puN drivers/mmc/card/queue.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/mmc/card/queue.c --- a/drivers/mmc/card/queue.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/mmc/card/queue.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -71,6 +72,8 @@ static int mmc_queue_thread(void *d) do { struct request *req = NULL; + try_to_freeze(); + spin_lock_irq(q->queue_lock); set_current_state(TASK_INTERRUPTIBLE); if (!blk_queue_plugged(q)) diff -puN drivers/mtd/mtd_blkdevs.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/mtd/mtd_blkdevs.c --- a/drivers/mtd/mtd_blkdevs.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/mtd/mtd_blkdevs.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -107,6 +108,8 @@ static int mtd_blktrans_thread(void *arg res = do_blktrans_request(tr, dev, req); mutex_unlock(&dev->lock); + try_to_freeze(); + spin_lock_irq(rq->queue_lock); end_request(req, res); diff -puN drivers/scsi/libsas/sas_scsi_host.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/scsi/libsas/sas_scsi_host.c --- a/drivers/scsi/libsas/sas_scsi_host.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/scsi/libsas/sas_scsi_host.c @@ -41,6 +41,7 @@ #include #include #include +#include /* ---------- SCSI Host glue ---------- */ @@ -871,6 +872,7 @@ static int sas_queue_thread(void *_sas_h current->flags |= PF_NOFREEZE; while (1) { + try_to_freeze(); set_current_state(TASK_INTERRUPTIBLE); schedule(); sas_queue(sas_ha); diff -puN drivers/scsi/scsi_error.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/scsi/scsi_error.c --- a/drivers/scsi/scsi_error.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/scsi/scsi_error.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -1546,6 +1547,8 @@ int scsi_error_handler(void *data) */ set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { + try_to_freeze(); + if ((shost->host_failed == 0 && shost->host_eh_scheduled == 0) || shost->host_failed != shost->host_busy) { SCSI_LOG_ERROR_RECOVERY(1, diff -puN drivers/usb/storage/usb.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads drivers/usb/storage/usb.c --- a/drivers/usb/storage/usb.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/drivers/usb/storage/usb.c @@ -304,6 +304,8 @@ static int usb_stor_control_thread(void current->flags |= PF_NOFREEZE; for(;;) { + try_to_freeze(); + US_DEBUGP("*** thread sleeping.\n"); if(down_interruptible(&us->sema)) break; diff -puN kernel/softirq.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads kernel/softirq.c --- a/kernel/softirq.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/kernel/softirq.c @@ -18,6 +18,7 @@ #include #include #include +#include #include /* @@ -494,6 +495,7 @@ static int ksoftirqd(void * __bind_cpu) set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { + try_to_freeze(); preempt_disable(); if (!local_softirq_pending()) { preempt_enable_no_resched(); diff -puN kernel/softlockup.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads kernel/softlockup.c --- a/kernel/softlockup.c~freezer-add-try_to_freeze-calls-to-all-kernel-threads +++ a/kernel/softlockup.c @@ -13,6 +13,7 @@ #include #include #include +#include static DEFINE_SPINLOCK(print_lock); @@ -127,6 +128,7 @@ static int watchdog(void * __bind_cpu) * debug-printout triggers in softlockup_tick(). */ while (!kthread_should_stop()) { + try_to_freeze(); set_current_state(TASK_INTERRUPTIBLE); touch_softlockup_watchdog(); schedule(); _