Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752646AbZGVKHR (ORCPT ); Wed, 22 Jul 2009 06:07:17 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751716AbZGVKHQ (ORCPT ); Wed, 22 Jul 2009 06:07:16 -0400 Received: from smtp161.dfw.emailsrvr.com ([67.192.241.161]:47598 "EHLO smtp161.dfw.emailsrvr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751000AbZGVKHQ (ORCPT ); Wed, 22 Jul 2009 06:07:16 -0400 X-Greylist: delayed 403 seconds by postgrey-1.27 at vger.kernel.org; Wed, 22 Jul 2009 06:07:15 EDT From: Oren Laadan To: Andrew Morton Cc: Linus Torvalds , containers@lists.linux-foundation.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-api@vger.kernel.org, Serge Hallyn , Dave Hansen , Ingo Molnar , "H. Peter Anvin" , Alexander Viro , Pavel Emelyanov , Alexey Dobriyan , Oren Laadan , Oren Laadan , Matt Helsley , Paul Menage , Li Zefan , Cedric Le Goater Subject: [RFC v17][PATCH 08/60] cgroup freezer: interface to freeze a cgroup from within the kernel Date: Wed, 22 Jul 2009 05:59:30 -0400 Message-Id: <1248256822-23416-9-git-send-email-orenl@librato.com> X-Mailer: git-send-email 1.6.0.4 In-Reply-To: <1248256822-23416-1-git-send-email-orenl@librato.com> References: <1248256822-23416-1-git-send-email-orenl@librato.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2952 Lines: 82 Add public interface to freeze a cgroup freezer given a task that belongs to that cgroup: cgroup_freezer_make_frozen(task) Freezing the root cgroup is not permitted. Freezing the cgroup to which current process belong is also not permitted. This will be used for restart(2) to be able to leave the restarted processes in a frozen state, instead of resuming execution. This is useful for debugging, if the user would like to attach a debugger to the restarted task(s). It is also useful if the restart procedure would like to perform additional setup once the tasks are restored but before they are allowed to proceed execution. Signed-off-by: Oren Laadan CC: Matt Helsley Cc: Paul Menage Cc: Li Zefan Cc: Cedric Le Goater --- include/linux/freezer.h | 1 + kernel/cgroup_freezer.c | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 0 deletions(-) diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 3d32641..0cb22cb 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -68,6 +68,7 @@ extern int cgroup_freezing_or_frozen(struct task_struct *task); extern int in_same_cgroup_freezer(struct task_struct *p, struct task_struct *q); extern int cgroup_freezer_begin_checkpoint(struct task_struct *task); extern void cgroup_freezer_end_checkpoint(struct task_struct *task); +extern int cgroup_freezer_make_frozen(struct task_struct *task); #else /* !CONFIG_CGROUP_FREEZER */ static inline int cgroup_freezing_or_frozen(struct task_struct *task) { diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index 87dfbfb..7925850 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c @@ -466,4 +466,31 @@ void cgroup_freezer_end_checkpoint(struct task_struct *task) */ WARN_ON(freezer_checkpointing(task, CGROUP_FROZEN) != CGROUP_CHECKPOINTING); } + +int cgroup_freezer_make_frozen(struct task_struct *task) +{ + struct freezer *freezer; + struct cgroup_subsys_state *css; + int ret = -ENODEV; + + task_lock(task); + css = task_subsys_state(task, freezer_subsys_id); + css_get(css); /* make sure freezer doesn't go away */ + freezer = container_of(css, struct freezer, css); + task_unlock(task); + + /* Never freeze the root cgroup */ + if (!test_bit(CSS_ROOT, &css->flags) && + cgroup_lock_live_group(css->cgroup)) { + /* do not freeze outselves, ei ?! */ + if (css != task_subsys_state(current, freezer_subsys_id)) + ret = freezer_change_state(css->cgroup, CGROUP_FROZEN); + else + ret = -EPERM; + cgroup_unlock(); + } + + css_put(css); + return ret; +} #endif /* CONFIG_CHECKPOINT */ -- 1.6.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/