Il 24/10/2016 16:06, Luca Abeni ha scritto: > The active utilisation here is defined as the total utilisation of the > active (TASK_RUNNING) tasks queued on a runqueue. Hence, it is increased > when a task wakes up and is decreased when a task blocks. > > When a task is migrated from CPUi to CPUj, immediately subtract the task's > utilisation from CPUi and add it to CPUj. This mechanism is implemented by > modifying the pull and push functions. > Note: this is not fully correct from the theoretical point of view > (the utilisation should be removed from CPUi only at the 0 lag time), > but doing the right thing would be _MUCH_ more complex (leaving the > timer armed when the task is on a different CPU... Inactive timers should > be moved from per-task timers to per-runqueue lists of timers! Bah...) > > The utilisation tracking mechanism implemented in this commit can be > fixed / improved by decreasing the active utilisation at the so-called > "0-lag time" instead of when the task blocks. > > Signed-off-by: Juri Lelli <juri.le...@arm.com> > Signed-off-by: Luca Abeni <luca.ab...@unitn.it> > --- > kernel/sched/deadline.c | 39 ++++++++++++++++++++++++++++++++++++++- > kernel/sched/sched.h | 6 ++++++ > 2 files changed, 44 insertions(+), 1 deletion(-) > > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c > index 37e2449..3d95c1d 100644 > --- a/kernel/sched/deadline.c > +++ b/kernel/sched/deadline.c > @@ -43,6 +43,22 @@ static inline int on_dl_rq(struct sched_dl_entity *dl_se) > return !RB_EMPTY_NODE(&dl_se->rb_node); > } > > +static void add_running_bw(struct sched_dl_entity *dl_se, struct dl_rq > *dl_rq) > +{ > + u64 se_bw = dl_se->dl_bw; > + > + dl_rq->running_bw += se_bw; > +}
why not... static *inline* void add_running_bw(struct sched_dl_entity *dl_se, struct dl_rq *dl_rq) { dl_rq->running_bw += dl_se->dl_bw; } am I missing something? > +static void sub_running_bw(struct sched_dl_entity *dl_se, struct dl_rq > *dl_rq) > +{ > + u64 se_bw = dl_se->dl_bw; > + > + dl_rq->running_bw -= se_bw; > + if (WARN_ON(dl_rq->running_bw < 0)) > + dl_rq->running_bw = 0; > +} (if I am not missing anything...) the same in the above function: use inline and remove the se_bw variable. -- Daniel