[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