diff -urbBd linux-2.4.21/include/linux/swap.h linux-2.4.21-1/include/linux/swap.h --- linux-2.4.21/include/linux/swap.h Fri Jun 13 07:51:39 2003 +++ linux-2.4.21-1/include/linux/swap.h Fri Jun 13 10:40:24 2003 @@ -82,6 +82,7 @@ /* Swap 50% full? Release swapcache more aggressively.. */ #define vm_swap_full() (nr_swap_pages*2 < total_swap_pages) +#define swap_avail() (nr_swap_pages > 0) extern unsigned int nr_free_pages(void); extern unsigned int nr_free_buffer_pages(void); diff -urbBd linux-2.4.21/mm/vmscan.c linux-2.4.21-1/mm/vmscan.c --- linux-2.4.21/mm/vmscan.c Thu Nov 28 15:53:15 2002 +++ linux-2.4.21-1/mm/vmscan.c Fri Jun 13 11:26:26 2003 @@ -474,6 +474,18 @@ spin_unlock(&pagecache_lock); UnlockPage(page); page_mapped: + /* if we don't have swap, it doesn't + do much good to swap things out. */ + if (!page->mapping && !swap_avail()) { + /* Let's make the page active since we + cannot swap it out. It gets it off + the inactive list. */ + spin_unlock(&pagemap_lru_lock); + activate_page(page); + ClearPageReferenced(page); + spin_lock(&pagemap_lru_lock); + continue; + } if (--max_mapped >= 0) continue;