Messages in this thread | | | Date | Wed, 14 Sep 2022 17:15:04 +0800 | From | Kant Fan <> | Subject | Re: [RESEND] devfreq: governor: Save void *data in the governor userspace |
| |
On 3/29/2022 5:14 PM, Kant Fan wrote: > The member void *data in the structure devfreq can be overwrite > by governor_userspace. For example: > 1. The device driver assigned the devfreq governor to simple_ondemand > by the function devfreq_add_device() and init the devfreq member > void *data to a pointer of a static structure devfreq_simple_ondemand_data > by the function devfreq_add_device(). > 2. The user changed the devfreq governor to userspace by the command > "echo userspace > /sys/class/devfreq/.../governor". > 3. The governor userspace alloced a dynamic memory for the struct > userspace_data and assigend the member void *data of devfreq to > this memory by the function userspace_init(). > 4. The user changed the devfreq governor back to simple_ondemand > by the command "echo simple_ondemand > /sys/class/devfreq/.../governor". > 5. The governor userspace exited and assigned the member void *data > in the structure devfreq to NULL by the function userspace_exit(). > 6. The governor simple_ondemand fetched the static information of > devfreq_simple_ondemand_data in the function > devfreq_simple_ondemand_func() but the member void *data of devfreq was > assigned to NULL by the function userspace_exit(). > 7. The information of upthreshold and downdifferential is lost > and the governor simple_ondemand can't work correctly. > > The member void *data in the structure devfreq is designed for > a static pointer used in a governor and inited by the function > devfreq_add_device(). So if a governor want to use void *data > to do some other things, it must save void *data in the init() > function and restore void *data in the exit() function. > > Signed-off-by: Kant Fan <kant@allwinnertech.com> > --- > drivers/devfreq/governor_userspace.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/devfreq/governor_userspace.c b/drivers/devfreq/governor_userspace.c > index ab9db7adb3ad..dbbb448dcbcf 100644 > --- a/drivers/devfreq/governor_userspace.c > +++ b/drivers/devfreq/governor_userspace.c > @@ -17,6 +17,7 @@ > struct userspace_data { > unsigned long user_frequency; > bool valid; > + void *saved_data; > }; > > static int devfreq_userspace_func(struct devfreq *df, unsigned long *freq) > @@ -91,6 +92,7 @@ static int userspace_init(struct devfreq *devfreq) > goto out; > } > data->valid = false; > + data->saved_data = devfreq->data; > devfreq->data = data; > > err = sysfs_create_group(&devfreq->dev.kobj, &dev_attr_group); > @@ -100,6 +102,8 @@ static int userspace_init(struct devfreq *devfreq) > > static void userspace_exit(struct devfreq *devfreq) > { > + struct userspace_data *data = devfreq->data; > + void *saved_data = data->saved_data; > /* > * Remove the sysfs entry, unless this is being called after > * device_del(), which should have done this already via kobject_del(). > @@ -108,7 +112,7 @@ static void userspace_exit(struct devfreq *devfreq) > sysfs_remove_group(&devfreq->dev.kobj, &dev_attr_group); > > kfree(devfreq->data); > - devfreq->data = NULL; > + devfreq->data = saved_data; > } > > static int devfreq_userspace_handler(struct devfreq *devfreq,
Dear MyungJoo, Kyungmin & Chanwoo, Gently ping this issue... Does this patch has a chance to be accepted? This seems to be a bug in devfreq userspace governor, which affects the switching between governors -- When switching from userspace to ondemand, the ondemand governor would be invalid. If there's any question, please let me know. Thank you.
-- Best Regards, Kant Fan
| |