patch-2.4.20 linux-2.4.20/mm/vmscan.c
Next file: linux-2.4.20/net/8021q/vlan.c
Previous file: linux-2.4.20/mm/vmalloc.c
Back to the patch index
Back to the overall index
- Lines: 84
- Date:
Thu Nov 28 15:53:15 2002
- Orig file:
linux-2.4.19/mm/vmscan.c
- Orig date:
Fri Aug 2 17:39:46 2002
diff -urN linux-2.4.19/mm/vmscan.c linux-2.4.20/mm/vmscan.c
@@ -1,6 +1,9 @@
/*
* linux/mm/vmscan.c
*
+ * The pageout daemon, decides which pages to evict (swap out) and
+ * does the actual work of freeing them.
+ *
* Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
*
* Swap reorganised 29.12.95, Stephen Tweedie.
@@ -581,7 +584,7 @@
return nr_pages;
}
-int try_to_free_pages(zone_t *classzone, unsigned int gfp_mask, unsigned int order)
+int try_to_free_pages_zone(zone_t *classzone, unsigned int gfp_mask)
{
int priority = DEF_PRIORITY;
int nr_pages = SWAP_CLUSTER_MAX;
@@ -601,6 +604,25 @@
return 0;
}
+int try_to_free_pages(unsigned int gfp_mask)
+{
+ pg_data_t *pgdat;
+ zonelist_t *zonelist;
+ unsigned long pf_free_pages;
+ int error = 0;
+
+ pf_free_pages = current->flags & PF_FREE_PAGES;
+ current->flags &= ~PF_FREE_PAGES;
+
+ for_each_pgdat(pgdat) {
+ zonelist = pgdat->node_zonelists + (gfp_mask & GFP_ZONEMASK);
+ error |= try_to_free_pages_zone(zonelist->zones[0], gfp_mask);
+ }
+
+ current->flags |= pf_free_pages;
+ return error;
+}
+
DECLARE_WAIT_QUEUE_HEAD(kswapd_wait);
static int check_classzone_need_balance(zone_t * classzone)
@@ -627,7 +649,7 @@
schedule();
if (!zone->need_balance)
continue;
- if (!try_to_free_pages(zone, GFP_KSWAPD, 0)) {
+ if (!try_to_free_pages_zone(zone, GFP_KSWAPD)) {
zone->need_balance = 0;
__set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ);
@@ -649,10 +671,9 @@
do {
need_more_balance = 0;
- pgdat = pgdat_list;
- do
+
+ for_each_pgdat(pgdat)
need_more_balance |= kswapd_balance_pgdat(pgdat);
- while ((pgdat = pgdat->node_next));
} while (need_more_balance);
}
@@ -675,12 +696,10 @@
{
pg_data_t * pgdat;
- pgdat = pgdat_list;
- do {
- if (kswapd_can_sleep_pgdat(pgdat))
- continue;
- return 0;
- } while ((pgdat = pgdat->node_next));
+ for_each_pgdat(pgdat) {
+ if (!kswapd_can_sleep_pgdat(pgdat))
+ return 0;
+ }
return 1;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)