On Sun, 27 Oct 2024, Mario Limonciello wrote:
> If multiple platform profile handlers have been registered, don't allow
> switching to profiles unique to only one handler.
>
> Tested-by: Matthew Schwartz <matthew.schwartz@linux.dev>
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
> drivers/acpi/platform_profile.c | 35 ++++++++++++++++++++++-----------
> 1 file changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c
> index 5fee467614eac..a83842f05022b 100644
> --- a/drivers/acpi/platform_profile.c
> +++ b/drivers/acpi/platform_profile.c
> @@ -33,30 +33,43 @@ static bool platform_profile_is_registered(void)
> return count > 0;
> }
>
> +/* expected to be called under mutex */
> +static unsigned long platform_profile_get_choices(void)
> +{
> + struct platform_profile_handler *handler;
> + unsigned long seen = 0;
> + int i;
> +
> + list_for_each_entry(handler, &platform_profile_handler_list, list) {
> + for_each_set_bit(i, handler->choices, PLATFORM_PROFILE_LAST) {
> + if (seen & BIT(i))
> + continue;
> + seen |= BIT(i);
The condition+continue part seems unnecessary if all this function does is
accumulate bits into seen.
--
i.
> + }
> + }
> +
> + return seen;
> +}
> +
> static ssize_t platform_profile_choices_show(struct device *dev,
> struct device_attribute *attr,
> char *buf)
> {
> + unsigned long choices;
> int len = 0;
> - int err, i;
> -
> - err = mutex_lock_interruptible(&profile_lock);
> - if (err)
> - return err;
> + int i;
>
> - if (!cur_profile) {
> - mutex_unlock(&profile_lock);
> - return -ENODEV;
> - }
> + scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock)
> + choices = platform_profile_get_choices();
> - for_each_set_bit(i, cur_profile->choices, PLATFORM_PROFILE_LAST) {
> + for_each_set_bit(i, &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]);
> }
> +
> len += sysfs_emit_at(buf, len, "\n");
> - mutex_unlock(&profile_lock);
> return len;
> }
>
>