Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f6c7ece authored by Minsung Kim's avatar Minsung Kim Committed by Amit Pundir
Browse files

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: default avatarMinsung Kim <ms925.kim@samsung.com>
parent 32582ffb
Loading
Loading
Loading
Loading
+14 −11
Original line number Original line Diff line number Diff line
@@ -1178,13 +1178,6 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
			return -ENOMEM;
			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->usage_count = 1;
		tunables->above_hispeed_delay = default_above_hispeed_delay;
		tunables->above_hispeed_delay = default_above_hispeed_delay;
		tunables->nabove_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->target_loads_lock);
		spin_lock_init(&tunables->above_hispeed_delay_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) {
		if (!policy->governor->initialized) {
			idle_notifier_register(&cpufreq_interactive_idle_nb);
			idle_notifier_register(&cpufreq_interactive_idle_nb);
			cpufreq_register_notifier(&cpufreq_notifier_block,
			cpufreq_register_notifier(&cpufreq_notifier_block,
					CPUFREQ_TRANSITION_NOTIFIER);
					CPUFREQ_TRANSITION_NOTIFIER);
		}
		}


		policy->governor_data = tunables;
		if (!have_governor_per_policy())
			common_tunables = tunables;

		break;
		break;


	case CPUFREQ_GOV_POLICY_EXIT:
	case CPUFREQ_GOV_POLICY_EXIT: