linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] cpuacct, cgroup: Remove cgroup_subsys.active
@ 2013-03-28  7:20 Li Zefan
  2013-03-28  7:20 ` [PATCH 1/5] cpuacct: Allocate per_cpu cpuusage for root cpuacct statically Li Zefan
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Li Zefan @ 2013-03-28  7:20 UTC (permalink / raw)
  To: Ingo Molnar, Tejun Heo; +Cc: Peter Zijlstra, LKML, Cgroups

cpuacct is the only user of cgroup_subsys.active flag.

The flag is needed because cpuacct_charge() and cpuacct_account_field() can
be called when cpuacct hasn't been initialized during system bootup.

This patch initializes cpuacct earlier, and the result is we don't have
to check the flag in scheduler hot path.

Note, this patchset is based on "[PATCH 0/7] sched: Split cpuacct"
(just because there're code conflicts)

	http://lkml.org/lkml/2013/3/28/1

0001-cpuacct-allocate-per_cpu-cpuusage-for-root-cpuacct-s.patch
0002-cpuacct-Initialize-root-cpuacct-earlier.patch
0003-cpuacct-Initialize-cpuacct-subsystem-earlier.patch
0004-cpuacct-No-need-to-check-subsys-active-state.patch
0005-cgroup-Remove-subsys.active-flag.patch

--
 include/linux/cgroup.h |  1 -
 kernel/cgroup.c        |  3 ---
 kernel/sched/core.c    |  2 --
 kernel/sched/cpuacct.c | 30 +++++++++++-------------------
 kernel/sched/cpuacct.h |  5 -----
 5 files changed, 11 insertions(+), 30 deletions(-)

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/5] cpuacct: Allocate per_cpu cpuusage for root cpuacct statically
  2013-03-28  7:20 [PATCH 0/5] cpuacct, cgroup: Remove cgroup_subsys.active Li Zefan
@ 2013-03-28  7:20 ` Li Zefan
  2013-03-28  7:20 ` [PATCH 2/5] cpuacct: Initialize root cpuacct earlier Li Zefan
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Li Zefan @ 2013-03-28  7:20 UTC (permalink / raw)
  To: Ingo Molnar, Tejun Heo; +Cc: Peter Zijlstra, LKML, Cgroups

This is a preparation, so later we can initialize cpuacct earlier.

Signed-off-by: Li Zefan <lizefan@huawei.com>
---
 kernel/sched/cpuacct.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index 9305fd2..a691c4d 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -58,6 +58,7 @@ static inline struct cpuacct *parent_ca(struct cpuacct *ca)
 	return cgroup_ca(ca->css.cgroup->parent);
 }
 
+static DEFINE_PER_CPU(u64, root_cpuacct_cpuusage);
 static struct cpuacct root_cpuacct;
 
 /* create a new cpu accounting group */
@@ -290,8 +291,7 @@ void cpuacct_account_field(struct task_struct *p, int index, u64 val)
 void __init cpuacct_init(void)
 {
 	root_cpuacct.cpustat = &kernel_cpustat;
-	root_cpuacct.cpuusage = alloc_percpu(u64);
-	BUG_ON(!root_cpuacct.cpuusage); /* Too early, not expected to fail */
+	root_cpuacct.cpuusage = &root_cpuacct_cpuusage;
 }
 
 struct cgroup_subsys cpuacct_subsys = {
-- 
1.8.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/5] cpuacct: Initialize root cpuacct earlier
  2013-03-28  7:20 [PATCH 0/5] cpuacct, cgroup: Remove cgroup_subsys.active Li Zefan
  2013-03-28  7:20 ` [PATCH 1/5] cpuacct: Allocate per_cpu cpuusage for root cpuacct statically Li Zefan
@ 2013-03-28  7:20 ` Li Zefan
  2013-03-28  7:21 ` [PATCH 3/5] cpuacct: Initialize cpuacct subsystem earlier Li Zefan
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Li Zefan @ 2013-03-28  7:20 UTC (permalink / raw)
  To: Ingo Molnar, Tejun Heo; +Cc: Peter Zijlstra, LKML, Cgroups

Now we don't need cpuacct_init(), and instead we just initialize
root_cpuacct when it's defined.

Signed-off-by: Li Zefan <lizefan@huawei.com>
---
 kernel/sched/core.c    |  2 --
 kernel/sched/cpuacct.c | 11 ++++-------
 kernel/sched/cpuacct.h |  5 -----
 3 files changed, 4 insertions(+), 14 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 9f5a804..e12649c 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6860,8 +6860,6 @@ void __init sched_init(void)
 
 #endif /* CONFIG_CGROUP_SCHED */
 
