The commit is pushed to "branch-rh7-3.10.0-327.36.1.vz7.20.x-ovz" and will
appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.36.1.vz7.20.12
------>
commit 53fc9a189617835a17b831512f1f93515c4719aa
Author: Kirill Tkhai <[email protected]>
Date: Thu Dec 8 17:45:56 2016 +0400
ve/sched: Dereference resched_next on next task's stack
When we dereference it before context switch, the read value
just caches in prev task's stack. Later, the prev task may
wake up in any cpu, so the value became useless.
https://jira.sw.ru/browse/PSBM-56984
Signed-off-by: Kirill Tkhai <[email protected]>
khorenko@: this fixes our priority inversion defense in kernel.
---
kernel/sched/core.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index ccc826a..384373c 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3443,9 +3443,6 @@ need_resched:
clear_tsk_need_resched(prev);
rq->skip_clock_update = 0;
- resched_next = rq->resched_next;
- rq->resched_next = 0;
-
if (likely(prev != next)) {
rq->nr_switches++;
rq->curr = next;
@@ -3465,8 +3462,11 @@ need_resched:
post_schedule(rq);
- if (resched_next)
+ resched_next = READ_ONCE(rq->resched_next);
+ if (resched_next) {
set_tsk_need_resched(current);
+ rq->resched_next = 0;
+ }
sched_preempt_enable_no_resched();
if (!resched_next && need_resched())
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel