mm: fix anonymous dirtying
[safe/jmp/linux-2.6] / mm / memory_hotplug.c
index c083cf5..efe3e0e 100644 (file)
@@ -339,8 +339,11 @@ EXPORT_SYMBOL_GPL(__remove_pages);
 
 void online_page(struct page *page)
 {
+       unsigned long pfn = page_to_pfn(page);
+
        totalram_pages++;
-       num_physpages++;
+       if (pfn >= num_physpages)
+               num_physpages = pfn + 1;
 
 #ifdef CONFIG_HIGHMEM
        if (PageHighMem(page))
@@ -422,7 +425,9 @@ int online_pages(unsigned long pfn, unsigned long nr_pages)
        zone->present_pages += onlined_pages;
        zone->zone_pgdat->node_present_pages += onlined_pages;
 
-       setup_per_zone_pages_min();
+       zone_pcp_update(zone);
+       setup_per_zone_wmarks();
+       calculate_zone_inactive_ratio(zone);
        if (onlined_pages) {
                kswapd_run(zone_to_nid(zone));
                node_set_state(zone_to_nid(zone), N_HIGH_MEMORY);
@@ -830,7 +835,9 @@ repeat:
        zone->present_pages -= offlined_pages;
        zone->zone_pgdat->node_present_pages -= offlined_pages;
        totalram_pages -= offlined_pages;
-       num_physpages -= offlined_pages;
+
+       setup_per_zone_wmarks();
+       calculate_zone_inactive_ratio(zone);
 
        vm_total_pages = nr_free_pagecache_pages();
        writeback_set_ratelimit();