Index: linux-2.6/arch/i386/mm/init.c =================================================================== --- linux-2.6.orig/arch/i386/mm/init.c +++ linux-2.6/arch/i386/mm/init.c @@ -273,7 +273,7 @@ void __init one_highpage_init(struct pag __free_page(page); totalhigh_pages++; } else - SetPageReserved(page); + SetPageUnusable(page); } #ifdef CONFIG_NUMA @@ -573,7 +573,7 @@ void __init mem_init(void) /* * Only count reserved RAM pages */ - if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp))) + if (!PageUnusable(pfn_to_page(tmp)) && PageReserved(pfn_to_page(tmp))) reservedpages++; set_highmem_pages_init(bad_ppro); Index: linux-2.6/include/linux/page-flags.h =================================================================== --- linux-2.6.orig/include/linux/page-flags.h +++ linux-2.6/include/linux/page-flags.h @@ -306,6 +306,9 @@ extern void __mod_page_state(unsigned lo #define SetPageUncached(page) set_bit(PG_uncached, &(page)->flags) #define ClearPageUncached(page) clear_bit(PG_uncached, &(page)->flags) +#define PageUnusable(page) ((page)->flags == 0xffffffff) +#define SetPageUnusable(page) ((page)->flags = 0xffffffff) + struct page; /* forward declaration */ int test_clear_page_dirty(struct page *page); Index: linux-2.6/kernel/power/swsusp.c =================================================================== --- linux-2.6.orig/kernel/power/swsusp.c +++ linux-2.6/kernel/power/swsusp.c @@ -433,16 +433,8 @@ static int save_highmem_zone(struct zone if (!pfn_valid(pfn)) continue; page = pfn_to_page(pfn); - /* - * This condition results from rvmalloc() sans vmalloc_32() - * and architectural memory reservations. This should be - * corrected eventually when the cases giving rise to this - * are better understood. - */ - if (PageReserved(page)) { - printk("highmem reserved page?!\n"); + if (PageUnusable(page)) continue; - } BUG_ON(PageNosave(page)); if (PageNosaveFree(page)) continue; @@ -528,6 +520,8 @@ static int saveable(struct zone * zone, return 0; page = pfn_to_page(pfn); + if (PageUnusable(page)) + return 0; if (PageNosave(page)) return 0; if (pfn_is_nosave(pfn)) { Index: linux-2.6/mm/page_alloc.c =================================================================== --- linux-2.6.orig/mm/page_alloc.c +++ linux-2.6/mm/page_alloc.c @@ -576,22 +576,29 @@ void mark_free_pages(struct zone *zone) unsigned long zone_pfn, flags; int order; struct list_head *curr; + struct page *page; if (!zone->spanned_pages) return; spin_lock_irqsave(&zone->lock, flags); - for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) - ClearPageNosaveFree(pfn_to_page(zone_pfn + zone->zone_start_pfn)); + for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { + page = pfn_to_page(zone_pfn + zone->zone_start_pfn); + if (PageUnusable(page)) + continue; + ClearPageNosaveFree(page); + } for (order = MAX_ORDER - 1; order >= 0; --order) list_for_each(curr, &zone->free_area[order].free_list) { - unsigned long start_pfn, i; + unsigned long i; - start_pfn = page_to_pfn(list_entry(curr, struct page, lru)); - - for (i=0; i < (1<lock, flags); }