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

Commit 3da3b760 authored by Santosh Mardi's avatar Santosh Mardi Committed by Gerrit - the friendly Code Review server
Browse files

drivers: soc: qcom: update rimps memlat while saving pmu counters



During hoplug cpu going down path pmu event handles will be freed.
If the hotplug path and idle path run in parallel there are chances
in idle path that the driver will try to read the PMU counters with
freed pointer resulting in a crash.

Add NULL pointer check before performing PMU reads.

Change-Id: I9b8a4a8dfa63e70e879c3530a878a9c96062872f
Signed-off-by: default avatarSantosh Mardi <gsantosh@codeaurora.org>
parent 5168327a
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -620,7 +620,8 @@ static void save_cpugrp_pmu_events(struct memlat_cpu_grp *cpu_grp, u8 cpu)
	for (i = 0; i < NUM_COMMON_EVS; i++) {
		u8 hw_id = pmu[i].hw_cntr_idx;

		if (hw_id == INVALID_PMU_HW_IDX)
		if ((hw_id == INVALID_PMU_HW_IDX) ||
				!cpus_data->common_evs[i])
			continue;
		perf_event_read_local(cpus_data->common_evs[i],
				&ev_count, NULL, NULL);
@@ -639,7 +640,8 @@ static void save_mon_pmu_events(struct memlat_mon *mon, u8 cpu)
	for (i = 0; i < NUM_MON_EVS; i++) {
		u8 hw_id = pmu[i].hw_cntr_idx;

		if (hw_id == INVALID_PMU_HW_IDX)
		if (hw_id == INVALID_PMU_HW_IDX ||
				!ev_data->mon_evs[i])
			continue;
		perf_event_read_local(ev_data->mon_evs[i],
				&ev_count, NULL, NULL);
@@ -658,6 +660,7 @@ static void free_common_evs(struct memlat_cpu_grp *cpu_grp, cpumask_t *mask)
			if (!cpus_data->common_evs[i])
				continue;
			perf_event_release_kernel(cpus_data->common_evs[i]);
			cpus_data->common_evs[i] = NULL;
		}
	}
}
@@ -674,6 +677,7 @@ static void free_mon_evs(struct memlat_mon *mon, cpumask_t *mask)
				continue;

			perf_event_release_kernel(ev_data->mon_evs[i]);
			ev_data->mon_evs[i] = NULL;
		}
	}
}
@@ -755,8 +759,12 @@ static int memlat_hp_restart_events(unsigned int cpu, bool cpu_up)

static int memlat_event_hotplug_coming_up(unsigned int cpu)
{
	int ret;

	ret = memlat_hp_restart_events(cpu, true);
	if (!ret)
		per_cpu(cpu_is_hp, cpu) = false;
	return memlat_hp_restart_events(cpu, true);
	return ret;
}

static int memlat_event_hotplug_going_down(unsigned int cpu)