linux/kernel/sched
Vikram Mulukutla ab2f7cf141 cpufreq: schedutil: Fix sugov_start() versus sugov_update_shared() race
With a shared policy in place, when one of the CPUs in the policy is
hotplugged out and then brought back online, sugov_stop() and
sugov_start() are called in order.

sugov_stop() removes utilization hooks for each CPU in the policy and
does nothing else in the for_each_cpu() loop. sugov_start() on the
other hand iterates through the CPUs in the policy and re-initializes
the per-cpu structure _and_ adds the utilization hook.  This implies
that the scheduler is allowed to invoke a CPU's utilization update
hook when the rest of the per-cpu structures have yet to be
re-inited.

Apart from some strange values in tracepoints this doesn't cause a
problem, but if we do end up accessing a pointer from the per-cpu
sugov_cpu structure somewhere in the sugov_update_shared() path,
we will likely see crashes since the memset for another CPU in the
policy is free to race with sugov_update_shared from the CPU that is
ready to go.  So let's fix this now to first init all per-cpu
structures, and then add the per-cpu utilization update hooks all at
once.

Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2017-07-12 14:47:48 +02:00
..
autogroup.c
autogroup.h
clock.c sched/clock: Fix broken stable to unstable transfer 2017-03-27 10:23:48 +02:00
completion.c sched/headers: Prepare for new header dependencies before moving code to <linux/sched/debug.h> 2017-03-02 08:42:34 +01:00
core.c sched/core: Idle_task_exit() shouldn't use switch_mm_irqs_off() 2017-06-11 10:58:17 +02:00
cpuacct.c
cpuacct.h
cpudeadline.c
cpudeadline.h
cpufreq_schedutil.c cpufreq: schedutil: Fix sugov_start() versus sugov_update_shared() race 2017-07-12 14:47:48 +02:00
cpufreq.c
cpupri.c
cpupri.h
cputime.c sched/cputime: Fix ksoftirqd cputime accounting regression 2017-04-27 09:08:26 +02:00
deadline.c sched/deadline: Use deadline instead of period when calculating overflow 2017-03-16 09:37:38 +01:00
debug.c sched/headers: Prepare to move the task_lock()/unlock() APIs to <linux/sched/task.h> 2017-03-02 08:42:38 +01:00
fair.c sched/fair: Fix typo in printk message 2017-06-11 10:00:33 +02:00
features.h sched/core: Add WARNING for multiple update_rq_clock() calls 2017-03-16 09:46:21 +01:00
idle_task.c
idle.c sched/core: Call __schedule() from do_idle() without enabling preemption 2017-05-15 10:09:12 +02:00
loadavg.c sched/loadavg: Use {READ,WRITE}_ONCE() for sample window 2017-03-16 09:21:01 +01:00
Makefile
rt.c sched/rt: Add comments describing the RT IPI pull method 2017-03-16 09:41:35 +01:00
sched-pelt.h sched/fair: Move the PELT constants into a generated header 2017-04-14 10:26:37 +02:00
sched.h sched/core: Call __schedule() from do_idle() without enabling preemption 2017-05-15 10:09:12 +02:00
stats.c
stats.h sched/headers: Move cputime functionality from <linux/sched.h> and <linux/cputime.h> into <linux/sched/cputime.h> 2017-03-03 01:45:22 +01:00
stop_task.c
swait.c sched/headers: Prepare to move signal wakeup & sigpending methods from <linux/sched.h> into <linux/sched/signal.h> 2017-03-02 08:42:32 +01:00
topology.c
wait.c sched/headers: fix up header file dependency on <linux/sched/signal.h> 2017-03-08 10:36:03 -08:00