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
614 cfs_rq->nr_spread_over);614 cfs_rq->nr_spread_over);
615 SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running);615 SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running);
616 SEQ_printf(m, " .%-30s: %d\n", "h_nr_running", cfs_rq->h_nr_running);616 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);
617 SEQ_printf(m, " .%-30s: %d\n", "idle_h_nr_running",619 SEQ_printf(m, " .%-30s: %d\n", "idle_h_nr_running",
618 cfs_rq->idle_h_nr_running);620 cfs_rq->idle_h_nr_running);
619 SEQ_printf(m, " .%-30s: %ld\n", "load", cfs_rq->load.weight);621 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
2995 }2995 }
2996#endif2996#endif
2997 cfs_rq->nr_running++;2997 cfs_rq->nr_running++;
2998 if (se_is_idle(se))
2999 cfs_rq->idle_nr_running++;
2998}3000}
2999 3001
3000static void3002static void
@@ -3008,6 +3010,8 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se) · 7 unmodified lines
3008 }3010 }
3009#endif3011#endif
3010 cfs_rq->nr_running--;3012 cfs_rq->nr_running--;
3013 if (se_is_idle(se))
3014 cfs_rq->idle_nr_running--;
3011}3015}
3012 3016
3013/*3017/*
@@ -5577,6 +5581,17 @@ static int sched_idle_rq(struct rq *rq) · 2563 unmodified lines
5577 rq->nr_running);5581 rq->nr_running);
5578}5582}
5579 5583
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 */
5589static 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
5580#ifdef CONFIG_SMP5595#ifdef CONFIG_SMP
5581static int sched_idle_cpu(int cpu)5596static int sched_idle_cpu(int cpu)
5582{5597{
@@ -11575,7 +11590,7 @@ int sched_group_set_idle(struct task_group *tg, long idle) · 5992 unmodified lines
11575 for_each_possible_cpu(i) {11590 for_each_possible_cpu(i) {
11576 struct rq *rq = cpu_rq(i);11591 struct rq *rq = cpu_rq(i);
11577 struct sched_entity *se = tg->se[i];11592 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];
11579 bool was_idle = cfs_rq_is_idle(grp_cfs_rq);11594 bool was_idle = cfs_rq_is_idle(grp_cfs_rq);
11580 long idle_task_delta;11595 long idle_task_delta;
11581 struct rq_flags rf;11596 struct rq_flags rf;
@@ -11586,6 +11601,14 @@ int sched_group_set_idle(struct task_group *tg, long idle) · 4 unmodified lines
11586 if (WARN_ON_ONCE(was_idle == cfs_rq_is_idle(grp_cfs_rq)))11601 if (WARN_ON_ONCE(was_idle == cfs_rq_is_idle(grp_cfs_rq)))
11587 goto next_cpu;11602 goto next_cpu;
11588 11603
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
11589 idle_task_delta = grp_cfs_rq->h_nr_running -11612 idle_task_delta = grp_cfs_rq->h_nr_running -
11590 grp_cfs_rq->idle_h_nr_running;11613 grp_cfs_rq->idle_h_nr_running;
11591 if (!cfs_rq_is_idle(grp_cfs_rq))11614 if (!cfs_rq_is_idle(grp_cfs_rq))
kernel/sched/sched.h+1−0
@@ -530,6 +530,7 @@ struct cfs_rq { · 529 unmodified lines
530 struct load_weight load;530 struct load_weight load;
531 unsigned int nr_running;531 unsigned int nr_running;
532 unsigned int h_nr_running; /* SCHED_{NORMAL,BATCH,IDLE} */532 unsigned int h_nr_running; /* SCHED_{NORMAL,BATCH,IDLE} */
533 unsigned int idle_nr_running; /* SCHED_IDLE */
533 unsigned int idle_h_nr_running; /* SCHED_IDLE */534 unsigned int idle_h_nr_running; /* SCHED_IDLE */
534 535
535 u64 exec_clock;536 u64 exec_clock;