Loading drivers/base/memory.c +23 −37 Original line number Diff line number Diff line Loading @@ -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) static int memory_block_action(unsigned long phys_index, unsigned long action) { int i; struct page *page; unsigned long start_pfn, start_paddr; unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; 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); for (i = 0; i < PAGES_PER_SECTION; i++) { if (PageReserved(page + i)) /* * 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); "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) { unsigned long start_pfn, start_paddr; unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; struct page *page; int ret; page = pfn_to_page(phys_index << PFN_SECTION_SHIFT); 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; Loading @@ -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); Loading @@ -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) Loading Loading
drivers/base/memory.c +23 −37 Original line number Diff line number Diff line Loading @@ -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) static int memory_block_action(unsigned long phys_index, unsigned long action) { int i; struct page *page; unsigned long start_pfn, start_paddr; unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; 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); for (i = 0; i < PAGES_PER_SECTION; i++) { if (PageReserved(page + i)) /* * 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); "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) { unsigned long start_pfn, start_paddr; unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; struct page *page; int ret; page = pfn_to_page(phys_index << PFN_SECTION_SHIFT); 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; Loading @@ -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); Loading @@ -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) Loading