public inbox for cgroups@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH cgroup/for-3.12 1/2] cgroup: fix subsystem file accesses on the root cgroup
@ 2013-08-15 15:42 Tejun Heo
       [not found] ` <20130815154236.GG14606-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Tejun Heo @ 2013-08-15 15:42 UTC (permalink / raw)
  To: Li Zefan, containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	cgroups-u79uwXL29TY76Z2rM5mHXA

From af8e64db96406f91746711260717c11584f90efd Mon Sep 17 00:00:00 2001
From: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Date: Thu, 15 Aug 2013 11:37:54 -0400

105347ba5 ("cgroup: make cgroup_file_open() rcu_read_lock() around
cgroup_css() and add cfent->css") added cfent->css to cache the
associted cgroup_subsys_state across file operations.

A cfent is associated with single css throughout its lifetime and the
origimal commit initialized the cache pointer during cgroup_add_file()
and verified that it matches the actual one in cgroup_file_open().
While this works fine for !root cgroups, it's broken for root cgroups
as files in a root cgroup are created before the css's are associated
with the cgroup and thus cgroup_css() call in cgroup_add_file()
returns NULL associating all cfents in the root cgroup with NULL css.
This makes cgroup_file_open() trigger WARN and fail with -ENODEV for
all !core subsystem files in the root cgroups.

There's no reason to initialize cfent->css separately from
cgroup_add_file().  As the association never changes,
cgroup_file_open() can set it unconditionally every time and
containing the logic in cgroup_file_open() makes more sense anyway as
the only reason it's necessary is file->private_data being already
occupied.

Fix it by setting cfent->css unconditionally from cgroup_file_open().

Signed-off-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 kernel/cgroup.c | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 66d0107..ab2a23f 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -2490,10 +2490,18 @@ static int cgroup_file_open(struct inode *inode, struct file *file)
 	}
 	rcu_read_unlock();
 
-	/* css should match @cfe->css, see cgroup_add_file() for details */
-	if (!css || WARN_ON_ONCE(css != cfe->css))
+	if (!css)
 		return -ENODEV;
 
+	/*
+	 * @cfe->css is used by read/write/close to determine the
+	 * associated css.  @file->private_data would be a better place but
+	 * that's already used by seqfile.  Multiple accessors may use it
+	 * simultaneously which is okay as the association never changes.
+	 */
+	WARN_ON_ONCE(cfe->css && cfe->css != css);
+	cfe->css = css;
+
 	if (cft->read_map || cft->read_seq_string) {
 		file->f_op = &cgroup_seqfile_operations;
 		err = single_open(file, cgroup_seqfile_show, cfe);
@@ -2772,18 +2780,6 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft)
 	dentry->d_fsdata = cfe;
 	simple_xattrs_init(&cfe->xattrs);
 
-	/*
-	 * cfe->css is used by read/write/close to determine the associated
-	 * css.  file->private_data would be a better place but that's
-	 * already used by seqfile.  Note that open will use the usual
-	 * cgroup_css() and css_tryget() to acquire the css and this
-	 * caching doesn't affect css lifetime management.
-	 */
-	if (cft->ss)
-		cfe->css = cgroup_css(cgrp, cft->ss->subsys_id);
-	else
-		cfe->css = &cgrp->dummy_css;
-
 	mode = cgroup_file_mode(cft);
 	error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb);
 	if (!error) {
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH cgroup/for-3.12 2/2] cgroup: fix cgroup_write_event_control()
       [not found] ` <20130815154236.GG14606-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
