Commit 498657a478c60be092208422fefa9c7b248729c2
Committed by
Ingo Molnar
1 parent
055a00865d
Exists in
master
and in
4 other branches
sched, kvm: Fix race condition involving sched_in_preempt_notifers
In finish_task_switch(), fire_sched_in_preempt_notifiers() is called after finish_lock_switch(). However, depending on architecture, preemption can be enabled after finish_lock_switch() which breaks the semantics of preempt notifiers. So move it before finish_arch_switch(). This also makes the in- notifiers symmetric to out- notifiers in terms of locking - now both are called under rq lock. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Avi Kivity <avi@redhat.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <4AFD2801.7020900@kernel.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Showing 1 changed file with 1 additions and 1 deletions Side-by-side Diff
kernel/sched.c
... | ... | @@ -2758,9 +2758,9 @@ |
2758 | 2758 | prev_state = prev->state; |
2759 | 2759 | finish_arch_switch(prev); |
2760 | 2760 | perf_event_task_sched_in(current, cpu_of(rq)); |
2761 | + fire_sched_in_preempt_notifiers(current); | |
2761 | 2762 | finish_lock_switch(rq, prev); |
2762 | 2763 | |
2763 | - fire_sched_in_preempt_notifiers(current); | |
2764 | 2764 | if (mm) |
2765 | 2765 | mmdrop(mm); |
2766 | 2766 | if (unlikely(prev_state == TASK_DEAD)) { |