From mboxrd@z Thu Jan 1 00:00:00 1970 From: Balbir Singh Subject: Re: [PATCH][for -mm] Fix and Enhancements for memory cgroup [1/6] fix refcnt race in charge/uncharge Date: Tue, 09 Oct 2007 16:08:11 +0530 Message-ID: <470B5A13.9020601@linux.vnet.ibm.com> References: <20071009184620.8b14cbc6.kamezawa.hiroyu@jp.fujitsu.com> <20071009184925.ad8248d4.kamezawa.hiroyu@jp.fujitsu.com> Reply-To: balbir-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20071009184925.ad8248d4.kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org> 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: KAMEZAWA Hiroyuki Cc: "containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org" , "linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org" , Andrew Morton List-Id: containers.vger.kernel.org KAMEZAWA Hiroyuki wrote: > The logic of uncharging is > - decrement refcnt -> lock page cgroup -> remove page cgroup. > But the logic of charging is > - lock page cgroup -> increment refcnt -> return. > > Then, one charge will be added to a page_cgroup under being removed. > This makes no big trouble (like panic) but one charge is lost. > > This patch add a test at charging to verify page_cgroup's refcnt is > greater than 0. If not, unlock and retry. > > Signed-off-by: KAMEZAWA Hiroyuki > > > mm/memcontrol.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > Index: linux-2.6.23-rc8-mm2/mm/memcontrol.c > =================================================================== > --- linux-2.6.23-rc8-mm2.orig/mm/memcontrol.c > +++ linux-2.6.23-rc8-mm2/mm/memcontrol.c > @@ -271,14 +271,19 @@ int mem_cgroup_charge(struct page *page, > * to see if the cgroup page already has a page_cgroup associated > * with it > */ > +retry: > lock_page_cgroup(page); > pc = page_get_page_cgroup(page); > /* > * The page_cgroup exists and the page has already been accounted > */ > if (pc) { > - atomic_inc(&pc->ref_cnt); > - goto done; > + if (unlikely(!atomic_inc_not_zero(&pc->ref_cnt))) { > + /* this page is under being uncharge ? */ > + unlock_page_cgroup(page); > + goto retry; > + } else > + goto done; > } > > unlock_page_cgroup(page); > > Looks good to me Acked-by: Balbir Singh -- Warm Regards, Balbir Singh Linux Technology Center IBM, ISTL