All of lore.kernel.org
 help / color / mirror / Atom feed
From: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
To: Tejun Heo <theo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
	Fengguang Wu
	<fengguang.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH cgroup/for-3.11 1/3] cgroup: fix RCU accesses to task->cgroups
Date: Tue, 25 Jun 2013 09:55:44 +0800	[thread overview]
Message-ID: <51C8F8A0.1090000@huawei.com> (raw)
In-Reply-To: <20130621225116.GC3949-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>

On 2013/6/22 6:51, Tejun Heo wrote:
> task->cgroups is a RCU pointer pointing to struct css_set.  A task
> switches to a different css_set on cgroup migration but a css_set
> doesn't change once created and its pointers to cgroup_subsys_states
> aren't RCU protected.
> 
> task_subsys_state[_check]() is the macro to acquire css given a task
> and subsys_id pair.  It RCU-dereferences task->cgroups->subsys[] not
> task->cgroups, so the RCU pointer task->cgroups ends up being
> dereferenced without read_barrier_depends() after it.  It's broken.
> 
> Fix it by introducing task_css_set[_check]() which does
> RCU-dereference on task->cgroups.  task_subsys_state[_check]() is
> reimplemented to directly dereference ->subsys[] of the css_set
> returned from task_css_set[_check]().
> 
> This removes some of sparse RCU warnings in cgroup.
> 
> Signed-off-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> Reported-by: Fengguang Wu <fengguang.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> ---
> Hello,
> 
> Three RCU fixe patches.  The first one fixes an actual bug.  The other
> two add missing annoations so that sparse doesn't generate spurious
> RCU address space warnings.
> 
> Thanks!
> 
>  include/linux/cgroup.h |   58 ++++++++++++++++++++++++++++++++++++++++---------
>  1 file changed, 48 insertions(+), 10 deletions(-)
> 
> --- a/include/linux/cgroup.h
> +++ b/include/linux/cgroup.h
> @@ -638,22 +638,60 @@ static inline struct cgroup_subsys_state
>  	return cgrp->subsys[subsys_id];
>  }
>  
> -/*
> - * function to get the cgroup_subsys_state which allows for extra
> - * rcu_dereference_check() conditions, such as locks used during the
> - * cgroup_subsys::attach() methods.
> +/**
> + * task_css_set_check - obtain a task's css_set with extra access conditions
> + * @task: the task to obtain css_set for
> + * @__c: extra condition expression to be passed to rcu_dereference_check()
> + *
> + * A task's css_set is RCU protected, initialized and exited while holding
> + * task_lock(), and can only be modified while holding both cgroup_mutex
> + * and task_lock() while the task is alive.  This macro verifies that the
> + * caller is inside proper critical section and returns @task's css_set.
> + *
> + * The caller can also specify additional allowed conditions via @__c, such
> + * as locks used during the cgroup_subsys::attach() methods.
>   */
>  #ifdef CONFIG_PROVE_RCU
>  extern struct mutex cgroup_mutex;
> -#define task_subsys_state_check(task, subsys_id, __c)			\
> -	rcu_dereference_check((task)->cgroups->subsys[(subsys_id)],	\
> -			      lockdep_is_held(&(task)->alloc_lock) ||	\
> -			      lockdep_is_held(&cgroup_mutex) || (__c))
> +#define task_css_set_check(task, __c)					\
> +	rcu_dereference_check((task)->cgroups,				\
> +		lockdep_is_held(&(task)->alloc_lock) ||			\
> +		lockdep_is_held(&cgroup_mutex) || (__c))
>  #else
> -#define task_subsys_state_check(task, subsys_id, __c)			\
> -	rcu_dereference((task)->cgroups->subsys[(subsys_id)])
> +#define task_css_set_check(task, __c)					\
> +	rcu_dereference_raw((task)->cgroups

parenthesis unmatched.

and why not just use rcu_dereference()? I guess it should be equivalent to
rcu_derference_raw() if CONFIG_PROVE_RCU=n ?

>  #endif
>  

  parent reply	other threads:[~2013-06-25  1:55 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-21 22:51 [PATCH cgroup/for-3.11 1/3] cgroup: fix RCU accesses to task->cgroups Tejun Heo
     [not found] ` <20130621225116.GC3949-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2013-06-21 22:52   ` [PATCH cgroup/for-3.11 2/3] cgroup: fix RCU accesses around task->cgroups Tejun Heo
     [not found]     ` <20130621225204.GD3949-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2013-06-21 22:52       ` [PATCH cgroup/for-3.11 3/3] cgroup: always use RCU accessors for protected accesses Tejun Heo
2013-06-21 22:52       ` Tejun Heo
     [not found]         ` <20130621225233.GE3949-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2013-06-25  2:04           ` Li Zefan
2013-06-25  2:02       ` [PATCH cgroup/for-3.11 2/3] cgroup: fix RCU accesses around task->cgroups Li Zefan
     [not found]         ` <51C8FA3E.9020104-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-06-25 18:50           ` Tejun Heo
2013-06-26  3:29       ` Li Zefan
2013-06-25  1:55   ` Li Zefan [this message]
2013-06-25 18:48   ` [PATCH v2 cgroup/for-3.11 1/3] cgroup: fix RCU accesses to task->cgroups Tejun Heo
     [not found]     ` <20130625184832.GC20051-9pTldWuhBndy/B6EtB590w@public.gmane.org>
2013-06-26  3:28       ` Li Zefan
2013-06-26 17:49   ` [PATCH " Tejun Heo
  -- strict thread matches above, loose matches on Subject: below --
2013-06-21 22:51 Tejun Heo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51C8F8A0.1090000@huawei.com \
    --to=lizefan-hv44wf8li93qt0dzr+alfa@public.gmane.org \
    --cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=fengguang.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=theo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.