A cut out from memcg: performance improvement patch set.
Tested-on: x86-64 fake NUMA/linux-2.6.26-rc2 + (2 easy paches I sent)
older versions are tested on ia64/NUMA, too.
I have a plan to post a patch for removing reference count from page_cgroup.
Before that, this clean up/ logic change is necessary.
And I think this is better logic than currently used one.
removing-refcnt patch itself will be posted against -mm to do long and wide
test. If this one should be against -mm, too, I'll repost.
This patch changes page migration under memory controller to use
a different algorithm. (thanks to Christoph for new idea.)
- page_cgroup is migrated from an old page to a new page.
- a new page is accoutned , no reuse of page_cgroup.
- We can avoid compliated lock depndencies and races in migration.
- new param to mem_cgroup_charge_common().
- mem_cgroup_getref() is added for handling ref_cnt ping-pong.
This version simplifies complicated lock dependency in page migraiton
under memory resource controller.
new refcnt sequence is following.
a mapped page:
prepage_migration() ..... +1 to NEW page
try_to_unmap() ..... all refs to OLD page is gone.
move_pages() ..... +1 to NEW page if page cache.
remap... ..... all refs from *map* is added to NEW one.
end_migration() ..... -1 to New page.
page's mapcount + (page_is_cache) refs are added to NEW one.
- add BUG_ON() to check return value from prepare_migration().
Signed-off-by: KAMEZAWA Hiroyuki <firstname.lastname@example.org>
include/linux/memcontrol.h | 11 ++-
mm/memcontrol.c | 128 ++++++++++++++++++++++-----------------------
mm/migrate.c | 20 ++++---
3 files changed, 84 insertions(+), 75 deletions(-)