PM / Sleep: Replace mutex_[un]lock(&pm_mutex) with [un]lock_system_sleep()
authorSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Wed, 7 Dec 2011 21:29:54 +0000 (22:29 +0100)
committerRafael J. Wysocki <rjw@sisk.pl>
Thu, 8 Dec 2011 22:22:29 +0000 (23:22 +0100)
Using [un]lock_system_sleep() is safer than directly using mutex_[un]lock()
on 'pm_mutex', since the latter could lead to freezing failures. Hence convert
all the present users of mutex_[un]lock(&pm_mutex) to use these safe APIs
instead.

Suggested-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Reviewed-by: Simon Horman <horms@verge.net.au>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
kernel/kexec.c
kernel/power/hibernate.c
kernel/power/main.c
kernel/power/suspend.c
kernel/power/user.c

index dc7bc0829286d60cd5e37e162441bdc7a8d12b46..090ee10d960485c6b9ed1923ef66c467c6fa19ea 100644 (file)
@@ -1523,7 +1523,7 @@ int kernel_kexec(void)
 
 #ifdef CONFIG_KEXEC_JUMP
        if (kexec_image->preserve_context) {
-               mutex_lock(&pm_mutex);
+               lock_system_sleep();
                pm_prepare_console();
                error = freeze_processes();
                if (error) {
@@ -1576,7 +1576,7 @@ int kernel_kexec(void)
                thaw_processes();
  Restore_console:
                pm_restore_console();
-               mutex_unlock(&pm_mutex);
+               unlock_system_sleep();
        }
 #endif
 
index 605149a6d21904153779aaefda353f7df013bacd..6d6d28870335831fa05c80428fefc05e20be3f69 100644 (file)
@@ -69,14 +69,14 @@ void hibernation_set_ops(const struct platform_hibernation_ops *ops)
                WARN_ON(1);
                return;
        }
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
        hibernation_ops = ops;
        if (ops)
                hibernation_mode = HIBERNATION_PLATFORM;
        else if (hibernation_mode == HIBERNATION_PLATFORM)
                hibernation_mode = HIBERNATION_SHUTDOWN;
 
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
 }
 
 static bool entering_platform_hibernation;
@@ -597,7 +597,7 @@ int hibernate(void)
 {
        int error;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
        /* The snapshot device should not be opened while we're running */
        if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
                error = -EBUSY;
@@ -665,7 +665,7 @@ int hibernate(void)
        pm_restore_console();
        atomic_inc(&snapshot_device_available);
  Unlock:
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
        return error;
 }
 
@@ -893,7 +893,7 @@ static ssize_t disk_store(struct kobject *kobj, struct kobj_attribute *attr,
        p = memchr(buf, '\n', n);
        len = p ? p - buf : n;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
        for (i = HIBERNATION_FIRST; i <= HIBERNATION_MAX; i++) {
                if (len == strlen(hibernation_modes[i])
                    && !strncmp(buf, hibernation_modes[i], len)) {
@@ -919,7 +919,7 @@ static ssize_t disk_store(struct kobject *kobj, struct kobj_attribute *attr,
        if (!error)
                pr_debug("PM: Hibernation mode set to '%s'\n",
                         hibernation_modes[mode]);
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
        return error ? error : n;
 }
 
@@ -946,9 +946,9 @@ static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr,
        if (maj != MAJOR(res) || min != MINOR(res))
                goto out;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
        swsusp_resume_device = res;
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
        printk(KERN_INFO "PM: Starting manual resume from disk\n");
        noresume = 0;
        software_resume();
index 7d36fb31e4c45aede5c2e440ee47f92588b66bf0..9824b41e5a18cf5ecc5e57773b5ccc2195984c99 100644 (file)
@@ -116,7 +116,7 @@ static ssize_t pm_test_store(struct kobject *kobj, struct kobj_attribute *attr,
        p = memchr(buf, '\n', n);
        len = p ? p - buf : n;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
 
        level = TEST_FIRST;
        for (s = &pm_tests[level]; level <= TEST_MAX; s++, level++)
@@ -126,7 +126,7 @@ static ssize_t pm_test_store(struct kobject *kobj, struct kobj_attribute *attr,
                        break;
                }
 
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
 
        return error ? error : n;
 }
index d336b27d1104fb5aa7aceff18c1742166325cf6d..4fd51beed87955f938f7b6545e49ffec0430da56 100644 (file)
@@ -42,9 +42,9 @@ static const struct platform_suspend_ops *suspend_ops;
  */
 void suspend_set_ops(const struct platform_suspend_ops *ops)
 {
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
        suspend_ops = ops;
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
 }
 EXPORT_SYMBOL_GPL(suspend_set_ops);
 
index 06ea33df856092ed0cc9f7dba070697a73b00ee0..98ade217da6c2c8d032c78a56d5358170d12819d 100644 (file)
@@ -71,7 +71,7 @@ static int snapshot_open(struct inode *inode, struct file *filp)
        struct snapshot_data *data;
        int error;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
 
        if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
                error = -EBUSY;
@@ -123,7 +123,7 @@ static int snapshot_open(struct inode *inode, struct file *filp)
        data->platform_support = 0;
 
  Unlock:
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
 
        return error;
 }
@@ -132,7 +132,7 @@ static int snapshot_release(struct inode *inode, struct file *filp)
 {
        struct snapshot_data *data;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
 
        swsusp_free();
        free_basic_memory_bitmaps();
@@ -146,7 +146,7 @@ static int snapshot_release(struct inode *inode, struct file *filp)
                        PM_POST_HIBERNATION : PM_POST_RESTORE);
        atomic_inc(&snapshot_device_available);
 
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
 
        return 0;
 }
@@ -158,7 +158,7 @@ static ssize_t snapshot_read(struct file *filp, char __user *buf,
        ssize_t res;
        loff_t pg_offp = *offp & ~PAGE_MASK;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
 
        data = filp->private_data;
        if (!data->ready) {
@@ -179,7 +179,7 @@ static ssize_t snapshot_read(struct file *filp, char __user *buf,
                *offp += res;
 
  Unlock:
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
 
        return res;
 }
@@ -191,7 +191,7 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,
        ssize_t res;
        loff_t pg_offp = *offp & ~PAGE_MASK;
 
-       mutex_lock(&pm_mutex);
+       lock_system_sleep();
 
        data = filp->private_data;
 
@@ -208,7 +208,7 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,
        if (res > 0)
                *offp += res;
 unlock:
-       mutex_unlock(&pm_mutex);
+       unlock_system_sleep();
 
        return res;
 }