Index: linux-2.6.20/mm/migrate.c =================================================================== --- linux-2.6.20.orig/mm/migrate.c 2007-02-14 16:54:39.000000000 -0800 +++ linux-2.6.20/mm/migrate.c 2007-02-14 16:54:45.000000000 -0800 @@ -64,7 +64,7 @@ get_page(page); ClearPageMlocked(page); list_add_tail(&page->lru, pagelist); - __dec_zone_page_state(zone, NR_MLOCK); + __dec_zone_state(zone, NR_MLOCK); } spin_unlock_irq(&zone->lru_lock); } Index: linux-2.6.20/mm/swap.c =================================================================== --- linux-2.6.20.orig/mm/swap.c 2007-02-14 16:58:29.000000000 -0800 +++ linux-2.6.20/mm/swap.c 2007-02-14 17:04:32.000000000 -0800 @@ -408,8 +408,8 @@ VM_BUG_ON(PageLRU(page)); SetPageLRU(page); VM_BUG_ON(PageActive(page)); - VM_BUG_ON(PageMlocked(page)); SetPageActive(page); + VM_BUG_ON(PageMlocked(page)); add_page_to_active_list(zone, page); } if (zone) @@ -434,13 +434,13 @@ spin_lock_irq(&zone->lru_lock); } if (!PageMlocked(page)) + /* Another process already moved page to LRU */ continue; BUG_ON(PageLRU(page)); - ClearPageMlocked(page); - smp_wmb(); - __dec_zone_state(zone, NR_MLOCK); SetPageLRU(page); + ClearPageMlocked(page); SetPageActive(page); + __dec_zone_state(zone, NR_MLOCK); add_page_to_active_list(zone, page); } if (zone)