2010-04-23 02:34:22

by Li Zefan

[permalink] [raw]
Subject: [PATCH] cgroup: Check task_lock in task_subsys_state()

task_subsys_state() is safe under task_lock(). See
Documentation/cgroups/cgroups.txt for locking rule.

This fixes an RCU warning when resume from suspend. The
warning comes from freezer cgroup in cgroup_freezing_or_frozen().

Signed-off-by: Li Zefan <[email protected]>
---

I'm not sure which is preferable - access ->alloc_lock directly
like this patch or add task_lock_is_held() in sched.h

---
include/linux/cgroup.h | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index b8ad1ea..8f78073 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -530,6 +530,7 @@ static inline struct cgroup_subsys_state *task_subsys_state(
{
return rcu_dereference_check(task->cgroups->subsys[subsys_id],
rcu_read_lock_held() ||
+ lockdep_is_held(&task->alloc_lock) ||
cgroup_lock_is_held());
}

--
1.6.3


2010-04-23 04:10:09

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH] cgroup: Check task_lock in task_subsys_state()

On Fri, Apr 23, 2010 at 10:35:52AM +0800, Li Zefan wrote:
> task_subsys_state() is safe under task_lock(). See
> Documentation/cgroups/cgroups.txt for locking rule.
>
> This fixes an RCU warning when resume from suspend. The
> warning comes from freezer cgroup in cgroup_freezing_or_frozen().
>
> Signed-off-by: Li Zefan <[email protected]>
> ---
>
> I'm not sure which is preferable - access ->alloc_lock directly
> like this patch or add task_lock_is_held() in sched.h

This is for the maintainers to decide, either way works from my viewpoint.

I have queued it as is with Matt's Acked-by, and am testing it. Thank you!!!

Thanx, Paul

> ---
> include/linux/cgroup.h | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
> index b8ad1ea..8f78073 100644
> --- a/include/linux/cgroup.h
> +++ b/include/linux/cgroup.h
> @@ -530,6 +530,7 @@ static inline struct cgroup_subsys_state *task_subsys_state(
> {
> return rcu_dereference_check(task->cgroups->subsys[subsys_id],
> rcu_read_lock_held() ||
> + lockdep_is_held(&task->alloc_lock) ||
> cgroup_lock_is_held());
> }
>
> --
> 1.6.3

2010-04-23 03:32:59

by Matt Helsley

[permalink] [raw]
Subject: Re: [PATCH] cgroup: Check task_lock in task_subsys_state()

On Fri, Apr 23, 2010 at 10:35:52AM +0800, Li Zefan wrote:
> task_subsys_state() is safe under task_lock(). See
> Documentation/cgroups/cgroups.txt for locking rule.
>
> This fixes an RCU warning when resume from suspend. The
> warning comes from freezer cgroup in cgroup_freezing_or_frozen().
>
> Signed-off-by: Li Zefan <[email protected]>

Acked-by: Matt Helsley <[email protected]>

> ---
>
> I'm not sure which is preferable - access ->alloc_lock directly
> like this patch or add task_lock_is_held() in sched.h
>
> ---
> include/linux/cgroup.h | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
> index b8ad1ea..8f78073 100644
> --- a/include/linux/cgroup.h
> +++ b/include/linux/cgroup.h
> @@ -530,6 +530,7 @@ static inline struct cgroup_subsys_state *task_subsys_state(
> {
> return rcu_dereference_check(task->cgroups->subsys[subsys_id],
> rcu_read_lock_held() ||
> + lockdep_is_held(&task->alloc_lock) ||
> cgroup_lock_is_held());
> }
>
> --
> 1.6.3