]> git.baikalelectronics.ru Git - kernel.git/commitdiff
sched/features: Distinguish between NORMAL and DEADLINE hrtick
authorJuri Lelli <juri.lelli@redhat.com>
Mon, 8 Feb 2021 07:35:54 +0000 (08:35 +0100)
committerIngo Molnar <mingo@kernel.org>
Wed, 17 Feb 2021 13:12:42 +0000 (14:12 +0100)
The HRTICK feature has traditionally been servicing configurations that
need precise preemptions point for NORMAL tasks. More recently, the
feature has been extended to also service DEADLINE tasks with stringent
runtime enforcement needs (e.g., runtime < 1ms with HZ=1000).

Enabling HRTICK sched feature currently enables the additional timer and
task tick for both classes, which might introduced undesired overhead
for no additional benefit if one needed it only for one of the cases.

Separate HRTICK sched feature in two (and leave the traditional case
name unmodified) so that it can be selectively enabled when needed.

With:

  $ echo HRTICK > /sys/kernel/debug/sched_features

the NORMAL/fair hrtick gets enabled.

With:

  $ echo HRTICK_DL > /sys/kernel/debug/sched_features

the DEADLINE hrtick gets enabled.

Signed-off-by: Juri Lelli <juri.lelli@redhat.com>
Signed-off-by: Luis Claudio R. Goncalves <lgoncalv@redhat.com>
Signed-off-by: Daniel Bristot de Oliveira <bristot@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/20210208073554.14629-3-juri.lelli@redhat.com
kernel/sched/core.c
kernel/sched/deadline.c
kernel/sched/fair.c
kernel/sched/features.h
kernel/sched/sched.h

index 18d51ab3d2b9cf4b55346b42017d1a2a10592032..88a2e2bdbabeb8a11c631907d2c7f5da0b4c0a1b 100644 (file)
@@ -4969,7 +4969,7 @@ static void __sched notrace __schedule(bool preempt)
 
        schedule_debug(prev, preempt);
 
-       if (sched_feat(HRTICK))
+       if (sched_feat(HRTICK) || sched_feat(HRTICK_DL))
                hrtick_clear(rq);
 
        local_irq_disable();
index 6f377969fa71b8b80d31059da98ef1f7ba3f0c8f..aac3539aa0fee773763b85fcd5b6d05fe3061c81 100644 (file)
@@ -1832,7 +1832,7 @@ static void set_next_task_dl(struct rq *rq, struct task_struct *p, bool first)
        if (!first)
                return;
 
-       if (hrtick_enabled(rq))
+       if (hrtick_enabled_dl(rq))
                start_hrtick_dl(rq, p);
 
        if (rq->curr->sched_class != &dl_sched_class)
@@ -1895,7 +1895,7 @@ static void task_tick_dl(struct rq *rq, struct task_struct *p, int queued)
         * not being the leftmost task anymore. In that case NEED_RESCHED will
         * be set and schedule() will start a new hrtick for the next task.
         */
-       if (hrtick_enabled(rq) && queued && p->dl.runtime > 0 &&
+       if (hrtick_enabled_dl(rq) && queued && p->dl.runtime > 0 &&
            is_leftmost(p, &rq->dl))
                start_hrtick_dl(rq, p);
 }
index 59b645e3c4fd90552d285a8245ef8fd6334c3135..8a8bd7b13634d675cb144829303085c2437a06c5 100644 (file)
@@ -5429,7 +5429,7 @@ static void hrtick_update(struct rq *rq)
 {
        struct task_struct *curr = rq->curr;
 
-       if (!hrtick_enabled(rq) || curr->sched_class != &fair_sched_class)
+       if (!hrtick_enabled_fair(rq) || curr->sched_class != &fair_sched_class)
                return;
 
        if (cfs_rq_of(&curr->se)->nr_running < sched_nr_latency)
@@ -7116,7 +7116,7 @@ done: __maybe_unused;
        list_move(&p->se.group_node, &rq->cfs_tasks);
 #endif
 
-       if (hrtick_enabled(rq))
+       if (hrtick_enabled_fair(rq))
                hrtick_start_fair(rq, p);
 
        update_misfit_status(p, rq);
index e875eabb660014960dbc32a440fc1db255ec3d8b..1bc2b158fc515895d030e3ecd39d4b6a76761d2e 100644 (file)
@@ -38,6 +38,7 @@ SCHED_FEAT(CACHE_HOT_BUDDY, true)
 SCHED_FEAT(WAKEUP_PREEMPTION, true)
 
 SCHED_FEAT(HRTICK, false)
+SCHED_FEAT(HRTICK_DL, false)
 SCHED_FEAT(DOUBLE_TICK, false)
 
 /*
index 0dfdd52799c7d7de83848a6c07ed408fc05d8d69..10a1522b1e30311a89ab7c7025c3af081f566741 100644 (file)
@@ -2105,17 +2105,39 @@ extern const_debug unsigned int sysctl_sched_migration_cost;
  */
 static inline int hrtick_enabled(struct rq *rq)
 {
-       if (!sched_feat(HRTICK))
-               return 0;
        if (!cpu_active(cpu_of(rq)))
                return 0;
        return hrtimer_is_hres_active(&rq->hrtick_timer);
 }
 
+static inline int hrtick_enabled_fair(struct rq *rq)
+{
+       if (!sched_feat(HRTICK))
+               return 0;
+       return hrtick_enabled(rq);
+}
+
+static inline int hrtick_enabled_dl(struct rq *rq)
+{
+       if (!sched_feat(HRTICK_DL))
+               return 0;
+       return hrtick_enabled(rq);
+}
+
 void hrtick_start(struct rq *rq, u64 delay);
 
 #else
 
+static inline int hrtick_enabled_fair(struct rq *rq)
+{
+       return 0;
+}
+
+static inline int hrtick_enabled_dl(struct rq *rq)
+{
+       return 0;
+}
+
 static inline int hrtick_enabled(struct rq *rq)
 {
        return 0;