lkml.org 
[lkml]   [2008]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] cgroups: fix incorrect using rcu_dereference() in cgroup_subsys_state()

    It's task->cgroups protected by RCU. and struct css_set.subsys[subsys_id]
    is readonly(after init). so we don't need rcu_dereference() for
    struct css_set.subsys[subsys_id].

    the ways using cgroup_subsys_state() safely:

    #1:
    rcu_read_lock() / task_lock();
    c = cgroup_subsys_state(tsk, id);
    use c;
    rcu_read_unlock() / task_unlock();


    #2: use cgroup_lock() for _current_ task.
    cgroup_lock();
    c = cgroup_subsys_state(current, id);
    use c;
    cgroup_unlock();

    Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
    ---
    diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
    index 1164963..22901ff 100644
    --- a/include/linux/cgroup.h
    +++ b/include/linux/cgroup.h
    @@ -359,10 +360,15 @@ static inline struct cgroup_subsys_state *cgroup_subsys_state(
    return cgrp->subsys[subsys_id];
    }

    +/* Caller must hold task_lock() or rcu_read_lock() */
    static inline struct cgroup_subsys_state *task_subsys_state(
    struct task_struct *task, int subsys_id)
    {
    - return rcu_dereference(task->cgroups->subsys[subsys_id]);
    + /*
    + * ->subsys[subsys_id] are read-only data, so we do not need
    + * rcu_dereference() for it.
    + */
    + return rcu_dereference(task->cgroups)->subsys[subsys_id];
    }

    static inline struct cgroup* task_cgroup(struct task_struct *task,




    \
     
     \ /
      Last update: 2008-11-21 09:57    [W:0.023 / U:34.020 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site