Re: [PATCH 1/2] sched/deadline: add per rq tracking of admitted bandwidth

From: luca abeni
Date: Thu Feb 11 2016 - 08:05:58 EST


On Thu, 11 Feb 2016 12:49:59 +0000
Juri Lelli <juri.lelli@xxxxxxx> wrote:
[...]
> > > > > Luca, did you already face this problem (if I got it right)
> > > > > and thought of a way to fix it? I'll go back and stare a bit
> > > > > more at those paths.
> > > > In my patch I took care of the first case (modifying
> > > > select_task_rq_dl() to move the utilization from the "old rq"
> > > > to the "new rq"), but I never managed to trigger
> > > > select_fallback_rq() in my tests, so I overlooked that case.
> > > >
> > >
> > > Right, I was thinking to do the same. And you did that after
> > > grabbing both locks, right?
> >
> > Not sure if I did everything correctly, but my code in
> > select_task_rq_dl() currently looks like this (you can obviously
> > ignore the "migrate_active" and "*_running_bw()" parts, and focus on
> > the "*_rq_bw()" stuff):
> > [...]
> > if (rq != cpu_rq(cpu)) {
> > int migrate_active;
> >
> > raw_spin_lock(&rq->lock);
> > migrate_active =
> > hrtimer_active(&p->dl.inactive_timer); if (migrate_active) {
> > hrtimer_try_to_cancel(&p->dl.inactive_timer);
> > sub_running_bw(&p->dl, &rq->dl);
> > }
> > sub_rq_bw(&p->dl, &rq->dl);
> > raw_spin_unlock(&rq->lock);
> > rq = cpu_rq(cpu);
>
> Can't something happen here? My problem is that I use per-rq bw
> tracking to save/restore root_domain state. So, I fear that a
> root_domain update can happen while we are in the middle of moving bw
> from one cpu to another.
Well, I never used the rq utilization to re-build the root_domain
utilization (and I never played with root domains too much... :)...
So, I do not really know. Maybe the code should do:
raw_spin_lock(&rq->lock);
raw_spin_lock(&cpu_rq(cpu)->lock);
sub_rq_bw(&p->dl, &rq->dl);
add_rq_bw(&p->dl, &cpu_rq(cpu)->dl);
[...]
?


Luca