cpufreq: interactive: fix NULL pointer dereference at sysfs ops
sysfs ops for target_loads and above_hispeed_delay can be called before initializing tunables at CPUFREQ_GOV_POLICY_INIT. Create sysfs entries after initialization. Change-Id: I50356198d7629731c0d32a3066d61fe8354e0001 Signed-off-by: Minsung Kim <ms925.kim@samsung.com>
This commit is contained in:
@@ -1178,13 +1178,6 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = sysfs_create_group(get_governor_parent_kobj(policy),
|
||||
get_sysfs_attr());
|
||||
if (rc) {
|
||||
kfree(tunables);
|
||||
return rc;
|
||||
}
|
||||
|
||||
tunables->usage_count = 1;
|
||||
tunables->above_hispeed_delay = default_above_hispeed_delay;
|
||||
tunables->nabove_hispeed_delay =
|
||||
@@ -1200,16 +1193,26 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
|
||||
spin_lock_init(&tunables->target_loads_lock);
|
||||
spin_lock_init(&tunables->above_hispeed_delay_lock);
|
||||
|
||||
policy->governor_data = tunables;
|
||||
if (!have_governor_per_policy())
|
||||
common_tunables = tunables;
|
||||
|
||||
rc = sysfs_create_group(get_governor_parent_kobj(policy),
|
||||
get_sysfs_attr());
|
||||
if (rc) {
|
||||
kfree(tunables);
|
||||
policy->governor_data = NULL;
|
||||
if (!have_governor_per_policy())
|
||||
common_tunables = NULL;
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (!policy->governor->initialized) {
|
||||
idle_notifier_register(&cpufreq_interactive_idle_nb);
|
||||
cpufreq_register_notifier(&cpufreq_notifier_block,
|
||||
CPUFREQ_TRANSITION_NOTIFIER);
|
||||
}
|
||||
|
||||
policy->governor_data = tunables;
|
||||
if (!have_governor_per_policy())
|
||||
common_tunables = tunables;
|
||||
|
||||
break;
|
||||
|
||||
case CPUFREQ_GOV_POLICY_EXIT:
|
||||
|
||||
Reference in New Issue
Block a user