diff options
Diffstat (limited to 'kernel/sched.c')
| -rw-r--r-- | kernel/sched.c | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 7d97ff7c4478..0a76d0b6f215 100644 --- a/kernel/sched.c +++ b/kernel/sched.c  | |||
| @@ -223,7 +223,7 @@ static void start_rt_bandwidth(struct rt_bandwidth *rt_b) | |||
| 223 | { | 223 | { | 
| 224 | ktime_t now; | 224 | ktime_t now; | 
| 225 | 225 | ||
| 226 | if (rt_bandwidth_enabled() && rt_b->rt_runtime == RUNTIME_INF) | 226 | if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF) | 
| 227 | return; | 227 | return; | 
| 228 | 228 | ||
| 229 | if (hrtimer_active(&rt_b->rt_period_timer)) | 229 | if (hrtimer_active(&rt_b->rt_period_timer)) | 
| @@ -9219,6 +9219,16 @@ static int sched_rt_global_constraints(void) | |||
| 9219 | 9219 | ||
| 9220 | return ret; | 9220 | return ret; | 
| 9221 | } | 9221 | } | 
| 9222 | |||
| 9223 | int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk) | ||
| 9224 | { | ||
| 9225 | /* Don't accept realtime tasks when there is no way for them to run */ | ||
| 9226 | if (rt_task(tsk) && tg->rt_bandwidth.rt_runtime == 0) | ||
| 9227 | return 0; | ||
| 9228 | |||
| 9229 | return 1; | ||
| 9230 | } | ||
| 9231 | |||
| 9222 | #else /* !CONFIG_RT_GROUP_SCHED */ | 9232 | #else /* !CONFIG_RT_GROUP_SCHED */ | 
| 9223 | static int sched_rt_global_constraints(void) | 9233 | static int sched_rt_global_constraints(void) | 
| 9224 | { | 9234 | { | 
| @@ -9312,8 +9322,7 @@ cpu_cgroup_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp, | |||
| 9312 | struct task_struct *tsk) | 9322 | struct task_struct *tsk) | 
| 9313 | { | 9323 | { | 
| 9314 | #ifdef CONFIG_RT_GROUP_SCHED | 9324 | #ifdef CONFIG_RT_GROUP_SCHED | 
| 9315 | /* Don't accept realtime tasks when there is no way for them to run */ | 9325 | if (!sched_rt_can_attach(cgroup_tg(cgrp), tsk)) | 
| 9316 | if (rt_task(tsk) && cgroup_tg(cgrp)->rt_bandwidth.rt_runtime == 0) | ||
| 9317 | return -EINVAL; | 9326 | return -EINVAL; | 
| 9318 | #else | 9327 | #else | 
| 9319 | /* We don't support RT-tasks being in separate groups */ | 9328 | /* We don't support RT-tasks being in separate groups */ | 
| @@ -9476,7 +9485,7 @@ cpuacct_destroy(struct cgroup_subsys *ss, struct cgroup *cgrp) | |||
| 9476 | 9485 | ||
| 9477 | static u64 cpuacct_cpuusage_read(struct cpuacct *ca, int cpu) | 9486 | static u64 cpuacct_cpuusage_read(struct cpuacct *ca, int cpu) | 
| 9478 | { | 9487 | { | 
| 9479 | u64 *cpuusage = percpu_ptr(ca->cpuusage, cpu); | 9488 | u64 *cpuusage = per_cpu_ptr(ca->cpuusage, cpu); | 
| 9480 | u64 data; | 9489 | u64 data; | 
| 9481 | 9490 | ||
| 9482 | #ifndef CONFIG_64BIT | 9491 | #ifndef CONFIG_64BIT | 
| @@ -9495,7 +9504,7 @@ static u64 cpuacct_cpuusage_read(struct cpuacct *ca, int cpu) | |||
| 9495 | 9504 | ||
| 9496 | static void cpuacct_cpuusage_write(struct cpuacct *ca, int cpu, u64 val) | 9505 | static void cpuacct_cpuusage_write(struct cpuacct *ca, int cpu, u64 val) | 
| 9497 | { | 9506 | { | 
| 9498 | u64 *cpuusage = percpu_ptr(ca->cpuusage, cpu); | 9507 | u64 *cpuusage = per_cpu_ptr(ca->cpuusage, cpu); | 
| 9499 | 9508 | ||
| 9500 | #ifndef CONFIG_64BIT | 9509 | #ifndef CONFIG_64BIT | 
| 9501 | /* | 9510 | /* | 
| @@ -9591,7 +9600,7 @@ static void cpuacct_charge(struct task_struct *tsk, u64 cputime) | |||
| 9591 | ca = task_ca(tsk); | 9600 | ca = task_ca(tsk); | 
| 9592 | 9601 | ||
| 9593 | for (; ca; ca = ca->parent) { | 9602 | for (; ca; ca = ca->parent) { | 
| 9594 | u64 *cpuusage = percpu_ptr(ca->cpuusage, cpu); | 9603 | u64 *cpuusage = per_cpu_ptr(ca->cpuusage, cpu); | 
| 9595 | *cpuusage += cputime; | 9604 | *cpuusage += cputime; | 
| 9596 | } | 9605 | } | 
| 9597 | } | 9606 | } | 
