diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/deadline.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 92279eaf0ef2..46167899d852 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
| @@ -518,12 +518,20 @@ again: | |||
| 518 | } | 518 | } |
| 519 | 519 | ||
| 520 | /* | 520 | /* |
| 521 | * We need to take care of a possible races here. In fact, the | 521 | * We need to take care of several possible races here: |
| 522 | * task might have changed its scheduling policy to something | 522 | * |
| 523 | * different from SCHED_DEADLINE or changed its reservation | 523 | * - the task might have changed its scheduling policy |
| 524 | * parameters (through sched_setattr()). | 524 | * to something different than SCHED_DEADLINE |
| 525 | * - the task might have changed its reservation parameters | ||
| 526 | * (through sched_setattr()) | ||
| 527 | * - the task might have been boosted by someone else and | ||
| 528 | * might be in the boosting/deboosting path | ||
| 529 | * | ||
| 530 | * In all this cases we bail out, as the task is already | ||
| 531 | * in the runqueue or is going to be enqueued back anyway. | ||
| 525 | */ | 532 | */ |
| 526 | if (!dl_task(p) || dl_se->dl_new) | 533 | if (!dl_task(p) || dl_se->dl_new || |
| 534 | dl_se->dl_boosted || !dl_se->dl_throttled) | ||
| 527 | goto unlock; | 535 | goto unlock; |
| 528 | 536 | ||
| 529 | sched_clock_tick(); | 537 | sched_clock_tick(); |
