diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-08-08 18:54:49 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-08-08 18:54:49 +0000 |
commit | 5514f4babeeb3af00ee0c325e3cda7a562cc3d65 (patch) | |
tree | edd733879cab73e41324a99ca5da7bc154c4196d /mm | |
parent | 6a9366db547e958e8c9bf8e1c13bcea6cb2bf393 (diff) |
Merge with Linux 2.4.0-test6-pre4.
Diffstat (limited to 'mm')
-rw-r--r-- | mm/highmem.c | 4 | ||||
-rw-r--r-- | mm/page_alloc.c | 13 | ||||
-rw-r--r-- | mm/vmscan.c | 17 |
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; |