projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
[firefly-linux-kernel-4.4.55.git]
/
kernel
/
sched
/
core.c
diff --git
a/kernel/sched/core.c
b/kernel/sched/core.c
index 7063c6a0744055c367eb82159677cfe6522b6c60..ff6b870315b79fb4ae86fac0e4a978f5ab1e3642 100644
(file)
--- a/
kernel/sched/core.c
+++ b/
kernel/sched/core.c
@@
-5525,6
+5525,7
@@
migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
case CPU_UP_PREPARE:
rq->calc_load_update = calc_load_update;
case CPU_UP_PREPARE:
rq->calc_load_update = calc_load_update;
+ account_reset_rq(rq);
break;
case CPU_ONLINE:
break;
case CPU_ONLINE:
@@
-6738,7
+6739,7
@@
static void sched_init_numa(void)
sched_domains_numa_masks[i][j] = mask;
sched_domains_numa_masks[i][j] = mask;
- for
(k = 0; k < nr_node_ids; k++
) {
+ for
_each_node(k
) {
if (node_distance(j, k) > sched_domains_numa_distance[i])
continue;
if (node_distance(j, k) > sched_domains_numa_distance[i])
continue;
@@
-7542,6
+7543,14
@@
static inline int preempt_count_equals(int preempt_offset)
return (nested == 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)
{
/*
void __might_sleep(const char *file, int line, int preempt_offset)
{
/*
@@
-7566,8
+7575,10
@@
void ___might_sleep(const char *file, int line, int preempt_offset)
rcu_sleep_check(); /* WARN_ON_ONCE() by default, no rate limit reqd. */
if ((preempt_count_equals(preempt_offset) && !irqs_disabled() &&
rcu_sleep_check(); /* WARN_ON_ONCE() by default, no rate limit reqd. */
if ((preempt_count_equals(preempt_offset) && !irqs_disabled() &&
- !is_idle_task(current)) ||
- system_state != SYSTEM_RUNNING || oops_in_progress)
+ !is_idle_task(current)) || 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;
return;
if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
return;
@@
-7692,7
+7703,7
@@
void set_curr_task(int cpu, struct task_struct *p)
/* task_group_lock serializes the addition/removal of task groups */
static DEFINE_SPINLOCK(task_group_lock);
/* task_group_lock serializes the addition/removal of task groups */
static DEFINE_SPINLOCK(task_group_lock);
-static void
free_sched
_group(struct task_group *tg)
+static void
sched_free
_group(struct task_group *tg)
{
free_fair_sched_group(tg);
free_rt_sched_group(tg);
{
free_fair_sched_group(tg);
free_rt_sched_group(tg);
@@
-7718,7
+7729,7
@@
struct task_group *sched_create_group(struct task_group *parent)
return tg;
err:
return tg;
err:
-
free_sched
_group(tg);
+
sched_free
_group(tg);
return ERR_PTR(-ENOMEM);
}
return ERR_PTR(-ENOMEM);
}
@@
-7738,17
+7749,16
@@
void sched_online_group(struct task_group *tg, struct task_group *parent)
}
/* rcu callback to free various structures associated with a task group */
}
/* rcu callback to free various structures associated with a task group */
-static void
free_sched
_group_rcu(struct rcu_head *rhp)
+static void
sched_free
_group_rcu(struct rcu_head *rhp)
{
/* now it should be safe to free those cfs_rqs */
{
/* now it should be safe to free those cfs_rqs */
-
free_sched
_group(container_of(rhp, struct task_group, rcu));
+
sched_free
_group(container_of(rhp, struct task_group, rcu));
}
}
-/* Destroy runqueue etc associated with a task group */
void sched_destroy_group(struct task_group *tg)
{
/* wait for possible concurrent references to cfs_rqs complete */
void sched_destroy_group(struct task_group *tg)
{
/* wait for possible concurrent references to cfs_rqs complete */
- call_rcu(&tg->rcu,
free_sched
_group_rcu);
+ call_rcu(&tg->rcu,
sched_free
_group_rcu);
}
void sched_offline_group(struct task_group *tg)
}
void sched_offline_group(struct task_group *tg)
@@
-8209,31
+8219,26
@@
cpu_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
if (IS_ERR(tg))
return ERR_PTR(-ENOMEM);
if (IS_ERR(tg))
return ERR_PTR(-ENOMEM);
+ sched_online_group(tg, parent);
+
return &tg->css;
}
return &tg->css;
}
-static
int cpu_cgroup_css_online
(struct cgroup_subsys_state *css)
+static
void cpu_cgroup_css_released
(struct cgroup_subsys_state *css)
{
struct task_group *tg = css_tg(css);
{
struct task_group *tg = css_tg(css);
- struct task_group *parent = css_tg(css->parent);
- if (parent)
- sched_online_group(tg, parent);
- return 0;
+ sched_offline_group(tg);
}
static void cpu_cgroup_css_free(struct cgroup_subsys_state *css)
{
struct task_group *tg = css_tg(css);
}
static void cpu_cgroup_css_free(struct cgroup_subsys_state *css)
{
struct task_group *tg = css_tg(css);
- sched_destroy_group(tg);
-}
-
-static void cpu_cgroup_css_offline(struct cgroup_subsys_state *css)
-{
- struct task_group *tg = css_tg(css);
-
- sched_offline_group(tg);
+ /*
+ * Relies on the RCU grace period between css_released() and this.
+ */
+ sched_free_group(tg);
}
static void cpu_cgroup_fork(struct task_struct *task, void *private)
}
static void cpu_cgroup_fork(struct task_struct *task, void *private)
@@
-8241,12
+8246,12
@@
static void cpu_cgroup_fork(struct task_struct *task, void *private)
sched_move_task(task);
}
sched_move_task(task);
}
-static int cpu_cgroup_can_attach(struct cgroup_subsys_state *css,
- struct cgroup_taskset *tset)
+static int cpu_cgroup_can_attach(struct cgroup_taskset *tset)
{
struct task_struct *task;
{
struct task_struct *task;
+ struct cgroup_subsys_state *css;
- cgroup_taskset_for_each(task, tset) {
+ cgroup_taskset_for_each(task,
css,
tset) {
#ifdef CONFIG_RT_GROUP_SCHED
if (!sched_rt_can_attach(css_tg(css), task))
return -EINVAL;
#ifdef CONFIG_RT_GROUP_SCHED
if (!sched_rt_can_attach(css_tg(css), task))
return -EINVAL;
@@
-8259,12
+8264,12
@@
static int cpu_cgroup_can_attach(struct cgroup_subsys_state *css,
return 0;
}
return 0;
}
-static void cpu_cgroup_attach(struct cgroup_subsys_state *css,
- struct cgroup_taskset *tset)
+static void cpu_cgroup_attach(struct cgroup_taskset *tset)
{
struct task_struct *task;
{
struct task_struct *task;
+ struct cgroup_subsys_state *css;
- cgroup_taskset_for_each(task, tset)
+ cgroup_taskset_for_each(task,
css,
tset)
sched_move_task(task);
}
sched_move_task(task);
}
@@
-8593,12
+8598,12
@@
static struct cftype cpu_files[] = {
struct cgroup_subsys cpu_cgrp_subsys = {
.css_alloc = cpu_cgroup_css_alloc,
struct cgroup_subsys cpu_cgrp_subsys = {
.css_alloc = cpu_cgroup_css_alloc,
+ .css_released = cpu_cgroup_css_released,
.css_free = cpu_cgroup_css_free,
.css_free = cpu_cgroup_css_free,
- .css_online = cpu_cgroup_css_online,
- .css_offline = cpu_cgroup_css_offline,
.fork = cpu_cgroup_fork,
.can_attach = cpu_cgroup_can_attach,
.attach = cpu_cgroup_attach,
.fork = cpu_cgroup_fork,
.can_attach = cpu_cgroup_can_attach,
.attach = cpu_cgroup_attach,
+ .allow_attach = subsys_cgroup_allow_attach,
.legacy_cftypes = cpu_files,
.early_init = 1,
};
.legacy_cftypes = cpu_files,
.early_init = 1,
};