diff -urNp vm-7/fs/buffer.c vm-8/fs/buffer.c --- vm-7/fs/buffer.c Wed May 29 20:33:55 2002 +++ vm-8/fs/buffer.c Wed May 29 20:34:17 2002 @@ -735,14 +735,10 @@ void __invalidate_buffers(kdev_t dev, in static void free_more_memory(void) { - zone_t * zone = contig_page_data.node_zonelists[GFP_NOFS & GFP_ZONEMASK].zones[0]; - - balance_dirty(); wakeup_bdflush(); - try_to_free_pages(zone, GFP_NOFS, 0); - run_task_queue(&tq_disk); + try_to_free_pages_nozone(GFP_NOIO); __set_current_state(TASK_RUNNING); - sys_sched_yield(); + yield(); } void init_buffer(struct buffer_head *bh, bh_end_io_t *handler, void *private) diff -urNp vm-7/include/linux/swap.h vm-8/include/linux/swap.h --- vm-7/include/linux/swap.h Wed May 29 20:33:55 2002 +++ vm-8/include/linux/swap.h Wed May 29 20:34:04 2002 @@ -116,6 +116,7 @@ extern void swap_setup(void); extern wait_queue_head_t kswapd_wait; extern int FASTCALL(try_to_free_pages(zone_t *, unsigned int, unsigned int)); extern int vm_vfs_scan_ratio, vm_cache_scan_ratio, vm_lru_balance_ratio, vm_passes, vm_gfp_debug, vm_mapped_ratio; +extern int FASTCALL(try_to_free_pages_nozone(unsigned int)); /* linux/mm/page_io.c */ extern void rw_swap_page(int, struct page *); diff -urNp vm-7/mm/page_alloc.c vm-8/mm/page_alloc.c --- vm-7/mm/page_alloc.c Wed May 29 20:33:56 2002 +++ vm-8/mm/page_alloc.c Wed May 29 20:34:04 2002 @@ -539,6 +539,30 @@ unsigned int nr_free_highpages (void) } #endif +int try_to_free_pages_nozone(unsigned int gfp_mask) +{ + pg_data_t *pgdat = pgdat_list; + zonelist_t *zonelist; + zone_t **zonep; + int ret = 0; + unsigned long pf_free_pages; + + pf_free_pages = current->flags & PF_FREE_PAGES; + current->flags &= ~PF_FREE_PAGES; + + do { + zonelist = pgdat->node_zonelists + (gfp_mask & GFP_ZONEMASK); + zonep = zonelist->zones; + + ret |= try_to_free_pages(*zonep, gfp_mask, 0); + + pgdat = pgdat->node_next; + } while (pgdat); + + current->flags |= pf_free_pages; + return ret; +} + #define K(x) ((x) << (PAGE_SHIFT-10)) /*