From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760272Ab1LPQit (ORCPT ); Fri, 16 Dec 2011 11:38:49 -0500 Received: from mail-yx0-f202.google.com ([209.85.213.202]:51252 "EHLO mail-yx0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760202Ab1LPQik (ORCPT ); Fri, 16 Dec 2011 11:38:40 -0500 From: Mandeep Singh Baines To: Tejun Heo , Li Zefan , linux-kernel@vger.kernel.org Cc: Mandeep Singh Baines , Tejun Heo , Li Zefan , containers@lists.linux-foundation.org, cgroups@vger.kernel.org, KAMEZAWA Hiroyuki , Frederic Weisbecker , Oleg Nesterov , Andrew Morton , Paul Menage Subject: [PATCH] cgroup: remove redundate get/put of old css_set from migrate Date: Fri, 16 Dec 2011 08:38:31 -0800 Message-Id: <1324053511-24591-1-git-send-email-msb@chromium.org> X-Mailer: git-send-email 1.7.3.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. This patch depends on: commit cd3d095275374220921fcf0d4e0c16584b26ddbc Author: Tejun Heo Date: Mon Dec 12 18:12:21 2011 -0800 cgroup: always lock threadgroup during migration Signed-off-by: Mandeep Singh Baines Cc: Tejun Heo Cc: Li Zefan Cc: containers@lists.linux-foundation.org Cc: cgroups@vger.kernel.org Cc: KAMEZAWA Hiroyuki Cc: Frederic Weisbecker Cc: Oleg Nesterov Cc: Andrew Morton Cc: Paul Menage --- kernel/cgroup.c | 25 ++++++------------------- 1 files changed, 6 insertions(+), 19 deletions(-) diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 1b3b841..eb95e32 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; @@ -2191,19 +2186,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 (css_set_prefetch(cgrp, oldcg, &newcg_list)) goto out_list_teardown; - } } /* -- 1.7.3.1