Index: linux-2.6.20/include/linux/page-flags.h =================================================================== --- linux-2.6.20.orig/include/linux/page-flags.h 2007-02-14 13:04:14.000000000 -0800 +++ linux-2.6.20/include/linux/page-flags.h 2007-02-14 13:04:37.000000000 -0800 @@ -91,7 +91,7 @@ #define PG_nosave_free 18 /* Used for system suspend/resume */ #define PG_buddy 19 /* Page is free, on buddy lists */ -#define PG_mlocked 21 /* Page is mlocked */ +#define PG_mlocked 20 /* Page is mlocked */ #if (BITS_PER_LONG > 32) /* Index: linux-2.6.20/mm/memory.c =================================================================== --- linux-2.6.20.orig/mm/memory.c 2007-02-14 13:01:25.000000000 -0800 +++ linux-2.6.20/mm/memory.c 2007-02-14 13:03:39.000000000 -0800 @@ -936,8 +936,11 @@ if (spin_trylock_irqsave(&zone->lru_lock, flags)) { if (PageLRU(page) && !PageMlocked(page)) { ClearPageLRU(page); + if (PageActive(page)) + del_page_from_active_list(zone, page); + else + del_page_from_inactive_list(zone, page); ClearPageActive(page); - list_del(&page->lru); SetPageMlocked(page); __inc_zone_page_state(page, NR_MLOCK); } Index: linux-2.6.20/mm/migrate.c =================================================================== --- linux-2.6.20.orig/mm/migrate.c 2007-02-14 13:03:41.000000000 -0800 +++ linux-2.6.20/mm/migrate.c 2007-02-14 13:04:08.000000000 -0800 @@ -60,6 +60,7 @@ list_add_tail(&page->lru, pagelist); } else if (PageMlocked(page)) { + ret = 0; get_page(page); ClearPageMlocked(page); list_add_tail(&page->lru, pagelist);