Hi, this patch is giving me some headaches: On Sun, 14 May 2023 22:57:13 -0400 Vineeth Pillai <vineeth@xxxxxxxxxxxxxxx> wrote: [...] > * Uextra: Extra bandwidth not reserved: > - * = Umax - \Sum(u_i / #cpus in the root domain) > + * = Umax - this_bw While I agree that this setting should be OK, it ends up with dq = -Uact / Umax * dt which I remember I originally tried, and gave some issues (I do not remember the details, but I think if you try N identical reclaiming tasks, with N > M, the reclaimed time is not distributed equally among them?) I need to think a little bit more about this... Luca > * u_i: Bandwidth of an admitted dl task in the > * root domain. > * > @@ -1286,22 +1286,14 @@ int dl_runtime_exceeded(struct > sched_dl_entity *dl_se) */ > static u64 grub_reclaim(u64 delta, struct rq *rq, struct > sched_dl_entity *dl_se) { > - u64 u_act; > - u64 u_inact = rq->dl.this_bw - rq->dl.running_bw; /* Utot - > Uact */ - > /* > - * Instead of computing max{u, (rq->dl.max_bw - u_inact - > u_extra)}, > - * we compare u_inact + rq->dl.extra_bw with > - * rq->dl.max_bw - u, because u_inact + rq->dl.extra_bw can > be larger > - * than rq->dl.max_bw (so, rq->dl.max_bw - u_inact - > rq->dl.extra_bw > - * would be negative leading to wrong results) > + * max{u, Umax - Uinact - Uextra} > + * = max{u, max_bw - (this_bw - running_bw) + (this_bw - > running_bw)} > + * = max{u, running_bw} = running_bw > + * So dq = -(max{u, Umax - Uinact - Uextra} / Umax) dt > + * = -(running_bw / max_bw) dt > */ > - if (u_inact + rq->dl.extra_bw > rq->dl.max_bw - dl_se->dl_bw) > - u_act = dl_se->dl_bw; > - else > - u_act = rq->dl.max_bw - u_inact - rq->dl.extra_bw; > - > - return div64_u64(delta * u_act, rq->dl.max_bw); > + return div64_u64(delta * rq->dl.running_bw, rq->dl.max_bw); > } > > /*