On Sun, 1 Dec 2024, 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 the > drivers that were already changed remain changed and the legacy sysfs > handler will report 'custom'. > > Tested-by: Mark Pearson <mpearson-lenovo@xxxxxxxxx> > Tested-by: Matthew Schwartz <matthew.schwartz@xxxxxxxxx> > Reviewed-by: Mark Pearson <mpearson-lenovo@xxxxxxxxx> > Reviewed-by: Armin Wolf <W_Armin@xxxxxx> > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> > --- > drivers/acpi/platform_profile.c | 11 ----------- > 1 file changed, 11 deletions(-) > > diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c > index 289b5d43638ae..2e38aa410b3ad 100644 > --- a/drivers/acpi/platform_profile.c > +++ b/drivers/acpi/platform_profile.c > @@ -10,7 +10,6 @@ > #include <linux/platform_profile.h> > #include <linux/sysfs.h> > > -static struct platform_profile_handler *cur_profile; > static DEFINE_MUTEX(profile_lock); > > static const char * const profile_names[] = { > @@ -399,8 +398,6 @@ static const struct attribute_group platform_profile_group = { > > void platform_profile_notify(struct platform_profile_handler *pprof) > { > - if (!cur_profile) > - return; > scoped_cond_guard(mutex_intr, return, &profile_lock) { > _notify_class_profile(pprof->class_dev, NULL); > } > @@ -463,9 +460,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; > > /* create class interface for individual handler */ > pprof->minor = ida_alloc(&platform_profile_ida, GFP_KERNEL); > @@ -481,8 +475,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) > > sysfs_notify(acpi_kobj, NULL, "platform_profile"); > > - cur_profile = pprof; > - > err = sysfs_update_group(acpi_kobj, &platform_profile_group); > if (err) > goto cleanup_cur; > @@ -490,7 +482,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) > return 0; > > cleanup_cur: > - cur_profile = NULL; > device_unregister(pprof->class_dev); > > cleanup_ida: > @@ -505,8 +496,6 @@ int platform_profile_remove(struct platform_profile_handler *pprof) > int id; > guard(mutex)(&profile_lock); > > - cur_profile = NULL; > - > id = pprof->minor; > device_unregister(pprof->class_dev); > ida_free(&platform_profile_ida, id); > Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx> -- i.