cgroup: avoid attaching a cgroup root to two different superblocks
PATCH 1/1 cgroup: avoid attaching a cgroup root to two different superblocks
Run this:
touch file0
for ((; ;))
{
mount -t cpuset xxx file0
}And this concurrently:
touch file1
for ((; ;))
{
mount -t cpuset xxx file1
}We'll trigger a warning like this:
------------[ cut here ]------------ WARNING: CPU: 1 PID: 4675 at lib/percpu-refcount.c:317 percpu_ref_kill_and_confirm+0x92/0xb0 percpu_ref_kill_and_confirm called more than once on css_release! CPU: 1 PID: 4675 Comm: mount Not tainted 4.11.0-rc5+ #5 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 Call Trace: dump_stack+0x63/0x84 __warn+0xd1/0xf0 warn_slowpath_fmt+0x5f/0x80 percpu_ref_kill_and_confirm+0x92/0xb0 cgroup_kill_sb+0x95/0xb0 deactivate_locked_super+0x43/0x70 deactivate_super+0x46/0x60 ... ---[ end trace a79f61c2a2633700 ]---
Here's a race:
Thread A Thread B
cgroup1_mount()
# alloc a new cgroup root
cgroup_setup_root()
cgroup1_mount()
# no sb yet, returns NULL
kernfs_pin_sb() # but succeeds in getting the refcnt,
# so re-use cgroup root
percpu_ref_tryget_live()
# alloc sb with cgroup root
cgroup_do_mount() cgroup_kill_sb()
# alloc another sb with same root cgroup_do_mount()
cgroup_kill_sb()
We end up using the same cgroup root for two different superblocks, so percpu_ref_kill() will be called twice on the same root when the two superblocks are destroyed.
We should fix to make sure the superblock pinning is really successful.
--- kernel/cgroup/cgroup-v1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/cgroup/cgroup-v1.c +1 -1
@@ -1146,7 +1146,7 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags,* path is super cold. Let's just sleep a bit and retry. */ pinned_sb =kernfs_pin_sb (root->kf_root,NULL ); -if (IS_ERR (pinned_sb) || +if (IS_ERR_OR_NULL (pinned_sb) || !percpu_ref_tryget_live (&root->cgrp.self.refcnt)) {mutex_unlock (&cgroup_mutex);if (!IS_ERR_OR_NULL (pinned_sb))
Signature · 1 line
1.8.3.1
Quoted 9 lines · Zefan Li
We end up using the same cgroup root for two different superblocks, so
percpu_ref_kill()will be called twice on the same root when the two superblocks are destroyed.We should fix to make sure the superblock pinning is really successful.
Cc [email protected] # 3.16+Reported-by Dmitry Vyukov <[email protected]>Signed-off-by Zefan Li <[email protected]>
Applied to cgroup/for-4.11-fixes.
Thanks.
Signature · 1 line
tejun
Hello,
One of our CRIU tests hangs with this patch.
Steps to reproduce:
curl -o cgroupns.c https://gist.githubusercontent.com/avagin/f87c8a8bd2a0de9afcc74976327786bc/raw/5843701ef3679f50dd2427cf57a80871082eb28c/gistfile1.txt
gcc cgroupns.c -o cgroupns
./cgroupns
./cgroupns
[root@fc24 ~]# strace -s 256 -fe clone,unshare,setns,mount ./cgroupnsmount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst") = 0unshare(CLONE_NEWCGROUP) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fe5da0b89d0) = 529
strace: Process 529 attached
[pid 529] setns(3, CLONE_NEWCGROUP) = 0
[pid 529] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=529, si_uid=0, si_status=0, si_utime=0, si_stime=0} --- +++ exited with 0 +++
[root@fc24 ~]# strace -s 256 -fe clone,unshare,setns,mount ./cgroupnsmount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst") = ? ERESTARTNOINTR (To be restarted) mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst") = ? ERESTARTNOINTR (To be restarted) mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst") = ? ERESTARTNOINTR (To be restarted) mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst") = ? ERESTARTNOINTR (To be restarted) mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst") = ? ERESTARTNOINTR (To be restarted) mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst") = ? ERESTARTNOINTR (To be restarted)
....
Thanks,
Andrei
Quoted 83 lines · Li Zefan
Run this:
touch file0 for ((; ;)) { mount -t cpuset xxx file0 }And this concurrently:
touch file1 for ((; ;)) { mount -t cpuset xxx file1 }We'll trigger a warning like this:
------------[ cut here ]------------ WARNING: CPU: 1 PID: 4675 at lib/percpu-refcount.c:317 percpu_ref_kill_and_confirm+0x92/0xb0 percpu_ref_kill_and_confirm called more than once on css_release! CPU: 1 PID: 4675 Comm: mount Not tainted 4.11.0-rc5+ #5 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 Call Trace: dump_stack+0x63/0x84 __warn+0xd1/0xf0 warn_slowpath_fmt+0x5f/0x80 percpu_ref_kill_and_confirm+0x92/0xb0 cgroup_kill_sb+0x95/0xb0 deactivate_locked_super+0x43/0x70 deactivate_super+0x46/0x60 ... ---[ end trace a79f61c2a2633700 ]---Here's a race:
Thread A Thread B
cgroup1_mount()# alloc a new cgroup root cgroup_setup_root() cgroup1_mount() # no sb yet, returns NULL kernfs_pin_sb()# but succeeds in getting the refcnt, # so re-use cgroup root percpu_ref_tryget_live() # alloc sb with cgroup root cgroup_do_mount()
cgroup_kill_sb()# alloc another sb with same root cgroup_do_mount()
cgroup_kill_sb()We end up using the same cgroup root for two different superblocks, so
percpu_ref_kill()will be called twice on the same root when the two superblocks are destroyed.We should fix to make sure the superblock pinning is really successful.
Cc [email protected] # 3.16+Reported-by Dmitry Vyukov <[email protected]>Signed-off-by Zefan Li <[email protected]>--- kernel/cgroup/cgroup-v1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)kernel/cgroup/cgroup-v1.c +1
-1@@ -1146,7 +1146,7 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags,* path is super cold. Let's just sleep a bit and retry. */ pinned_sb =kernfs_pin_sb (root->kf_root,NULL ); -if (IS_ERR (pinned_sb) || +if (IS_ERR_OR_NULL (pinned_sb) || !percpu_ref_tryget_live (&root->cgrp.self.refcnt)) {mutex_unlock (&cgroup_mutex);if (!IS_ERR_OR_NULL (pinned_sb))
Quoted 9 lines · Andrei Vagin
Hello,
One of our CRIU tests hangs with this patch.
Steps to reproduce:
curl -ocgroupns.chttps://gist.githubusercontent.com/avagin/f87c8a8bd2a0de9afcc74976327786bc/raw/5843701ef3679f50dd2427cf57a80871082eb28c/gistfile1.txt
gcccgroupns.c-o cgroupns
./cgroupns
./cgroupns
I've found a trivial reproducer:
mkdir /tmp/xxx
mount -t cgroup -o none,name=zdtmtst xxx /tmp/xxx
mkdir /tmp/xxx/xxx
umount /tmp/xxx
mount -t cgroup -o none,name=zdtmtst xxx /tmp/xxx
Quoted 106 lines
[root@fc24 ~]# strace -s 256 -fe clone,unshare,setns,mount ./cgroupns
mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst")= 0unshare(CLONE_NEWCGROUP)= 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fe5da0b89d0) = 529
strace: Process 529 attached
[pid 529]setns(3, CLONE_NEWCGROUP)= 0
[pid 529] +++ exited with 0 +++exited with 0 +++ renamed from SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=529, si_uid=0, si_status=0, si_utime=0, si_stime=0} --- +0
-0[root@fc24 ~]# strace -s 256 -fe clone,unshare,setns,mount ./cgroupns
mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst")= ? ERESTARTNOINTR (To be restarted)mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst")= ? ERESTARTNOINTR (To be restarted)mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst")= ? ERESTARTNOINTR (To be restarted)mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst")= ? ERESTARTNOINTR (To be restarted)mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst")= ? ERESTARTNOINTR (To be restarted)mount("none", "/tmp/cgroupns.test/zdtmtst", "cgroup", 0, "none,name=zdtmtst")= ? ERESTARTNOINTR (To be restarted)
....Thanks,
AndreiQuoted 83 lines · Li Zefan
Run this:
touch file0 for ((; ;)) { mount -t cpuset xxx file0 }And this concurrently:
touch file1 for ((; ;)) { mount -t cpuset xxx file1 }We'll trigger a warning like this:
------------[ cut here ]------------ WARNING: CPU: 1 PID: 4675 at lib/percpu-refcount.c:317 percpu_ref_kill_and_confirm+0x92/0xb0 percpu_ref_kill_and_confirm called more than once on css_release! CPU: 1 PID: 4675 Comm: mount Not tainted 4.11.0-rc5+ #5 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 Call Trace: dump_stack+0x63/0x84 __warn+0xd1/0xf0 warn_slowpath_fmt+0x5f/0x80 percpu_ref_kill_and_confirm+0x92/0xb0 cgroup_kill_sb+0x95/0xb0 deactivate_locked_super+0x43/0x70 deactivate_super+0x46/0x60 ... ---[ end trace a79f61c2a2633700 ]---Here's a race:
Thread A Thread B
cgroup1_mount()# alloc a new cgroup root cgroup_setup_root() cgroup1_mount() # no sb yet, returns NULL kernfs_pin_sb()# but succeeds in getting the refcnt, # so re-use cgroup root percpu_ref_tryget_live() # alloc sb with cgroup root cgroup_do_mount()
cgroup_kill_sb()# alloc another sb with same root cgroup_do_mount()
cgroup_kill_sb()We end up using the same cgroup root for two different superblocks, so
percpu_ref_kill()will be called twice on the same root when the two superblocks are destroyed.We should fix to make sure the superblock pinning is really successful.
Cc [email protected] # 3.16+Reported-by Dmitry Vyukov <[email protected]>Signed-off-by Zefan Li <[email protected]>--- kernel/cgroup/cgroup-v1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)kernel/cgroup/cgroup-v1.c +1
-1@@ -1146,7 +1146,7 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags,* path is super cold. Let's just sleep a bit and retry. */ pinned_sb =kernfs_pin_sb (root->kf_root,NULL ); -if (IS_ERR (pinned_sb) || +if (IS_ERR_OR_NULL (pinned_sb) || !percpu_ref_tryget_live (&root->cgrp.self.refcnt)) {mutex_unlock (&cgroup_mutex);if (!IS_ERR_OR_NULL (pinned_sb))
Tejun Heo
maintainerQuoted 9 lines · Andrei Vagin
Hello,
One of our CRIU tests hangs with this patch.
Steps to reproduce:
curl -ocgroupns.chttps://gist.githubusercontent.com/avagin/f87c8a8bd2a0de9afcc74976327786bc/raw/5843701ef3679f50dd2427cf57a80871082eb28c/gistfile1.txt
gcccgroupns.c-o cgroupns
./cgroupns
./cgroupns
Reverted the patch for now. Let's try again later.
Thanks.
Signature · 1 line
tejun
Quoted 11 lines · Andrei Vagin
Quoted 9 lines · Andrei Vagin
Hello,
One of our CRIU tests hangs with this patch.
Steps to reproduce:
curl -ocgroupns.chttps://gist.githubusercontent.com/avagin/f87c8a8bd2a0de9afcc74976327786bc/raw/5843701ef3679f50dd2427cf57a80871082eb28c/gistfile1.txt
gcccgroupns.c-o cgroupns
./cgroupns
./cgroupns
Quoted 7 lines
I've found a trivial reproducer:
mkdir/tmp/xxx
mount -t cgroup -o none,name=zdtmtst xxx/tmp/xxx
mkdir/tmp/xxx/xxx
umount/tmp/xxx
mount -t cgroup -o none,name=zdtmtst xxx/tmp/xxx
Now I remember why it didn't check NULL pointer... Could you try the following fix? It also reverts my previous patch. I would appreciate if you run the full test suit, to make sure it won't break anything.
PS: Tejun, I found recently I can no longer receive your emails. Don't know why...
=======
[PATCH] cgruop: avoid attaching a cgroup root to two different superblocks, take 2
Commit bfb0b80db5f9 is broken. Now we try to fix the race by delaying the initialization of cgroup root refcnt until a superblock has been allocated.
--- kernel/cgroup/cgroup-internal.h | 2 +- kernel/cgroup/cgroup-v1.c | 18 ++++++++++++++++-- kernel/cgroup/cgroup.c | 8 ++++---- 3 files changed, 21 insertions(+), 7 deletions(-)
kernel/cgroup/cgroup-internal.h +1 -1
@@ -163,7 +163,7 @@ int cgroup_path_ns_locked(struct cgroup *cgrp, char *buf, size_t buflen,void cgroup_free_root (struct cgroup_root *root);void init_cgroup_root (struct cgroup_root *root,struct cgroup_sb_opts *opts); -int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask); +int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask,int ref_flags);int rebind_subsystems (struct cgroup_root *dst_root,u16 ss_mask); struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags, struct cgroup_root *root, unsigned long magic,
kernel/cgroup/cgroup-v1.c +16 -2
@@ -1072,6 +1072,7 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags,struct cgroup_subsys *ss;struct dentry *dentry;int i, ret; +bool new_root = false;cgroup_lock_and_drain_offline (&cgrp_dfl_root.cgrp);
@@ -1146,7 +1147,7 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags,* path is super cold. Let's just sleep a bit and retry. */ pinned_sb =kernfs_pin_sb (root->kf_root,NULL ); -if (IS_ERR_OR_NULL (pinned_sb) || +if (IS_ERR (pinned_sb) || !percpu_ref_tryget_live (&root->cgrp.self.refcnt)) {mutex_unlock (&cgroup_mutex);if (!IS_ERR_OR_NULL (pinned_sb))
@@ -1181,10 +1182,11 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags, ret = -ENOMEM ; goto out_unlock; } + new_root = true;init_cgroup_root (root, &opts); - ret =cgroup_setup_root (root, opts.subsys_mask); + ret =cgroup_setup_root (root, opts.subsys_mask,PERCPU_REF_INIT_DEAD );if (ret)cgroup_free_root (root);
@@ -1201,6 +1203,18 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags, CGROUP_SUPER_MAGIC, ns);/* +* There's a race window after we release cgroup_mutex and before +* allocating a superblock. Make sure a concurrent process won't +* be able to re-use the root during this window by delaying the +* initialization of root refcnt. +*/ +if (new_root) { +mutex_lock (&cgroup_mutex); +percpu_ref_reinit (&root->cgrp.self.refcnt); +mutex_unlock (&cgroup_mutex); + } + +/* * If @pinned_sb, we're reusing an existing root and holding an * extra ref on its sb. Mount is complete. Put the extra ref. */
kernel/cgroup/cgroup.c +4 -4
@@ -1640,7 +1640,7 @@ void init_cgroup_root(struct cgroup_root *root, struct cgroup_sb_opts *opts)set_bit (CGRP_CPUSET_CLONE_CHILDREN , &root->cgrp.flags); } -int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask) +int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask,int ref_flags) {LIST_HEAD (tmp_links);struct cgroup *root_cgrp = &root->cgrp;
@@ -1656,8 +1656,8 @@ int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask) root_cgrp->id = ret; root_cgrp->ancestor_ids[0 ] = ret; - ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release,0 , -GFP_KERNEL ); + ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release, + ref_flags,GFP_KERNEL );if (ret) goto out;
@@ -4512,7 +4512,7 @@ int __init cgroup_init(void)hash_add (css_set_table, &init_css_set.hlist,css_set_hash (init_css_set.subsys)); -BUG_ON (cgroup_setup_root (&cgrp_dfl_root,0 )); +BUG_ON (cgroup_setup_root (&cgrp_dfl_root,0 ,0 ));mutex_unlock (&cgroup_mutex);
Signature · 1 line
1.8.3.1
Andrei Vagin
Tested-byQuoted 20 lines · Zefan Li
Quoted 11 lines · Andrei Vagin
Quoted 9 lines · Andrei Vagin
Hello,
One of our CRIU tests hangs with this patch.
Steps to reproduce:
curl -ocgroupns.chttps://gist.githubusercontent.com/avagin/f87c8a8bd2a0de9afcc74976327786bc/raw/5843701ef3679f50dd2427cf57a80871082eb28c/gistfile1.txt
gcccgroupns.c-o cgroupns
./cgroupns
./cgroupnsQuoted 7 lines
I've found a trivial reproducer:
mkdir/tmp/xxx
mount -t cgroup -o none,name=zdtmtst xxx/tmp/xxx
mkdir/tmp/xxx/xxx
umount/tmp/xxx
mount -t cgroup -o none,name=zdtmtst xxx/tmp/xxx
Quoted 3 lines
Now I remember why it didn't check NULL pointer... Could you try the following fix? It also reverts my previous patch. I would appreciate if you run the full test suit, to make sure it won't break anything.
It works for me. Thanks.
Quoted 123 lines
PS: Tejun, I found recently I can no longer receive your emails. Don't know why...
=======
[PATCH] cgruop: avoid attaching a cgroup root to two different superblocks, take 2
Commit
bfb0b80db5f9is broken. Now we try to fix the race by delaying the initialization of cgroup root refcnt until a superblock has been allocated.Cc [email protected] # 3.16+Reported-by Dmitry Vyukov <[email protected]>Reported-by Andrei Vagin <[email protected]>Signed-off-by Zefan Li <[email protected]>--- kernel/cgroup/cgroup-internal.h | 2 +- kernel/cgroup/cgroup-v1.c | 18 ++++++++++++++++-- kernel/cgroup/cgroup.c | 8 ++++---- 3 files changed, 21 insertions(+), 7 deletions(-)kernel/cgroup/cgroup-internal.h +1
-1@@ -163,7 +163,7 @@ int cgroup_path_ns_locked(struct cgroup *cgrp, char *buf, size_t buflen,void cgroup_free_root (struct cgroup_root *root);void init_cgroup_root (struct cgroup_root *root,struct cgroup_sb_opts *opts); -int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask); +int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask,int ref_flags);int rebind_subsystems (struct cgroup_root *dst_root,u16 ss_mask); struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags, struct cgroup_root *root, unsigned long magic,kernel/cgroup/cgroup-v1.c +16
-2@@ -1072,6 +1072,7 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags,struct cgroup_subsys *ss;struct dentry *dentry;int i, ret; +bool new_root = false;cgroup_lock_and_drain_offline (&cgrp_dfl_root.cgrp);@@ -1146,7 +1147,7 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags,* path is super cold. Let's just sleep a bit and retry. */ pinned_sb =kernfs_pin_sb (root->kf_root,NULL ); -if (IS_ERR_OR_NULL (pinned_sb) || +if (IS_ERR (pinned_sb) || !percpu_ref_tryget_live (&root->cgrp.self.refcnt)) {mutex_unlock (&cgroup_mutex);if (!IS_ERR_OR_NULL (pinned_sb))@@ -1181,10 +1182,11 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags, ret = -ENOMEM ; goto out_unlock; } + new_root = true;init_cgroup_root (root, &opts); - ret =cgroup_setup_root (root, opts.subsys_mask); + ret =cgroup_setup_root (root, opts.subsys_mask,PERCPU_REF_INIT_DEAD );if (ret)cgroup_free_root (root);@@ -1201,6 +1203,18 @@ struct dentry *cgroup1_mount(struct file_system_type *fs_type, int flags, CGROUP_SUPER_MAGIC, ns);/* +* There's a race window after we release cgroup_mutex and before +* allocating a superblock. Make sure a concurrent process won't +* be able to re-use the root during this window by delaying the +* initialization of root refcnt. +*/ +if (new_root) { +mutex_lock (&cgroup_mutex); +percpu_ref_reinit (&root->cgrp.self.refcnt); +mutex_unlock (&cgroup_mutex); + } + +/* * If @pinned_sb, we're reusing an existing root and holding an * extra ref on its sb. Mount is complete. Put the extra ref. */ kernel/cgroup/cgroup.c +4
-4@@ -1640,7 +1640,7 @@ void init_cgroup_root(struct cgroup_root *root, struct cgroup_sb_opts *opts)set_bit (CGRP_CPUSET_CLONE_CHILDREN , &root->cgrp.flags); } -int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask) +int cgroup_setup_root (struct cgroup_root *root,u16 ss_mask,int ref_flags) {LIST_HEAD (tmp_links);struct cgroup *root_cgrp = &root->cgrp;@@ -1656,8 +1656,8 @@ int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask) root_cgrp->id = ret; root_cgrp->ancestor_ids[0 ] = ret; - ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release,0 , -GFP_KERNEL ); + ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release, + ref_flags,GFP_KERNEL );if (ret) goto out;@@ -4512,7 +4512,7 @@ int __init cgroup_init(void)hash_add (css_set_table, &init_css_set.hlist,css_set_hash (init_css_set.subsys)); -BUG_ON (cgroup_setup_root (&cgrp_dfl_root,0 )); +BUG_ON (cgroup_setup_root (&cgrp_dfl_root,0 ,0 ));mutex_unlock (&cgroup_mutex);Signature · 1 line
1.8.3.1
Tejun Heo
maintainerHello, Li.
Quoted 3 lines · Zefan Li
Now I remember why it didn't check NULL pointer... Could you try the following fix? It also reverts my previous patch. I would appreciate if you run the full test suit, to make sure it won't break anything.
Can you please refresh the patch on top of cgroup/for-next which already has the original patch reverted? Let's apply this one for for-4.12 w/o -stable. The bug isn't too likely to trigger in the wild and the fix is kinda subtle. If necessary, we can last ask Greg to pick it up once we know that the patch is safe.
Quoted 1 line
PS: Tejun, I found recently I can no longer receive your emails. Don't know why...
Hah, no idea. I didn't change anything on my side - all emails are sent through gmail.com.
Thanks.
Signature · 1 line
tejun