On Thu, Oct 31, 2024, at 12:09 AM, Mario Limonciello wrote: > Multiple drivers may attempt to register platform profile handlers, > but only one may be registered and the behavior is non-deterministic > for which one wins. It's mostly controlled by probing order. > > This can be problematic if one driver changes CPU settings and another > driver notifies the EC for changing fan curves. > > Modify the ACPI platform profile handler to let multiple drivers > register platform profile handlers and abstract this detail from userspace. > > To avoid undefined behaviors only offer profiles that are commonly > advertised across multiple handlers. > > If any problems occur when changing profiles for any driver, then revert > back to the balanced profile, which is now required. > > Tested-by: Matthew Schwartz <matthew.schwartz@xxxxxxxxx> > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> > --- > drivers/acpi/platform_profile.c | 10 ++-------- > 1 file changed, 2 insertions(+), 8 deletions(-) > > diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c > index 1cc8182930dde..a845524a248b9 100644 > --- a/drivers/acpi/platform_profile.c > +++ b/drivers/acpi/platform_profile.c > @@ -9,7 +9,6 @@ > #include <linux/platform_profile.h> > #include <linux/sysfs.h> > > -static struct platform_profile_handler *cur_profile; > static LIST_HEAD(platform_profile_handler_list); > static DEFINE_MUTEX(profile_lock); > > @@ -212,7 +211,8 @@ static const struct attribute_group > platform_profile_group = { > > void platform_profile_notify(void) > { > - if (!cur_profile) > + guard(mutex)(&profile_lock); > + if (!platform_profile_is_registered()) > return; > sysfs_notify(acpi_kobj, NULL, "platform_profile"); > } > @@ -280,9 +280,6 @@ int platform_profile_register(struct > platform_profile_handler *pprof) > } > > guard(mutex)(&profile_lock); > - /* We can only have one active profile */ > - if (cur_profile) > - return -EEXIST; > > registered = platform_profile_is_registered(); > if (!registered) { > @@ -313,7 +310,6 @@ int platform_profile_register(struct > platform_profile_handler *pprof) > list_add_tail(&pprof->list, &platform_profile_handler_list); > sysfs_notify(acpi_kobj, NULL, "platform_profile"); > > - cur_profile = pprof; > return 0; > > cleanup_device: > @@ -336,8 +332,6 @@ int platform_profile_remove(struct > platform_profile_handler *pprof) > > list_del(&pprof->list); > > - cur_profile = NULL; > - > sysfs_notify(acpi_kobj, NULL, "platform_profile"); > > sysfs_remove_group(&pprof->class_dev->kobj, &platform_profile_group); > -- > 2.43.0 Looks good to me Reviewed-by: Mark Pearson <mpearson-lenovo@xxxxxxxxx> Mark