diff options
Diffstat (limited to 'kernel/sched_rt.c')
-rw-r--r-- | kernel/sched_rt.c | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index 1bbd99014011..0a5277233452 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
@@ -550,30 +550,28 @@ static void update_curr_rt(struct rq *rq) | |||
550 | static inline | 550 | static inline |
551 | void inc_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) | 551 | void inc_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) |
552 | { | 552 | { |
553 | WARN_ON(!rt_prio(rt_se_prio(rt_se))); | 553 | int prio = rt_se_prio(rt_se); |
554 | rt_rq->rt_nr_running++; | ||
555 | #if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHED | ||
556 | if (rt_se_prio(rt_se) < rt_rq->highest_prio) { | ||
557 | #ifdef CONFIG_SMP | 554 | #ifdef CONFIG_SMP |
558 | struct rq *rq = rq_of_rt_rq(rt_rq); | 555 | struct rq *rq = rq_of_rt_rq(rt_rq); |
559 | #endif | 556 | #endif |
560 | 557 | ||
561 | rt_rq->highest_prio = rt_se_prio(rt_se); | 558 | WARN_ON(!rt_prio(prio)); |
559 | rt_rq->rt_nr_running++; | ||
560 | #if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHED | ||
561 | if (prio < rt_rq->highest_prio) { | ||
562 | |||
563 | rt_rq->highest_prio = prio; | ||
562 | #ifdef CONFIG_SMP | 564 | #ifdef CONFIG_SMP |
563 | if (rq->online) | 565 | if (rq->online) |
564 | cpupri_set(&rq->rd->cpupri, rq->cpu, | 566 | cpupri_set(&rq->rd->cpupri, rq->cpu, prio); |
565 | rt_se_prio(rt_se)); | ||
566 | #endif | 567 | #endif |
567 | } | 568 | } |
568 | #endif | 569 | #endif |
569 | #ifdef CONFIG_SMP | 570 | #ifdef CONFIG_SMP |
570 | if (rt_se->nr_cpus_allowed > 1) { | 571 | if (rt_se->nr_cpus_allowed > 1) |
571 | struct rq *rq = rq_of_rt_rq(rt_rq); | ||
572 | |||
573 | rq->rt.rt_nr_migratory++; | 572 | rq->rt.rt_nr_migratory++; |
574 | } | ||
575 | 573 | ||
576 | update_rt_migration(rq_of_rt_rq(rt_rq)); | 574 | update_rt_migration(rq); |
577 | #endif | 575 | #endif |
578 | #ifdef CONFIG_RT_GROUP_SCHED | 576 | #ifdef CONFIG_RT_GROUP_SCHED |
579 | if (rt_se_boosted(rt_se)) | 577 | if (rt_se_boosted(rt_se)) |
@@ -590,6 +588,7 @@ static inline | |||
590 | void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) | 588 | void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) |
591 | { | 589 | { |
592 | #ifdef CONFIG_SMP | 590 | #ifdef CONFIG_SMP |
591 | struct rq *rq = rq_of_rt_rq(rt_rq); | ||
593 | int highest_prio = rt_rq->highest_prio; | 592 | int highest_prio = rt_rq->highest_prio; |
594 | #endif | 593 | #endif |
595 | 594 | ||
@@ -611,20 +610,13 @@ void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) | |||
611 | rt_rq->highest_prio = MAX_RT_PRIO; | 610 | rt_rq->highest_prio = MAX_RT_PRIO; |
612 | #endif | 611 | #endif |
613 | #ifdef CONFIG_SMP | 612 | #ifdef CONFIG_SMP |
614 | if (rt_se->nr_cpus_allowed > 1) { | 613 | if (rt_se->nr_cpus_allowed > 1) |
615 | struct rq *rq = rq_of_rt_rq(rt_rq); | ||
616 | rq->rt.rt_nr_migratory--; | 614 | rq->rt.rt_nr_migratory--; |
617 | } | ||
618 | 615 | ||
619 | if (rt_rq->highest_prio != highest_prio) { | 616 | if (rq->online && rt_rq->highest_prio != highest_prio) |
620 | struct rq *rq = rq_of_rt_rq(rt_rq); | 617 | cpupri_set(&rq->rd->cpupri, rq->cpu, rt_rq->highest_prio); |
621 | |||
622 | if (rq->online) | ||
623 | cpupri_set(&rq->rd->cpupri, rq->cpu, | ||
624 | rt_rq->highest_prio); | ||
625 | } | ||
626 | 618 | ||
627 | update_rt_migration(rq_of_rt_rq(rt_rq)); | 619 | update_rt_migration(rq); |
628 | #endif /* CONFIG_SMP */ | 620 | #endif /* CONFIG_SMP */ |
629 | #ifdef CONFIG_RT_GROUP_SCHED | 621 | #ifdef CONFIG_RT_GROUP_SCHED |
630 | if (rt_se_boosted(rt_se)) | 622 | if (rt_se_boosted(rt_se)) |