All of lore.kernel.org
 help / color / mirror / Atom feed
* [BUGFIX][PATCH] memcg: fix race in file_mapped accouting flag management
@ 2010-09-13  7:08 ` KAMEZAWA Hiroyuki
  0 siblings, 0 replies; 22+ messages in thread
From: KAMEZAWA Hiroyuki @ 2010-09-13  7:08 UTC (permalink / raw)
  To: linux-mm; +Cc: balbir, nishimura, gthelen, linux-kernel, akpm, stable


I think this small race is not very critical but it's bug.
We have this race since 2.6.34. 
=
From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>

Now. memory cgroup accounts file-mapped by counter and flag.
counter is working in the same way with zone_stat but FileMapped flag only
exists in memcg (for helping move_account).

This flag can be updated wrongly in a case. Assume CPU0 and CPU1
and a thread mapping a page on CPU0, another thread unmapping it on CPU1.

    CPU0                   		CPU1
				rmv rmap (mapcount 1->0)
   add rmap (mapcount 0->1)
   lock_page_cgroup()
   memcg counter+1		(some delay)
   set MAPPED FLAG.
   unlock_page_cgroup()
				lock_page_cgroup()
				memcg counter-1
				clear MAPPED flag

In above sequence, counter is properly updated but FLAG is not.
This means that representing a state by a flag which is maintained by
counter needs some specail care.

To handle this, at claering a flag, this patch check mapcount directly and
clear the flag only when mapcount == 0. (if mapcount >0, someone will make
it to zero later and flag will be cleared.)

Reverse case, dec-after-inc cannot be a problem because page_table_lock()
works well for it. (IOW, to make above sequence, 2 processes should touch
the same page at once with map/unmap.)

Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
---
 mm/memcontrol.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Index: lockless-update/mm/memcontrol.c
===================================================================
--- lockless-update.orig/mm/memcontrol.c
+++ lockless-update/mm/memcontrol.c
@@ -1485,7 +1485,8 @@ void mem_cgroup_update_file_mapped(struc
 		SetPageCgroupFileMapped(pc);
 	} else {
 		__this_cpu_dec(mem->stat->count[MEM_CGROUP_STAT_FILE_MAPPED]);
-		ClearPageCgroupFileMapped(pc);
+		if (page_mapped(page)) /* for race between dec->inc counter */
+			ClearPageCgroupFileMapped(pc);
 	}
 
 done:


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

end of thread, other threads:[~2010-09-14  5:00 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-13  7:08 [BUGFIX][PATCH] memcg: fix race in file_mapped accouting flag management KAMEZAWA Hiroyuki
2010-09-13  7:08 ` KAMEZAWA Hiroyuki
2010-09-13  7:13 ` [PATCH] " KAMEZAWA Hiroyuki
2010-09-13  7:13   ` KAMEZAWA Hiroyuki
2010-09-13  8:01   ` [PATCH] memcg: avoid lock in updating file_mapped (Was " KAMEZAWA Hiroyuki
2010-09-13  8:01     ` KAMEZAWA Hiroyuki
2010-09-13 17:26     ` Balbir Singh
2010-09-13 17:26       ` Balbir Singh
2010-09-14  4:55       ` KAMEZAWA Hiroyuki
2010-09-14  4:55         ` KAMEZAWA Hiroyuki
2010-09-13  8:47 ` [BUGFIX][PATCH] memcg: " Balbir Singh
2010-09-13  8:47   ` Balbir Singh
2010-09-13 15:28   ` Hiroyuki Kamezawa
2010-09-13 15:28     ` Hiroyuki Kamezawa
2010-09-13 17:17     ` Balbir Singh
2010-09-13 17:17       ` Balbir Singh
2010-09-13 21:08 ` Andrew Morton
2010-09-13 21:08   ` Andrew Morton
2010-09-14  4:35   ` KAMEZAWA Hiroyuki
2010-09-14  4:35     ` KAMEZAWA Hiroyuki
2010-09-14  4:38   ` KAMEZAWA Hiroyuki
2010-09-14  4:38     ` KAMEZAWA Hiroyuki

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.