The following commit has been merged into the sched/core branch of tip:

Commit-ID:     934fc3314b39e16a89fc4d5d0d5cbfe71dcbe7b1
Gitweb:        
https://git.kernel.org/tip/934fc3314b39e16a89fc4d5d0d5cbfe71dcbe7b1
Author:        Peter Zijlstra <pet...@infradead.org>
AuthorDate:    Wed, 14 Oct 2020 21:06:49 +02:00
Committer:     Peter Zijlstra <pet...@infradead.org>
CommitterDate: Thu, 29 Oct 2020 11:00:30 +01:00

sched/cpupri: Remap CPUPRI_NORMAL to MAX_RT_PRIO-1

This makes the mapping continuous and frees up 100 for other usage.

Prev mapping:

p->rt_priority   p->prio   newpri   cpupri

                               -1       -1 (CPUPRI_INVALID)

                              100        0 (CPUPRI_NORMAL)

             1        98       98        1
           ...
            49        50       50       49
            50        49       49       50
           ...
            99         0        0       99

New mapping:

p->rt_priority   p->prio   newpri   cpupri

                               -1       -1 (CPUPRI_INVALID)

                               99        0 (CPUPRI_NORMAL)

             1        98       98        1
           ...
            49        50       50       49
            50        49       49       50
           ...
            99         0        0       99

Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
Reviewed-by: Dietmar Eggemann <dietmar.eggem...@arm.com>
---
 kernel/sched/cpupri.c | 34 +++++++++++++++++++++++++++-------
 kernel/sched/rt.c     | 16 +++++++++-------
 2 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c
index 8d9952a..e434910 100644
--- a/kernel/sched/cpupri.c
+++ b/kernel/sched/cpupri.c
@@ -24,17 +24,37 @@
  */
 #include "sched.h"
 
-/* Convert between a 140 based task->prio, and our 100 based cpupri */
+/*
+ * p->rt_priority   p->prio   newpri   cpupri
+ *
+ *                               -1       -1 (CPUPRI_INVALID)
+ *
+ *                               99        0 (CPUPRI_NORMAL)
+ *
+ *             1        98       98        1
+ *           ...
+ *            49        50       50       49
+ *            50        49       49       50
+ *           ...
+ *            99         0        0       99
+ */
 static int convert_prio(int prio)
 {
        int cpupri;
 
-       if (prio == CPUPRI_INVALID)
-               cpupri = CPUPRI_INVALID;
-       else if (prio >= MAX_RT_PRIO)
-               cpupri = CPUPRI_NORMAL;
-       else
-               cpupri = MAX_RT_PRIO - prio - 1;
+       switch (prio) {
+       case CPUPRI_INVALID:
+               cpupri = CPUPRI_INVALID;        /* -1 */
+               break;
+
+       case 0 ... 98:
+               cpupri = MAX_RT_PRIO-1 - prio;  /* 1 ... 99 */
+               break;
+
+       case MAX_RT_PRIO-1:
+               cpupri = CPUPRI_NORMAL;         /*  0 */
+               break;
+       }
 
        return cpupri;
 }
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 49ec096..8a3b1ba 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -89,8 +89,8 @@ void init_rt_rq(struct rt_rq *rt_rq)
        __set_bit(MAX_RT_PRIO, array->bitmap);
 
 #if defined CONFIG_SMP
-       rt_rq->highest_prio.curr = MAX_RT_PRIO;
-       rt_rq->highest_prio.next = MAX_RT_PRIO;
+       rt_rq->highest_prio.curr = MAX_RT_PRIO-1;
+       rt_rq->highest_prio.next = MAX_RT_PRIO-1;
        rt_rq->rt_nr_migratory = 0;
        rt_rq->overloaded = 0;
        plist_head_init(&rt_rq->pushable_tasks);
@@ -161,7 +161,7 @@ void init_tg_rt_entry(struct task_group *tg, struct rt_rq 
*rt_rq,
 {
        struct rq *rq = cpu_rq(cpu);
 
-       rt_rq->highest_prio.curr = MAX_RT_PRIO;
+       rt_rq->highest_prio.curr = MAX_RT_PRIO-1;
        rt_rq->rt_nr_boosted = 0;
        rt_rq->rq = rq;
        rt_rq->tg = tg;
@@ -393,8 +393,9 @@ static void dequeue_pushable_task(struct rq *rq, struct 
task_struct *p)
                p = plist_first_entry(&rq->rt.pushable_tasks,
                                      struct task_struct, pushable_tasks);
                rq->rt.highest_prio.next = p->prio;
-       } else
-               rq->rt.highest_prio.next = MAX_RT_PRIO;
+       } else {
+               rq->rt.highest_prio.next = MAX_RT_PRIO-1;
+       }
 }
 
 #else
@@ -1147,8 +1148,9 @@ dec_rt_prio(struct rt_rq *rt_rq, int prio)
                                sched_find_first_bit(array->bitmap);
                }
 
-       } else
-               rt_rq->highest_prio.curr = MAX_RT_PRIO;
+       } else {
+               rt_rq->highest_prio.curr = MAX_RT_PRIO-1;
+       }
 
        dec_rt_prio_smp(rt_rq, prio, prev_prio);
 }

Reply via email to