summaryrefslogtreecommitdiffstats
path: root/mm/vmscan.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-03-02 02:36:47 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-03-02 02:36:47 +0000
commit8624512aa908741ba2795200133eae0d7f4557ea (patch)
treed5d3036fccf2604f4c98dedc11e8adb929d6b52e /mm/vmscan.c
parent7b8f5d6f1d45d9f9de1d26e7d3c32aa5af11b488 (diff)
Merge with 2.3.48.
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r--mm/vmscan.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 02cf78030..fa687b7e0 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -8,6 +8,7 @@
* Removed kswapd_ctl limits, and swap out as many pages as needed
* to bring the system back to freepages.high: 2.4.97, Rik van Riel.
* Version: $Id: vmscan.c,v 1.5 1998/02/23 22:14:28 sct Exp $
+ * Zone aware kswapd started 02/00, Kanoj Sarcar (kanoj@sgi.com).
*/
#include <linux/slab.h>
@@ -468,7 +469,10 @@ DECLARE_WAIT_QUEUE_HEAD(kswapd_wait);
*/
int kswapd(void *unused)
{
+ int i;
struct task_struct *tsk = current;
+ pg_data_t *pgdat;
+ zone_t *zone;
tsk->session = 1;
tsk->pgrp = 1;
@@ -496,12 +500,17 @@ int kswapd(void *unused)
* up on a more timely basis.
*/
do {
- /* kswapd is critical to provide GFP_ATOMIC
- allocations (not GFP_HIGHMEM ones). */
- if (nr_free_pages() - nr_free_highpages() >= freepages.high)
- break;
- if (!do_try_to_free_pages(GFP_KSWAPD, 0))
- break;
+ pgdat = pgdat_list;
+ while (pgdat) {
+ for (i = 0; i < MAX_NR_ZONES; i++) {
+ zone = pgdat->node_zones + i;
+ if ((!zone->size) ||
+ (!zone->zone_wake_kswapd))
+ continue;
+ do_try_to_free_pages(GFP_KSWAPD, zone);
+ }
+ pgdat = pgdat->node_next;
+ }
run_task_queue(&tq_disk);
} while (!tsk->need_resched);
tsk->state = TASK_INTERRUPTIBLE;