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

Commit dfb9634d authored by Joonwoo Park's avatar Joonwoo Park
Browse files

sched: prevent race between disable window statistics and task grouping



Change of colocation group requires to finish CPU busy time accounting
prior to its operation by calling update_task_ravg().  However when
window statistics accounting is disabled, update_task_ravg() acts as
nop and results in incorrect CPU time accounting.

Disallow colocation group change while window statistics accounting is
disabled in order to prevent race between reset_all_window_stats() and
colocation grouping functions.

Change-Id: I6dfa20b8d8b0ae7ccc94119bf9cf14c5e11a1cf7
Signed-off-by: default avatarJoonwoo Park <joonwoop@codeaurora.org>
parent 758693b4
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -3150,14 +3150,14 @@ void reset_all_window_stats(u64 window_start, unsigned int window_size)
	unsigned int old = 0, new = 0;
	unsigned int old = 0, new = 0;
	struct related_thread_group *grp;
	struct related_thread_group *grp;


	read_lock(&related_thread_group_lock);

	disable_window_stats();
	disable_window_stats();


	reset_all_task_stats();
	reset_all_task_stats();


	local_irq_save(flags);
	local_irq_save(flags);


	read_lock(&related_thread_group_lock);

	for_each_possible_cpu(cpu)
	for_each_possible_cpu(cpu)
		raw_spin_lock(&cpu_rq(cpu)->lock);
		raw_spin_lock(&cpu_rq(cpu)->lock);


@@ -3223,10 +3223,10 @@ void reset_all_window_stats(u64 window_start, unsigned int window_size)
	for_each_possible_cpu(cpu)
	for_each_possible_cpu(cpu)
		raw_spin_unlock(&cpu_rq(cpu)->lock);
		raw_spin_unlock(&cpu_rq(cpu)->lock);


	read_unlock(&related_thread_group_lock);

	local_irq_restore(flags);
	local_irq_restore(flags);


	read_unlock(&related_thread_group_lock);

	trace_sched_reset_all_window_stats(window_start, window_size,
	trace_sched_reset_all_window_stats(window_start, window_size,
		sched_ktime_clock() - start_ts, reason, old, new);
		sched_ktime_clock() - start_ts, reason, old, new);
}
}