Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bcda53fa authored by Srivatsa S. Bhat's avatar Srivatsa S. Bhat Committed by Rafael J. Wysocki
Browse files

PM / Sleep: Replace mutex_[un]lock(&pm_mutex) with [un]lock_system_sleep()



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: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Reviewed-by: default avatarSimon Horman <horms@verge.net.au>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent 9b6fc5dc
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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

+8 −8
Original line number Diff line number Diff line
@@ -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();
+2 −2
Original line number Diff line number Diff line
@@ -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;
}
+2 −2
Original line number Diff line number Diff line
@@ -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);

+8 −8
Original line number Diff line number Diff line
@@ -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;
}