-	cpuacct_init();
-
 	for_each_possible_cpu(i) {
 		struct rq *rq;
 
diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index a691c4d..0425581 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -59,7 +59,10 @@ static inline struct cpuacct *parent_ca(struct cpuacct *ca)
 }
 
 static DEFINE_PER_CPU(u64, root_cpuacct_cpuusage);
-static struct cpuacct root_cpuacct;
+static struct cpuacct root_cpuacct = {
+	.cpustat	= &kernel_cpustat,
+	.cpuusage	= &root_cpuacct_cpuusage,
+};
 
 /* create a new cpu accounting group */
 static struct cgroup_subsys_state *cpuacct_css_alloc(struct cgroup *cgrp)
@@ -288,12 +291,6 @@ void cpuacct_account_field(struct task_struct *p, int index, u64 val)
 	rcu_read_unlock();
 }
 
-void __init cpuacct_init(void)
-{
-	root_cpuacct.cpustat = &kernel_cpustat;
-	root_cpuacct.cpuusage = &root_cpuacct_cpuusage;
-}
-
 struct cgroup_subsys cpuacct_subsys = {
 	.name = "cpuacct",
 	.css_alloc = cpuacct_css_alloc,
diff --git a/kernel/sched/cpuacct.h b/kernel/sched/cpuacct.h
index 51cd76e..ed60562 100644
--- a/kernel/sched/cpuacct.h
+++ b/kernel/sched/cpuacct.h
@@ -1,15 +1,10 @@
 #ifdef CONFIG_CGROUP_CPUACCT
 
-extern void cpuacct_init(void);
 extern void cpuacct_charge(struct task_struct *tsk, u64 cputime);
 extern void cpuacct_account_field(struct task_struct *p, int index, u64 val);
 
 #else
 
-static inline void cpuacct_init(void)
-{
-}
-
 static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime)
 {
 }
-- 
1.8.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/5] cpuacct: Initialize cpuacct subsystem earlier
  2013-03-28  7:20 [PATCH 0/5] cpuacct, cgroup: Remove cgroup_subsys.active Li Zefan
  2013-03-28  7:20 ` [PATCH 1/5] cpuacct: Allocate per_cpu cpuusage for root cpuacct statically Li Zefan
  2013-03-28  7:20 ` [PATCH 2/5] cpuacct: Initialize root cpuacct earlier Li Zefan
