mm: correctly update zone->managed_pages
[linux-2.6-block.git] / mm / memory_hotplug.c
index e3097f299f678f9c743a9defa2dc54ec6b9601b2..5e34922124a36af7d53e35d8b8b5e26b89710dda 100644 (file)
@@ -101,12 +101,9 @@ void get_page_bootmem(unsigned long info,  struct page *page,
        atomic_inc(&page->_count);
 }
 
-/* reference to __meminit __free_pages_bootmem is valid
- * so use __ref to tell modpost not to generate a warning */
-void __ref put_page_bootmem(struct page *page)
+void put_page_bootmem(struct page *page)
 {
        unsigned long type;
-       static DEFINE_MUTEX(ppb_lock);
 
        type = (unsigned long) page->lru.next;
        BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE ||
@@ -116,17 +113,8 @@ void __ref put_page_bootmem(struct page *page)
                ClearPagePrivate(page);
                set_page_private(page, 0);
                INIT_LIST_HEAD(&page->lru);
-
-               /*
-                * Please refer to comment for __free_pages_bootmem()
-                * for why we serialize here.
-                */
-               mutex_lock(&ppb_lock);
-               __free_pages_bootmem(page, 0);
-               mutex_unlock(&ppb_lock);
-               totalram_pages++;
+               free_reserved_page(page);
        }
-
 }
 
 #ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
@@ -309,7 +297,7 @@ static int __meminit move_pfn_range_left(struct zone *z1, struct zone *z2,
        /* can't move pfns which are higher than @z2 */
        if (end_pfn > zone_end_pfn(z2))
                goto out_fail;
-       /* the move out part mast at the left most of @z2 */
+       /* the move out part must be at the left most of @z2 */
        if (start_pfn > z2->zone_start_pfn)
                goto out_fail;
        /* must included/overlap */
@@ -784,20 +772,13 @@ EXPORT_SYMBOL_GPL(__online_page_set_limits);
 
 void __online_page_increment_counters(struct page *page)
 {
-       totalram_pages++;
-
-#ifdef CONFIG_HIGHMEM
-       if (PageHighMem(page))
-               totalhigh_pages++;
-#endif
+       adjust_managed_page_count(page, 1);
 }
 EXPORT_SYMBOL_GPL(__online_page_increment_counters);
 
 void __online_page_free(struct page *page)
 {
-       ClearPageReserved(page);
-       init_page_count(page);
-       __free_page(page);
+       __free_reserved_page(page);
 }
 EXPORT_SYMBOL_GPL(__online_page_free);
 
@@ -995,7 +976,6 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ
                return ret;
        }
 
-       zone->managed_pages += onlined_pages;
        zone->present_pages += onlined_pages;
 
        pgdat_resize_lock(zone->zone_pgdat, &flags);
@@ -1584,15 +1564,13 @@ repeat:
        /* reset pagetype flags and makes migrate type to be MOVABLE */
        undo_isolate_page_range(start_pfn, end_pfn, MIGRATE_MOVABLE);
        /* removal success */
-       zone->managed_pages -= offlined_pages;
+       adjust_managed_page_count(pfn_to_page(start_pfn), -offlined_pages);
        zone->present_pages -= offlined_pages;
 
        pgdat_resize_lock(zone->zone_pgdat, &flags);
        zone->zone_pgdat->node_present_pages -= offlined_pages;
        pgdat_resize_unlock(zone->zone_pgdat, &flags);
 
-       totalram_pages -= offlined_pages;
-
        init_per_zone_wmark_min();
 
        if (!populated_zone(zone)) {