Unverified Commit a5d78138 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!15425 CVE-2022-49513

Merge Pull Request from: @ci-robot 
 
PR sync from: Zhang Kunbo <zhangkunbo@huawei.com>
https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/SHCUZDCIPKKWKFHBACF2P3XAPKTDAUTE/ 
*** BLURB HERE ***

Kevin Hao (2):
  cpufreq: Move to_gov_attr_set() to cpufreq.h
  cpufreq: governor: Use kobject release() method to free dbs_data

 
https://gitee.com/src-openeuler/kernel/issues/IBP6N1 
 
Link:https://gitee.com/openeuler/kernel/pulls/15425

 

Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Reviewed-by: default avatarYuan Can <yuancan@huawei.com>
Signed-off-by: default avatarYuan Can <yuancan@huawei.com>
parents 72481518 6a98f0ae
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -412,6 +412,15 @@ static void free_policy_dbs_info(struct policy_dbs_info *policy_dbs,
	gov->free(policy_dbs);
}

static void cpufreq_dbs_data_release(struct kobject *kobj)
{
	struct dbs_data *dbs_data = to_dbs_data(to_gov_attr_set(kobj));
	struct dbs_governor *gov = dbs_data->gov;

	gov->exit(dbs_data);
	kfree(dbs_data);
}

int cpufreq_dbs_governor_init(struct cpufreq_policy *policy)
{
	struct dbs_governor *gov = dbs_governor_of(policy);
@@ -449,6 +458,7 @@ int cpufreq_dbs_governor_init(struct cpufreq_policy *policy)
		goto free_policy_dbs_info;
	}

	dbs_data->gov = gov;
	gov_attr_set_init(&dbs_data->attr_set, &policy_dbs->list);

	ret = gov->init(dbs_data);
@@ -471,6 +481,7 @@ int cpufreq_dbs_governor_init(struct cpufreq_policy *policy)
	policy->governor_data = policy_dbs;

	gov->kobj_type.sysfs_ops = &governor_sysfs_ops;
	gov->kobj_type.release = cpufreq_dbs_data_release;
	ret = kobject_init_and_add(&dbs_data->attr_set.kobj, &gov->kobj_type,
				   get_governor_parent_kobj(policy),
				   "%s", gov->gov.name);
@@ -512,14 +523,9 @@ void cpufreq_dbs_governor_exit(struct cpufreq_policy *policy)

	policy->governor_data = NULL;

	if (!count) {
		if (!have_governor_per_policy())
	if (!count && !have_governor_per_policy())
		gov->gdbs_data = NULL;

		gov->exit(dbs_data);
		kfree(dbs_data);
	}

	free_policy_dbs_info(policy_dbs, gov);

	mutex_unlock(&gov_dbs_data_mutex);
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ enum {OD_NORMAL_SAMPLE, OD_SUB_SAMPLE};
/* Governor demand based switching data (per-policy or global). */
struct dbs_data {
	struct gov_attr_set attr_set;
	struct dbs_governor *gov;
	void *tuners;
	unsigned int ignore_nice_load;
	unsigned int sampling_rate;
+0 −5
Original line number Diff line number Diff line
@@ -11,11 +11,6 @@

#include "cpufreq_governor.h"

static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj)
{
	return container_of(kobj, struct gov_attr_set, kobj);
}

static inline struct governor_attr *to_gov_attr(struct attribute *attr)
{
	return container_of(attr, struct governor_attr, attr);
+5 −0
Original line number Diff line number Diff line
@@ -551,6 +551,11 @@ struct gov_attr_set {
/* sysfs ops for cpufreq governors */
extern const struct sysfs_ops governor_sysfs_ops;

static inline struct gov_attr_set *to_gov_attr_set(struct kobject *kobj)
{
	return container_of(kobj, struct gov_attr_set, kobj);
}

void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node);
void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node);
unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node);