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

Commit 9a845af1 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: msm_perf: free allocated memory if error happens"

parents 6c15fcda e48430b6
Loading
Loading
Loading
Loading
+31 −8
Original line number Original line Diff line number Diff line
@@ -1810,7 +1810,7 @@ static void single_mod_exit_timer(unsigned long data)
static int init_cluster_control(void)
static int init_cluster_control(void)
{
{
	unsigned int i;
	unsigned int i;
	int ret;
	int ret = 0;
	struct kobject *module_kobj;
	struct kobject *module_kobj;


	managed_clusters = kcalloc(num_clusters, sizeof(struct cluster *),
	managed_clusters = kcalloc(num_clusters, sizeof(struct cluster *),
@@ -1820,19 +1820,24 @@ static int init_cluster_control(void)
	for (i = 0; i < num_clusters; i++) {
	for (i = 0; i < num_clusters; i++) {
		managed_clusters[i] = kcalloc(1, sizeof(struct cluster),
		managed_clusters[i] = kcalloc(1, sizeof(struct cluster),
								GFP_KERNEL);
								GFP_KERNEL);
		if (!managed_clusters[i])
		if (!managed_clusters[i]) {
			return -ENOMEM;
			pr_err("msm_perf:Cluster %u mem alloc failed\n", i);
			ret = -ENOMEM;
			goto error;
		}
		if (!alloc_cpumask_var(&managed_clusters[i]->cpus,
		if (!alloc_cpumask_var(&managed_clusters[i]->cpus,
		     GFP_KERNEL)) {
		     GFP_KERNEL)) {
			pr_err("msm_perf:Cluster %u cpu alloc failed\n",
			pr_err("msm_perf:Cluster %u cpu alloc failed\n",
			       i);
			       i);
			return -ENOMEM;
			ret = -ENOMEM;
			goto error;
		}
		}
		if (!alloc_cpumask_var(&managed_clusters[i]->offlined_cpus,
		if (!alloc_cpumask_var(&managed_clusters[i]->offlined_cpus,
		     GFP_KERNEL)) {
		     GFP_KERNEL)) {
			pr_err("msm_perf:Cluster %u off_cpus alloc failed\n",
			pr_err("msm_perf:Cluster %u off_cpus alloc failed\n",
			       i);
			       i);
			return -ENOMEM;
			ret = -ENOMEM;
			goto error;
		}
		}
		managed_clusters[i]->max_cpu_request = -1;
		managed_clusters[i]->max_cpu_request = -1;
		managed_clusters[i]->single_enter_load = DEF_SINGLE_ENT;
		managed_clusters[i]->single_enter_load = DEF_SINGLE_ENT;
@@ -1861,23 +1866,41 @@ static int init_cluster_control(void)
	module_kobj = kset_find_obj(module_kset, KBUILD_MODNAME);
	module_kobj = kset_find_obj(module_kset, KBUILD_MODNAME);
	if (!module_kobj) {
	if (!module_kobj) {
		pr_err("msm_perf: Couldn't find module kobject\n");
		pr_err("msm_perf: Couldn't find module kobject\n");
		return -ENOENT;
		ret = -ENOENT;
		goto error;
	}
	}
	mode_kobj = kobject_create_and_add("workload_modes", module_kobj);
	mode_kobj = kobject_create_and_add("workload_modes", module_kobj);
	if (!mode_kobj) {
	if (!mode_kobj) {
		pr_err("msm_perf: Failed to add mode_kobj\n");
		pr_err("msm_perf: Failed to add mode_kobj\n");
		return -ENOMEM;
		ret = -ENOMEM;
		kobject_put(module_kobj);
		goto error;
	}
	}
	ret = sysfs_create_group(mode_kobj, &attr_group);
	ret = sysfs_create_group(mode_kobj, &attr_group);
	if (ret) {
	if (ret) {
		pr_err("msm_perf: Failed to create sysfs\n");
		pr_err("msm_perf: Failed to create sysfs\n");
		return ret;
		kobject_put(module_kobj);
		kobject_put(mode_kobj);
		goto error;
	}
	}


	notify_thread = kthread_run(notify_userspace, NULL, "wrkld_notify");
	notify_thread = kthread_run(notify_userspace, NULL, "wrkld_notify");
	clusters_inited = true;
	clusters_inited = true;


	return 0;
	return 0;

error:
	for (i = 0; i < num_clusters; i++) {
		if (!managed_clusters[i])
			break;
		if (managed_clusters[i]->offlined_cpus)
			free_cpumask_var(managed_clusters[i]->offlined_cpus);
		if (managed_clusters[i]->cpus)
			free_cpumask_var(managed_clusters[i]->cpus);
		kfree(managed_clusters[i]);
	}
	kfree(managed_clusters);
	return ret;
}
}


static int init_events_group(void)
static int init_events_group(void)