--- vmscan.c.riel Sat Jun 3 19:09:16 2000 +++ vmscan.c Sat Jun 3 22:30:22 2000 @@ -551,24 +551,39 @@ for (;;) { pg_data_t *pgdat; int something_to_do = 0; + int more_to_do = 0; pgdat = pgdat_list; do { int i; + for(i = 0; i < MAX_NR_ZONES; i++) { zone_t *zone = pgdat->node_zones+ i; - if (tsk->need_resched) - schedule(); if (!zone->size || !zone->zone_wake_kswapd) continue; + something_to_do = 1; if (zone->free_pages < zone->pages_low) - something_to_do = 1; - do_try_to_free_pages(GFP_KSWAPD); + more_to_do = 1; } pgdat = pgdat->node_next; + } while (pgdat); - if (!something_to_do) { + /* Need to free pages? + * Will actually run fewer times than previous version! + * (It did run once per zone with waken kswapd) + */ + if (something_to_do) { + do_try_to_free_pages(GFP_KSWAPD); + } + + /* In a hurry? */ + if (more_to_do) { + if (tsk->need_resched) { + schedule(); + } + } + else { tsk->state = TASK_INTERRUPTIBLE; interruptible_sleep_on(&kswapd_wait); }