lkml.org 
[lkml]   [2011]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/5 V3] cgroup: remove redundate get/put of old css_set from migrate
    Date
    Changes in V3:
    * Fixed to put error in retval (thanks Frederic Weisbecker)
    * https://lkml.org/lkml/2011/12/20/255
    Changes in V2:
    * Updated commit message as per Tejun's feedback:
    * https://lkml.org/lkml/2011/12/19/289

    -- >8 -- (snip)

    We can now assume that the css_set reference held by the task
    will not go away for an exiting task. PF_EXITING state can be
    trusted throughout migration by checking it after locking
    threadgroup.

    While at it, renamed css_set_check_fetched to css_set_fetched.
    !css_set_fetched() seems to read better than
    !css_set_check_fetched().

    Signed-off-by: Mandeep Singh Baines <msb@chromium.org>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Li Zefan <lizf@cn.fujitsu.com>
    Cc: containers@lists.linux-foundation.org
    Cc: cgroups@vger.kernel.org
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Paul Menage <paul@paulmenage.org>
    ---
    kernel/cgroup.c | 25 ++++++-------------------
    1 files changed, 6 insertions(+), 19 deletions(-)

    diff --git a/kernel/cgroup.c b/kernel/cgroup.c
    index bc3caff..4166066 100644
    --- a/kernel/cgroup.c
    +++ b/kernel/cgroup.c
    @@ -1856,7 +1856,6 @@ static int cgroup_task_migrate(struct cgroup *cgrp, struct cgroup *oldcgrp,
    */
    task_lock(tsk);
    oldcg = tsk->cgroups;
    - get_css_set(oldcg);
    task_unlock(tsk);

    /* locate or allocate a new css_set for this task. */
    @@ -1872,12 +1871,9 @@ static int cgroup_task_migrate(struct cgroup *cgrp, struct cgroup *oldcgrp,
    might_sleep();
    /* find_css_set will give us newcg already referenced. */
    newcg = find_css_set(oldcg, cgrp);
    - if (!newcg) {
    - put_css_set(oldcg);
    + if (!newcg)
    return -ENOMEM;
    - }
    }
    - put_css_set(oldcg);

    /* @tsk can't exit as its threadgroup is locked */
    task_lock(tsk);
    @@ -2015,9 +2011,8 @@ struct cg_list_entry {
    struct list_head links;
    };

    -static bool css_set_check_fetched(struct cgroup *cgrp,
    - struct task_struct *tsk, struct css_set *cg,
    - struct list_head *newcg_list)
    +static bool css_set_fetched(struct cgroup *cgrp, struct task_struct *tsk,
    + struct css_set *cg, struct list_head *newcg_list)
    {
    struct css_set *newcg;
    struct cg_list_entry *cg_entry;
    @@ -2185,19 +2180,11 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader)
    /* get old css_set pointer */
    task_lock(tc->task);
    oldcg = tc->task->cgroups;
    - get_css_set(oldcg);
    task_unlock(tc->task);
    - /* see if the new one for us is already in the list? */
    - if (css_set_check_fetched(cgrp, tc->task, oldcg, &newcg_list)) {
    - /* was already there, nothing to do. */
    - put_css_set(oldcg);
    - } else {
    - /* we don't already have it. get new one. */
    - retval = css_set_prefetch(cgrp, oldcg, &newcg_list);
    - put_css_set(oldcg);
    - if (retval)
    + /* if we don't already have it in the list get a new one */
    + if (!css_set_fetched(cgrp, tc->task, oldcg, &newcg_list))
    + if (retval = css_set_prefetch(cgrp, oldcg, &newcg_list))
    goto out_list_teardown;
    - }
    }

    /*
    --
    1.7.3.1


    \
     
     \ /
      Last update: 2011-12-21 00:17    [W:0.029 / U:30.500 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site