@ 2013-08-15 15:43   ` Tejun Heo
       [not found]     ` <20130815154315.GH14606-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
  2013-08-19  2:23   ` [PATCH cgroup/for-3.12 1/2] cgroup: fix subsystem file accesses on the root cgroup Li Zefan
  1 sibling, 1 reply; 6+ messages in thread
From: Tejun Heo @ 2013-08-15 15:43 UTC (permalink / raw)
  To: Li Zefan, containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	cgroups-u79uwXL29TY76Z2rM5mHXA

From ced043264c9c3f03ab3c992af17461db50421dd8 Mon Sep 17 00:00:00 2001
From: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Date: Thu, 15 Aug 2013 11:37:54 -0400

81eeaf0411 ("cgroup: make cftype->[un]register_event() deal with
cgroup_subsys_state inst ead of cgroup") updated the cftype event
methods to take @css (cgroup_subsys_state) instead of @cgroup;
however, it incorrectly used @css passed to
cgroup_write_event_control(), which the dummy_css for the cgroup as
the file is a cgroup core file.  This leads to oops on event
registration.

Fix it by using the css matching the event target file.  Note that
cgroup_write_event_control() now disallows cgroup core files from
being event sources.  This is for simplicity and doesn't matter as
cgroup_event will be moved and made specific to memcg.

Signed-off-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 kernel/cgroup.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index ab2a23f..6499004 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -4040,10 +4040,10 @@ static void cgroup_event_ptable_queue_proc(struct file *file,
  * Input must be in format '<event_fd> <control_fd> <args>'.
  * Interpretation of args is defined by control file implementation.
  */
-static int cgroup_write_event_control(struct cgroup_subsys_state *css,
+static int cgroup_write_event_control(struct cgroup_subsys_state *dummy_css,
 				      struct cftype *cft, const char *buffer)
 {
-	struct cgroup *cgrp = css->cgroup;
+	struct cgroup *cgrp = dummy_css->cgroup;
 	struct cgroup_event *event;
 	struct cgroup *cgrp_cfile;
 	unsigned int efd, cfd;
@@ -4065,7 +4065,7 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
 	event = kzalloc(sizeof(*event), GFP_KERNEL);
 	if (!event)
 		return -ENOMEM;
-	event->css = css;
+
 	INIT_LIST_HEAD(&event->list);
 	init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc);
 	init_waitqueue_func_entry(&event->wait, cgroup_event_wake);
@@ -4101,6 +4101,23 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
 		goto out_put_cfile;
 	}
 
+	if (!event->cft->ss) {
+		ret = -EBADF;
+		goto out_put_cfile;
+	}
+
+	/* determine the css of @cfile and associate @event with it */
+	rcu_read_lock();
+
+	ret = -EINVAL;
+	event->css = cgroup_css(cgrp, event->cft->ss->subsys_id);
+	if (event->css)
+		ret = 0;
+
+	rcu_read_unlock();
+	if (ret)
+		goto out_put_cfile;
+
 	/*
 	 * The file to be monitored must be in the same cgroup as
 	 * cgroup.event_control is.
@@ -4116,7 +4133,7 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *css,
 		goto out_put_cfile;
 	}
 
-	ret = event->cft->register_event(css, event->cft,
+	ret = event->cft->register_event(event->css, event->cft,
 			event->eventfd, buffer);
 	if (ret)
 		goto out_put_cfile;
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH cgroup/for-3.12 1/2] cgroup: fix subsystem file accesses on the root cgroup
       [not found] ` <20130815154236.GG14606-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
  2013-08-15 15:43   ` [PATCH cgroup/for-3.12 2/2] cgroup: fix cgroup_write_event_control() Tejun Heo
@ 2013-08-19  2:23   ` Li Zefan
       [not found]     ` <521181AD.7090700-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  1 sibling, 1 reply; 6+ messages in thread
From: Li Zefan @ 2013-08-19  2:23 UTC (permalink / raw)
  To: Tejun Heo
  Cc: cgroups-u79uwXL29TY76Z2rM5mHXA,
	containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA

> 105347ba5 ("cgroup: make cgroup_file_open() rcu_read_lock() around
> cgroup_css() and add cfent->css") added cfent->css to cache the
> associted cgroup_subsys_state across file operations.
> 
> A cfent is associated with single css throughout its lifetime and the
> origimal commit initialized the cache pointer during cgroup_add_file()
> and verified that it matches the actual one in cgroup_file_open().
> While this works fine for !root cgroups, it's broken for root cgroups
> as files in a root cgroup are created before the css's are associated
> with the cgroup and thus cgroup_css() call in cgroup_add_file()
> returns NULL associating all cfents in the root cgroup with NULL css.
> This makes cgroup_file_open() trigger WARN and fail with -ENODEV for
> all !core subsystem files in the root cgroups.
> 
> There's no reason to initialize cfent->css separately from
> cgroup_add_file().  As the association never changes,
> cgroup_file_open() can set it unconditionally every time and
> containing the logic in cgroup_file_open() makes more sense anyway as
> the only reason it's necessary is file->private_data being already
> occupied.
> 
> Fix it by setting cfent->css unconditionally from cgroup_file_open().
> 
> Signed-off-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

Acked-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH cgroup/for-3.12 2/2] cgroup: fix cgroup_write_event_control()
       [not found]     ` <20130815154315.GH14606-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
@ 2013-08-19  2:41       ` Li Zefan
       [not found]         ` <521185F3.6060806-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Li Zefan @ 2013-08-19  2:41 UTC (permalink / raw)
  To: Tejun Heo
  Cc: cgroups-u79uwXL29TY76Z2rM5mHXA,
	containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA

