|
@@ -2290,8 +2290,17 @@ static void switched_from_dl(struct rq *rq, struct task_struct *p)
|
|
|
if (task_on_rq_queued(p) && p->dl.dl_runtime)
|
|
|
task_non_contending(p);
|
|
|
|
|
|
- if (!task_on_rq_queued(p))
|
|
|
+ if (!task_on_rq_queued(p)) {
|
|
|
+ /*
|
|
|
+ * Inactive timer is armed. However, p is leaving DEADLINE and
|
|
|
+ * might migrate away from this rq while continuing to run on
|
|
|
+ * some other class. We need to remove its contribution from
|
|
|
+ * this rq running_bw now, or sub_rq_bw (below) will complain.
|
|
|
+ */
|
|
|
+ if (p->dl.dl_non_contending)
|
|
|
+ sub_running_bw(&p->dl, &rq->dl);
|
|
|
sub_rq_bw(&p->dl, &rq->dl);
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* We cannot use inactive_task_timer() to invoke sub_running_bw()
|