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 | } |