1208d54e5513c0c02d85af0990901354c74364d5cDave Hansen#ifndef __LINUX_MEMORY_HOTPLUG_H 2208d54e5513c0c02d85af0990901354c74364d5cDave Hansen#define __LINUX_MEMORY_HOTPLUG_H 3208d54e5513c0c02d85af0990901354c74364d5cDave Hansen 4208d54e5513c0c02d85af0990901354c74364d5cDave Hansen#include <linux/mmzone.h> 5208d54e5513c0c02d85af0990901354c74364d5cDave Hansen#include <linux/spinlock.h> 63947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen#include <linux/notifier.h> 7187f1882b5b0748b3c4c22274663fdb372ac0452Paul Gortmaker#include <linux/bug.h> 8208d54e5513c0c02d85af0990901354c74364d5cDave Hansen 978679302fe428f4f3dc853a51ee24f306010d874KAMEZAWA Hiroyukistruct page; 1078679302fe428f4f3dc853a51ee24f306010d874KAMEZAWA Hiroyukistruct zone; 1178679302fe428f4f3dc853a51ee24f306010d874KAMEZAWA Hiroyukistruct pglist_data; 12ea01ea937dcae2caa146dea1918cccf2f16ed3c4Badari Pulavartystruct mem_section; 1378679302fe428f4f3dc853a51ee24f306010d874KAMEZAWA Hiroyuki 14208d54e5513c0c02d85af0990901354c74364d5cDave Hansen#ifdef CONFIG_MEMORY_HOTPLUG 1504753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto 1604753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto/* 175f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli * Types for free bootmem stored in page->lru.next. These have to be in 185f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli * some random range in unsigned long space for debugging purposes. 1904753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto */ 205f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangelienum { 215f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE = 12, 225f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli SECTION_INFO = MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE, 235f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli MIX_SECTION_INFO, 245f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli NODE_INFO, 255f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE = NODE_INFO, 265f24ce5fd34c3ca1b3d10d30da754732da64d5c0Andrea Arcangeli}; 2704753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto 28208d54e5513c0c02d85af0990901354c74364d5cDave Hansen/* 29208d54e5513c0c02d85af0990901354c74364d5cDave Hansen * pgdat resizing functions 30208d54e5513c0c02d85af0990901354c74364d5cDave Hansen */ 31208d54e5513c0c02d85af0990901354c74364d5cDave Hansenstatic inline 32208d54e5513c0c02d85af0990901354c74364d5cDave Hansenvoid pgdat_resize_lock(struct pglist_data *pgdat, unsigned long *flags) 33208d54e5513c0c02d85af0990901354c74364d5cDave Hansen{ 34208d54e5513c0c02d85af0990901354c74364d5cDave Hansen spin_lock_irqsave(&pgdat->node_size_lock, *flags); 35208d54e5513c0c02d85af0990901354c74364d5cDave Hansen} 36208d54e5513c0c02d85af0990901354c74364d5cDave Hansenstatic inline 37208d54e5513c0c02d85af0990901354c74364d5cDave Hansenvoid pgdat_resize_unlock(struct pglist_data *pgdat, unsigned long *flags) 38208d54e5513c0c02d85af0990901354c74364d5cDave Hansen{ 39bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen spin_unlock_irqrestore(&pgdat->node_size_lock, *flags); 40208d54e5513c0c02d85af0990901354c74364d5cDave Hansen} 41208d54e5513c0c02d85af0990901354c74364d5cDave Hansenstatic inline 42208d54e5513c0c02d85af0990901354c74364d5cDave Hansenvoid pgdat_resize_init(struct pglist_data *pgdat) 43208d54e5513c0c02d85af0990901354c74364d5cDave Hansen{ 44208d54e5513c0c02d85af0990901354c74364d5cDave Hansen spin_lock_init(&pgdat->node_size_lock); 45208d54e5513c0c02d85af0990901354c74364d5cDave Hansen} 46bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen/* 47bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen * Zone resizing functions 48bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen */ 49bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline unsigned zone_span_seqbegin(struct zone *zone) 50bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen{ 51bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen return read_seqbegin(&zone->span_seqlock); 52bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen} 53bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline int zone_span_seqretry(struct zone *zone, unsigned iv) 54bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen{ 55bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen return read_seqretry(&zone->span_seqlock, iv); 56bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen} 57bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline void zone_span_writelock(struct zone *zone) 58bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen{ 59bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen write_seqlock(&zone->span_seqlock); 60bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen} 61bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline void zone_span_writeunlock(struct zone *zone) 62bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen{ 63bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen write_sequnlock(&zone->span_seqlock); 64bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen} 65bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline void zone_seqlock_init(struct zone *zone) 66bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen{ 67bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen seqlock_init(&zone->span_seqlock); 68bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen} 693947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansenextern int zone_grow_free_lists(struct zone *zone, unsigned long new_nr_pages); 703947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansenextern int zone_grow_waitqueues(struct zone *zone, unsigned long nr_pages); 713947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansenextern int add_one_highpage(struct page *page, int pfn, int bad_ppro); 723947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen/* VM interface that may be used by firmware interface */ 733947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansenextern int online_pages(unsigned long, unsigned long); 740c0e6195896535481173df98935ad8db174f4d45KAMEZAWA Hiroyukiextern void __offline_isolated_pages(unsigned long, unsigned long); 7548e94196a533dbee17c252bf80d0310fb8c8c2ebKAMEZAWA Hiroyuki 769d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kipertypedef void (*online_page_callback_t)(struct page *page); 779d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiper 789d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiperextern int set_online_page_callback(online_page_callback_t callback); 799d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiperextern int restore_online_page_callback(online_page_callback_t callback); 809d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiper 819d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiperextern void __online_page_set_limits(struct page *page); 829d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiperextern void __online_page_increment_counters(struct page *page); 839d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiperextern void __online_page_free(struct page *page); 849d0ad8ca43ce8023bb834a409c2258bd7197fb05Daniel Kiper 8549ac825587f33afec8841b7fab2eb4db775014e6KAMEZAWA Hiroyuki#ifdef CONFIG_MEMORY_HOTREMOVE 8649ac825587f33afec8841b7fab2eb4db775014e6KAMEZAWA Hiroyukiextern bool is_pageblock_removable_nolock(struct page *page); 8749ac825587f33afec8841b7fab2eb4db775014e6KAMEZAWA Hiroyuki#endif /* CONFIG_MEMORY_HOTREMOVE */ 8849ac825587f33afec8841b7fab2eb4db775014e6KAMEZAWA Hiroyuki 893947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen/* reasonably generic interface to expand the physical pages in a zone */ 90c04fc586c1a480ba198f03ae7b6cbd7b57380b91Gary Hadeextern int __add_pages(int nid, struct zone *zone, unsigned long start_pfn, 913947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen unsigned long nr_pages); 92ea01ea937dcae2caa146dea1918cccf2f16ed3c4Badari Pulavartyextern int __remove_pages(struct zone *zone, unsigned long start_pfn, 93ea01ea937dcae2caa146dea1918cccf2f16ed3c4Badari Pulavarty unsigned long nr_pages); 94bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto 95bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto#ifdef CONFIG_NUMA 96bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Gotoextern int memory_add_physaddr_to_nid(u64 start); 97bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto#else 98bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Gotostatic inline int memory_add_physaddr_to_nid(u64 start) 99bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto{ 100bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto return 0; 101bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto} 102bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto#endif 103bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Goto 104306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#ifdef CONFIG_HAVE_ARCH_NODEDATA_EXTENSION 105306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto/* 106306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * For supporting node-hotadd, we have to allocate a new pgdat. 107306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * 108306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * If an arch has generic style NODE_DATA(), 109306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * node_data[nid] = kzalloc() works well. But it depends on the architecture. 110306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * 111306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * In general, generic_alloc_nodedata() is used. 112306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * Now, arch_free_nodedata() is just defined for error path of node_hot_add. 113306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * 114306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto */ 115dd0932d9d4301bd58a4d5a634a3a8298c4fc5e24Yasunori Gotoextern pg_data_t *arch_alloc_nodedata(int nid); 116dd0932d9d4301bd58a4d5a634a3a8298c4fc5e24Yasunori Gotoextern void arch_free_nodedata(pg_data_t *pgdat); 1177049027c6f0098eb6b23b8f6ca65a905541faf81Yasunori Gotoextern void arch_refresh_nodedata(int nid, pg_data_t *pgdat); 118306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto 119306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#else /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */ 120306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto 121306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#define arch_alloc_nodedata(nid) generic_alloc_nodedata(nid) 122306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#define arch_free_nodedata(pgdat) generic_free_nodedata(pgdat) 123306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto 124306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#ifdef CONFIG_NUMA 125306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto/* 126306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * If ARCH_HAS_NODEDATA_EXTENSION=n, this func is used to allocate pgdat. 127306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * XXX: kmalloc_node() can't work well to get new node's memory at this time. 128306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * Because, pgdat for the new node is not allocated/initialized yet itself. 129306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * To use new node's memory, more consideration will be necessary. 130306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto */ 131306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#define generic_alloc_nodedata(nid) \ 132306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto({ \ 133306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto kzalloc(sizeof(pg_data_t), GFP_KERNEL); \ 134306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto}) 135306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto/* 136306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * This definition is just for error path in node hotadd. 137306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto * For node hotremove, we have to replace this. 138306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto */ 139306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#define generic_free_nodedata(pgdat) kfree(pgdat) 140306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto 14110ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Gotoextern pg_data_t *node_data[]; 14210ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Gotostatic inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat) 14310ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Goto{ 14410ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Goto node_data[nid] = pgdat; 14510ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Goto} 14610ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Goto 147306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#else /* !CONFIG_NUMA */ 148306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto 149306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto/* never called */ 150306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Gotostatic inline pg_data_t *generic_alloc_nodedata(int nid) 151306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto{ 152306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto BUG(); 153306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto return NULL; 154306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto} 155306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Gotostatic inline void generic_free_nodedata(pg_data_t *pgdat) 156306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto{ 157306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto} 15810ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Gotostatic inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat) 15910ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Goto{ 16010ad400b49aca15ecf83b0fde7e35e4064b15c85Yasunori Goto} 161306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#endif /* CONFIG_NUMA */ 162306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto#endif /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */ 163306d6cbe86e2e6603ac3162e1294d5c75cfdeca6Yasunori Goto 16404753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto#ifdef CONFIG_SPARSEMEM_VMEMMAP 16504753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Gotostatic inline void register_page_bootmem_info_node(struct pglist_data *pgdat) 16604753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto{ 16704753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto} 16804753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Gotostatic inline void put_page_bootmem(struct page *page) 16904753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto{ 17004753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto} 17104753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto#else 17204753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Gotoextern void register_page_bootmem_info_node(struct pglist_data *pgdat); 17304753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Gotoextern void put_page_bootmem(struct page *page); 17404753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto#endif 17504753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto 176925268a06dc2b1ff7bfcc37419a6827a0e739639KAMEZAWA Hiroyuki/* 177925268a06dc2b1ff7bfcc37419a6827a0e739639KAMEZAWA Hiroyuki * Lock for memory hotplug guarantees 1) all callbacks for memory hotplug 178925268a06dc2b1ff7bfcc37419a6827a0e739639KAMEZAWA Hiroyuki * notifier will be called under this. 2) offline/online/add/remove memory 179925268a06dc2b1ff7bfcc37419a6827a0e739639KAMEZAWA Hiroyuki * will not run simultaneously. 180925268a06dc2b1ff7bfcc37419a6827a0e739639KAMEZAWA Hiroyuki */ 181925268a06dc2b1ff7bfcc37419a6827a0e739639KAMEZAWA Hiroyuki 18220d6c96b5f1cad5c5da4641945ec17a1d9a1afc8KOSAKI Motohirovoid lock_memory_hotplug(void); 18320d6c96b5f1cad5c5da4641945ec17a1d9a1afc8KOSAKI Motohirovoid unlock_memory_hotplug(void); 18420d6c96b5f1cad5c5da4641945ec17a1d9a1afc8KOSAKI Motohiro 185208d54e5513c0c02d85af0990901354c74364d5cDave Hansen#else /* ! CONFIG_MEMORY_HOTPLUG */ 186208d54e5513c0c02d85af0990901354c74364d5cDave Hansen/* 187208d54e5513c0c02d85af0990901354c74364d5cDave Hansen * Stub functions for when hotplug is off 188208d54e5513c0c02d85af0990901354c74364d5cDave Hansen */ 189208d54e5513c0c02d85af0990901354c74364d5cDave Hansenstatic inline void pgdat_resize_lock(struct pglist_data *p, unsigned long *f) {} 190208d54e5513c0c02d85af0990901354c74364d5cDave Hansenstatic inline void pgdat_resize_unlock(struct pglist_data *p, unsigned long *f) {} 191208d54e5513c0c02d85af0990901354c74364d5cDave Hansenstatic inline void pgdat_resize_init(struct pglist_data *pgdat) {} 192bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen 193bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline unsigned zone_span_seqbegin(struct zone *zone) 194bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen{ 195bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen return 0; 196bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen} 197bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline int zone_span_seqretry(struct zone *zone, unsigned iv) 198bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen{ 199bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen return 0; 200bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen} 201bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline void zone_span_writelock(struct zone *zone) {} 202bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline void zone_span_writeunlock(struct zone *zone) {} 203bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansenstatic inline void zone_seqlock_init(struct zone *zone) {} 2043947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen 2053947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansenstatic inline int mhp_notimplemented(const char *func) 2063947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen{ 2073947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen printk(KERN_WARNING "%s() called, with CONFIG_MEMORY_HOTPLUG disabled\n", func); 2083947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen dump_stack(); 2093947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen return -ENOSYS; 2103947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen} 2113947be1969a9ce455ec30f60ef51efb10e4323d1Dave Hansen 21204753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Gotostatic inline void register_page_bootmem_info_node(struct pglist_data *pgdat) 21304753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto{ 21404753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto} 21504753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto 21620d6c96b5f1cad5c5da4641945ec17a1d9a1afc8KOSAKI Motohirostatic inline void lock_memory_hotplug(void) {} 21720d6c96b5f1cad5c5da4641945ec17a1d9a1afc8KOSAKI Motohirostatic inline void unlock_memory_hotplug(void) {} 21820d6c96b5f1cad5c5da4641945ec17a1d9a1afc8KOSAKI Motohiro 219bdc8cb984576ab5b550c8b24c6fa111a873503e3Dave Hansen#endif /* ! CONFIG_MEMORY_HOTPLUG */ 2209d99aaa31f5994d1923c3713ce9144c4c42332e1Andi Kleen 2215c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty#ifdef CONFIG_MEMORY_HOTREMOVE 2225c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty 2235c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavartyextern int is_mem_section_removable(unsigned long pfn, unsigned long nr_pages); 2245c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty 2255c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty#else 2265c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavartystatic inline int is_mem_section_removable(unsigned long pfn, 2275c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty unsigned long nr_pages) 2285c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty{ 2295c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty return 0; 2305c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty} 2315c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty#endif /* CONFIG_MEMORY_HOTREMOVE */ 2325c755e9fd813810680abd56ec09a5f90143e815bBadari Pulavarty 233cf23422b9d76215316855253da491d4c9f294372minskey guoextern int mem_online_node(int nid); 234bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Gotoextern int add_memory(int nid, u64 start, u64 size); 235bc02af93dd2bbddce1b55e0a493f833a1b7cf140Yasunori Gotoextern int arch_add_memory(int nid, u64 start, u64 size); 2369d99aaa31f5994d1923c3713ce9144c4c42332e1Andi Kleenextern int remove_memory(u64 start, u64 size); 237f28c5edc06ecd8068b38b7662ad19f4d20d741afKeith Manntheyextern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, 238f28c5edc06ecd8068b38b7662ad19f4d20d741afKeith Mannthey int nr_pages); 239ea01ea937dcae2caa146dea1918cccf2f16ed3c4Badari Pulavartyextern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms); 24004753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Gotoextern struct page *sparse_decode_mem_map(unsigned long coded_mem_map, 24104753278769f3b6c3b79a080edb52f21d83bf6e2Yasunori Goto unsigned long pnum); 2429d99aaa31f5994d1923c3713ce9144c4c42332e1Andi Kleen 243208d54e5513c0c02d85af0990901354c74364d5cDave Hansen#endif /* __LINUX_MEMORY_HOTPLUG_H */ 244