1 /* 2 * linux/mm/memory_hotplug.c 3 * 4 * Copyright (C) 5 */ 6 7 #include <linux/stddef.h> 8 #include <linux/mm.h> 9 #include <linux/swap.h> 10 #include <linux/interrupt.h> 11 #include <linux/pagemap.h> 12 #include <linux/bootmem.h> 13 #include <linux/compiler.h> 14 #include <linux/export.h> 15 #include <linux/pagevec.h> 16 #include <linux/writeback.h> 17 #include <linux/slab.h> 18 #include <linux/sysctl.h> 19 #include <linux/cpu.h> 20 #include <linux/memory.h> 21 #include <linux/memory_hotplug.h> 22 #include <linux/highmem.h> 23 #include <linux/vmalloc.h> 24 #include <linux/ioport.h> 25 #include <linux/delay.h> 26 #include <linux/migrate.h> 27 #include <linux/page-isolation.h> 28 #include <linux/pfn.h> 29 #include <linux/suspend.h> 30 #include <linux/mm_inline.h> 31 #include <linux/firmware-map.h> 32 33 #include <asm/tlbflush.h> 34 35 #include "internal.h" 36 37 /* 38 * online_page_callback contains pointer to current page onlining function. 39 * Initially it is generic_online_page(). If it is required it could be 40 * changed by calling set_online_page_callback() for callback registration 41 * and restore_online_page_callback() for generic callback restore. 42 */ 43 44 static void generic_online_page(struct page *page); 45 46 static online_page_callback_t online_page_callback = generic_online_page; 47 48 DEFINE_MUTEX(mem_hotplug_mutex); 49 50 void lock_memory_hotplug(void) 51 { 52 mutex_lock(&mem_hotplug_mutex); 53 54 /* for exclusive hibernation if CONFIG_HIBERNATION=y */ 55 lock_system_sleep(); 56 } 57 58 void unlock_memory_hotplug(void) 59 { 60 unlock_system_sleep(); 61 mutex_unlock(&mem_hotplug_mutex); 62 } 63 64 65 /* add this memory to iomem resource */ 66 static struct resource *register_memory_resource(u64 start, u64 size) 67 { 68 struct resource *res; 69 res = kzalloc(sizeof(struct resource), GFP_KERNEL); 70 BUG_ON(!res); 71 72 res->name = "System RAM"; 73 res->start = start; 74 res->end = start + size - 1; 75 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 76 if (request_resource(&iomem_resource, res) < 0) { 77 printk("System RAM resource %pR cannot be added\n", res); 78 kfree(res); 79 res = NULL; 80 } 81 return res; 82 } 83 84 static void release_memory_resource(struct resource *res) 85 { 86 if (!res) 87 return; 88 release_resource(res); 89 kfree(res); 90 return; 91 } 92 93 #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE 94 #ifndef CONFIG_SPARSEMEM_VMEMMAP 95 static void get_page_bootmem(unsigned long info, struct page *page, 96 unsigned long type) 97 { 98 page->lru.next = (struct list_head *) type; 99 SetPagePrivate(page); 100 set_page_private(page, info); 101 atomic_inc(&page->_count); 102 } 103 104 /* reference to __meminit __free_pages_bootmem is valid 105 * so use __ref to tell modpost not to generate a warning */ 106 void __ref put_page_bootmem(struct page *page) 107 { 108 unsigned long type; 109 static DEFINE_MUTEX(ppb_lock); 110 111 type = (unsigned long) page->lru.next; 112 BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE || 113 type > MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE); 114 115 if (atomic_dec_return(&page->_count) == 1) { 116 ClearPagePrivate(page); 117 set_page_private(page, 0); 118 INIT_LIST_HEAD(&page->lru); 119 120 /* 121 * Please refer to comment for __free_pages_bootmem() 122 * for why we serialize here. 123 */ 124 mutex_lock(&ppb_lock); 125 __free_pages_bootmem(page, 0); 126 mutex_unlock(&ppb_lock); 127 } 128 129 } 130 131 static void register_page_bootmem_info_section(unsigned long start_pfn) 132 { 133 unsigned long *usemap, mapsize, section_nr, i; 134 struct mem_section *ms; 135 struct page *page, *memmap; 136 137 section_nr = pfn_to_section_nr(start_pfn); 138 ms = __nr_to_section(section_nr); 139 140 /* Get section's memmap address */ 141 memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); 142 143 /* 144 * Get page for the memmap's phys address 145 * XXX: need more consideration for sparse_vmemmap... 146 */ 147 page = virt_to_page(memmap); 148 mapsize = sizeof(struct page) * PAGES_PER_SECTION; 149 mapsize = PAGE_ALIGN(mapsize) >> PAGE_SHIFT; 150 151 /* remember memmap's page */ 152 for (i = 0; i < mapsize; i++, page++) 153 get_page_bootmem(section_nr, page, SECTION_INFO); 154 155 usemap = __nr_to_section(section_nr)->pageblock_flags; 156 page = virt_to_page(usemap); 157 158 mapsize = PAGE_ALIGN(usemap_size()) >> PAGE_SHIFT; 159 160 for (i = 0; i < mapsize; i++, page++) 161 get_page_bootmem(section_nr, page, MIX_SECTION_INFO); 162 163 } 164 165 void register_page_bootmem_info_node(struct pglist_data *pgdat) 166 { 167 unsigned long i, pfn, end_pfn, nr_pages; 168 int node = pgdat->node_id; 169 struct page *page; 170 struct zone *zone; 171 172 nr_pages = PAGE_ALIGN(sizeof(struct pglist_data)) >> PAGE_SHIFT; 173 page = virt_to_page(pgdat); 174 175 for (i = 0; i < nr_pages; i++, page++) 176 get_page_bootmem(node, page, NODE_INFO); 177 178 zone = &pgdat->node_zones[0]; 179 for (; zone < pgdat->node_zones + MAX_NR_ZONES - 1; zone++) { 180 if (zone->wait_table) { 181 nr_pages = zone->wait_table_hash_nr_entries 182 * sizeof(wait_queue_head_t); 183 nr_pages = PAGE_ALIGN(nr_pages) >> PAGE_SHIFT; 184 page = virt_to_page(zone->wait_table); 185 186 for (i = 0; i < nr_pages; i++, page++) 187 get_page_bootmem(node, page, NODE_INFO); 188 } 189 } 190 191 pfn = pgdat->node_start_pfn; 192 end_pfn = pfn + pgdat->node_spanned_pages; 193 194 /* register_section info */ 195 for (; pfn < end_pfn; pfn += PAGES_PER_SECTION) { 196 /* 197 * Some platforms can assign the same pfn to multiple nodes - on 198 * node0 as well as nodeN. To avoid registering a pfn against 199 * multiple nodes we check that this pfn does not already 200 * reside in some other node. 201 */ 202 if (pfn_valid(pfn) && (pfn_to_nid(pfn) == node)) 203 register_page_bootmem_info_section(pfn); 204 } 205 } 206 #endif /* !CONFIG_SPARSEMEM_VMEMMAP */ 207 208 static void grow_zone_span(struct zone *zone, unsigned long start_pfn, 209 unsigned long end_pfn) 210 { 211 unsigned long old_zone_end_pfn; 212 213 zone_span_writelock(zone); 214 215 old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages; 216 if (!zone->spanned_pages || start_pfn < zone->zone_start_pfn) 217 zone->zone_start_pfn = start_pfn; 218 219 zone->spanned_pages = max(old_zone_end_pfn, end_pfn) - 220 zone->zone_start_pfn; 221 222 zone_span_writeunlock(zone); 223 } 224 225 static void resize_zone(struct zone *zone, unsigned long start_pfn, 226 unsigned long end_pfn) 227 { 228 zone_span_writelock(zone); 229 230 if (end_pfn - start_pfn) { 231 zone->zone_start_pfn = start_pfn; 232 zone->spanned_pages = end_pfn - start_pfn; 233 } else { 234 /* 235 * make it consist as free_area_init_core(), 236 * if spanned_pages = 0, then keep start_pfn = 0 237 */ 238 zone->zone_start_pfn = 0; 239 zone->spanned_pages = 0; 240 } 241 242 zone_span_writeunlock(zone); 243 } 244 245 static void fix_zone_id(struct zone *zone, unsigned long start_pfn, 246 unsigned long end_pfn) 247 { 248 enum zone_type zid = zone_idx(zone); 249 int nid = zone->zone_pgdat->node_id; 250 unsigned long pfn; 251 252 for (pfn = start_pfn; pfn < end_pfn; pfn++) 253 set_page_links(pfn_to_page(pfn), zid, nid, pfn); 254 } 255 256 static int __meminit move_pfn_range_left(struct zone *z1, struct zone *z2, 257 unsigned long start_pfn, unsigned long end_pfn) 258 { 259 int ret; 260 unsigned long flags; 261 unsigned long z1_start_pfn; 262 263 if (!z1->wait_table) { 264 ret = init_currently_empty_zone(z1, start_pfn, 265 end_pfn - start_pfn, MEMMAP_HOTPLUG); 266 if (ret) 267 return ret; 268 } 269 270 pgdat_resize_lock(z1->zone_pgdat, &flags); 271 272 /* can't move pfns which are higher than @z2 */ 273 if (end_pfn > z2->zone_start_pfn + z2->spanned_pages) 274 goto out_fail; 275 /* the move out part mast at the left most of @z2 */ 276 if (start_pfn > z2->zone_start_pfn) 277 goto out_fail; 278 /* must included/overlap */ 279 if (end_pfn <= z2->zone_start_pfn) 280 goto out_fail; 281 282 /* use start_pfn for z1's start_pfn if z1 is empty */ 283 if (z1->spanned_pages) 284 z1_start_pfn = z1->zone_start_pfn; 285 else 286 z1_start_pfn = start_pfn; 287 288 resize_zone(z1, z1_start_pfn, end_pfn); 289 resize_zone(z2, end_pfn, z2->zone_start_pfn + z2->spanned_pages); 290 291 pgdat_resize_unlock(z1->zone_pgdat, &flags); 292 293 fix_zone_id(z1, start_pfn, end_pfn); 294 295 return 0; 296 out_fail: 297 pgdat_resize_unlock(z1->zone_pgdat, &flags); 298 return -1; 299 } 300 301 static int __meminit move_pfn_range_right(struct zone *z1, struct zone *z2, 302 unsigned long start_pfn, unsigned long end_pfn) 303 { 304 int ret; 305 unsigned long flags; 306 unsigned long z2_end_pfn; 307 308 if (!z2->wait_table) { 309 ret = init_currently_empty_zone(z2, start_pfn, 310 end_pfn - start_pfn, MEMMAP_HOTPLUG); 311 if (ret) 312 return ret; 313 } 314 315 pgdat_resize_lock(z1->zone_pgdat, &flags); 316 317 /* can't move pfns which are lower than @z1 */ 318 if (z1->zone_start_pfn > start_pfn) 319 goto out_fail; 320 /* the move out part mast at the right most of @z1 */ 321 if (z1->zone_start_pfn + z1->spanned_pages > end_pfn) 322 goto out_fail; 323 /* must included/overlap */ 324 if (start_pfn >= z1->zone_start_pfn + z1->spanned_pages) 325 goto out_fail; 326 327 /* use end_pfn for z2's end_pfn if z2 is empty */ 328 if (z2->spanned_pages) 329 z2_end_pfn = z2->zone_start_pfn + z2->spanned_pages; 330 else 331 z2_end_pfn = end_pfn; 332 333 resize_zone(z1, z1->zone_start_pfn, start_pfn); 334 resize_zone(z2, start_pfn, z2_end_pfn); 335 336 pgdat_resize_unlock(z1->zone_pgdat, &flags); 337 338 fix_zone_id(z2, start_pfn, end_pfn); 339 340 return 0; 341 out_fail: 342 pgdat_resize_unlock(z1->zone_pgdat, &flags); 343 return -1; 344 } 345 346 static void grow_pgdat_span(struct pglist_data *pgdat, unsigned long start_pfn, 347 unsigned long end_pfn) 348 { 349 unsigned long old_pgdat_end_pfn = 350 pgdat->node_start_pfn + pgdat->node_spanned_pages; 351 352 if (!pgdat->node_spanned_pages || start_pfn < pgdat->node_start_pfn) 353 pgdat->node_start_pfn = start_pfn; 354 355 pgdat->node_spanned_pages = max(old_pgdat_end_pfn, end_pfn) - 356 pgdat->node_start_pfn; 357 } 358 359 static int __meminit __add_zone(struct zone *zone, unsigned long phys_start_pfn) 360 { 361 struct pglist_data *pgdat = zone->zone_pgdat; 362 int nr_pages = PAGES_PER_SECTION; 363 int nid = pgdat->node_id; 364 int zone_type; 365 unsigned long flags; 366 367 zone_type = zone - pgdat->node_zones; 368 if (!zone->wait_table) { 369 int ret; 370 371 ret = init_currently_empty_zone(zone, phys_start_pfn, 372 nr_pages, MEMMAP_HOTPLUG); 373 if (ret) 374 return ret; 375 } 376 pgdat_resize_lock(zone->zone_pgdat, &flags); 377 grow_zone_span(zone, phys_start_pfn, phys_start_pfn + nr_pages); 378 grow_pgdat_span(zone->zone_pgdat, phys_start_pfn, 379 phys_start_pfn + nr_pages); 380 pgdat_resize_unlock(zone->zone_pgdat, &flags); 381 memmap_init_zone(nr_pages, nid, zone_type, 382 phys_start_pfn, MEMMAP_HOTPLUG); 383 return 0; 384 } 385 386 static int __meminit __add_section(int nid, struct zone *zone, 387 unsigned long phys_start_pfn) 388 { 389 int nr_pages = PAGES_PER_SECTION; 390 int ret; 391 392 if (pfn_valid(phys_start_pfn)) 393 return -EEXIST; 394 395 ret = sparse_add_one_section(zone, phys_start_pfn, nr_pages); 396 397 if (ret < 0) 398 return ret; 399 400 ret = __add_zone(zone, phys_start_pfn); 401 402 if (ret < 0) 403 return ret; 404 405 return register_new_memory(nid, __pfn_to_section(phys_start_pfn)); 406 } 407 408 #ifdef CONFIG_SPARSEMEM_VMEMMAP 409 static int __remove_section(struct zone *zone, struct mem_section *ms) 410 { 411 /* 412 * XXX: Freeing memmap with vmemmap is not implement yet. 413 * This should be removed later. 414 */ 415 return -EBUSY; 416 } 417 #else 418 static int __remove_section(struct zone *zone, struct mem_section *ms) 419 { 420 unsigned long flags; 421 struct pglist_data *pgdat = zone->zone_pgdat; 422 int ret = -EINVAL; 423 424 if (!valid_section(ms)) 425 return ret; 426 427 ret = unregister_memory_section(ms); 428 if (ret) 429 return ret; 430 431 pgdat_resize_lock(pgdat, &flags); 432 sparse_remove_one_section(zone, ms); 433 pgdat_resize_unlock(pgdat, &flags); 434 return 0; 435 } 436 #endif 437 438 /* 439 * Reasonably generic function for adding memory. It is 440 * expected that archs that support memory hotplug will 441 * call this function after deciding the zone to which to 442 * add the new pages. 443 */ 444 int __ref __add_pages(int nid, struct zone *zone, unsigned long phys_start_pfn, 445 unsigned long nr_pages) 446 { 447 unsigned long i; 448 int err = 0; 449 int start_sec, end_sec; 450 /* during initialize mem_map, align hot-added range to section */ 451 start_sec = pfn_to_section_nr(phys_start_pfn); 452 end_sec = pfn_to_section_nr(phys_start_pfn + nr_pages - 1); 453 454 for (i = start_sec; i <= end_sec; i++) { 455 err = __add_section(nid, zone, i << PFN_SECTION_SHIFT); 456 457 /* 458 * EEXIST is finally dealt with by ioresource collision 459 * check. see add_memory() => register_memory_resource() 460 * Warning will be printed if there is collision. 461 */ 462 if (err && (err != -EEXIST)) 463 break; 464 err = 0; 465 } 466 467 return err; 468 } 469 EXPORT_SYMBOL_GPL(__add_pages); 470 471 /** 472 * __remove_pages() - remove sections of pages from a zone 473 * @zone: zone from which pages need to be removed 474 * @phys_start_pfn: starting pageframe (must be aligned to start of a section) 475 * @nr_pages: number of pages to remove (must be multiple of section size) 476 * 477 * Generic helper function to remove section mappings and sysfs entries 478 * for the section of the memory we are removing. Caller needs to make 479 * sure that pages are marked reserved and zones are adjust properly by 480 * calling offline_pages(). 481 */ 482 int __remove_pages(struct zone *zone, unsigned long phys_start_pfn, 483 unsigned long nr_pages) 484 { 485 unsigned long i, ret = 0; 486 int sections_to_remove; 487 488 /* 489 * We can only remove entire sections 490 */ 491 BUG_ON(phys_start_pfn & ~PAGE_SECTION_MASK); 492 BUG_ON(nr_pages % PAGES_PER_SECTION); 493 494 release_mem_region(phys_start_pfn << PAGE_SHIFT, nr_pages * PAGE_SIZE); 495 496 sections_to_remove = nr_pages / PAGES_PER_SECTION; 497 for (i = 0; i < sections_to_remove; i++) { 498 unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION; 499 ret = __remove_section(zone, __pfn_to_section(pfn)); 500 if (ret) 501 break; 502 } 503 return ret; 504 } 505 EXPORT_SYMBOL_GPL(__remove_pages); 506 507 int set_online_page_callback(online_page_callback_t callback) 508 { 509 int rc = -EINVAL; 510 511 lock_memory_hotplug(); 512 513 if (online_page_callback == generic_online_page) { 514 online_page_callback = callback; 515 rc = 0; 516 } 517 518 unlock_memory_hotplug(); 519 520 return rc; 521 } 522 EXPORT_SYMBOL_GPL(set_online_page_callback); 523 524 int restore_online_page_callback(online_page_callback_t callback) 525 { 526 int rc = -EINVAL; 527 528 lock_memory_hotplug(); 529 530 if (online_page_callback == callback) { 531 online_page_callback = generic_online_page; 532 rc = 0; 533 } 534 535 unlock_memory_hotplug(); 536 537 return rc; 538 } 539 EXPORT_SYMBOL_GPL(restore_online_page_callback); 540 541 void __online_page_set_limits(struct page *page) 542 { 543 unsigned long pfn = page_to_pfn(page); 544 545 if (pfn >= num_physpages) 546 num_physpages = pfn + 1; 547 } 548 EXPORT_SYMBOL_GPL(__online_page_set_limits); 549 550 void __online_page_increment_counters(struct page *page) 551 { 552 totalram_pages++; 553 554 #ifdef CONFIG_HIGHMEM 555 if (PageHighMem(page)) 556 totalhigh_pages++; 557 #endif 558 } 559 EXPORT_SYMBOL_GPL(__online_page_increment_counters); 560 561 void __online_page_free(struct page *page) 562 { 563 ClearPageReserved(page); 564 init_page_count(page); 565 __free_page(page); 566 } 567 EXPORT_SYMBOL_GPL(__online_page_free); 568 569 static void generic_online_page(struct page *page) 570 { 571 __online_page_set_limits(page); 572 __online_page_increment_counters(page); 573 __online_page_free(page); 574 } 575 576 static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages, 577 void *arg) 578 { 579 unsigned long i; 580 unsigned long onlined_pages = *(unsigned long *)arg; 581 struct page *page; 582 if (PageReserved(pfn_to_page(start_pfn))) 583 for (i = 0; i < nr_pages; i++) { 584 page = pfn_to_page(start_pfn + i); 585 (*online_page_callback)(page); 586 onlined_pages++; 587 } 588 *(unsigned long *)arg = onlined_pages; 589 return 0; 590 } 591 592 #ifdef CONFIG_MOVABLE_NODE 593 /* 594 * When CONFIG_MOVABLE_NODE, we permit onlining of a node which doesn't have 595 * normal memory. 596 */ 597 static bool can_online_high_movable(struct zone *zone) 598 { 599 return true; 600 } 601 #else /* CONFIG_MOVABLE_NODE */ 602 /* ensure every online node has NORMAL memory */ 603 static bool can_online_high_movable(struct zone *zone) 604 { 605 return node_state(zone_to_nid(zone), N_NORMAL_MEMORY); 606 } 607 #endif /* CONFIG_MOVABLE_NODE */ 608 609 /* check which state of node_states will be changed when online memory */ 610 static void node_states_check_changes_online(unsigned long nr_pages, 611 struct zone *zone, struct memory_notify *arg) 612 { 613 int nid = zone_to_nid(zone); 614 enum zone_type zone_last = ZONE_NORMAL; 615 616 /* 617 * If we have HIGHMEM or movable node, node_states[N_NORMAL_MEMORY] 618 * contains nodes which have zones of 0...ZONE_NORMAL, 619 * set zone_last to ZONE_NORMAL. 620 * 621 * If we don't have HIGHMEM nor movable node, 622 * node_states[N_NORMAL_MEMORY] contains nodes which have zones of 623 * 0...ZONE_MOVABLE, set zone_last to ZONE_MOVABLE. 624 */ 625 if (N_MEMORY == N_NORMAL_MEMORY) 626 zone_last = ZONE_MOVABLE; 627 628 /* 629 * if the memory to be online is in a zone of 0...zone_last, and 630 * the zones of 0...zone_last don't have memory before online, we will 631 * need to set the node to node_states[N_NORMAL_MEMORY] after 632 * the memory is online. 633 */ 634 if (zone_idx(zone) <= zone_last && !node_state(nid, N_NORMAL_MEMORY)) 635 arg->status_change_nid_normal = nid; 636 else 637 arg->status_change_nid_normal = -1; 638 639 #ifdef CONFIG_HIGHMEM 640 /* 641 * If we have movable node, node_states[N_HIGH_MEMORY] 642 * contains nodes which have zones of 0...ZONE_HIGHMEM, 643 * set zone_last to ZONE_HIGHMEM. 644 * 645 * If we don't have movable node, node_states[N_NORMAL_MEMORY] 646 * contains nodes which have zones of 0...ZONE_MOVABLE, 647 * set zone_last to ZONE_MOVABLE. 648 */ 649 zone_last = ZONE_HIGHMEM; 650 if (N_MEMORY == N_HIGH_MEMORY) 651 zone_last = ZONE_MOVABLE; 652 653 if (zone_idx(zone) <= zone_last && !node_state(nid, N_HIGH_MEMORY)) 654 arg->status_change_nid_high = nid; 655 else 656 arg->status_change_nid_high = -1; 657 #else 658 arg->status_change_nid_high = arg->status_change_nid_normal; 659 #endif 660 661 /* 662 * if the node don't have memory befor online, we will need to 663 * set the node to node_states[N_MEMORY] after the memory 664 * is online. 665 */ 666 if (!node_state(nid, N_MEMORY)) 667 arg->status_change_nid = nid; 668 else 669 arg->status_change_nid = -1; 670 } 671 672 static void node_states_set_node(int node, struct memory_notify *arg) 673 { 674 if (arg->status_change_nid_normal >= 0) 675 node_set_state(node, N_NORMAL_MEMORY); 676 677 if (arg->status_change_nid_high >= 0) 678 node_set_state(node, N_HIGH_MEMORY); 679 680 node_set_state(node, N_MEMORY); 681 } 682 683 684 int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_type) 685 { 686 unsigned long onlined_pages = 0; 687 struct zone *zone; 688 int need_zonelists_rebuild = 0; 689 int nid; 690 int ret; 691 struct memory_notify arg; 692 693 lock_memory_hotplug(); 694 /* 695 * This doesn't need a lock to do pfn_to_page(). 696 * The section can't be removed here because of the 697 * memory_block->state_mutex. 698 */ 699 zone = page_zone(pfn_to_page(pfn)); 700 701 if ((zone_idx(zone) > ZONE_NORMAL || online_type == ONLINE_MOVABLE) && 702 !can_online_high_movable(zone)) { 703 unlock_memory_hotplug(); 704 return -1; 705 } 706 707 if (online_type == ONLINE_KERNEL && zone_idx(zone) == ZONE_MOVABLE) { 708 if (move_pfn_range_left(zone - 1, zone, pfn, pfn + nr_pages)) { 709 unlock_memory_hotplug(); 710 return -1; 711 } 712 } 713 if (online_type == ONLINE_MOVABLE && zone_idx(zone) == ZONE_MOVABLE - 1) { 714 if (move_pfn_range_right(zone, zone + 1, pfn, pfn + nr_pages)) { 715 unlock_memory_hotplug(); 716 return -1; 717 } 718 } 719 720 /* Previous code may changed the zone of the pfn range */ 721 zone = page_zone(pfn_to_page(pfn)); 722 723 arg.start_pfn = pfn; 724 arg.nr_pages = nr_pages; 725 node_states_check_changes_online(nr_pages, zone, &arg); 726 727 nid = page_to_nid(pfn_to_page(pfn)); 728 729 ret = memory_notify(MEM_GOING_ONLINE, &arg); 730 ret = notifier_to_errno(ret); 731 if (ret) { 732 memory_notify(MEM_CANCEL_ONLINE, &arg); 733 unlock_memory_hotplug(); 734 return ret; 735 } 736 /* 737 * If this zone is not populated, then it is not in zonelist. 738 * This means the page allocator ignores this zone. 739 * So, zonelist must be updated after online. 740 */ 741 mutex_lock(&zonelists_mutex); 742 if (!populated_zone(zone)) { 743 need_zonelists_rebuild = 1; 744 build_all_zonelists(NULL, zone); 745 } 746 747 ret = walk_system_ram_range(pfn, nr_pages, &onlined_pages, 748 online_pages_range); 749 if (ret) { 750 if (need_zonelists_rebuild) 751 zone_pcp_reset(zone); 752 mutex_unlock(&zonelists_mutex); 753 printk(KERN_DEBUG "online_pages [mem %#010llx-%#010llx] failed\n", 754 (unsigned long long) pfn << PAGE_SHIFT, 755 (((unsigned long long) pfn + nr_pages) 756 << PAGE_SHIFT) - 1); 757 memory_notify(MEM_CANCEL_ONLINE, &arg); 758 unlock_memory_hotplug(); 759 return ret; 760 } 761 762 zone->managed_pages += onlined_pages; 763 zone->present_pages += onlined_pages; 764 zone->zone_pgdat->node_present_pages += onlined_pages; 765 if (onlined_pages) { 766 node_states_set_node(zone_to_nid(zone), &arg); 767 if (need_zonelists_rebuild) 768 build_all_zonelists(NULL, NULL); 769 else 770 zone_pcp_update(zone); 771 } 772 773 mutex_unlock(&zonelists_mutex); 774 775 init_per_zone_wmark_min(); 776 777 if (onlined_pages) 778 kswapd_run(zone_to_nid(zone)); 779 780 vm_total_pages = nr_free_pagecache_pages(); 781 782 writeback_set_ratelimit(); 783 784 if (onlined_pages) 785 memory_notify(MEM_ONLINE, &arg); 786 unlock_memory_hotplug(); 787 788 return 0; 789 } 790 #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ 791 792 /* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ 793 static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start) 794 { 795 struct pglist_data *pgdat; 796 unsigned long zones_size[MAX_NR_ZONES] = {0}; 797 unsigned long zholes_size[MAX_NR_ZONES] = {0}; 798 unsigned long start_pfn = start >> PAGE_SHIFT; 799 800 pgdat = arch_alloc_nodedata(nid); 801 if (!pgdat) 802 return NULL; 803 804 arch_refresh_nodedata(nid, pgdat); 805 806 /* we can use NODE_DATA(nid) from here */ 807 808 /* init node's zones as empty zones, we don't have any present pages.*/ 809 free_area_init_node(nid, zones_size, start_pfn, zholes_size); 810 811 /* 812 * The node we allocated has no zone fallback lists. For avoiding 813 * to access not-initialized zonelist, build here. 814 */ 815 mutex_lock(&zonelists_mutex); 816 build_all_zonelists(pgdat, NULL); 817 mutex_unlock(&zonelists_mutex); 818 819 return pgdat; 820 } 821 822 static void rollback_node_hotadd(int nid, pg_data_t *pgdat) 823 { 824 arch_refresh_nodedata(nid, NULL); 825 arch_free_nodedata(pgdat); 826 return; 827 } 828 829 830 /* 831 * called by cpu_up() to online a node without onlined memory. 832 */ 833 int mem_online_node(int nid) 834 { 835 pg_data_t *pgdat; 836 int ret; 837 838 lock_memory_hotplug(); 839 pgdat = hotadd_new_pgdat(nid, 0); 840 if (!pgdat) { 841 ret = -ENOMEM; 842 goto out; 843 } 844 node_set_online(nid); 845 ret = register_one_node(nid); 846 BUG_ON(ret); 847 848 out: 849 unlock_memory_hotplug(); 850 return ret; 851 } 852 853 /* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ 854 int __ref add_memory(int nid, u64 start, u64 size) 855 { 856 pg_data_t *pgdat = NULL; 857 int new_pgdat = 0; 858 struct resource *res; 859 int ret; 860 861 lock_memory_hotplug(); 862 863 res = register_memory_resource(start, size); 864 ret = -EEXIST; 865 if (!res) 866 goto out; 867 868 if (!node_online(nid)) { 869 pgdat = hotadd_new_pgdat(nid, start); 870 ret = -ENOMEM; 871 if (!pgdat) 872 goto error; 873 new_pgdat = 1; 874 } 875 876 /* call arch's memory hotadd */ 877 ret = arch_add_memory(nid, start, size); 878 879 if (ret < 0) 880 goto error; 881 882 /* we online node here. we can't roll back from here. */ 883 node_set_online(nid); 884 885 if (new_pgdat) { 886 ret = register_one_node(nid); 887 /* 888 * If sysfs file of new node can't create, cpu on the node 889 * can't be hot-added. There is no rollback way now. 890 * So, check by BUG_ON() to catch it reluctantly.. 891 */ 892 BUG_ON(ret); 893 } 894 895 /* create new memmap entry */ 896 firmware_map_add_hotplug(start, start + size, "System RAM"); 897 898 goto out; 899 900 error: 901 /* rollback pgdat allocation and others */ 902 if (new_pgdat) 903 rollback_node_hotadd(nid, pgdat); 904 if (res) 905 release_memory_resource(res); 906 907 out: 908 unlock_memory_hotplug(); 909 return ret; 910 } 911 EXPORT_SYMBOL_GPL(add_memory); 912 913 #ifdef CONFIG_MEMORY_HOTREMOVE 914 /* 915 * A free page on the buddy free lists (not the per-cpu lists) has PageBuddy 916 * set and the size of the free page is given by page_order(). Using this, 917 * the function determines if the pageblock contains only free pages. 918 * Due to buddy contraints, a free page at least the size of a pageblock will 919 * be located at the start of the pageblock 920 */ 921 static inline int pageblock_free(struct page *page) 922 { 923 return PageBuddy(page) && page_order(page) >= pageblock_order; 924 } 925 926 /* Return the start of the next active pageblock after a given page */ 927 static struct page *next_active_pageblock(struct page *page) 928 { 929 /* Ensure the starting page is pageblock-aligned */ 930 BUG_ON(page_to_pfn(page) & (pageblock_nr_pages - 1)); 931 932 /* If the entire pageblock is free, move to the end of free page */ 933 if (pageblock_free(page)) { 934 int order; 935 /* be careful. we don't have locks, page_order can be changed.*/ 936 order = page_order(page); 937 if ((order < MAX_ORDER) && (order >= pageblock_order)) 938 return page + (1 << order); 939 } 940 941 return page + pageblock_nr_pages; 942 } 943 944 /* Checks if this range of memory is likely to be hot-removable. */ 945 int is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) 946 { 947 struct page *page = pfn_to_page(start_pfn); 948 struct page *end_page = page + nr_pages; 949 950 /* Check the starting page of each pageblock within the range */ 951 for (; page < end_page; page = next_active_pageblock(page)) { 952 if (!is_pageblock_removable_nolock(page)) 953 return 0; 954 cond_resched(); 955 } 956 957 /* All pageblocks in the memory block are likely to be hot-removable */ 958 return 1; 959 } 960 961 /* 962 * Confirm all pages in a range [start, end) is belongs to the same zone. 963 */ 964 static int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) 965 { 966 unsigned long pfn; 967 struct zone *zone = NULL; 968 struct page *page; 969 int i; 970 for (pfn = start_pfn; 971 pfn < end_pfn; 972 pfn += MAX_ORDER_NR_PAGES) { 973 i = 0; 974 /* This is just a CONFIG_HOLES_IN_ZONE check.*/ 975 while ((i < MAX_ORDER_NR_PAGES) && !pfn_valid_within(pfn + i)) 976 i++; 977 if (i == MAX_ORDER_NR_PAGES) 978 continue; 979 page = pfn_to_page(pfn + i); 980 if (zone && page_zone(page) != zone) 981 return 0; 982 zone = page_zone(page); 983 } 984 return 1; 985 } 986 987 /* 988 * Scanning pfn is much easier than scanning lru list. 989 * Scan pfn from start to end and Find LRU page. 990 */ 991 static unsigned long scan_lru_pages(unsigned long start, unsigned long end) 992 { 993 unsigned long pfn; 994 struct page *page; 995 for (pfn = start; pfn < end; pfn++) { 996 if (pfn_valid(pfn)) { 997 page = pfn_to_page(pfn); 998 if (PageLRU(page)) 999 return pfn; 1000 } 1001 } 1002 return 0; 1003 } 1004 1005 #define NR_OFFLINE_AT_ONCE_PAGES (256) 1006 static int 1007 do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) 1008 { 1009 unsigned long pfn; 1010 struct page *page; 1011 int move_pages = NR_OFFLINE_AT_ONCE_PAGES; 1012 int not_managed = 0; 1013 int ret = 0; 1014 LIST_HEAD(source); 1015 1016 for (pfn = start_pfn; pfn < end_pfn && move_pages > 0; pfn++) { 1017 if (!pfn_valid(pfn)) 1018 continue; 1019 page = pfn_to_page(pfn); 1020 if (!get_page_unless_zero(page)) 1021 continue; 1022 /* 1023 * We can skip free pages. And we can only deal with pages on 1024 * LRU. 1025 */ 1026 ret = isolate_lru_page(page); 1027 if (!ret) { /* Success */ 1028 put_page(page); 1029 list_add_tail(&page->lru, &source); 1030 move_pages--; 1031 inc_zone_page_state(page, NR_ISOLATED_ANON + 1032 page_is_file_cache(page)); 1033 1034 } else { 1035 #ifdef CONFIG_DEBUG_VM 1036 printk(KERN_ALERT "removing pfn %lx from LRU failed\n", 1037 pfn); 1038 dump_page(page); 1039 #endif 1040 put_page(page); 1041 /* Because we don't have big zone->lock. we should 1042 check this again here. */ 1043 if (page_count(page)) { 1044 not_managed++; 1045 ret = -EBUSY; 1046 break; 1047 } 1048 } 1049 } 1050 if (!list_empty(&source)) { 1051 if (not_managed) { 1052 putback_lru_pages(&source); 1053 goto out; 1054 } 1055 1056 /* 1057 * alloc_migrate_target should be improooooved!! 1058 * migrate_pages returns # of failed pages. 1059 */ 1060 ret = migrate_pages(&source, alloc_migrate_target, 0, 1061 true, MIGRATE_SYNC, 1062 MR_MEMORY_HOTPLUG); 1063 if (ret) 1064 putback_lru_pages(&source); 1065 } 1066 out: 1067 return ret; 1068 } 1069 1070 /* 1071 * remove from free_area[] and mark all as Reserved. 1072 */ 1073 static int 1074 offline_isolated_pages_cb(unsigned long start, unsigned long nr_pages, 1075 void *data) 1076 { 1077 __offline_isolated_pages(start, start + nr_pages); 1078 return 0; 1079 } 1080 1081 static void 1082 offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn) 1083 { 1084 walk_system_ram_range(start_pfn, end_pfn - start_pfn, NULL, 1085 offline_isolated_pages_cb); 1086 } 1087 1088 /* 1089 * Check all pages in range, recoreded as memory resource, are isolated. 1090 */ 1091 static int 1092 check_pages_isolated_cb(unsigned long start_pfn, unsigned long nr_pages, 1093 void *data) 1094 { 1095 int ret; 1096 long offlined = *(long *)data; 1097 ret = test_pages_isolated(start_pfn, start_pfn + nr_pages, true); 1098 offlined = nr_pages; 1099 if (!ret) 1100 *(long *)data += offlined; 1101 return ret; 1102 } 1103 1104 static long 1105 check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) 1106 { 1107 long offlined = 0; 1108 int ret; 1109 1110 ret = walk_system_ram_range(start_pfn, end_pfn - start_pfn, &offlined, 1111 check_pages_isolated_cb); 1112 if (ret < 0) 1113 offlined = (long)ret; 1114 return offlined; 1115 } 1116 1117 #ifdef CONFIG_MOVABLE_NODE 1118 /* 1119 * When CONFIG_MOVABLE_NODE, we permit offlining of a node which doesn't have 1120 * normal memory. 1121 */ 1122 static bool can_offline_normal(struct zone *zone, unsigned long nr_pages) 1123 { 1124 return true; 1125 } 1126 #else /* CONFIG_MOVABLE_NODE */ 1127 /* ensure the node has NORMAL memory if it is still online */ 1128 static bool can_offline_normal(struct zone *zone, unsigned long nr_pages) 1129 { 1130 struct pglist_data *pgdat = zone->zone_pgdat; 1131 unsigned long present_pages = 0; 1132 enum zone_type zt; 1133 1134 for (zt = 0; zt <= ZONE_NORMAL; zt++) 1135 present_pages += pgdat->node_zones[zt].present_pages; 1136 1137 if (present_pages > nr_pages) 1138 return true; 1139 1140 present_pages = 0; 1141 for (; zt <= ZONE_MOVABLE; zt++) 1142 present_pages += pgdat->node_zones[zt].present_pages; 1143 1144 /* 1145 * we can't offline the last normal memory until all 1146 * higher memory is offlined. 1147 */ 1148 return present_pages == 0; 1149 } 1150 #endif /* CONFIG_MOVABLE_NODE */ 1151 1152 /* check which state of node_states will be changed when offline memory */ 1153 static void node_states_check_changes_offline(unsigned long nr_pages, 1154 struct zone *zone, struct memory_notify *arg) 1155 { 1156 struct pglist_data *pgdat = zone->zone_pgdat; 1157 unsigned long present_pages = 0; 1158 enum zone_type zt, zone_last = ZONE_NORMAL; 1159 1160 /* 1161 * If we have HIGHMEM or movable node, node_states[N_NORMAL_MEMORY] 1162 * contains nodes which have zones of 0...ZONE_NORMAL, 1163 * set zone_last to ZONE_NORMAL. 1164 * 1165 * If we don't have HIGHMEM nor movable node, 1166 * node_states[N_NORMAL_MEMORY] contains nodes which have zones of 1167 * 0...ZONE_MOVABLE, set zone_last to ZONE_MOVABLE. 1168 */ 1169 if (N_MEMORY == N_NORMAL_MEMORY) 1170 zone_last = ZONE_MOVABLE; 1171 1172 /* 1173 * check whether node_states[N_NORMAL_MEMORY] will be changed. 1174 * If the memory to be offline is in a zone of 0...zone_last, 1175 * and it is the last present memory, 0...zone_last will 1176 * become empty after offline , thus we can determind we will 1177 * need to clear the node from node_states[N_NORMAL_MEMORY]. 1178 */ 1179 for (zt = 0; zt <= zone_last; zt++) 1180 present_pages += pgdat->node_zones[zt].present_pages; 1181 if (zone_idx(zone) <= zone_last && nr_pages >= present_pages) 1182 arg->status_change_nid_normal = zone_to_nid(zone); 1183 else 1184 arg->status_change_nid_normal = -1; 1185 1186 #ifdef CONFIG_HIGHMEM 1187 /* 1188 * If we have movable node, node_states[N_HIGH_MEMORY] 1189 * contains nodes which have zones of 0...ZONE_HIGHMEM, 1190 * set zone_last to ZONE_HIGHMEM. 1191 * 1192 * If we don't have movable node, node_states[N_NORMAL_MEMORY] 1193 * contains nodes which have zones of 0...ZONE_MOVABLE, 1194 * set zone_last to ZONE_MOVABLE. 1195 */ 1196 zone_last = ZONE_HIGHMEM; 1197 if (N_MEMORY == N_HIGH_MEMORY) 1198 zone_last = ZONE_MOVABLE; 1199 1200 for (; zt <= zone_last; zt++) 1201 present_pages += pgdat->node_zones[zt].present_pages; 1202 if (zone_idx(zone) <= zone_last && nr_pages >= present_pages) 1203 arg->status_change_nid_high = zone_to_nid(zone); 1204 else 1205 arg->status_change_nid_high = -1; 1206 #else 1207 arg->status_change_nid_high = arg->status_change_nid_normal; 1208 #endif 1209 1210 /* 1211 * node_states[N_HIGH_MEMORY] contains nodes which have 0...ZONE_MOVABLE 1212 */ 1213 zone_last = ZONE_MOVABLE; 1214 1215 /* 1216 * check whether node_states[N_HIGH_MEMORY] will be changed 1217 * If we try to offline the last present @nr_pages from the node, 1218 * we can determind we will need to clear the node from 1219 * node_states[N_HIGH_MEMORY]. 1220 */ 1221 for (; zt <= zone_last; zt++) 1222 present_pages += pgdat->node_zones[zt].present_pages; 1223 if (nr_pages >= present_pages) 1224 arg->status_change_nid = zone_to_nid(zone); 1225 else 1226 arg->status_change_nid = -1; 1227 } 1228 1229 static void node_states_clear_node(int node, struct memory_notify *arg) 1230 { 1231 if (arg->status_change_nid_normal >= 0) 1232 node_clear_state(node, N_NORMAL_MEMORY); 1233 1234 if ((N_MEMORY != N_NORMAL_MEMORY) && 1235 (arg->status_change_nid_high >= 0)) 1236 node_clear_state(node, N_HIGH_MEMORY); 1237 1238 if ((N_MEMORY != N_HIGH_MEMORY) && 1239 (arg->status_change_nid >= 0)) 1240 node_clear_state(node, N_MEMORY); 1241 } 1242 1243 static int __ref __offline_pages(unsigned long start_pfn, 1244 unsigned long end_pfn, unsigned long timeout) 1245 { 1246 unsigned long pfn, nr_pages, expire; 1247 long offlined_pages; 1248 int ret, drain, retry_max, node; 1249 struct zone *zone; 1250 struct memory_notify arg; 1251 1252 BUG_ON(start_pfn >= end_pfn); 1253 /* at least, alignment against pageblock is necessary */ 1254 if (!IS_ALIGNED(start_pfn, pageblock_nr_pages)) 1255 return -EINVAL; 1256 if (!IS_ALIGNED(end_pfn, pageblock_nr_pages)) 1257 return -EINVAL; 1258 /* This makes hotplug much easier...and readable. 1259 we assume this for now. .*/ 1260 if (!test_pages_in_a_zone(start_pfn, end_pfn)) 1261 return -EINVAL; 1262 1263 lock_memory_hotplug(); 1264 1265 zone = page_zone(pfn_to_page(start_pfn)); 1266 node = zone_to_nid(zone); 1267 nr_pages = end_pfn - start_pfn; 1268 1269 ret = -EINVAL; 1270 if (zone_idx(zone) <= ZONE_NORMAL && !can_offline_normal(zone, nr_pages)) 1271 goto out; 1272 1273 /* set above range as isolated */ 1274 ret = start_isolate_page_range(start_pfn, end_pfn, 1275 MIGRATE_MOVABLE, true); 1276 if (ret) 1277 goto out; 1278 1279 arg.start_pfn = start_pfn; 1280 arg.nr_pages = nr_pages; 1281 node_states_check_changes_offline(nr_pages, zone, &arg); 1282 1283 ret = memory_notify(MEM_GOING_OFFLINE, &arg); 1284 ret = notifier_to_errno(ret); 1285 if (ret) 1286 goto failed_removal; 1287 1288 pfn = start_pfn; 1289 expire = jiffies + timeout; 1290 drain = 0; 1291 retry_max = 5; 1292 repeat: 1293 /* start memory hot removal */ 1294 ret = -EAGAIN; 1295 if (time_after(jiffies, expire)) 1296 goto failed_removal; 1297 ret = -EINTR; 1298 if (signal_pending(current)) 1299 goto failed_removal; 1300 ret = 0; 1301 if (drain) { 1302 lru_add_drain_all(); 1303 cond_resched(); 1304 drain_all_pages(); 1305 } 1306 1307 pfn = scan_lru_pages(start_pfn, end_pfn); 1308 if (pfn) { /* We have page on LRU */ 1309 ret = do_migrate_range(pfn, end_pfn); 1310 if (!ret) { 1311 drain = 1; 1312 goto repeat; 1313 } else { 1314 if (ret < 0) 1315 if (--retry_max == 0) 1316 goto failed_removal; 1317 yield(); 1318 drain = 1; 1319 goto repeat; 1320 } 1321 } 1322 /* drain all zone's lru pagevec, this is asynchronous... */ 1323 lru_add_drain_all(); 1324 yield(); 1325 /* drain pcp pages, this is synchronous. */ 1326 drain_all_pages(); 1327 /* check again */ 1328 offlined_pages = check_pages_isolated(start_pfn, end_pfn); 1329 if (offlined_pages < 0) { 1330 ret = -EBUSY; 1331 goto failed_removal; 1332 } 1333 printk(KERN_INFO "Offlined Pages %ld\n", offlined_pages); 1334 /* Ok, all of our target is isolated. 1335 We cannot do rollback at this point. */ 1336 offline_isolated_pages(start_pfn, end_pfn); 1337 /* reset pagetype flags and makes migrate type to be MOVABLE */ 1338 undo_isolate_page_range(start_pfn, end_pfn, MIGRATE_MOVABLE); 1339 /* removal success */ 1340 zone->managed_pages -= offlined_pages; 1341 zone->present_pages -= offlined_pages; 1342 zone->zone_pgdat->node_present_pages -= offlined_pages; 1343 totalram_pages -= offlined_pages; 1344 1345 init_per_zone_wmark_min(); 1346 1347 if (!populated_zone(zone)) { 1348 zone_pcp_reset(zone); 1349 mutex_lock(&zonelists_mutex); 1350 build_all_zonelists(NULL, NULL); 1351 mutex_unlock(&zonelists_mutex); 1352 } else 1353 zone_pcp_update(zone); 1354 1355 node_states_clear_node(node, &arg); 1356 if (arg.status_change_nid >= 0) 1357 kswapd_stop(node); 1358 1359 vm_total_pages = nr_free_pagecache_pages(); 1360 writeback_set_ratelimit(); 1361 1362 memory_notify(MEM_OFFLINE, &arg); 1363 unlock_memory_hotplug(); 1364 return 0; 1365 1366 failed_removal: 1367 printk(KERN_INFO "memory offlining [mem %#010llx-%#010llx] failed\n", 1368 (unsigned long long) start_pfn << PAGE_SHIFT, 1369 ((unsigned long long) end_pfn << PAGE_SHIFT) - 1); 1370 memory_notify(MEM_CANCEL_OFFLINE, &arg); 1371 /* pushback to free area */ 1372 undo_isolate_page_range(start_pfn, end_pfn, MIGRATE_MOVABLE); 1373 1374 out: 1375 unlock_memory_hotplug(); 1376 return ret; 1377 } 1378 1379 int offline_pages(unsigned long start_pfn, unsigned long nr_pages) 1380 { 1381 return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ); 1382 } 1383 1384 int remove_memory(u64 start, u64 size) 1385 { 1386 struct memory_block *mem = NULL; 1387 struct mem_section *section; 1388 unsigned long start_pfn, end_pfn; 1389 unsigned long pfn, section_nr; 1390 int ret; 1391 1392 start_pfn = PFN_DOWN(start); 1393 end_pfn = start_pfn + PFN_DOWN(size); 1394 1395 for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) { 1396 section_nr = pfn_to_section_nr(pfn); 1397 if (!present_section_nr(section_nr)) 1398 continue; 1399 1400 section = __nr_to_section(section_nr); 1401 /* same memblock? */ 1402 if (mem) 1403 if ((section_nr >= mem->start_section_nr) && 1404 (section_nr <= mem->end_section_nr)) 1405 continue; 1406 1407 mem = find_memory_block_hinted(section, mem); 1408 if (!mem) 1409 continue; 1410 1411 ret = offline_memory_block(mem); 1412 if (ret) { 1413 kobject_put(&mem->dev.kobj); 1414 return ret; 1415 } 1416 } 1417 1418 if (mem) 1419 kobject_put(&mem->dev.kobj); 1420 1421 return 0; 1422 } 1423 #else 1424 int offline_pages(unsigned long start_pfn, unsigned long nr_pages) 1425 { 1426 return -EINVAL; 1427 } 1428 int remove_memory(u64 start, u64 size) 1429 { 1430 return -EINVAL; 1431 } 1432 #endif /* CONFIG_MEMORY_HOTREMOVE */ 1433 EXPORT_SYMBOL_GPL(remove_memory); 1434