Re: [PATCH 06/19] smart: use CPU selection logic if smart is enabled
From: Pavel Machek
Date: Sun Sep 21 2014 - 13:31:32 EST
On Thu 2014-09-04 20:30:52, klamm@xxxxxxxxxxxxxx wrote:
> From: Roman Gushchin <klamm@xxxxxxxxxxxxxx>
>
> This patch causes rt scheduler to use smart CPU selection logic,
> if smart_enabled() returns true.
SMART is a technology to report HDD health, so while it is cool name, it might
be better to use different name to avoid confusion.
Pavel
> @@ -1262,8 +1262,12 @@ int select_task_rq(struct task_struct *p, int sd_flags, int wake_flags)
> * not worry about this generic constraint ]
> */
> if (unlikely(!cpumask_test_cpu(cpu, tsk_cpus_allowed(p)) ||
> - !cpu_online(cpu)))
> + !cpu_online(cpu))) {
> + if (smart_enabled() && task_has_rt_policy(p) && cpu >= 0)
> + release_core(cpu);
> +
> cpu = select_fallback_rq(task_cpu(p), p);
> + }
>
> return cpu;
> }
> diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
> index 805951b..1993c47 100644
> --- a/kernel/sched/rt.c
> +++ b/kernel/sched/rt.c
> @@ -15,6 +15,14 @@ struct static_key __smart_enabled = STATIC_KEY_INIT_TRUE;
> DEFINE_MUTEX(smart_mutex);
>
> DEFINE_PER_CPU_SHARED_ALIGNED(struct smart_core_data, smart_core_data);
> +
> +static int smart_find_lowest_rq(struct task_struct *task, bool wakeup);
> +
> +#else /* CONFIG_SMART */
> +static inline int smart_find_lowest_rq(struct task_struct *task, bool wakeup)
> +{
> + return -1;
> +}
> #endif /* CONFIG_SMART */
>
> int sched_rr_timeslice = RR_TIMESLICE;
> @@ -1211,6 +1219,7 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags)
> enqueue_pushable_task(rq, p);
>
> inc_nr_running(rq);
> + release_core(cpu_of(rq));
> }
>
> static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags)
> @@ -1278,6 +1287,13 @@ select_task_rq_rt(struct task_struct *p, int sd_flag, int flags)
> if (sd_flag != SD_BALANCE_WAKE && sd_flag != SD_BALANCE_FORK)
> goto out;
>
> + if (smart_enabled()) {
> + int target = smart_find_lowest_rq(p, true);
> + if (likely(target != -1))
> + cpu = target;
> + goto out;
> + }
> +
> rq = cpu_rq(cpu);
>
> rcu_read_lock();
> @@ -1580,10 +1596,17 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq)
> int cpu;
>
> for (tries = 0; tries < RT_MAX_TRIES; tries++) {
> - cpu = find_lowest_rq(task);
> + if (smart_enabled())
> + cpu = smart_find_lowest_rq(task, false);
> + else
> + cpu = find_lowest_rq(task);
> +
> + if ((cpu == -1) || (cpu == rq->cpu)) {
> + if (cpu == rq->cpu)
> + release_core(cpu);
>
> - if ((cpu == -1) || (cpu == rq->cpu))
> break;
> + }
>
> lowest_rq = cpu_rq(cpu);
>
> @@ -1602,6 +1625,7 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq)
> !task->on_rq)) {
>
> double_unlock_balance(rq, lowest_rq);
> + release_core(cpu);
> lowest_rq = NULL;
> break;
> }
> @@ -1614,6 +1638,7 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq)
> /* try again */
> double_unlock_balance(rq, lowest_rq);
> lowest_rq = NULL;
> + release_core(cpu);
> }
>
> return lowest_rq;
> --
> 1.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/