Index: linux-2.6.10-rc2-mm4-page-migration-only/include/linux/swap.h =================================================================== --- linux-2.6.10-rc2-mm4-page-migration-only.orig/include/linux/swap.h 2005-01-04 07:55:22.000000000 -0800 +++ linux-2.6.10-rc2-mm4-page-migration-only/include/linux/swap.h 2005-01-04 08:13:16.000000000 -0800 @@ -258,7 +258,7 @@ static inline int remove_exclusive_swap_ { return __remove_exclusive_swap_page(p, 0); } -extern int migration_remove_entry(swp_entry_t); +extern void migration_remove_entry(swp_entry_t); struct backing_dev_info; extern struct swap_list_t swap_list; Index: linux-2.6.10-rc2-mm4-page-migration-only/mm/mmigrate.c =================================================================== --- linux-2.6.10-rc2-mm4-page-migration-only.orig/mm/mmigrate.c 2005-01-04 07:55:22.000000000 -0800 +++ linux-2.6.10-rc2-mm4-page-migration-only/mm/mmigrate.c 2005-01-04 08:11:51.000000000 -0800 @@ -79,7 +79,6 @@ struct page *lookup_migration_cache(int void migration_duplicate(swp_entry_t entry) { - int offset; struct counter *cnt; read_lock_irq(&migration_space.tree_lock); @@ -96,32 +95,11 @@ void remove_from_migration_cache(struct idr_remove(&migration_idr, id); radix_tree_delete(&migration_space.page_tree, id); ClearPageSwapCache(page); - page->private = NULL; + page->private = 0; write_unlock_irq(&migration_space.tree_lock); } -// FIXME: if the page is locked will it be correctly removed from migr cache? -// check races - -int migration_remove_entry(swp_entry_t entry) -{ - struct page *page; - - page = find_get_page(&migration_space, entry.val); - - if (!page) - BUG(); - - lock_page(page); - - migration_remove_reference(page, 1); - - unlock_page(page); - - page_cache_release(page); -} - -int migration_remove_reference(struct page *page, int dec) +void migration_remove_reference(struct page *page, int dec) { struct counter *c; swp_entry_t entry; @@ -145,6 +123,28 @@ int migration_remove_reference(struct pa } } + +// FIXME: if the page is locked will it be correctly removed from migr cache? +// check races + +void migration_remove_entry(swp_entry_t entry) +{ + struct page *page; + + page = find_get_page(&migration_space, entry.val); + + if (!page) + BUG(); + + lock_page(page); + + migration_remove_reference(page, 1); + + unlock_page(page); + + page_cache_release(page); +} + int detach_from_migration_cache(struct page *page) { lock_page(page); @@ -486,9 +486,6 @@ generic_migrate_page(struct page *page, /* Wait for all operations against the page to finish. */ ret = migrate_fn(page, newpage, &vlist); switch (ret) { - default: - /* The page is busy. Try it later. */ - goto out_busy; case -ENOENT: /* The file the page belongs to has been truncated. */ page_cache_get(page); @@ -496,7 +493,10 @@ generic_migrate_page(struct page *page, newpage->mapping = NULL; /* fall thru */ case 0: - /* fall thru */ + break; + default: + /* The page is busy. Try it later. */ + goto out_busy; } arch_migrate_page(page, newpage);