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