sched/cpupri: Remap CPUPRI_NORMAL to MAX_RT_PRIO-1
authorPeter Zijlstra <peterz@infradead.org>
Wed, 14 Oct 2020 19:06:49 +0000 (21:06 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 29 Oct 2020 10:00:30 +0000 (11:00 +0100)
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) <peterz@infradead.org>
Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
kernel/sched/cpupri.c
kernel/sched/rt.c

index 8d9952a..e434910 100644 (file)
  */
 #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;
 }
index 49ec096..8a3b1ba 100644 (file)
@@ -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);
 }