Re: [PATCH 1/6] sched/rt: check if curr can be pushed/pulled somewhere else in advance

Wanpeng Li
2014-10-29T22:57:28Z

Cc Kirill,
2014/10/27 9:41, Wanpeng Li:
> This patch checks if current can be pushed/pulled somewhere else
> in advance to make logic clear.
>
> - If current can't be migrated, useless to reschedule, let's hope
> task can move out.
> - If task is migratable, so let's not schedule it and see if it
> can be pushed or pulled somewhere else.
>
> Signed-off-by: Wanpeng Li <wanpeng.li@linux.intel.com>
> ---
> kernel/sched/rt.c | 14 ++++++++++----
> 1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
> index 87ea5bf..ca1b7c7 100644
> --- a/kernel/sched/rt.c
> +++ b/kernel/sched/rt.c
> @@ -1351,16 +1351,22 @@ out:
>
> static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p)
> {
> - if (rq->curr->nr_cpus_allowed == 1)
> + /*
> + * Current can't be migrated, useless to reschedule,
> + * let's hope p can move out.
> + */
> + if (rq->curr->nr_cpus_allowed == 1 ||
> + !cpupri_find(&rq->rd->cpupri, rq->curr, NULL))
> return;
>
> + /*
> + * p is migratable, so let's not schedule it and
> + * see if it is pushed or pulled somewhere else.
> + */
> if (p->nr_cpus_allowed != 1
> && cpupri_find(&rq->rd->cpupri, p, NULL))
> return;
>
> - if (!cpupri_find(&rq->rd->cpupri, rq->curr, NULL))
> - return;
> -
> /*
> * There appears to be other cpus that can accept
> * current and none to run 'p', so lets reschedule