Index: linux-2.6/include/linux/mmzone.h =================================================================== --- linux-2.6.orig/include/linux/mmzone.h 2007-07-31 12:25:18.000000000 -0700 +++ linux-2.6/include/linux/mmzone.h 2007-07-31 12:25:41.000000000 -0700 @@ -234,6 +234,7 @@ struct zone { unsigned long nr_scan_inactive; unsigned long pages_scanned; /* since last reclaim */ int all_unreclaimable; /* All pages pinned */ + int unmapped_unreclaimable; /* Unmapped pages are unreclaimable */ /* A count of how many reclaimers are scanning this zone */ atomic_t reclaim_in_progress; Index: linux-2.6/mm/vmscan.c =================================================================== --- linux-2.6.orig/mm/vmscan.c 2007-07-31 12:21:23.000000000 -0700 +++ linux-2.6/mm/vmscan.c 2007-07-31 12:29:27.000000000 -0700 @@ -1759,7 +1759,10 @@ static int __zone_reclaim(struct zone *z note_zone_scanning_priority(zone, priority); nr_reclaimed += shrink_zone(priority, zone, &sc); priority--; - } while (priority >= 0 && nr_reclaimed < nr_pages); + } while (priority >= 0 && nr_reclaimed < nr_pages && + !zone->unmapped_unreclaimable); + + zone->unmapped_reclaimable = !nr_reclaimed; } slab_reclaimable = zone_page_state(zone, NR_SLAB_RECLAIMABLE);