Ah, I see. Thanks for explaining! Now, everything is more clear and I agreeand further enqueue_task() places it on the dl_rq.I was under the impression that no further enqueue_task() will happen (since
the task is throttled, it is not on runqueue, so __sched_setscheduler() will
not dequeue/enqueue it).
But I am probably missing something else :)
We have two concept of "on runqueue". The first one is rq->on_rq. It means
that a task is "queued". The second is on_dl_rq(dl_se).
When task is not "queued", it's always not on dl_rq.
When task is "queued" it may be in two states:
1)on_dl_rq() -- this means the task is not throttled;
2)!on_dl_rq() -- is task as throttled.
So when we are discussing about a throttled task, the task is "queued". If
you clear dl_throttled, __sched_setscheduler() places it back it the both
meaning: on_rq and on_dl_rq, and the task becomes available for picking
in __schedule().
Does my patch help you? It helps me, but anyway I need your confirmation.I am just back from vacations, and I had no time to test it yet... I hope to