summaryrefslogtreecommitdiff
path: root/kernel/sched
diff options
context:
space:
mode:
authorDan Willemsen <dwillemsen@nvidia.com>2012-03-23 21:43:21 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2012-03-23 21:43:21 -0700
commit9c6641224bdc2957f1d4ef692f027ff5e0fcc63b (patch)
tree589c55d8a24b79a5cfd2cb3379d1ce0cac9c7464 /kernel/sched
parentc9134a33b3936ca9cae8bdc6dccd77e9c294f0ef (diff)
parent5275e74ae5e7e92b05bd1361e2573bb38d381358 (diff)
Merge commit '5275e74' into after-upstream-android
Conflicts: arch/arm/common/Kconfig arch/arm/mm/Makefile arch/arm/mm/cache-l2x0.c drivers/misc/Kconfig drivers/misc/Makefile drivers/mmc/core/core.c Signed-off-by: Dan Willemsen <dwillemsen@nvidia.com>
Diffstat (limited to 'kernel/sched')
-rw-r--r--kernel/sched/core.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 4f65bd795a63..4df23cdbf6ce 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6989,13 +6989,24 @@ static inline int preempt_count_equals(int preempt_offset)
return (nested == preempt_offset);
}
+static int __might_sleep_init_called;
+int __init __might_sleep_init(void)
+{
+ __might_sleep_init_called = 1;
+ return 0;
+}
+early_initcall(__might_sleep_init);
+
void __might_sleep(const char *file, int line, int preempt_offset)
{
static unsigned long prev_jiffy; /* ratelimiting */
rcu_sleep_check(); /* WARN_ON_ONCE() by default, no rate limit reqd. */
if ((preempt_count_equals(preempt_offset) && !irqs_disabled()) ||
- system_state != SYSTEM_RUNNING || oops_in_progress)
+ oops_in_progress)
+ return;
+ if (system_state != SYSTEM_RUNNING &&
+ (!__might_sleep_init_called || system_state != SYSTEM_BOOTING))
return;
if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
return;
@@ -7550,6 +7561,23 @@ cpu_cgroup_destroy(struct cgroup_subsys *ss, struct cgroup *cgrp)
sched_destroy_group(tg);
}
+static int
+cpu_cgroup_allow_attach(struct cgroup *cgrp, struct cgroup_taskset *tset)
+{
+ const struct cred *cred = current_cred(), *tcred;
+ struct task_struct *task;
+
+ cgroup_taskset_for_each(task, cgrp, tset) {
+ tcred = __task_cred(task);
+
+ if ((current != task) && !capable(CAP_SYS_NICE) &&
+ cred->euid != tcred->uid && cred->euid != tcred->suid)
+ return -EACCES;
+ }
+
+ return 0;
+}
+
static int cpu_cgroup_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
struct cgroup_taskset *tset)
{
@@ -7911,6 +7939,7 @@ struct cgroup_subsys cpu_cgroup_subsys = {
.destroy = cpu_cgroup_destroy,
.can_attach = cpu_cgroup_can_attach,
.attach = cpu_cgroup_attach,
+ .allow_attach = cpu_cgroup_allow_attach,
.exit = cpu_cgroup_exit,
.populate = cpu_cgroup_populate,
.subsys_id = cpu_cgroup_subsys_id,