From mboxrd@z Thu Jan 1 00:00:00 1970 From: Li Zefan Subject: Re: [PATCH v5 3/3] cgroups: make procs file writable Date: Thu, 30 Dec 2010 12:38:30 +0800 Message-ID: <4D1C0CC6.4090107@cn.fujitsu.com> References: <20101224114500.GA18036@ghc17.ghc.andrew.cmu.edu> <20101224035331.b907b410.akpm@linux-foundation.org> <20101224120853.GA18518@ghc17.ghc.andrew.cmu.edu> <20101224212452.GA27275@ghc17.ghc.andrew.cmu.edu> <20101224230901.GA30136@ghc17.ghc.andrew.cmu.edu> <20101227001233.GA10951@ghc17.ghc.andrew.cmu.edu> <20101227103701.GC20986@ghc17.ghc.andrew.cmu.edu> <4D1A913C.5080702@cn.fujitsu.com> <4D1C0464.5090801@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: containers-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: containers-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: David Rientjes Cc: Ben Blum , containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, Oleg Nesterov , Miao Xie , Andrew Morton , Paul Menage , ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org List-Id: containers.vger.kernel.org David Rientjes wrote: > On Thu, 30 Dec 2010, Li Zefan wrote: > >> That's what we did for cpu masks :). See commit >> 2341d1b6598c7146d64a5050b53a72a5a819617f. >> >> I made a patchset to remove on stack cpu masks. >> >> What I meant is we don't have to allocate nodemasks in cpuset_sprintf_memlist(). >> This is sufficient: >> >> diff --git a/kernel/cpuset.c b/kernel/cpuset.c >> index 4349935..a159612 100644 >> --- a/kernel/cpuset.c >> +++ b/kernel/cpuset.c >> @@ -1620,20 +1620,12 @@ static int cpuset_sprintf_cpulist(char *page, struct cpu >> >> static int cpuset_sprintf_memlist(char *page, struct cpuset *cs) >> { >> - NODEMASK_ALLOC(nodemask_t, mask, GFP_KERNEL); >> int retval; >> >> - if (mask == NULL) >> - return -ENOMEM; >> - >> mutex_lock(&callback_mutex); >> - *mask = cs->mems_allowed; >> + retval = nodelist_scnprintf(page, PAGE_SIZE, cs->mems_allowed); >> mutex_unlock(&callback_mutex); >> >> - retval = nodelist_scnprintf(page, PAGE_SIZE, *mask); >> - >> - NODEMASK_FREE(mask); >> - >> return retval; >> } >> > > This needs to be done with cgroup_lock() instead of callback_mutex since > the post_clone() callback will store to cs->mems_allowed on > cgroup_clone(). > Then cpuset_post_clone() breaks the lock rule: * A task must hold both mutexes to modify cpusets... ... * If a task is only holding callback_mutex, then it has read-only * access to cpusets. But that's Ok, because cgroup_clone() is called during the creation of the new cgroup, so no one can access the cpuset at that time.