freezer: don't unnecessarily set PF_NOFREEZE explicitly
authorTejun Heo <tj@kernel.org>
Mon, 21 Nov 2011 20:32:22 +0000 (12:32 -0800)
committerTejun Heo <tj@kernel.org>
Mon, 21 Nov 2011 20:32:22 +0000 (12:32 -0800)
Some drivers set PF_NOFREEZE in their kthread functions which is
completely unnecessary and racy - some part of freezer code doesn't
consider cases where PF_NOFREEZE is set asynchronous to freezer
operations.

In general, there's no reason to allow setting PF_NOFREEZE explicitly.
Remove them and change the documentation to note that setting
PF_NOFREEZE directly isn't allowed.

-v2: Dropped change to twl4030-irq.c as it no longer uses PF_NOFREEZE.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: "Gustavo F. Padovan" <padovan@profusion.mobi>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Cc: Marcel Holtmann <marcel@holtmann.org>
Cc: wwang <wei_wang@realsil.com.cn>
Documentation/power/freezing-of-tasks.txt
drivers/bluetooth/btmrvl_main.c
drivers/mfd/twl6030-irq.c
drivers/staging/rts_pstor/rtsx.c

index 316c2ba187f49980a96a80ec460510013c5aacdb..587e0828053f71c48c28c8157a4047975d2f3629 100644 (file)
@@ -67,7 +67,7 @@ III. Which kernel threads are freezable?
 
 Kernel threads are not freezable by default.  However, a kernel thread may clear
 PF_NOFREEZE for itself by calling set_freezable() (the resetting of PF_NOFREEZE
-directly is strongly discouraged).  From this point it is regarded as freezable
+directly is not allowed).  From this point it is regarded as freezable
 and must call try_to_freeze() in a suitable place.
 
 IV. Why do we do that?
index a88a78c86162fb15516fe5525a639f0769dec18d..6c3defa508454e1d76937abf9235b07fc6e880a8 100644 (file)
@@ -475,8 +475,6 @@ static int btmrvl_service_main_thread(void *data)
 
        init_waitqueue_entry(&wait, current);
 
-       current->flags |= PF_NOFREEZE;
-
        for (;;) {
                add_wait_queue(&thread->wait_q, &wait);
 
index 3eee45ffb096e337d1e1aa67040532a14ff0b670..c6b456ad7342755c83e4f31d1106dd9d74cf5ca6 100644 (file)
@@ -138,8 +138,6 @@ static int twl6030_irq_thread(void *data)
        static const unsigned max_i2c_errors = 100;
        int ret;
 
-       current->flags |= PF_NOFREEZE;
-
        while (!kthread_should_stop()) {
                int i;
                union {
index 480b0ed2e4de8975ea315504190c5eff02e5ac59..8a7803cf88d2a566447d72de0722a00299c05872 100644 (file)
@@ -466,8 +466,6 @@ static int rtsx_control_thread(void *__dev)
        struct rtsx_chip *chip = dev->chip;
        struct Scsi_Host *host = rtsx_to_host(dev);
 
-       current->flags |= PF_NOFREEZE;
-
        for (;;) {
                if (wait_for_completion_interruptible(&dev->cmnd_ready))
                        break;