Files
kernel-tenderloin-3.0/include/linux
KAMEZAWA Hiroyuki ea1c627781 memcg: add mem_cgroup_replace_page_cache() to fix LRU issue
commit ab936cbcd02072a34b60d268f94440fd5cf1970b upstream.

Commit ef6a3c6311 ("mm: add replace_page_cache_page() function") added a
function replace_page_cache_page().  This function replaces a page in the
radix-tree with a new page.  WHen doing this, memory cgroup needs to fix
up the accounting information.  memcg need to check PCG_USED bit etc.

In some(many?) cases, 'newpage' is on LRU before calling
replace_page_cache().  So, memcg's LRU accounting information should be
fixed, too.

This patch adds mem_cgroup_replace_page_cache() and removes the old hooks.
 In that function, old pages will be unaccounted without touching
res_counter and new page will be accounted to the memcg (of old page).
WHen overwriting pc->mem_cgroup of newpage, take zone->lru_lock and avoid
races with LRU handling.

Background:
  replace_page_cache_page() is called by FUSE code in its splice() handling.
  Here, 'newpage' is replacing oldpage but this newpage is not a newly allocated
  page and may be on LRU. LRU mis-accounting will be critical for memory cgroup
  because rmdir() checks the whole LRU is empty and there is no account leak.
  If a page is on the other LRU than it should be, rmdir() will fail.

This bug was added in March 2011, but no bug report yet.  I guess there
are not many people who use memcg and FUSE at the same time with upstream
kernels.

The result of this bug is that admin cannot destroy a memcg because of
account leak.  So, no panic, no deadlock.  And, even if an active cgroup
exist, umount can succseed.  So no problem at shutdown.

Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Michal Hocko <mhocko@suse.cz>
Cc: Miklos Szeredi <mszeredi@suse.cz>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2012-01-25 17:24:43 -08:00
..
2011-05-04 14:08:36 -07:00
2011-06-01 11:36:49 +01:00
2012-01-12 11:35:33 -08:00
2011-05-28 17:41:46 +02:00
2011-05-26 17:12:34 -07:00
2011-05-26 17:12:34 -07:00
2011-05-19 15:59:38 -07:00
2011-06-27 16:06:19 -07:00
2011-05-23 10:47:06 -05:00
2011-05-29 13:03:09 +01:00
2011-05-24 10:21:29 +02:00
2011-05-24 10:21:29 +02:00
2011-06-09 15:05:48 -07:00
2011-06-27 16:06:19 -07:00
2011-05-26 12:03:50 -07:00
2011-05-25 20:43:32 +02:00
2011-05-08 16:41:45 -07:00
2011-05-26 17:12:37 -07:00
2011-05-22 08:47:53 -04:00
2011-05-19 20:50:53 -04:00
2011-05-24 14:33:35 +02:00
2011-11-11 09:36:29 -08:00
2011-11-11 09:36:48 -08:00
2011-05-19 16:55:27 +09:30
2011-05-20 11:46:11 -07:00
2011-05-26 17:12:34 -07:00
2012-01-25 17:24:38 -08:00
2011-05-26 17:12:37 -07:00
2011-05-24 12:10:51 +02:00
2011-05-13 16:31:00 -07:00
2011-05-05 23:16:59 -07:00
2011-05-25 08:39:19 -07:00
2011-10-03 11:40:08 -07:00
2011-10-16 14:14:51 -07:00
2011-12-09 08:52:39 -08:00
2011-05-05 11:10:14 -07:00
2011-06-27 18:00:12 -07:00
2011-06-15 20:03:59 -07:00
2011-10-03 11:39:49 -07:00
2011-11-11 09:35:12 -08:00
2011-06-07 09:05:42 -07:00
2012-01-12 11:35:25 -08:00
2011-05-30 11:14:16 +09:30