devfreq: governor: Add a private governor_data for governors in devfreq
PATCH v2 1/1 devfreq: governor: Add a private governor_data for governors in devfreq
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(). This patch add an element named governor_data in the devfreq structure which can be used by a governor(E.g userspace) who want to assign a private data to do some private things.
--- drivers/devfreq/governor_userspace.c | 12 ++++++------ include/linux/devfreq.h | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-)
drivers/devfreq/governor_userspace.c +6 -6
@@ -21,7 +21,7 @@ struct userspace_data {static int devfreq_userspace_func (struct devfreq *df,unsigned long *freq) { -struct userspace_data *data = df->data; +struct userspace_data *data = df->governor_data;if (data->valid) *freq = data->user_frequency;
@@ -40,7 +40,7 @@ static ssize_t set_freq_store(struct device *dev, struct device_attribute *attr,int err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;sscanf (buf,"%lu" , &wanted); data->user_frequency = wanted;
@@ -60,7 +60,7 @@ static ssize_t set_freq_show(struct device *dev,int err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;if (data->valid) err =sprintf (buf,"%lu\n" , data->user_frequency);
@@ -91,7 +91,7 @@ static int userspace_init(struct devfreq *devfreq) goto out; } data->valid = false; - devfreq->data = data; + devfreq->governor_data = data; err =sysfs_create_group (&devfreq->dev.kobj, &dev_attr_group); out:
@@ -107,8 +107,8 @@ static void userspace_exit(struct devfreq *devfreq)if (devfreq->dev.kobj.sd)sysfs_remove_group (&devfreq->dev.kobj, &dev_attr_group); -kfree (devfreq->data); - devfreq->data =NULL ; +kfree (devfreq->governor_data); + devfreq->governor_data =NULL ; } static int devfreq_userspace_handler(struct devfreq *devfreq,
include/linux/devfreq.h +4 -3
@@ -152,8 +152,8 @@ struct devfreq_stats {* @max_state: count of entry present in the frequency table. * @previous_freq: previously configured frequency value. * @last_status: devfreq user device info, performance statistics -* @data: Private data of the governor. The devfreq framework does not -* touch this. +* @data: devfreq core pass to governors, governor should not change it. +* @governor_data: private data for governors, devfreq core doesn't touch it. * @user_min_freq_req: PM QoS minimum frequency request from user (via sysfs) * @user_max_freq_req: PM QoS maximum frequency request from user (via sysfs) * @scaling_min_freq: Limit minimum frequency requested by OPP interface
@@ -193,7 +193,8 @@ struct devfreq {unsigned long previous_freq;struct devfreq_dev_status last_status; -void *data;/* private data for governors */ +void *data; +void *governor_data;struct dev_pm_qos_request user_min_freq_req;struct dev_pm_qos_request user_max_freq_req;
Signature · 1 line
2.29.0
Hi,
I'm sorry for late reply. It looks good to me. Instead, this patch should contain the 'Fixes' information with the following commit because the changed code was merged on the patch[1]. Also, need to send it to stable mailing list.
[1] ce26c5bb9569d8b826f01b8620fc16d8da6821e9
PM / devfreq: Add basic governors
Lastly, I think that need to change the patch title as following:
- PM / devfreq: governor: Add a private governor_data for governor
Quoted 112 lines · Kant Fan
The member void *data in the structure devfreq can be overwrite by
governor_userspace. For example:
1. The device driver assigned the devfreq governor tosimple_ondemandby the functiondevfreq_add_device()and init the devfreq member void *data to a pointer of a static structuredevfreq_simple_ondemand_databy the functiondevfreq_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 structuserspace_dataand assigend the member void *data of devfreq to this memory by the functionuserspace_init().
4. The user changed the devfreq governor back tosimple_ondemandby the command "echosimple_ondemand>/sys/class/devfreq/.../governor".
5. The governor userspace exited and assigned the member void *data in the structure devfreq to NULL by the functionuserspace_exit().
6. The governorsimple_ondemandfetched the static information ofdevfreq_simple_ondemand_datain the functiondevfreq_simple_ondemand_func()but the member void *data of devfreq was assigned to NULL by the functionuserspace_exit().
7. The information of upthreshold and downdifferential is lost and the governorsimple_ondemandcan'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(). This patch add an element namedgovernor_datain the devfreq structure which can be used by a governor(E.g userspace) who want to assign a private data to do some private things.Acked-by MyungJoo Ham <[email protected]>Signed-off-by Kant Fan <[email protected]>--- drivers/devfreq/governor_userspace.c | 12 ++++++------ include/linux/devfreq.h | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-)drivers/devfreq/governor_userspace.c +6
-6@@ -21,7 +21,7 @@ struct userspace_data {static int devfreq_userspace_func (struct devfreq *df,unsigned long *freq) { -struct userspace_data *data = df->data; +struct userspace_data *data = df->governor_data;if (data->valid) *freq = data->user_frequency;@@ -40,7 +40,7 @@ static ssize_t set_freq_store(struct device *dev, struct device_attribute *attr,int err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;sscanf (buf,"%lu" , &wanted); data->user_frequency = wanted;@@ -60,7 +60,7 @@ static ssize_t set_freq_show(struct device *dev,int err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;if (data->valid) err =sprintf (buf,"%lu\n" , data->user_frequency);@@ -91,7 +91,7 @@ static int userspace_init(struct devfreq *devfreq) goto out; } data->valid = false; - devfreq->data = data; + devfreq->governor_data = data; err =sysfs_create_group (&devfreq->dev.kobj, &dev_attr_group); out:@@ -107,8 +107,8 @@ static void userspace_exit(struct devfreq *devfreq)if (devfreq->dev.kobj.sd)sysfs_remove_group (&devfreq->dev.kobj, &dev_attr_group); -kfree (devfreq->data); - devfreq->data =NULL ; +kfree (devfreq->governor_data); + devfreq->governor_data =NULL ; } static int devfreq_userspace_handler(struct devfreq *devfreq,include/linux/devfreq.h +4
-3@@ -152,8 +152,8 @@ struct devfreq_stats {* @max_state: count of entry present in the frequency table. * @previous_freq: previously configured frequency value. * @last_status: devfreq user device info, performance statistics -* @data: Private data of the governor. The devfreq framework does not -* touch this. +* @data: devfreq core pass to governors, governor should not change it. +* @governor_data: private data for governors, devfreq core doesn't touch it. * @user_min_freq_req: PM QoS minimum frequency request from user (via sysfs) * @user_max_freq_req: PM QoS maximum frequency request from user (via sysfs) * @scaling_min_freq: Limit minimum frequency requested by OPP interface @@ -193,7 +193,8 @@ struct devfreq {unsigned long previous_freq;struct devfreq_dev_status last_status; -void *data;/* private data for governors */ +void *data; +void *governor_data;struct dev_pm_qos_request user_min_freq_req;struct dev_pm_qos_request user_max_freq_req;
Signature · 3 lines
Best Regards, Samsung Electronics Chanwoo Choi
Quoted 101 lines · Chanwoo Choi
Hi,
I'm sorry for late reply. It looks good to me. Instead, this patch should contain the 'Fixes' information with the following commit because the changed code was merged on the patch[1]. Also, need to send it to stable mailing list.
[1]
ce26c5bb9569d8b826f01b8620fc16d8da6821e9
PM / devfreq: Add basic governorsLastly, I think that need to change the patch title as following:
- PM / devfreq: governor: Add a privategovernor_datafor governorQuoted 86 lines · Kant Fan
The member void *data in the structure devfreq can be overwrite by
governor_userspace. For example:
1. The device driver assigned the devfreq governor tosimple_ondemandby the functiondevfreq_add_device()and init the devfreq member void *data to a pointer of a static structuredevfreq_simple_ondemand_databy the functiondevfreq_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 structuserspace_dataand assigend the member void *data of devfreq to this memory by the functionuserspace_init().
4. The user changed the devfreq governor back tosimple_ondemandby the command "echosimple_ondemand>/sys/class/devfreq/.../governor".
5. The governor userspace exited and assigned the member void *data in the structure devfreq to NULL by the functionuserspace_exit().
6. The governorsimple_ondemandfetched the static information ofdevfreq_simple_ondemand_datain the functiondevfreq_simple_ondemand_func()but the member void *data of devfreq was assigned to NULL by the functionuserspace_exit().
7. The information of upthreshold and downdifferential is lost and the governorsimple_ondemandcan'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(). This patch add an element namedgovernor_datain the devfreq structure which can be used by a governor(E.g userspace) who want to assign a private data to do some private things.Acked-by MyungJoo Ham <[email protected]>Signed-off-by Kant Fan <[email protected]>--- drivers/devfreq/governor_userspace.c | 12 ++++++------ include/linux/devfreq.h | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-)drivers/devfreq/governor_userspace.c +6
-6@@ -21,7 +21,7 @@ struct userspace_data {static int devfreq_userspace_func (struct devfreq *df,unsigned long *freq) { -struct userspace_data *data = df->data; +struct userspace_data *data = df->governor_data;if (data->valid) *freq = data->user_frequency;@@ -40,7 +40,7 @@ static ssize_t set_freq_store(struct device *dev, struct device_attribute *attr,int err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;sscanf (buf,"%lu" , &wanted); data->user_frequency = wanted;@@ -60,7 +60,7 @@ static ssize_t set_freq_show(struct device *dev,int err =0 ;mutex_lock (&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data;if (data->valid) err =sprintf (buf,"%lu\n" , data->user_frequency);@@ -91,7 +91,7 @@ static int userspace_init(struct devfreq *devfreq) goto out; } data->valid = false; - devfreq->data = data; + devfreq->governor_data = data; err =sysfs_create_group (&devfreq->dev.kobj, &dev_attr_group); out:@@ -107,8 +107,8 @@ static void userspace_exit(struct devfreq *devfreq)if (devfreq->dev.kobj.sd)sysfs_remove_group (&devfreq->dev.kobj, &dev_attr_group); -kfree (devfreq->data); - devfreq->data =NULL ; +kfree (devfreq->governor_data); + devfreq->governor_data =NULL ; }
Quoted 12 lines
include/linux/devfreq.h struct devfreq_stats { · line 155
Quoted 12 lines
drivers/devfreq/governor_userspace.c +0
-0static int devfreq_userspace_handler(struct devfreq *devfreq,include/linux/devfreq.h +1
-2@@ -152,8 +152,8 @@ struct devfreq_stats {* @max_state: count of entry present in the frequency table. * @previous_freq: previously configured frequency value. * @last_status: devfreq user device info, performance statistics -* @data: Private data of the governor. The devfreq framework does not -* touch this. +* @data: devfreq core pass to governors, governor should not change it.
In addition, the devfreq driver pass the 'data' from devfreq driver to governor by using devfreq_add_device. I think that 'devfreq driver' is more proper
* @data: devfreq driver pass to governors, governor should not change it.
And then, there are extra changes required.
drivers/devfreq/devfreq.c +2 -4
@@ -776,8 +776,7 @@ static void remove_sysfs_files(struct devfreq *devfreq,* @dev: the device to add devfreq feature. * @profile: device-specific profile to run devfreq. * @governor_name: name of the policy to choose frequency. -* @data: private data for the governor. The devfreq framework does not -* touch this value. +* @data: devfreq driver pass to governors, governor should not change it. */ struct devfreq *devfreq_add_device(struct device *dev, struct devfreq_dev_profile *profile,
@@ -1011,8 +1010,7 @@ static void devm_devfreq_dev_release(struct device *dev, void *res)* @dev: the device to add devfreq feature. * @profile: device-specific profile to run devfreq. * @governor_name: name of the policy to choose frequency. -* @data: private data for the governor. The devfreq framework does not -* touch this value. +* @data: devfreq driver pass to governors, governor should not change it. * * This function manages automatically the memory of devfreq device using device * resource management and simplify the free operation for memory of devfreq
Signature · 3 lines
Best Regards, Samsung Electronics Chanwoo Choi
Quoted 25 lines · Chanwoo Choi
In addition, the devfreq driver pass the 'data' from devfreq driver to governor by using
devfreq_add_device. I think that 'devfreq driver' is more proper* @data: devfreq driver pass to governors, governor should not change it.
And then, there are extra changes required.
drivers/devfreq/devfreq.c +1
-2@@ -776,8 +776,7 @@ static void remove_sysfs_files(struct devfreq *devfreq,* @dev: the device to add devfreq feature. * @profile: device-specific profile to run devfreq. * @governor_name: name of the policy to choose frequency. -* @data: private data for the governor. The devfreq framework does not -* touch this value. +* @data: devfreq driver pass to governors, governor should not change it. */ struct devfreq *devfreq_add_device(struct device *dev, struct devfreq_dev_profile *profile,
drivers/devfreq/devfreq.c static void devm_devfreq_dev_release(struct device *dev, void *res) · line 1016
Quoted 9 lines
drivers/devfreq/devfreq.c +1
-2@@ -1011,8 +1010,7 @@ static void devm_devfreq_dev_release(struct device *dev, void *res)* @dev: the device to add devfreq feature. * @profile: device-specific profile to run devfreq. * @governor_name: name of the policy to choose frequency. -* @data: private data for the governor. The devfreq framework does not -* touch this value. +* @data: devfreq driver pass to governors, governor should not change it. * * This function manages automatically the memory of devfreq device using device * resource management and simplify the free operation for memory of devfreq
Dear Chanwoo,
Thanks for your kindly advice. I've modified it as patch-v3 [1]. Please have a look.
[1] https://lore.kernel.org/all/[email protected]/
Signature · 2 lines
Best Regards, Kant Fan