mm/memory_hotplug.c must #include "internal.h"
[linux-2.6.git] / mm / memory_hotplug.c
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/module.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/cpuset.h>
26 #include <linux/delay.h>
27 #include <linux/migrate.h>
28 #include <linux/page-isolation.h>
29
30 #include <asm/tlbflush.h>
31
32 #include "internal.h"
33
34 /* add this memory to iomem resource */
35 static struct resource *register_memory_resource(u64 start, u64 size)
36 {
37         struct resource *res;
38         res = kzalloc(sizeof(struct resource), GFP_KERNEL);
39         BUG_ON(!res);
40
41         res->name = "System RAM";
42         res->start = start;
43         res->end = start + size - 1;
44         res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
45         if (request_resource(&iomem_resource, res) < 0) {
46                 printk("System RAM resource %llx - %llx cannot be added\n",
47                 (unsigned long long)res->start, (unsigned long long)res->end);
48                 kfree(res);
49                 res = NULL;
50         }
51         return res;
52 }
53
54 static void release_memory_resource(struct resource *res)
55 {
56         if (!res)
57                 return;
58         release_resource(res);
59         kfree(res);
60         return;
61 }
62
63 #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
64 #ifndef CONFIG_SPARSEMEM_VMEMMAP
65 static void get_page_bootmem(unsigned long info,  struct page *page, int magic)
66 {
67         atomic_set(&page->_mapcount, magic);
68         SetPagePrivate(page);
69         set_page_private(page, info);
70         atomic_inc(&page->_count);
71 }
72
73 void put_page_bootmem(struct page *page)
74 {
75         int magic;
76
77         magic = atomic_read(&page->_mapcount);
78         BUG_ON(magic >= -1);
79
80         if (atomic_dec_return(&page->_count) == 1) {
81                 ClearPagePrivate(page);
82                 set_page_private(page, 0);
83                 reset_page_mapcount(page);
84                 __free_pages_bootmem(page, 0);
85         }
86
87 }
88
89 void register_page_bootmem_info_section(unsigned long start_pfn)
90 {
91         unsigned long *usemap, mapsize, section_nr, i;
92         struct mem_section *ms;
93         struct page *page, *memmap;
94
95         if (!pfn_valid(start_pfn))
96                 return;
97
98         section_nr = pfn_to_section_nr(start_pfn);
99         ms = __nr_to_section(section_nr);
100
101         /* Get section's memmap address */
102         memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr);
103
104         /*
105          * Get page for the memmap's phys address
106          * XXX: need more consideration for sparse_vmemmap...
107          */
108         page = virt_to_page(memmap);
109         mapsize = sizeof(struct page) * PAGES_PER_SECTION;
110         mapsize = PAGE_ALIGN(mapsize) >> PAGE_SHIFT;
111
112         /* remember memmap's page */
113         for (i = 0; i < mapsize; i++, page++)
114                 get_page_bootmem(section_nr, page, SECTION_INFO);
115
116         usemap = __nr_to_section(section_nr)->pageblock_flags;
117         page = virt_to_page(usemap);
118
119         mapsize = PAGE_ALIGN(usemap_size()) >> PAGE_SHIFT;
120
121         for (i = 0; i < mapsize; i++, page++)
122                 get_page_bootmem(section_nr, page, MIX_INFO);
123
124 }
125
126 void register_page_bootmem_info_node(struct pglist_data *pgdat)
127 {
128         unsigned long i, pfn, end_pfn, nr_pages;
129         int node = pgdat->node_id;
130         struct page *page;
131         struct zone *zone;
132
133         nr_pages = PAGE_ALIGN(sizeof(struct pglist_data)) >> PAGE_SHIFT;
134         page = virt_to_page(pgdat);
135
136         for (i = 0; i < nr_pages; i++, page++)
137                 get_page_bootmem(node, page, NODE_INFO);
138
139         zone = &pgdat->node_zones[0];
140         for (; zone < pgdat->node_zones + MAX_NR_ZONES - 1; zone++) {
141                 if (zone->wait_table) {
142                         nr_pages = zone->wait_table_hash_nr_entries
143                                 * sizeof(wait_queue_head_t);
144                         nr_pages = PAGE_ALIGN(nr_pages) >> PAGE_SHIFT;
145                         page = virt_to_page(zone->wait_table);
146
147                         for (i = 0; i < nr_pages; i++, page++)
148                                 get_page_bootmem(node, page, NODE_INFO);
149                 }
150         }
151
152         pfn = pgdat->node_start_pfn;
153         end_pfn = pfn + pgdat->node_spanned_pages;
154
155         /* register_section info */
156         for (; pfn < end_pfn; pfn += PAGES_PER_SECTION)
157                 register_page_bootmem_info_section(pfn);
158
159 }
160 #endif /* !CONFIG_SPARSEMEM_VMEMMAP */
161
162 static int __add_zone(struct zone *zone, unsigned long phys_start_pfn)
163 {
164         struct pglist_data *pgdat = zone->zone_pgdat;
165         int nr_pages = PAGES_PER_SECTION;
166         int nid = pgdat->node_id;
167         int zone_type;
168
169         zone_type = zone - pgdat->node_zones;
170         if (!zone->wait_table) {
171                 int ret = 0;
172                 ret = init_currently_empty_zone(zone, phys_start_pfn,
173                                                 nr_pages, MEMMAP_HOTPLUG);
174                 if (ret < 0)
175                         return ret;
176         }
177         memmap_init_zone(nr_pages, nid, zone_type,
178                          phys_start_pfn, MEMMAP_HOTPLUG);
179         return 0;
180 }
181
182 static int __add_section(struct zone *zone, unsigned long phys_start_pfn)
183 {
184         int nr_pages = PAGES_PER_SECTION;
185         int ret;
186
187         if (pfn_valid(phys_start_pfn))
188                 return -EEXIST;
189
190         ret = sparse_add_one_section(zone, phys_start_pfn, nr_pages);
191
192         if (ret < 0)
193                 return ret;
194
195         ret = __add_zone(zone, phys_start_pfn);
196
197         if (ret < 0)
198                 return ret;
199
200         return register_new_memory(__pfn_to_section(phys_start_pfn));
201 }
202
203 #ifdef CONFIG_SPARSEMEM_VMEMMAP
204 static int __remove_section(struct zone *zone, struct mem_section *ms)
205 {
206         /*
207          * XXX: Freeing memmap with vmemmap is not implement yet.
208          *      This should be removed later.
209          */
210         return -EBUSY;
211 }
212 #else
213 static int __remove_section(struct zone *zone, struct mem_section *ms)
214 {
215         unsigned long flags;
216         struct pglist_data *pgdat = zone->zone_pgdat;
217         int ret = -EINVAL;
218
219         if (!valid_section(ms))
220                 return ret;
221
222         ret = unregister_memory_section(ms);
223         if (ret)
224                 return ret;
225
226         pgdat_resize_lock(pgdat, &flags);
227         sparse_remove_one_section(zone, ms);
228         pgdat_resize_unlock(pgdat, &flags);
229         return 0;
230 }
231 #endif
232
233 /*
234  * Reasonably generic function for adding memory.  It is
235  * expected that archs that support memory hotplug will
236  * call this function after deciding the zone to which to
237  * add the new pages.
238  */
239 int __add_pages(struct zone *zone, unsigned long phys_start_pfn,
240                  unsigned long nr_pages)
241 {
242         unsigned long i;
243         int err = 0;
244         int start_sec, end_sec;
245         /* during initialize mem_map, align hot-added range to section */
246         start_sec = pfn_to_section_nr(phys_start_pfn);
247         end_sec = pfn_to_section_nr(phys_start_pfn + nr_pages - 1);
248
249         for (i = start_sec; i <= end_sec; i++) {
250                 err = __add_section(zone, i << PFN_SECTION_SHIFT);
251
252                 /*
253                  * EEXIST is finally dealt with by ioresource collision
254                  * check. see add_memory() => register_memory_resource()
255                  * Warning will be printed if there is collision.
256                  */
257                 if (err && (err != -EEXIST))
258                         break;
259                 err = 0;
260         }
261
262         return err;
263 }
264 EXPORT_SYMBOL_GPL(__add_pages);
265
266 /**
267  * __remove_pages() - remove sections of pages from a zone
268  * @zone: zone from which pages need to be removed
269  * @phys_start_pfn: starting pageframe (must be aligned to start of a section)
270  * @nr_pages: number of pages to remove (must be multiple of section size)
271  *
272  * Generic helper function to remove section mappings and sysfs entries
273  * for the section of the memory we are removing. Caller needs to make
274  * sure that pages are marked reserved and zones are adjust properly by
275  * calling offline_pages().
276  */
277 int __remove_pages(struct zone *zone, unsigned long phys_start_pfn,
278                  unsigned long nr_pages)
279 {
280         unsigned long i, ret = 0;
281         int sections_to_remove;
282
283         /*
284          * We can only remove entire sections
285          */
286         BUG_ON(phys_start_pfn & ~PAGE_SECTION_MASK);
287         BUG_ON(nr_pages % PAGES_PER_SECTION);
288
289         release_mem_region(phys_start_pfn << PAGE_SHIFT, nr_pages * PAGE_SIZE);
290
291         sections_to_remove = nr_pages / PAGES_PER_SECTION;
292         for (i = 0; i < sections_to_remove; i++) {
293                 unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION;
294                 ret = __remove_section(zone, __pfn_to_section(pfn));
295                 if (ret)
296                         break;
297         }
298         return ret;
299 }
300 EXPORT_SYMBOL_GPL(__remove_pages);
301
302 static void grow_zone_span(struct zone *zone,
303                 unsigned long start_pfn, unsigned long end_pfn)
304 {
305         unsigned long old_zone_end_pfn;
306
307         zone_span_writelock(zone);
308
309         old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages;
310         if (start_pfn < zone->zone_start_pfn)
311                 zone->zone_start_pfn = start_pfn;
312
313         zone->spanned_pages = max(old_zone_end_pfn, end_pfn) -
314                                 zone->zone_start_pfn;
315
316         zone_span_writeunlock(zone);
317 }
318
319 static void grow_pgdat_span(struct pglist_data *pgdat,
320                 unsigned long start_pfn, unsigned long end_pfn)
321 {
322         unsigned long old_pgdat_end_pfn =
323                 pgdat->node_start_pfn + pgdat->node_spanned_pages;
324
325         if (start_pfn < pgdat->node_start_pfn)
326                 pgdat->node_start_pfn = start_pfn;
327
328         pgdat->node_spanned_pages = max(old_pgdat_end_pfn, end_pfn) -
329                                         pgdat->node_start_pfn;
330 }
331
332 void online_page(struct page *page)
333 {
334         totalram_pages++;
335         num_physpages++;
336
337 #ifdef CONFIG_HIGHMEM
338         if (PageHighMem(page))
339                 totalhigh_pages++;
340 #endif
341
342 #ifdef CONFIG_FLATMEM
343         max_mapnr = max(page_to_pfn(page), max_mapnr);
344 #endif
345
346         ClearPageReserved(page);
347         init_page_count(page);
348         __free_page(page);
349 }
350
351 static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages,
352                         void *arg)
353 {
354         unsigned long i;
355         unsigned long onlined_pages = *(unsigned long *)arg;
356         struct page *page;
357         if (PageReserved(pfn_to_page(start_pfn)))
358                 for (i = 0; i < nr_pages; i++) {
359                         page = pfn_to_page(start_pfn + i);
360                         online_page(page);
361                         onlined_pages++;
362                 }
363         *(unsigned long *)arg = onlined_pages;
364         return 0;
365 }
366
367
368 int online_pages(unsigned long pfn, unsigned long nr_pages)
369 {
370         unsigned long flags;
371         unsigned long onlined_pages = 0;
372         struct zone *zone;
373         int need_zonelists_rebuild = 0;
374         int nid;
375         int ret;
376         struct memory_notify arg;
377
378         arg.start_pfn = pfn;
379         arg.nr_pages = nr_pages;
380         arg.status_change_nid = -1;
381
382         nid = page_to_nid(pfn_to_page(pfn));
383         if (node_present_pages(nid) == 0)
384                 arg.status_change_nid = nid;
385
386         ret = memory_notify(MEM_GOING_ONLINE, &arg);
387         ret = notifier_to_errno(ret);
388         if (ret) {
389                 memory_notify(MEM_CANCEL_ONLINE, &arg);
390                 return ret;
391         }
392         /*
393          * This doesn't need a lock to do pfn_to_page().
394          * The section can't be removed here because of the
395          * memory_block->state_mutex.
396          */
397         zone = page_zone(pfn_to_page(pfn));
398         pgdat_resize_lock(zone->zone_pgdat, &flags);
399         grow_zone_span(zone, pfn, pfn + nr_pages);
400         grow_pgdat_span(zone->zone_pgdat, pfn, pfn + nr_pages);
401         pgdat_resize_unlock(zone->zone_pgdat, &flags);
402
403         /*
404          * If this zone is not populated, then it is not in zonelist.
405          * This means the page allocator ignores this zone.
406          * So, zonelist must be updated after online.
407          */
408         if (!populated_zone(zone))
409                 need_zonelists_rebuild = 1;
410
411         walk_memory_resource(pfn, nr_pages, &onlined_pages,
412                 online_pages_range);
413         zone->present_pages += onlined_pages;
414         zone->zone_pgdat->node_present_pages += onlined_pages;
415
416         setup_per_zone_pages_min();
417         if (onlined_pages) {
418                 kswapd_run(zone_to_nid(zone));
419                 node_set_state(zone_to_nid(zone), N_HIGH_MEMORY);
420         }
421
422         if (need_zonelists_rebuild)
423                 build_all_zonelists();
424         vm_total_pages = nr_free_pagecache_pages();
425         writeback_set_ratelimit();
426
427         if (onlined_pages)
428                 memory_notify(MEM_ONLINE, &arg);
429
430         return 0;
431 }
432 #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
433
434 static pg_data_t *hotadd_new_pgdat(int nid, u64 start)
435 {
436         struct pglist_data *pgdat;
437         unsigned long zones_size[MAX_NR_ZONES] = {0};
438         unsigned long zholes_size[MAX_NR_ZONES] = {0};
439         unsigned long start_pfn = start >> PAGE_SHIFT;
440
441         pgdat = arch_alloc_nodedata(nid);
442         if (!pgdat)
443                 return NULL;
444
445         arch_refresh_nodedata(nid, pgdat);
446
447         /* we can use NODE_DATA(nid) from here */
448
449         /* init node's zones as empty zones, we don't have any present pages.*/
450         free_area_init_node(nid, pgdat, zones_size, start_pfn, zholes_size);
451
452         return pgdat;
453 }
454
455 static void rollback_node_hotadd(int nid, pg_data_t *pgdat)
456 {
457         arch_refresh_nodedata(nid, NULL);
458         arch_free_nodedata(pgdat);
459         return;
460 }
461
462
463 int add_memory(int nid, u64 start, u64 size)
464 {
465         pg_data_t *pgdat = NULL;
466         int new_pgdat = 0;
467         struct resource *res;
468         int ret;
469
470         res = register_memory_resource(start, size);
471         if (!res)
472                 return -EEXIST;
473
474         if (!node_online(nid)) {
475                 pgdat = hotadd_new_pgdat(nid, start);
476                 if (!pgdat)
477                         return -ENOMEM;
478                 new_pgdat = 1;
479         }
480
481         /* call arch's memory hotadd */
482         ret = arch_add_memory(nid, start, size);
483
484         if (ret < 0)
485                 goto error;
486
487         /* we online node here. we can't roll back from here. */
488         node_set_online(nid);
489
490         cpuset_track_online_nodes();
491
492         if (new_pgdat) {
493                 ret = register_one_node(nid);
494                 /*
495                  * If sysfs file of new node can't create, cpu on the node
496                  * can't be hot-added. There is no rollback way now.
497                  * So, check by BUG_ON() to catch it reluctantly..
498                  */
499                 BUG_ON(ret);
500         }
501
502         return ret;
503 error:
504         /* rollback pgdat allocation and others */
505         if (new_pgdat)
506                 rollback_node_hotadd(nid, pgdat);
507         if (res)
508                 release_memory_resource(res);
509
510         return ret;
511 }
512 EXPORT_SYMBOL_GPL(add_memory);
513
514 #ifdef CONFIG_MEMORY_HOTREMOVE
515 /*
516  * Confirm all pages in a range [start, end) is belongs to the same zone.
517  */
518 static int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn)
519 {
520         unsigned long pfn;
521         struct zone *zone = NULL;
522         struct page *page;
523         int i;
524         for (pfn = start_pfn;
525              pfn < end_pfn;
526              pfn += MAX_ORDER_NR_PAGES) {
527                 i = 0;
528                 /* This is just a CONFIG_HOLES_IN_ZONE check.*/
529                 while ((i < MAX_ORDER_NR_PAGES) && !pfn_valid_within(pfn + i))
530                         i++;
531                 if (i == MAX_ORDER_NR_PAGES)
532                         continue;
533                 page = pfn_to_page(pfn + i);
534                 if (zone && page_zone(page) != zone)
535                         return 0;
536                 zone = page_zone(page);
537         }
538         return 1;
539 }
540
541 /*
542  * Scanning pfn is much easier than scanning lru list.
543  * Scan pfn from start to end and Find LRU page.
544  */
545 int scan_lru_pages(unsigned long start, unsigned long end)
546 {
547         unsigned long pfn;
548         struct page *page;
549         for (pfn = start; pfn < end; pfn++) {
550                 if (pfn_valid(pfn)) {
551                         page = pfn_to_page(pfn);
552                         if (PageLRU(page))
553                                 return pfn;
554                 }
555         }
556         return 0;
557 }
558
559 static struct page *
560 hotremove_migrate_alloc(struct page *page,
561                         unsigned long private,
562                         int **x)
563 {
564         /* This should be improoooooved!! */
565         return alloc_page(GFP_HIGHUSER_PAGECACHE);
566 }
567
568
569 #define NR_OFFLINE_AT_ONCE_PAGES        (256)
570 static int
571 do_migrate_range(unsigned long start_pfn, unsigned long end_pfn)
572 {
573         unsigned long pfn;
574         struct page *page;
575         int move_pages = NR_OFFLINE_AT_ONCE_PAGES;
576         int not_managed = 0;
577         int ret = 0;
578         LIST_HEAD(source);
579
580         for (pfn = start_pfn; pfn < end_pfn && move_pages > 0; pfn++) {
581                 if (!pfn_valid(pfn))
582                         continue;
583                 page = pfn_to_page(pfn);
584                 if (!page_count(page))
585                         continue;
586                 /*
587                  * We can skip free pages. And we can only deal with pages on
588                  * LRU.
589                  */
590                 ret = isolate_lru_page(page, &source);
591                 if (!ret) { /* Success */
592                         move_pages--;
593                 } else {
594                         /* Becasue we don't have big zone->lock. we should
595                            check this again here. */
596                         if (page_count(page))
597                                 not_managed++;
598 #ifdef CONFIG_DEBUG_VM
599                         printk(KERN_INFO "removing from LRU failed"
600                                          " %lx/%d/%lx\n",
601                                 pfn, page_count(page), page->flags);
602 #endif
603                 }
604         }
605         ret = -EBUSY;
606         if (not_managed) {
607                 if (!list_empty(&source))
608                         putback_lru_pages(&source);
609                 goto out;
610         }
611         ret = 0;
612         if (list_empty(&source))
613                 goto out;
614         /* this function returns # of failed pages */
615         ret = migrate_pages(&source, hotremove_migrate_alloc, 0);
616
617 out:
618         return ret;
619 }
620
621 /*
622  * remove from free_area[] and mark all as Reserved.
623  */
624 static int
625 offline_isolated_pages_cb(unsigned long start, unsigned long nr_pages,
626                         void *data)
627 {
628         __offline_isolated_pages(start, start + nr_pages);
629         return 0;
630 }
631
632 static void
633 offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
634 {
635         walk_memory_resource(start_pfn, end_pfn - start_pfn, NULL,
636                                 offline_isolated_pages_cb);
637 }
638
639 /*
640  * Check all pages in range, recoreded as memory resource, are isolated.
641  */
642 static int
643 check_pages_isolated_cb(unsigned long start_pfn, unsigned long nr_pages,
644                         void *data)
645 {
646         int ret;
647         long offlined = *(long *)data;
648         ret = test_pages_isolated(start_pfn, start_pfn + nr_pages);
649         offlined = nr_pages;
650         if (!ret)
651                 *(long *)data += offlined;
652         return ret;
653 }
654
655 static long
656 check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn)
657 {
658         long offlined = 0;
659         int ret;
660
661         ret = walk_memory_resource(start_pfn, end_pfn - start_pfn, &offlined,
662                         check_pages_isolated_cb);
663         if (ret < 0)
664                 offlined = (long)ret;
665         return offlined;
666 }
667
668 int offline_pages(unsigned long start_pfn,
669                   unsigned long end_pfn, unsigned long timeout)
670 {
671         unsigned long pfn, nr_pages, expire;
672         long offlined_pages;
673         int ret, drain, retry_max, node;
674         struct zone *zone;
675         struct memory_notify arg;
676
677         BUG_ON(start_pfn >= end_pfn);
678         /* at least, alignment against pageblock is necessary */
679         if (!IS_ALIGNED(start_pfn, pageblock_nr_pages))
680                 return -EINVAL;
681         if (!IS_ALIGNED(end_pfn, pageblock_nr_pages))
682                 return -EINVAL;
683         /* This makes hotplug much easier...and readable.
684            we assume this for now. .*/
685         if (!test_pages_in_a_zone(start_pfn, end_pfn))
686                 return -EINVAL;
687
688         zone = page_zone(pfn_to_page(start_pfn));
689         node = zone_to_nid(zone);
690         nr_pages = end_pfn - start_pfn;
691
692         /* set above range as isolated */
693         ret = start_isolate_page_range(start_pfn, end_pfn);
694         if (ret)
695                 return ret;
696
697         arg.start_pfn = start_pfn;
698         arg.nr_pages = nr_pages;
699         arg.status_change_nid = -1;
700         if (nr_pages >= node_present_pages(node))
701                 arg.status_change_nid = node;
702
703         ret = memory_notify(MEM_GOING_OFFLINE, &arg);
704         ret = notifier_to_errno(ret);
705         if (ret)
706                 goto failed_removal;
707
708         pfn = start_pfn;
709         expire = jiffies + timeout;
710         drain = 0;
711         retry_max = 5;
712 repeat:
713         /* start memory hot removal */
714         ret = -EAGAIN;
715         if (time_after(jiffies, expire))
716                 goto failed_removal;
717         ret = -EINTR;
718         if (signal_pending(current))
719                 goto failed_removal;
720         ret = 0;
721         if (drain) {
722                 lru_add_drain_all();
723                 flush_scheduled_work();
724                 cond_resched();
725                 drain_all_pages();
726         }
727
728         pfn = scan_lru_pages(start_pfn, end_pfn);
729         if (pfn) { /* We have page on LRU */
730                 ret = do_migrate_range(pfn, end_pfn);
731                 if (!ret) {
732                         drain = 1;
733                         goto repeat;
734                 } else {
735                         if (ret < 0)
736                                 if (--retry_max == 0)
737                                         goto failed_removal;
738                         yield();
739                         drain = 1;
740                         goto repeat;
741                 }
742         }
743         /* drain all zone's lru pagevec, this is asyncronous... */
744         lru_add_drain_all();
745         flush_scheduled_work();
746         yield();
747         /* drain pcp pages , this is synchrouns. */
748         drain_all_pages();
749         /* check again */
750         offlined_pages = check_pages_isolated(start_pfn, end_pfn);
751         if (offlined_pages < 0) {
752                 ret = -EBUSY;
753                 goto failed_removal;
754         }
755         printk(KERN_INFO "Offlined Pages %ld\n", offlined_pages);
756         /* Ok, all of our target is islaoted.
757            We cannot do rollback at this point. */
758         offline_isolated_pages(start_pfn, end_pfn);
759         /* reset pagetype flags and makes migrate type to be MOVABLE */
760         undo_isolate_page_range(start_pfn, end_pfn);
761         /* removal success */
762         zone->present_pages -= offlined_pages;
763         zone->zone_pgdat->node_present_pages -= offlined_pages;
764         totalram_pages -= offlined_pages;
765         num_physpages -= offlined_pages;
766
767         vm_total_pages = nr_free_pagecache_pages();
768         writeback_set_ratelimit();
769
770         memory_notify(MEM_OFFLINE, &arg);
771         return 0;
772
773 failed_removal:
774         printk(KERN_INFO "memory offlining %lx to %lx failed\n",
775                 start_pfn, end_pfn);
776         memory_notify(MEM_CANCEL_OFFLINE, &arg);
777         /* pushback to free area */
778         undo_isolate_page_range(start_pfn, end_pfn);
779
780         return ret;
781 }
782 #else
783 int remove_memory(u64 start, u64 size)
784 {
785         return -EINVAL;
786 }
787 EXPORT_SYMBOL_GPL(remove_memory);
788 #endif /* CONFIG_MEMORY_HOTREMOVE */