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.

Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 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 @@ static void __sched __schedule(void)
        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 @@ static void __sched __schedule(void)
 
        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
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to