summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-08-08 18:54:49 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-08-08 18:54:49 +0000
commit5514f4babeeb3af00ee0c325e3cda7a562cc3d65 (patch)
treeedd733879cab73e41324a99ca5da7bc154c4196d /mm
parent6a9366db547e958e8c9bf8e1c13bcea6cb2bf393 (diff)
Merge with Linux 2.4.0-test6-pre4.
Diffstat (limited to 'mm')
-rw-r--r--mm/highmem.c4
-rw-r--r--mm/page_alloc.c13
-rw-r--r--mm/vmscan.c17
3 files changed, 26 insertions, 8 deletions
diff --git a/mm/highmem.c b/mm/highmem.c
index 834968569..e11b5d0b1 100644
--- a/mm/highmem.c
+++ b/mm/highmem.c
@@ -118,6 +118,8 @@ static void flush_all_zero_pkmaps(void)
{
int i;
+ flush_cache_all();
+
for (i = 0; i < LAST_PKMAP; i++) {
struct page *page;
pte_t pte;
@@ -181,7 +183,7 @@ start:
}
}
vaddr = PKMAP_ADDR(last_pkmap_nr);
- pkmap_page_table[last_pkmap_nr] = mk_pte(page, kmap_prot);
+ set_pte(pkmap_page_table + last_pkmap_nr, mk_pte(page, kmap_prot));
pkmap_count[last_pkmap_nr] = 1;
page->virtual = vaddr;
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 1e19a9109..941cb5909 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -29,7 +29,7 @@ int nr_lru_pages;
pg_data_t *pgdat_list;
static char *zone_names[MAX_NR_ZONES] = { "DMA", "Normal", "HighMem" };
-static int zone_balance_ratio[MAX_NR_ZONES] = { 128, 128, 128, };
+static int zone_balance_ratio[MAX_NR_ZONES] = { 32, 128, 128, };
static int zone_balance_min[MAX_NR_ZONES] = { 10 , 10, 10, };
static int zone_balance_max[MAX_NR_ZONES] = { 255 , 255, 255, };
@@ -430,7 +430,16 @@ void show_free_areas_core(int nid)
zone_t *zone = NODE_DATA(nid)->node_zones + type;
unsigned long nr, total, flags;
- printk(" %s: ", zone->name);
+ printk(" %c%d%d %s: ",
+ (zone->free_pages > zone->pages_low
+ ? (zone->free_pages > zone->pages_high
+ ? ' '
+ : 'H')
+ : (zone->free_pages > zone->pages_min
+ ? 'M'
+ : 'L')),
+ zone->zone_wake_kswapd, zone->low_on_memory,
+ zone->name);
total = 0;
if (zone->size) {
diff --git a/mm/vmscan.c b/mm/vmscan.c
index cbdd0cb7f..4dda15dd1 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -444,20 +444,24 @@ static inline int memory_pressure(void)
*/
static inline int keep_kswapd_awake(void)
{
+ int all_recent = 1;
pg_data_t *pgdat = pgdat_list;
do {
int i;
for(i = 0; i < MAX_NR_ZONES; i++) {
zone_t *zone = pgdat->node_zones+ i;
- if (zone->size &&
- !zone->zone_wake_kswapd)
- return 0;
+ if (zone->size) {
+ if (zone->free_pages < zone->pages_min)
+ return 1;
+ if (!zone->zone_wake_kswapd)
+ all_recent = 0;
+ }
}
pgdat = pgdat->node_next;
} while (pgdat);
- return 1;
+ return all_recent;
}
/*
@@ -470,6 +474,9 @@ static inline int keep_kswapd_awake(void)
*
* Don't try _too_ hard, though. We don't want to have bad
* latency.
+ *
+ * Note: only called by kswapd and try_to_free_pages
+ * both can WAIT at top level.
*/
#define FREE_COUNT 8
#define SWAP_COUNT 16
@@ -548,7 +555,7 @@ static int do_try_to_free_pages(unsigned int gfp_mask)
}
/* Return 1 if any page is freed, or
* there are no more memory pressure */
- return (count < FREE_COUNT || !memory_pressure());
+ return (count < FREE_COUNT || !keep_kswapd_awake());
done:
return 1;