From: Matt Helsley <matthltc@us.ibm.com>
To: Paul Menage <menage@google.com>
Cc: Linux-Kernel <linux-kernel@vger.kernel.org>,
Cedric Le Goater <clg@fr.ibm.com>,
Oren Laadan <orenl@cs.columbia.edu>,
Linus Torvalds <torvalds@linux-foundation.org>,
Pavel Machek <pavel@ucw.cz>,
linux-pm@lists.linux-foundation.org,
Linux Containers <containers@lists.linux-foundation.org>
Subject: Re: [RFC][PATCH 3/5] Container Freezer: Implement freezer cgroup subsystem
Date: Wed, 30 Apr 2008 03:39:45 -0700 [thread overview]
Message-ID: <1209551985.29759.20.camel@localhost.localdomain> (raw)
In-Reply-To: <6599ad830804242251w439dd712tc1919b489535c74c@mail.gmail.com>
On Thu, 2008-04-24 at 22:51 -0700, Paul Menage wrote:
> >+static const char *freezer_state_strs[] = {
> >+ "RUNNING\n",
> >+ "FREEZING\n" ,
> >+ "FROZEN\n"
> >+};
>
> I think it might be cleaner to not include the \n characters in this array.
Sure. Though that might produce weird output from
simple_read_from_buffer() -- no newline.
I've switched this and the strcmp() code below.
> >+static inline int cgroup_frozen(struct task_struct *task)
> >+{
> >+ struct cgroup *cgroup = task_cgroup(task, freezer_subsys_id);
> >+ struct freezer *freezer = cgroup_freezer(cgroup);
> >+ enum freezer_state state;
> >+
> >+ spin_lock(&freezer->lock);
> >+ state = freezer->state;
> >+ spin_unlock(&freezer->lock);
> >+
> >+ return (state == STATE_FROZEN);
> >+}
>
> You need to be in an RCU critical section or else hold task_lock() in
> order to dereference the cgroup returned from task_cgroup()
What are the rules of using subsystem pointers from the cgroup? Suppose
I did:
rcu_read_lock();
cgroup = task_cgroup(task, freezer_subsys_id);
freezer = cgroup_freezer(cgroup);
state = freezer->state;
rcu_read_unlock();
return (state == STATE_FROZEN);
(And guard writes to freezer->state with the freezer->lock)
?
> I'm not sure that you need to take freezer->lock here - you're just
> reading a single word.
Doesn't the safety of that assumption depend on the architecture _and_
compiler?
> >+
> >+ if (!capable(CAP_SYS_ADMIN))
> >+ return ERR_PTR(-EPERM);
> >+
>
> Why does everyone keep throwing calls to check CAP_SYS_ADMIN into
> their cgroup create callbacks? You have to be root in order to mount a
> cgroups hierarchy in the first place, and filesystem permissions will
> control who can create new cgroups.
Removed.
> >+static int freezer_can_attach(struct cgroup_subsys *ss,
> >+ struct cgroup *new_cgroup,
> >+ struct task_struct *task)
> >+{
> >+ struct freezer *freezer = cgroup_freezer(new_cgroup);
> >+ int retval = 0;
> >+
> >+ if (freezer->state == STATE_FROZEN)
> >+ retval = -EBUSY;
> >+
> >+ return retval;
> >+}
>
> You should comment here that the call to cgroup_lock() in the
> freezer.state write method prevents a write to that file racing
> against an attach, and hence the can_attach() result will remain valid
> until the attach completes.
OK. I used your comment. :)
> >+static ssize_t freezer_write(struct cgroup *cgroup,
> >+ struct cftype *cft,
> >+ struct file *file,
> >+ const char __user *userbuf,
> >+ size_t nbytes, loff_t *unused_ppos)
> >+{
> >+ char *buffer;
> >+ int retval = 0;
> >+ enum freezer_state goal_state;
> >+
> >+ if (nbytes >= PATH_MAX)
> >+ return -E2BIG;
> >+
> >+ /* +1 for nul-terminator */
> >+ buffer = kmalloc(nbytes + 1, GFP_KERNEL);
> >+ if (buffer == NULL)
> >+ return -ENOMEM;
>
> Given that you're copying a string whose maximum valid length is
> "FREEZING" you don't really need to use a dynamically-allocated
> buffer.
Yup. Changed to use a fixed buffer.
> But I really ought to provide a write_string() method that handles
> this kind of copying on behalf of cgroup subsystems, the way it
> already does for 64-bit ints.
Seems like a good idea for this cgroup subsystem at least.
> >+ if (strcmp(buffer, "RUNNING") == 0)
> >+ goal_state = STATE_RUNNING;
> >+ else if (strcmp(buffer, "FROZEN") == 0)
> >+ goal_state = STATE_FROZEN;
>
> Would it make sense to compare against the strings you already have in
> the array earlier in the file?
Done.
Cheers,
-Matt Helsley
next prev parent reply other threads:[~2008-04-30 10:40 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-24 6:47 [RFC][PATCH 0/5] Container Freezer: Reuse Suspend Freezer Matt Helsley
2008-04-24 6:47 ` [RFC][PATCH 1/5] Container Freezer: Add TIF_FREEZE flag to all architectures Matt Helsley
2008-04-24 6:47 ` Matt Helsley
[not found] ` <20080424064756.935832298-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-04-24 8:09 ` Pavel Machek
2008-04-24 8:09 ` Pavel Machek
2008-04-24 8:09 ` Pavel Machek
2008-04-24 6:47 ` Matt Helsley
2008-04-24 6:47 ` [RFC][PATCH 2/5] Container Freezer: Make refrigerator always available Matt Helsley
2008-04-24 6:47 ` Matt Helsley
2008-04-25 11:04 ` Pavel Machek
2008-04-25 11:04 ` Pavel Machek
2008-04-25 12:07 ` Cedric Le Goater
2008-04-26 13:02 ` Rafael J. Wysocki
[not found] ` <4811C978.6010508-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
2008-04-26 13:02 ` Rafael J. Wysocki
2008-04-26 13:02 ` Rafael J. Wysocki
2008-04-26 23:32 ` [RFC][PATCH] Freezer: NOSIG flag (was: Re: [RFC][PATCH 2/5] Container Freezer: Make refrigerator always available) Rafael J. Wysocki
2008-04-26 23:32 ` Rafael J. Wysocki
[not found] ` <200804261502.37413.rjw-KKrjLPT3xs0@public.gmane.org>
2008-04-26 23:32 ` Rafael J. Wysocki
2008-04-25 12:07 ` [RFC][PATCH 2/5] Container Freezer: Make refrigerator always available Cedric Le Goater
2008-04-30 9:08 ` Matt Helsley
[not found] ` <20080425110456.GF14903-I/5MKhXcvmPrBKCeMvbIDA@public.gmane.org>
2008-04-25 12:07 ` Cedric Le Goater
2008-04-30 9:08 ` Matt Helsley
2008-04-30 9:08 ` Matt Helsley
[not found] ` <20080424064757.227289200-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-04-25 11:04 ` Pavel Machek
2008-04-24 6:47 ` Matt Helsley
2008-04-24 6:47 ` [RFC][PATCH 3/5] Container Freezer: Implement freezer cgroup subsystem Matt Helsley
2008-04-24 6:47 ` Matt Helsley
2008-04-25 5:51 ` Paul Menage
2008-04-25 5:51 ` Paul Menage
2008-04-28 4:03 ` Serge E. Hallyn
2008-04-28 4:03 ` Serge E. Hallyn
[not found] ` <6599ad830804242251w439dd712tc1919b489535c74c-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-04-28 4:03 ` Serge E. Hallyn
2008-04-30 10:39 ` Matt Helsley
2008-04-30 10:39 ` Matt Helsley [this message]
2008-04-30 10:39 ` Matt Helsley
[not found] ` <20080424064757.526468716-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-04-25 5:51 ` Paul Menage
2008-04-30 21:28 ` Matt Helsley
2008-04-30 21:28 ` Matt Helsley
2008-04-30 22:30 ` Matt Helsley
[not found] ` <1209590905.29759.38.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2008-04-30 22:30 ` Matt Helsley
2008-04-30 22:30 ` Matt Helsley
2008-04-30 21:28 ` Matt Helsley
2008-04-24 6:47 ` Matt Helsley
2008-04-24 6:48 ` [RFC][PATCH 4/5] Container Freezer: Skip frozen cgroups during power management resume Matt Helsley
2008-04-24 6:48 ` Matt Helsley
2008-04-24 6:48 ` Matt Helsley
2008-04-24 6:48 ` [RFC][PATCH 5/5] Add a Signal Control Group Subsystem Matt Helsley
[not found] ` <20080424064758.113999091-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-04-24 19:30 ` Paul Jackson
2008-04-25 6:01 ` Paul Menage
2008-04-25 6:01 ` Paul Menage
2008-04-30 8:29 ` Matt Helsley
2008-04-30 8:29 ` Matt Helsley
[not found] ` <6599ad830804242301s6a00dd75ye212a28f97072b68-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-04-30 8:29 ` Matt Helsley
2008-04-25 11:41 ` Cedric Le Goater
2008-04-24 19:30 ` Paul Jackson
2008-04-24 19:30 ` Paul Jackson
2008-04-30 7:48 ` Matt Helsley
2008-04-30 7:48 ` Matt Helsley
[not found] ` <1209541714.6095.72.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2008-04-30 8:18 ` Paul Jackson
2008-04-30 8:18 ` Paul Jackson
2008-04-30 8:18 ` Paul Jackson
[not found] ` <20080424143032.7e659522.pj-sJ/iWh9BUns@public.gmane.org>
2008-04-30 7:48 ` Matt Helsley
2008-04-25 6:01 ` Paul Menage
2008-04-25 11:41 ` Cedric Le Goater
2008-04-30 18:44 ` Matt Helsley
[not found] ` <4811C37D.9050706-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
2008-04-30 18:44 ` Matt Helsley
2008-04-30 18:44 ` Matt Helsley
2008-04-25 11:41 ` Cedric Le Goater
2008-04-24 6:48 ` Matt Helsley
2008-04-24 6:48 ` Matt Helsley
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=1209551985.29759.20.camel@localhost.localdomain \
--to=matthltc@us.ibm.com \
--cc=clg@fr.ibm.com \
--cc=containers@lists.linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=menage@google.com \
--cc=orenl@cs.columbia.edu \
--cc=pavel@ucw.cz \
--cc=torvalds@linux-foundation.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.