diff options
| -rw-r--r-- | kernel/sched/deadline.c | 11 | ||||
| -rw-r--r-- | kernel/stop_machine.c | 6 |
2 files changed, 15 insertions, 2 deletions
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index fbfc3f1d368a..10c7b51c0d1f 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
| @@ -2290,8 +2290,17 @@ static void switched_from_dl(struct rq *rq, struct task_struct *p) | |||
| 2290 | if (task_on_rq_queued(p) && p->dl.dl_runtime) | 2290 | if (task_on_rq_queued(p) && p->dl.dl_runtime) |
| 2291 | task_non_contending(p); | 2291 | task_non_contending(p); |
| 2292 | 2292 | ||
| 2293 | if (!task_on_rq_queued(p)) | 2293 | if (!task_on_rq_queued(p)) { |
| 2294 | /* | ||
| 2295 | * Inactive timer is armed. However, p is leaving DEADLINE and | ||
| 2296 | * might migrate away from this rq while continuing to run on | ||
| 2297 | * some other class. We need to remove its contribution from | ||
| 2298 | * this rq running_bw now, or sub_rq_bw (below) will complain. | ||
| 2299 | */ | ||
| 2300 | if (p->dl.dl_non_contending) | ||
| 2301 | sub_running_bw(&p->dl, &rq->dl); | ||
| 2294 | sub_rq_bw(&p->dl, &rq->dl); | 2302 | sub_rq_bw(&p->dl, &rq->dl); |
| 2303 | } | ||
| 2295 | 2304 | ||
| 2296 | /* | 2305 | /* |
| 2297 | * We cannot use inactive_task_timer() to invoke sub_running_bw() | 2306 | * We cannot use inactive_task_timer() to invoke sub_running_bw() |
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index f89014a2c238..1ff523dae6e2 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c | |||
| @@ -270,7 +270,11 @@ unlock: | |||
| 270 | goto retry; | 270 | goto retry; |
| 271 | } | 271 | } |
| 272 | 272 | ||
| 273 | wake_up_q(&wakeq); | 273 | if (!err) { |
| 274 | preempt_disable(); | ||
| 275 | wake_up_q(&wakeq); | ||
| 276 | preempt_enable(); | ||
| 277 | } | ||
| 274 | 278 | ||
| 275 | return err; | 279 | return err; |
| 276 | } | 280 | } |
