History

sched: Account number of SCHED_IDLE entities on each cfs_rq

Adds cfs_rq->idle_nr_running, which accounts the number of idle entities directly enqueued on the cfs_rq.

Josh Don committed 5 years ago

Commit a480add1 parent a130e8f3 files · +27 −1Browse files

Unified · Split

3 files
  1. kernel/sched/debug.c +2 −0
  2. kernel/sched/fair.c +24 −1
  3. kernel/sched/sched.h +1 −0
kernel/sched/debug.c+2−0
@@ -614,6 +614,8 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) · 613 unmodified lines
614614 cfs_rq->nr_spread_over);
615615 SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running);
616616 SEQ_printf(m, " .%-30s: %d\n", "h_nr_running", cfs_rq->h_nr_running);
617+ SEQ_printf(m, " .%-30s: %d\n", "idle_nr_running",
618+ cfs_rq->idle_nr_running);
617619 SEQ_printf(m, " .%-30s: %d\n", "idle_h_nr_running",
618620 cfs_rq->idle_h_nr_running);
619621 SEQ_printf(m, " .%-30s: %ld\n", "load", cfs_rq->load.weight);
kernel/sched/fair.c+24−1
@@ -2995,6 +2995,8 @@ account_entity_enqueue(struct cfs_rq *cfs_rq, struct sched_entity *se) · 2994 unmodified lines
29952995 }
29962996 #endif
29972997 cfs_rq->nr_running++;
2998+ if (se_is_idle(se))
2999+ cfs_rq->idle_nr_running++;
29983000 }
29993001
30003002 static void
@@ -3008,6 +3010,8 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se) · 7 unmodified lines
30083010 }
30093011 #endif
30103012 cfs_rq->nr_running--;
3013+ if (se_is_idle(se))
3014+ cfs_rq->idle_nr_running--;
30113015 }
30123016
30133017 /*
@@ -5577,6 +5581,17 @@ static int sched_idle_rq(struct rq *rq) · 2563 unmodified lines
55775581 rq->nr_running);
55785582 }
55795583
5584+/*
5585+ * Returns true if cfs_rq only has SCHED_IDLE entities enqueued. Note the use
5586+ * of idle_nr_running, which does not consider idle descendants of normal
5587+ * entities.
5588+ */
5589+static bool sched_idle_cfs_rq(struct cfs_rq *cfs_rq)
5590+{
5591+ return cfs_rq->nr_running &&
5592+ cfs_rq->nr_running == cfs_rq->idle_nr_running;
5593+}
5594+
55805595 #ifdef CONFIG_SMP
55815596 static int sched_idle_cpu(int cpu)
55825597 {
@@ -11575,7 +11590,7 @@ int sched_group_set_idle(struct task_group *tg, long idle) · 5992 unmodified lines
1157511590 for_each_possible_cpu(i) {
1157611591 struct rq *rq = cpu_rq(i);
1157711592 struct sched_entity *se = tg->se[i];
11578− struct cfs_rq *grp_cfs_rq = tg->cfs_rq[i];
11593+ struct cfs_rq *parent_cfs_rq, *grp_cfs_rq = tg->cfs_rq[i];
1157911594 bool was_idle = cfs_rq_is_idle(grp_cfs_rq);
1158011595 long idle_task_delta;
1158111596 struct rq_flags rf;
@@ -11586,6 +11601,14 @@ int sched_group_set_idle(struct task_group *tg, long idle) · 4 unmodified lines
1158611601 if (WARN_ON_ONCE(was_idle == cfs_rq_is_idle(grp_cfs_rq)))
1158711602 goto next_cpu;
1158811603
11604+ if (se->on_rq) {
11605+ parent_cfs_rq = cfs_rq_of(se);
11606+ if (cfs_rq_is_idle(grp_cfs_rq))
11607+ parent_cfs_rq->idle_nr_running++;
11608+ else
11609+ parent_cfs_rq->idle_nr_running--;
11610+ }
11611+
1158911612 idle_task_delta = grp_cfs_rq->h_nr_running -
1159011613 grp_cfs_rq->idle_h_nr_running;
1159111614 if (!cfs_rq_is_idle(grp_cfs_rq))
kernel/sched/sched.h+1−0
@@ -530,6 +530,7 @@ struct cfs_rq { · 529 unmodified lines
530530 struct load_weight load;
531531 unsigned int nr_running;
532532 unsigned int h_nr_running; /* SCHED_{NORMAL,BATCH,IDLE} */
533+ unsigned int idle_nr_running; /* SCHED_IDLE */
533534 unsigned int idle_h_nr_running; /* SCHED_IDLE */
534535
535536 u64 exec_clock;