As there is a time_before64() in linux/jiffies.h we can use to achieve our requirement here, we need not to reimplement a new function of dl_time_before() here.
Signed-off-by: Dongsheng Yang <[email protected]> --- kernel/sched/cpudeadline.c | 17 ++++++----------- kernel/sched/deadline.c | 30 +++++++++++++++--------------- kernel/sched/sched.h | 7 +------ 3 files changed, 22 insertions(+), 32 deletions(-) diff --git a/kernel/sched/cpudeadline.c b/kernel/sched/cpudeadline.c index 5b9bb42..15cedea 100644 --- a/kernel/sched/cpudeadline.c +++ b/kernel/sched/cpudeadline.c @@ -30,11 +30,6 @@ static inline int right_child(int i) return (i << 1) + 2; } -static inline int dl_time_before(u64 a, u64 b) -{ - return (s64)(a - b) < 0; -} - static void cpudl_exchange(struct cpudl *cp, int a, int b) { int cpu_a = cp->elements[a].cpu, cpu_b = cp->elements[b].cpu; @@ -53,10 +48,10 @@ static void cpudl_heapify(struct cpudl *cp, int idx) r = right_child(idx); largest = idx; - if ((l < cp->size) && dl_time_before(cp->elements[idx].dl, + if ((l < cp->size) && time_before64(cp->elements[idx].dl, cp->elements[l].dl)) largest = l; - if ((r < cp->size) && dl_time_before(cp->elements[largest].dl, + if ((r < cp->size) && time_before64(cp->elements[largest].dl, cp->elements[r].dl)) largest = r; if (largest == idx) @@ -72,12 +67,12 @@ static void cpudl_change_key(struct cpudl *cp, int idx, u64 new_dl) { WARN_ON(idx == IDX_INVALID || !cpu_present(idx)); - if (dl_time_before(new_dl, cp->elements[idx].dl)) { + if (time_before64(new_dl, cp->elements[idx].dl)) { cp->elements[idx].dl = new_dl; cpudl_heapify(cp, idx); } else { cp->elements[idx].dl = new_dl; - while (idx > 0 && dl_time_before(cp->elements[parent(idx)].dl, + while (idx > 0 && time_before64(cp->elements[parent(idx)].dl, cp->elements[idx].dl)) { cpudl_exchange(cp, idx, parent(idx)); idx = parent(idx); @@ -110,7 +105,7 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p, best_cpu = cpumask_any(later_mask); goto out; } else if (cpumask_test_cpu(cpudl_maximum(cp), &p->cpus_allowed) && - dl_time_before(dl_se->deadline, cp->elements[0].dl)) { + time_before64(dl_se->deadline, cp->elements[0].dl)) { best_cpu = cpudl_maximum(cp); if (later_mask) cpumask_set_cpu(best_cpu, later_mask); @@ -157,7 +152,7 @@ void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid) cp->size--; cp->cpu_to_idx[new_cpu] = old_idx; cp->cpu_to_idx[cpu] = IDX_INVALID; - while (old_idx > 0 && dl_time_before( + while (old_idx > 0 && time_before64( cp->elements[parent(old_idx)].dl, cp->elements[old_idx].dl)) { cpudl_exchange(cp, old_idx, parent(old_idx)); diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index b080957..ef53607 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -347,7 +347,7 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se, * resetting the deadline and the budget of the * entity. */ - if (dl_time_before(dl_se->deadline, rq_clock(rq))) { + if (time_before64(dl_se->deadline, rq_clock(rq))) { static bool lag_once = false; if (!lag_once) { @@ -410,7 +410,7 @@ static bool dl_entity_overflow(struct sched_dl_entity *dl_se, right = ((dl_se->deadline - t) >> DL_SCALE) * (pi_se->dl_runtime >> DL_SCALE); - return dl_time_before(right, left); + return time_before64(right, left); } /* @@ -437,7 +437,7 @@ static void update_dl_entity(struct sched_dl_entity *dl_se, return; } - if (dl_time_before(dl_se->deadline, rq_clock(rq)) || + if (time_before64(dl_se->deadline, rq_clock(rq)) || dl_entity_overflow(dl_se, pi_se, rq_clock(rq))) { dl_se->deadline = rq_clock(rq) + pi_se->dl_deadline; dl_se->runtime = pi_se->dl_runtime; @@ -565,7 +565,7 @@ void init_dl_task_timer(struct sched_dl_entity *dl_se) static int dl_runtime_exceeded(struct rq *rq, struct sched_dl_entity *dl_se) { - int dmiss = dl_time_before(dl_se->deadline, rq_clock(rq)); + int dmiss = time_before64(dl_se->deadline, rq_clock(rq)); int rorun = dl_se->runtime <= 0; if (!rorun && !dmiss) @@ -680,7 +680,7 @@ static void inc_dl_deadline(struct dl_rq *dl_rq, u64 deadline) struct rq *rq = rq_of_dl_rq(dl_rq); if (dl_rq->earliest_dl.curr == 0 || - dl_time_before(deadline, dl_rq->earliest_dl.curr)) { + time_before64(deadline, dl_rq->earliest_dl.curr)) { /* * If the dl_rq had no -deadline tasks, or if the new task * has shorter deadline than the current one on dl_rq, we @@ -691,7 +691,7 @@ static void inc_dl_deadline(struct dl_rq *dl_rq, u64 deadline) dl_rq->earliest_dl.curr = deadline; cpudl_set(&rq->rd->cpudl, rq->cpu, deadline, 1); } else if (dl_rq->earliest_dl.next == 0 || - dl_time_before(deadline, dl_rq->earliest_dl.next)) { + time_before64(deadline, dl_rq->earliest_dl.next)) { /* * On the other hand, if the new -deadline task has a * a later deadline than the earliest one on dl_rq, but @@ -773,7 +773,7 @@ static void __enqueue_dl_entity(struct sched_dl_entity *dl_se) while (*link) { parent = *link; entry = rb_entry(parent, struct sched_dl_entity, rb_node); - if (dl_time_before(dl_se->deadline, entry->deadline)) + if (time_before64(dl_se->deadline, entry->deadline)) link = &parent->rb_left; else { link = &parent->rb_right; @@ -1268,7 +1268,7 @@ static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq) * task, the rq is a good one. */ if (!later_rq->dl.dl_nr_running || - dl_time_before(task->dl.deadline, + time_before64(task->dl.deadline, later_rq->dl.earliest_dl.curr)) break; @@ -1329,7 +1329,7 @@ retry: * without going further in pushing next_task. */ if (dl_task(rq->curr) && - dl_time_before(next_task->dl.deadline, rq->curr->dl.deadline) && + time_before64(next_task->dl.deadline, rq->curr->dl.deadline) && rq->curr->nr_cpus_allowed > 1) { resched_task(rq->curr); return 0; @@ -1415,7 +1415,7 @@ static int pull_dl_task(struct rq *this_rq) * we are fine with this. */ if (this_rq->dl.dl_nr_running && - dl_time_before(this_rq->dl.earliest_dl.curr, + time_before64(this_rq->dl.earliest_dl.curr, src_rq->dl.earliest_dl.next)) continue; @@ -1436,9 +1436,9 @@ static int pull_dl_task(struct rq *this_rq) * - it preempts our current (if there's one), * - it will preempt the last one we pulled (if any). */ - if (p && dl_time_before(p->dl.deadline, dmin) && + if (p && time_before64(p->dl.deadline, dmin) && (!this_rq->dl.dl_nr_running || - dl_time_before(p->dl.deadline, + time_before64(p->dl.deadline, this_rq->dl.earliest_dl.curr))) { WARN_ON(p == src_rq->curr); WARN_ON(!p->on_rq); @@ -1447,8 +1447,8 @@ static int pull_dl_task(struct rq *this_rq) * Then we pull iff p has actually an earlier * deadline than the current task of its runqueue. */ - if (dl_time_before(p->dl.deadline, - src_rq->curr->dl.deadline)) + if (time_before64(p->dl.deadline, + src_rq->curr->dl.deadline)) goto skip; ret = 1; @@ -1628,7 +1628,7 @@ static void prio_changed_dl(struct rq *rq, struct task_struct *p, * then reschedule, provided p is still on this * runqueue. */ - if (dl_time_before(rq->dl.earliest_dl.curr, p->dl.deadline) && + if (time_before64(rq->dl.earliest_dl.curr, p->dl.deadline) && rq->curr == p) resched_task(p); #else diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index bbc7e07..bf71df0 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -93,18 +93,13 @@ static inline int task_has_dl_policy(struct task_struct *p) return dl_policy(p->policy); } -static inline bool dl_time_before(u64 a, u64 b) -{ - return (s64)(a - b) < 0; -} - /* * Tells if entity @a should preempt entity @b. */ static inline bool dl_entity_preempt(struct sched_dl_entity *a, struct sched_dl_entity *b) { - return dl_time_before(a->deadline, b->deadline); + return time_before64(a->deadline, b->deadline); } /* -- 1.8.2.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

