[Devel] [PATCH RHEL7 COMMIT] ve/sched: Dereference resched_next on next task's stack
Konstantin Khorenko
khorenko at virtuozzo.com
Thu Dec 8 05:47:01 PST 2016
Please consider to RK.
--
Best regards,
Konstantin Khorenko,
Virtuozzo Linux Kernel Team
On 12/08/2016 04:45 PM, Konstantin Khorenko wrote:
> 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 <ktkhai at virtuozzo.com>
> 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 <ktkhai at virtuozzo.com>
>
> 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())
> .
>
More information about the Devel
mailing list