Unverified Commit 1f3ac55c authored by Mario Limonciello's avatar Mario Limonciello Committed by Ilpo Järvinen
Browse files

ACPI: platform_profile: Use `scoped_cond_guard`



Migrate away from using an interruptible mutex to scoped_cond_guard
in all functions. While changing, move the sysfs notification
used in platform_profile_store() outside of mutex scope.

Reviewed-by: default avatarArmin Wolf <W_Armin@gmx.de>
Tested-by: default avatarMark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: default avatarMark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20241206031918.1537-10-mario.limonciello@amd.com


Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent 55b1e681
Loading
Loading
Loading
Loading
+38 −67
Original line number Diff line number Diff line
@@ -27,25 +27,16 @@ static ssize_t platform_profile_choices_show(struct device *dev,
					char *buf)
{
	int len = 0;
	int err, i;
	int i;

	err = mutex_lock_interruptible(&profile_lock);
	if (err)
		return err;

	if (!cur_profile) {
		mutex_unlock(&profile_lock);
	scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
		if (!cur_profile)
			return -ENODEV;
	}

	for_each_set_bit(i, cur_profile->choices, PLATFORM_PROFILE_LAST) {
		if (len == 0)
			len += sysfs_emit_at(buf, len, "%s", profile_names[i]);
		else
			len += sysfs_emit_at(buf, len, " %s", profile_names[i]);
		for_each_set_bit(i, cur_profile->choices, PLATFORM_PROFILE_LAST)
			len += sysfs_emit_at(buf, len, len ? " %s": "%s", profile_names[i]);
	}
	len += sysfs_emit_at(buf, len, "\n");
	mutex_unlock(&profile_lock);

	return len;
}

@@ -56,19 +47,14 @@ static ssize_t platform_profile_show(struct device *dev,
	enum platform_profile_option profile = PLATFORM_PROFILE_BALANCED;
	int err;

	err = mutex_lock_interruptible(&profile_lock);
	if (err)
		return err;

	if (!cur_profile) {
		mutex_unlock(&profile_lock);
	scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
		if (!cur_profile)
			return -ENODEV;
	}

		err = cur_profile->profile_get(cur_profile, &profile);
	mutex_unlock(&profile_lock);
		if (err)
			return err;
	}

	/* Check that profile is valid index */
	if (WARN_ON((profile < 0) || (profile >= ARRAY_SIZE(profile_names))))
@@ -88,28 +74,21 @@ static ssize_t platform_profile_store(struct device *dev,
	if (i < 0)
		return -EINVAL;

	err = mutex_lock_interruptible(&profile_lock);
	if (err)
		return err;

	if (!cur_profile) {
		mutex_unlock(&profile_lock);
	scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
		if (!cur_profile)
			return -ENODEV;
	}

		/* Check that platform supports this profile choice */
	if (!test_bit(i, cur_profile->choices)) {
		mutex_unlock(&profile_lock);
		if (!test_bit(i, cur_profile->choices))
			return -EOPNOTSUPP;
	}

		err = cur_profile->profile_set(cur_profile, i);
	if (!err)
		sysfs_notify(acpi_kobj, NULL, "platform_profile");

	mutex_unlock(&profile_lock);
		if (err)
			return err;
	}

	sysfs_notify(acpi_kobj, NULL, "platform_profile");

	return count;
}

@@ -140,36 +119,28 @@ int platform_profile_cycle(void)
	enum platform_profile_option next;
	int err;

	err = mutex_lock_interruptible(&profile_lock);
	if (err)
		return err;

	if (!cur_profile) {
		mutex_unlock(&profile_lock);
	scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
		if (!cur_profile)
			return -ENODEV;
	}

		err = cur_profile->profile_get(cur_profile, &profile);
	if (err) {
		mutex_unlock(&profile_lock);
		if (err)
			return err;
	}

		next = find_next_bit_wrap(cur_profile->choices, PLATFORM_PROFILE_LAST,
					  profile + 1);

	if (WARN_ON(next == PLATFORM_PROFILE_LAST)) {
		mutex_unlock(&profile_lock);
		if (WARN_ON(next == PLATFORM_PROFILE_LAST))
			return -EINVAL;
	}

		err = cur_profile->profile_set(cur_profile, next);
	mutex_unlock(&profile_lock);
		if (err)
			return err;
	}

	if (!err)
	sysfs_notify(acpi_kobj, NULL, "platform_profile");

	return err;
	return 0;
}
EXPORT_SYMBOL_GPL(platform_profile_cycle);