mm: strictly require elevated page refcount in isolate_lru_page()
authorKonstantin Khlebnikov <khlebnikov@openvz.org>
Wed, 25 May 2011 00:12:21 +0000 (17:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 25 May 2011 15:39:23 +0000 (08:39 -0700)
commit0c917313a8d84fcc0c376db3f7edb7c06f06f920
treede95ed4a300d1034b1abae2eb8c7e509c9dfb341
parentbd486285f24ac2fd1ff64688fb0729712c5712c4
mm: strictly require elevated page refcount in isolate_lru_page()

isolate_lru_page() must be called only with stable reference to the page,
this is what is written in the comment above it, this is reasonable.

current isolate_lru_page() users and its page extra reference sources:

 mm/huge_memory.c:
  __collapse_huge_page_isolate() - reference from pte

 mm/memcontrol.c:
  mem_cgroup_move_parent() - get_page_unless_zero()
  mem_cgroup_move_charge_pte_range() - reference from pte

 mm/memory-failure.c:
  soft_offline_page() - fixed, reference from get_any_page()
  delete_from_lru_cache() - reference from caller or get_page_unless_zero()
[ seems like there bug, because __memory_failure() can call
  page_action() for hpages tail, but it is ok for
  isolate_lru_page(), tail getted and not in lru]

 mm/memory_hotplug.c:
  do_migrate_range() - fixed, get_page_unless_zero()

 mm/mempolicy.c:
  migrate_page_add() - reference from pte

 mm/migrate.c:
  do_move_page_to_node_array() - reference from follow_page()

 mlock.c: - various external references

 mm/vmscan.c:
  putback_lru_page() - reference from isolate_lru_page()

It seems that all isolate_lru_page() users are ready now for this
restriction.  So, let's replace redundant get_page_unless_zero() with
get_page() and add page initial reference count check with VM_BUG_ON()

Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
Cc: Rik van Riel <riel@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/vmscan.c