|
@@ -229,10 +229,11 @@ int memory_isolate_notify(unsigned long val, void *v)
|
|
|
* OK to have direct references to sparsemem variables in here.
|
|
|
*/
|
|
|
static int
|
|
|
-memory_section_action(unsigned long phys_index, unsigned long action)
|
|
|
+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 *first_page;
|
|
|
int ret;
|
|
|
|
|
@@ -244,7 +245,7 @@ memory_section_action(unsigned long phys_index, unsigned long action)
|
|
|
* that way.
|
|
|
*/
|
|
|
if (action == MEM_ONLINE) {
|
|
|
- for (i = 0; i < PAGES_PER_SECTION; i++) {
|
|
|
+ for (i = 0; i < nr_pages; i++) {
|
|
|
if (PageReserved(first_page+i))
|
|
|
continue;
|
|
|
|
|
@@ -258,12 +259,12 @@ memory_section_action(unsigned long phys_index, unsigned long action)
|
|
|
switch (action) {
|
|
|
case MEM_ONLINE:
|
|
|
start_pfn = page_to_pfn(first_page);
|
|
|
- ret = online_pages(start_pfn, PAGES_PER_SECTION);
|
|
|
+ ret = online_pages(start_pfn, nr_pages);
|
|
|
break;
|
|
|
case MEM_OFFLINE:
|
|
|
start_paddr = page_to_pfn(first_page) << PAGE_SHIFT;
|
|
|
ret = remove_memory(start_paddr,
|
|
|
- PAGES_PER_SECTION << PAGE_SHIFT);
|
|
|
+ nr_pages << PAGE_SHIFT);
|
|
|
break;
|
|
|
default:
|
|
|
WARN(1, KERN_WARNING "%s(%ld, %ld) unknown action: "
|
|
@@ -289,20 +290,11 @@ static int memory_block_change_state(struct memory_block *mem,
|
|
|
if (to_state == MEM_OFFLINE)
|
|
|
mem->state = MEM_GOING_OFFLINE;
|
|
|
|
|
|
- for (i = 0; i < sections_per_block; i++) {
|
|
|
- ret = memory_section_action(mem->start_section_nr + i,
|
|
|
- to_state);
|
|
|
- if (ret)
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (ret) {
|
|
|
- for (i = 0; i < sections_per_block; i++)
|
|
|
- memory_section_action(mem->start_section_nr + i,
|
|
|
- from_state_req);
|
|
|
+ ret = memory_block_action(mem->start_section_nr, to_state);
|
|
|
|
|
|
+ if (ret)
|
|
|
mem->state = from_state_req;
|
|
|
- } else
|
|
|
+ else
|
|
|
mem->state = to_state;
|
|
|
|
|
|
out:
|