@ 2013-03-28  7:21 ` Li Zefan
  2013-03-28  7:21 ` [PATCH 4/5] cpuacct: No need to check subsys active state Li Zefan
  2013-03-28  7:21 ` [PATCH 5/5] cgroup: Remove subsys.active flag Li Zefan
  4 siblings, 0 replies; 7+ messages in thread
From: Li Zefan @ 2013-03-28  7:21 UTC (permalink / raw)
  To: Ingo Molnar, Tejun Heo; +Cc: Peter Zijlstra, LKML, Cgroups

Initialize cpuacct before the scheduler is functioning, so when
cpuacct_charge() and cpuacct_account_field() are called, task_ca()
won't return NULL.

Signed-off-by: Li Zefan <lizefan@huawei.com>
---
 kernel/sched/cpuacct.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index 0425581..75e46d2 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -292,9 +292,10 @@ void cpuacct_account_field(struct task_struct *p, int index, u64 val)
 }
 
 struct cgroup_subsys cpuacct_subsys = {
-	.name = "cpuacct",
-	.css_alloc = cpuacct_css_alloc,
-	.css_free = cpuacct_css_free,
-	.subsys_id = cpuacct_subsys_id,
-	.base_cftypes = files,
+	.name		= "cpuacct",
+	.css_alloc	= cpuacct_css_alloc,
+	.css_free	= cpuacct_css_free,
+	.subsys_id	= cpuacct_subsys_id,
+	.base_cftypes	= files,
+	.early_init	= 1,
 };
-- 
1.8.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/5] cpuacct: No need to check subsys active state
  2013-03-28  7:20 [PATCH 0/5] cpuacct, cgroup: Remove cgroup_subsys.active Li Zefan
                   ` (2 preceding siblings ...)
  2013-03-28  7:21 ` [PATCH 3/5] cpuacct: Initialize cpuacct subsystem earlier Li Zefan
@ 2013-03-28  7:21 ` Li Zefan
  2013-03-28  7:21 ` [PATCH 5/5] cgroup: Remove subsys.active flag Li Zefan
  4 siblings, 0 replies; 7+ messages in thread
From: Li Zefan @ 2013-03-28  7:21 UTC (permalink / raw)
  To: Ingo Molnar, Tejun Heo; +Cc: Peter Zijlstra, LKML, Cgroups

Now we're guaranteed when cpuacct_charge() and cpuacct_account_field()
are called, cpuacct has already been properly initialized, so we no
longer need those checks.

Signed-off-by: Li Zefan <lizefan@huawei.com>
---
 kernel/sched/cpuacct.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index 75e46d2..ef57ab6 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -247,9 +247,6 @@ void cpuacct_charge(struct task_struct *tsk, u64 cputime)
 	struct cpuacct *ca;
 	int cpu;
 
-	if (unlikely(!cpuacct_subsys.active))
-		return;
-
 	cpu = task_cpu(tsk);
 
 	rcu_read_lock();
@@ -278,9 +275,6 @@ void cpuacct_account_field(struct task_struct *p, int index, u64 val)
 	struct kernel_cpustat *kcpustat;
 	struct cpuacct *ca;
 
-	if (unlikely(!cpuacct_subsys.active))
-		return;
-
 	rcu_read_lock();
 	ca = task_ca(p);
 	while (ca != &root_cpuacct) {
-- 
1.8.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/5] cgroup: Remove subsys.active flag
  2013-03-28  7:20 [PATCH 0/5] cpuacct, cgroup: Remove cgroup_subsys.active Li Zefan
                   ` (3 preceding siblings ...)
  2013-03-28  7:21 ` [PATCH 4/5] cpuacct: No need to check subsys active state Li Zefan
@ 2013-03-28  7:21 ` Li Zefan
  2013-03-28 18:19   ` Tejun Heo
  4 siblings, 1 reply; 7+ messages in thread
From: Li Zefan @ 2013-03-28  7:21 UTC (permalink / raw)
  To: Ingo Molnar, Tejun Heo; +Cc: Peter Zijlstra, LKML, Cgroups

The only user was cpuacct.

Signed-off-by: Li Zefan <lizefan@huawei.com>
---
 include/linux/cgroup.h | 1 -
 kernel/cgroup.c        | 3 ---
 2 files changed, 4 deletions(-)

diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 7d73905..a236a5b 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -457,7 +457,6 @@ struct cgroup_subsys {
 	void (*bind)(struct cgroup *root);
 
 	int subsys_id;
-	int active;
 	int disabled;
 	int early_init;
 	/*
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 4855892..64dd57d 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -4415,7 +4415,6 @@ static void __init cgroup_init_subsys(struct cgroup_subsys *ss)
 	 * need to invoke fork callbacks here. */
 	BUG_ON(!list_empty(&init_task.tasks));
 
-	ss->active = 1;
 	BUG_ON(online_css(ss, dummytop));
 
 	mutex_unlock(&cgroup_mutex);
@@ -4523,7 +4522,6 @@ int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss)
 	}
 	write_unlock(&css_set_lock);
 
-	ss->active = 1;
 	ret = online_css(ss, dummytop);
 	if (ret)
 		goto err_unload;
@@ -4565,7 +4563,6 @@ void cgroup_unload_subsys(struct cgroup_subsys *ss)
 	mutex_lock(&cgroup_mutex);
 
 	offline_css(ss, dummytop);
-	ss->active = 0;
 
 	if (ss->use_id) {
 		idr_remove_all(&ss->idr);
-- 
1.8.0.2

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 5/5] cgroup: Remove subsys.active flag
  2013-03-28  7:21 ` [PATCH 5/5] cgroup: Remove subsys.active flag Li Zefan
@ 2013-03-28 18:19   ` Tejun Heo
  0 siblings, 0 replies; 7+ messages in thread
From: Tejun Heo @ 2013-03-28 18:19 UTC (permalink / raw)
  To: Li Zefan; +Cc: Ingo Molnar, Peter Zijlstra, LKML, Cgroups

On Thu, Mar 28, 2013 at 03:21:49PM +0800, Li Zefan wrote:
> The only user was cpuacct.
> 
> Signed-off-by: Li Zefan <lizefan@huawei.com>

  Acked-by: Tejun Heo <tj@kernel.org>

Please feel free to route through -tip with the other cpuacct changes.

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-03-28 18:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-28  7:20 [PATCH 0/5] cpuacct, cgroup: Remove cgroup_subsys.active Li Zefan
2013-03-28  7:20 ` [PATCH 1/5] cpuacct: Allocate per_cpu cpuusage for root cpuacct statically Li Zefan
2013-03-28  7:20 ` [PATCH 2/5] cpuacct: Initialize root cpuacct earlier Li Zefan
2013-03-28  7:21 ` [PATCH 3/5] cpuacct: Initialize cpuacct subsystem earlier Li Zefan
2013-03-28  7:21 ` [PATCH 4/5] cpuacct: No need to check subsys active state Li Zefan
2013-03-28  7:21 ` [PATCH 5/5] cgroup: Remove subsys.active flag Li Zefan
2013-03-28 18:19   ` Tejun Heo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).