Index: current/mm/memory.c =================================================================== --- current.orig/mm/memory.c 2007-02-03 13:21:20.000000000 -0800 +++ current/mm/memory.c 2007-02-03 13:26:18.000000000 -0800 @@ -682,16 +682,10 @@ static unsigned long zap_pte_range(struc file_rss--; } page_remove_rmap(page, vma); - if (vma->vm_flags & VM_LOCKED && PageMlocked(page)) { - struct zone *zone = page_zone(page); - - spin_lock_irq(&zone->lru_lock); - if (PageMlocked(page)) { - ClearPageMlocked(page); - lru_cache_add_active(page); - __dec_zone_state(zone, NR_MLOCK); - } - spin_unlock_irq(&zone->lru_lock); + if (vma->vm_flags & VM_LOCKED && + TestClearPageMlocked(page)) { + __dec_zone_page_state(page, NR_MLOCK); + lru_cache_add_active(page); } tlb_remove_page(tlb, page); continue; Index: current/mm/vmscan.c =================================================================== --- current.orig/mm/vmscan.c 2007-02-03 13:20:22.000000000 -0800 +++ current/mm/vmscan.c 2007-02-03 13:21:15.000000000 -0800 @@ -596,10 +596,9 @@ free_it: continue; mlocked: - ClearPageActive(page); - SetPageMlocked(page); unlock_page(page); - __inc_zone_page_state(page, NR_MLOCK); + if (!TestSetPageMlocked(page)) + __inc_zone_page_state(page, NR_MLOCK); continue; activate_locked: Index: current/include/linux/page-flags.h =================================================================== --- current.orig/include/linux/page-flags.h 2007-02-03 13:23:35.000000000 -0800 +++ current/include/linux/page-flags.h 2007-02-03 13:24:08.000000000 -0800 @@ -239,6 +239,10 @@ static inline void SetPageUptodate(struc #define PageMlocked(page) test_bit(PG_mlocked, &(page)->flags) #define SetPageMlocked(page) set_bit(PG_mlocked, &(page)->flags) #define ClearPageMlocked(page) clear_bit(PG_mlocked, &(page)->flags) +#define TestSetPageMlocked(page) \ + test_and_set_bit(PG_mlocked, &(page)->flags) +#define TestClearPageMlocked(page) \ + test_and_clear_bit(PG_mlocked, &(page)->flags) struct page; /* forward declaration */