On 2013/8/15 23:43, Tejun Heo wrote:
>>From ced043264c9c3f03ab3c992af17461db50421dd8 Mon Sep 17 00:00:00 2001
> From: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> Date: Thu, 15 Aug 2013 11:37:54 -0400
> 
> 81eeaf0411 ("cgroup: make cftype->[un]register_event() deal with
> cgroup_subsys_state inst ead of cgroup") updated the cftype event
> methods to take @css (cgroup_subsys_state) instead of @cgroup;
> however, it incorrectly used @css passed to
> cgroup_write_event_control(), which the dummy_css for the cgroup as
> the file is a cgroup core file.  This leads to oops on event
> registration.
> 
> Fix it by using the css matching the event target file.  Note that
> cgroup_write_event_control() now disallows cgroup core files from
> being event sources.  This is for simplicity and doesn't matter as
> cgroup_event will be moved and made specific to memcg.
> 
> Signed-off-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

Acked-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH cgroup/for-3.12 1/2] cgroup: fix subsystem file accesses on the root cgroup
       [not found]     ` <521181AD.7090700-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
@ 2013-08-19 13:57       ` Tejun Heo
  0 siblings, 0 replies; 6+ messages in thread
From: Tejun Heo @ 2013-08-19 13:57 UTC (permalink / raw)
  To: Li Zefan
  Cc: containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	cgroups-u79uwXL29TY76Z2rM5mHXA

On Mon, Aug 19, 2013 at 10:23:41AM +0800, Li Zefan wrote:
> > 105347ba5 ("cgroup: make cgroup_file_open() rcu_read_lock() around
> > cgroup_css() and add cfent->css") added cfent->css to cache the
> > associted cgroup_subsys_state across file operations.
> > 
> > A cfent is associated with single css throughout its lifetime and the
> > origimal commit initialized the cache pointer during cgroup_add_file()
> > and verified that it matches the actual one in cgroup_file_open().
> > While this works fine for !root cgroups, it's broken for root cgroups
> > as files in a root cgroup are created before the css's are associated
> > with the cgroup and thus cgroup_css() call in cgroup_add_file()
> > returns NULL associating all cfents in the root cgroup with NULL css.
> > This makes cgroup_file_open() trigger WARN and fail with -ENODEV for
> > all !core subsystem files in the root cgroups.
> > 
> > There's no reason to initialize cfent->css separately from
> > cgroup_add_file().  As the association never changes,
> > cgroup_file_open() can set it unconditionally every time and
> > containing the logic in cgroup_file_open() makes more sense anyway as
> > the only reason it's necessary is file->private_data being already
> > occupied.
> > 
> > Fix it by setting cfent->css unconditionally from cgroup_file_open().
> > 
> > Signed-off-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> 
> Acked-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>

Applied to cgroup/for-3.12.

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH cgroup/for-3.12 2/2] cgroup: fix cgroup_write_event_control()
       [not found]         ` <521185F3.6060806-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
@ 2013-08-19 13:57           ` Tejun Heo
  0 siblings, 0 replies; 6+ messages in thread
From: Tejun Heo @ 2013-08-19 13:57 UTC (permalink / raw)
  To: Li Zefan
  Cc: cgroups-u79uwXL29TY76Z2rM5mHXA,
	containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA

On Mon, Aug 19, 2013 at 10:41:55AM +0800, Li Zefan wrote:
> On 2013/8/15 23:43, Tejun Heo wrote:
> >>From ced043264c9c3f03ab3c992af17461db50421dd8 Mon Sep 17 00:00:00 2001
> > From: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> > Date: Thu, 15 Aug 2013 11:37:54 -0400
> > 
> > 81eeaf0411 ("cgroup: make cftype->[un]register_event() deal with
> > cgroup_subsys_state inst ead of cgroup") updated the cftype event
> > methods to take @css (cgroup_subsys_state) instead of @cgroup;
> > however, it incorrectly used @css passed to
> > cgroup_write_event_control(), which the dummy_css for the cgroup as
> > the file is a cgroup core file.  This leads to oops on event
> > registration.
> > 
> > Fix it by using the css matching the event target file.  Note that
> > cgroup_write_event_control() now disallows cgroup core files from
> > being event sources.  This is for simplicity and doesn't matter as
> > cgroup_event will be moved and made specific to memcg.
> > 
> > Signed-off-by: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> 
> Acked-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>

Applied to cgroup/for-3.12.  Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-08-19 13:57 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-15 15:42 [PATCH cgroup/for-3.12 1/2] cgroup: fix subsystem file accesses on the root cgroup Tejun Heo
     [not found] ` <20130815154236.GG14606-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2013-08-15 15:43   ` [PATCH cgroup/for-3.12 2/2] cgroup: fix cgroup_write_event_control() Tejun Heo
     [not found]     ` <20130815154315.GH14606-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2013-08-19  2:41       ` Li Zefan
     [not found]         ` <521185F3.6060806-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-19 13:57           ` Tejun Heo
2013-08-19  2:23   ` [PATCH cgroup/for-3.12 1/2] cgroup: fix subsystem file accesses on the root cgroup Li Zefan
     [not found]     ` <521181AD.7090700-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-19 13:57       ` Tejun Heo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox