--- 2.2.14-kswapd/mm/vmscan.c.~1~ Wed Jan 5 14:16:56 2000 +++ 2.2.14-kswapd/mm/vmscan.c Fri Jan 21 03:25:59 2000 @@ -437,7 +437,7 @@ printk ("Starting kswapd v%.*s\n", i, s); } -static struct wait_queue * kswapd_wait = NULL; +struct wait_queue * kswapd_wait; /* * The background pageout daemon, started as a kernel thread @@ -485,7 +485,7 @@ * the processes needing more memory will wake us * up on a more timely basis. */ - interruptible_sleep_on_timeout(&kswapd_wait, HZ); + interruptible_sleep_on(&kswapd_wait); while (nr_free_pages < freepages.high) { if (do_try_to_free_pages(GFP_KSWAPD)) @@ -519,7 +519,6 @@ { int retval = 1; - wake_up_interruptible(&kswapd_wait); if (gfp_mask & __GFP_WAIT) retval = do_try_to_free_pages(gfp_mask); return retval; --- 2.2.14-kswapd/mm/page_alloc.c.~1~ Wed Jan 5 14:16:56 2000 +++ 2.2.14-kswapd/mm/page_alloc.c Fri Jan 21 13:50:58 2000 @@ -211,14 +211,21 @@ */ if (!(current->flags & PF_MEMALLOC)) { int freed; + extern struct wait_queue * kswapd_wait; - if (nr_free_pages > freepages.min) { - if (!low_on_memory) - goto ok_to_allocate; - if (nr_free_pages >= freepages.high) { + if (nr_free_pages >= freepages.high) + { + /* share RO cachelines in fast path */ + if (low_on_memory) low_on_memory = 0; + goto ok_to_allocate; + } + else + { + if (nr_free_pages < freepages.low) + wake_up_interruptible(&kswapd_wait); + if (nr_free_pages > freepages.min && !low_on_memory) goto ok_to_allocate; - } } low_on_memory = 1;