lkml.org 
[lkml]   [2016]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 2/4] SCHED_DEADLINE cpu heap code clarification/refactory.
    Date
    1. heapify up factored out in new dedicated function heapify_up()
    (avoids repeatition of same code)
    2. call to cpudl_change_key() replaced with heapify_up() when
    cpudl_set actually inserts a new node in the heap

    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Juri Lelli <juri.lelli@arm.com>
    Cc: Luca Abeni <luca.abeni@unitn.it>
    Reviewed-by: Luca Abeni <luca.abeni@unitn.it>
    Signed-off-by: Tommaso Cucinotta <tommaso.cucinotta@sssup.it>
    ---
    kernel/sched/cpudeadline.c | 38 +++++++++++++++++++-------------------
    1 file changed, 19 insertions(+), 19 deletions(-)

    diff --git a/kernel/sched/cpudeadline.c b/kernel/sched/cpudeadline.c
    index d418449..3c42702 100644
    --- a/kernel/sched/cpudeadline.c
    +++ b/kernel/sched/cpudeadline.c
    @@ -41,7 +41,7 @@ static void cpudl_exchange(struct cpudl *cp, int a, int b)
    swap(cp->elements[cpu_a].idx, cp->elements[cpu_b].idx);
    }

    -static void cpudl_heapify(struct cpudl *cp, int idx)
    +static void cpudl_heapify_down(struct cpudl *cp, int idx)
    {
    int l, r, largest;

    @@ -66,20 +66,25 @@ static void cpudl_heapify(struct cpudl *cp, int idx)
    }
    }

    +static void cpudl_heapify_up(struct cpudl *cp, int idx)
    +{
    + while (idx > 0 && dl_time_before(cp->elements[parent(idx)].dl,
    + cp->elements[idx].dl)) {
    + cpudl_exchange(cp, idx, parent(idx));
    + idx = parent(idx);
    + }
    +}
    +
    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)) {
    cp->elements[idx].dl = new_dl;
    - cpudl_heapify(cp, idx);
    + cpudl_heapify_down(cp, idx);
    } else {
    cp->elements[idx].dl = new_dl;
    - while (idx > 0 && dl_time_before(cp->elements[parent(idx)].dl,
    - cp->elements[idx].dl)) {
    - cpudl_exchange(cp, idx, parent(idx));
    - idx = parent(idx);
    - }
    + cpudl_heapify_up(cp, idx);
    }
    }

    @@ -154,24 +159,19 @@ void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid)
    cp->size--;
    cp->elements[new_cpu].idx = old_idx;
    cp->elements[cpu].idx = IDX_INVALID;
    - while (old_idx > 0 && dl_time_before(
    - cp->elements[parent(old_idx)].dl,
    - cp->elements[old_idx].dl)) {
    - cpudl_exchange(cp, old_idx, parent(old_idx));
    - old_idx = parent(old_idx);
    - }
    + cpudl_heapify_up(cp, old_idx);
    cpumask_set_cpu(cpu, cp->free_cpus);
    - cpudl_heapify(cp, old_idx);
    + cpudl_heapify_down(cp, old_idx);

    goto out;
    }

    if (old_idx == IDX_INVALID) {
    - cp->size++;
    - cp->elements[cp->size - 1].dl = dl;
    - cp->elements[cp->size - 1].cpu = cpu;
    - cp->elements[cpu].idx = cp->size - 1;
    - cpudl_change_key(cp, cp->size - 1, dl);
    + int size1 = cp->size++;
    + cp->elements[size1].dl = dl;
    + cp->elements[size1].cpu = cpu;
    + cp->elements[cpu].idx = size1;
    + cpudl_heapify_up(cp, size1);
    cpumask_clear_cpu(cpu, cp->free_cpus);
    } else {
    cpudl_change_key(cp, old_idx, dl);
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-07-19 13:21    [W:3.801 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site