[PATCH] mm: migration page refcounting fix
Migration code currently does not take a reference to target page properly, so between unlocking the pte and trying to take a new reference to the page with isolate_lru_page, anything could happen to it. Fix this by holding the pte lock until we get a chance to elevate the refcount. Other small cleanups while we're here. Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
e236a166b2
commit
053837fce7
@@ -39,24 +39,3 @@ del_page_from_lru(struct zone *zone, struct page *page)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Isolate one page from the LRU lists.
|
||||
*
|
||||
* - zone->lru_lock must be held
|
||||
*/
|
||||
static inline int __isolate_lru_page(struct page *page)
|
||||
{
|
||||
if (unlikely(!TestClearPageLRU(page)))
|
||||
return 0;
|
||||
|
||||
if (get_page_testone(page)) {
|
||||
/*
|
||||
* It is being freed elsewhere
|
||||
*/
|
||||
__put_page(page);
|
||||
SetPageLRU(page);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@@ -167,6 +167,7 @@ extern void FASTCALL(lru_cache_add_active(struct page *));
|
||||
extern void FASTCALL(activate_page(struct page *));
|
||||
extern void FASTCALL(mark_page_accessed(struct page *));
|
||||
extern void lru_add_drain(void);
|
||||
extern int lru_add_drain_all(void);
|
||||
extern int rotate_reclaimable_page(struct page *page);
|
||||
extern void swap_setup(void);
|
||||
|
||||
|
Reference in New Issue
Block a user