Revert "memory hotplug: Correct page reservation checking"
Greg Kroah-Hartman [Tue, 18 Oct 2011 21:00:57 +0000 (14:00 -0700)]
This reverts commit 54f23eb7ba7619de85d8edca6e5336bc33072dbd.

Turns out this patch is wrong, another correct one will follow it.

Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

drivers/base/memory.c

index ca8bfe5..2a0b5f1 100644 (file)
@@ -227,42 +227,41 @@ int memory_isolate_notify(unsigned long val, void *v)
  * MEMORY_HOTPLUG depends on SPARSEMEM in mm/Kconfig, so it is
  * OK to have direct references to sparsemem variables in here.
  */
-static int check_page_reservations(unsigned long phys_index)
-{
-       int i;
-       struct page *page;
-
-       page = pfn_to_page(phys_index << PFN_SECTION_SHIFT);
-
-       for (i = 0; i < PAGES_PER_SECTION; i++) {
-               if (PageReserved(page + i))
-                       continue;
-
-               printk(KERN_WARNING "section number %ld page number %d "
-                       "not reserved, was it already online?\n", phys_index, i);
-                       return -EBUSY;
-       }
-
-       return 0;
-}
-
 static int
 memory_block_action(unsigned long phys_index, unsigned long action)
 {
+       int i;
        unsigned long start_pfn, start_paddr;
        unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;
-       struct page *page;
+       struct page *first_page;
        int ret;
 
-       page = pfn_to_page(phys_index << PFN_SECTION_SHIFT);
+       first_page = pfn_to_page(phys_index << PFN_SECTION_SHIFT);
+
+       /*
+        * The probe routines leave the pages reserved, just
+        * as the bootmem code does.  Make sure they're still
+        * that way.
+        */
+       if (action == MEM_ONLINE) {
+               for (i = 0; i < nr_pages; i++) {
+                       if (PageReserved(first_page+i))
+                               continue;
+
+                       printk(KERN_WARNING "section number %ld page number %d "
+                               "not reserved, was it already online?\n",
+                               phys_index, i);
+                       return -EBUSY;
+               }
+       }
 
        switch (action) {
                case MEM_ONLINE:
-                       start_pfn = page_to_pfn(page);
+                       start_pfn = page_to_pfn(first_page);
                        ret = online_pages(start_pfn, nr_pages);
                        break;
                case MEM_OFFLINE:
-                       start_paddr = page_to_pfn(page) << PAGE_SHIFT;
+                       start_paddr = page_to_pfn(first_page) << PAGE_SHIFT;
                        ret = remove_memory(start_paddr,
                                            nr_pages << PAGE_SHIFT);
                        break;
@@ -278,7 +277,7 @@ memory_block_action(unsigned long phys_index, unsigned long action)
 static int memory_block_change_state(struct memory_block *mem,
                unsigned long to_state, unsigned long from_state_req)
 {
-       int i, ret = 0;
+       int ret = 0;
 
        mutex_lock(&mem->state_mutex);
 
@@ -290,19 +289,6 @@ static int memory_block_change_state(struct memory_block *mem,
        if (to_state == MEM_OFFLINE)
                mem->state = MEM_GOING_OFFLINE;
 
-       if (to_state == MEM_ONLINE) {
-               /*
-                * The probe routines leave the pages reserved, just
-                * as the bootmem code does.  Make sure they're still
-                * that way.
-                */
-               for (i = 0; i < sections_per_block; i++) {
-                       ret = check_page_reservations(mem->start_section_nr + i);
-                       if (ret)
-                               return ret;
-               }
-       }
-
        ret = memory_block_action(mem->start_section_nr, to_state);
 
        if (ret)