Skip to content

Commit

Permalink
Revert "memory hotplug: Correct page reservation checking"
Browse files Browse the repository at this point in the history
This reverts commit 54f23eb.

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

Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Greg Kroah-Hartman committed Oct 18, 2011
1 parent 5fa2242 commit de0ed36
Showing 1 changed file with 23 additions and 37 deletions.
60 changes: 23 additions & 37 deletions drivers/base/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand All @@ -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)
Expand Down

0 comments on commit de0ed36

Please sign in to comment.