home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / memory_hotplug.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.3 KB  |  224 lines

  1. #ifndef __LINUX_MEMORY_HOTPLUG_H
  2. #define __LINUX_MEMORY_HOTPLUG_H
  3.  
  4. #include <linux/mmzone.h>
  5. #include <linux/spinlock.h>
  6. #include <linux/notifier.h>
  7.  
  8. struct page;
  9. struct zone;
  10. struct pglist_data;
  11. struct mem_section;
  12.  
  13. #ifdef CONFIG_MEMORY_HOTPLUG
  14.  
  15. /*
  16.  * Types for free bootmem.
  17.  * The normal smallest mapcount is -1. Here is smaller value than it.
  18.  */
  19. #define SECTION_INFO        (-1 - 1)
  20. #define MIX_SECTION_INFO    (-1 - 2)
  21. #define NODE_INFO        (-1 - 3)
  22.  
  23. /*
  24.  * pgdat resizing functions
  25.  */
  26. static inline
  27. void pgdat_resize_lock(struct pglist_data *pgdat, unsigned long *flags)
  28. {
  29.     spin_lock_irqsave(&pgdat->node_size_lock, *flags);
  30. }
  31. static inline
  32. void pgdat_resize_unlock(struct pglist_data *pgdat, unsigned long *flags)
  33. {
  34.     spin_unlock_irqrestore(&pgdat->node_size_lock, *flags);
  35. }
  36. static inline
  37. void pgdat_resize_init(struct pglist_data *pgdat)
  38. {
  39.     spin_lock_init(&pgdat->node_size_lock);
  40. }
  41. /*
  42.  * Zone resizing functions
  43.  */
  44. static inline unsigned zone_span_seqbegin(struct zone *zone)
  45. {
  46.     return read_seqbegin(&zone->span_seqlock);
  47. }
  48. static inline int zone_span_seqretry(struct zone *zone, unsigned iv)
  49. {
  50.     return read_seqretry(&zone->span_seqlock, iv);
  51. }
  52. static inline void zone_span_writelock(struct zone *zone)
  53. {
  54.     write_seqlock(&zone->span_seqlock);
  55. }
  56. static inline void zone_span_writeunlock(struct zone *zone)
  57. {
  58.     write_sequnlock(&zone->span_seqlock);
  59. }
  60. static inline void zone_seqlock_init(struct zone *zone)
  61. {
  62.     seqlock_init(&zone->span_seqlock);
  63. }
  64. extern int zone_grow_free_lists(struct zone *zone, unsigned long new_nr_pages);
  65. extern int zone_grow_waitqueues(struct zone *zone, unsigned long nr_pages);
  66. extern int add_one_highpage(struct page *page, int pfn, int bad_ppro);
  67. /* need some defines for these for archs that don't support it */
  68. extern void online_page(struct page *page);
  69. /* VM interface that may be used by firmware interface */
  70. extern int online_pages(unsigned long, unsigned long);
  71. extern void __offline_isolated_pages(unsigned long, unsigned long);
  72. extern int offline_pages(unsigned long, unsigned long, unsigned long);
  73.  
  74. /* reasonably generic interface to expand the physical pages in a zone  */
  75. extern int __add_pages(struct zone *zone, unsigned long start_pfn,
  76.     unsigned long nr_pages);
  77. extern int __remove_pages(struct zone *zone, unsigned long start_pfn,
  78.     unsigned long nr_pages);
  79.  
  80. #ifdef CONFIG_NUMA
  81. extern int memory_add_physaddr_to_nid(u64 start);
  82. #else
  83. static inline int memory_add_physaddr_to_nid(u64 start)
  84. {
  85.     return 0;
  86. }
  87. #endif
  88.  
  89. #ifdef CONFIG_HAVE_ARCH_NODEDATA_EXTENSION
  90. /*
  91.  * For supporting node-hotadd, we have to allocate a new pgdat.
  92.  *
  93.  * If an arch has generic style NODE_DATA(),
  94.  * node_data[nid] = kzalloc() works well. But it depends on the architecture.
  95.  *
  96.  * In general, generic_alloc_nodedata() is used.
  97.  * Now, arch_free_nodedata() is just defined for error path of node_hot_add.
  98.  *
  99.  */
  100. extern pg_data_t *arch_alloc_nodedata(int nid);
  101. extern void arch_free_nodedata(pg_data_t *pgdat);
  102. extern void arch_refresh_nodedata(int nid, pg_data_t *pgdat);
  103.  
  104. #else /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */
  105.  
  106. #define arch_alloc_nodedata(nid)    generic_alloc_nodedata(nid)
  107. #define arch_free_nodedata(pgdat)    generic_free_nodedata(pgdat)
  108.  
  109. #ifdef CONFIG_NUMA
  110. /*
  111.  * If ARCH_HAS_NODEDATA_EXTENSION=n, this func is used to allocate pgdat.
  112.  * XXX: kmalloc_node() can't work well to get new node's memory at this time.
  113.  *    Because, pgdat for the new node is not allocated/initialized yet itself.
  114.  *    To use new node's memory, more consideration will be necessary.
  115.  */
  116. #define generic_alloc_nodedata(nid)                \
  117. ({                                \
  118.     kzalloc(sizeof(pg_data_t), GFP_KERNEL);            \
  119. })
  120. /*
  121.  * This definition is just for error path in node hotadd.
  122.  * For node hotremove, we have to replace this.
  123.  */
  124. #define generic_free_nodedata(pgdat)    kfree(pgdat)
  125.  
  126. extern pg_data_t *node_data[];
  127. static inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat)
  128. {
  129.     node_data[nid] = pgdat;
  130. }
  131.  
  132. #else /* !CONFIG_NUMA */
  133.  
  134. /* never called */
  135. static inline pg_data_t *generic_alloc_nodedata(int nid)
  136. {
  137.     BUG();
  138.     return NULL;
  139. }
  140. static inline void generic_free_nodedata(pg_data_t *pgdat)
  141. {
  142. }
  143. static inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat)
  144. {
  145. }
  146. #endif /* CONFIG_NUMA */
  147. #endif /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */
  148.  
  149. #ifdef CONFIG_SPARSEMEM_VMEMMAP
  150. static inline void register_page_bootmem_info_node(struct pglist_data *pgdat)
  151. {
  152. }
  153. static inline void put_page_bootmem(struct page *page)
  154. {
  155. }
  156. #else
  157. extern void register_page_bootmem_info_node(struct pglist_data *pgdat);
  158. extern void put_page_bootmem(struct page *page);
  159. #endif
  160.  
  161. #else /* ! CONFIG_MEMORY_HOTPLUG */
  162. /*
  163.  * Stub functions for when hotplug is off
  164.  */
  165. static inline void pgdat_resize_lock(struct pglist_data *p, unsigned long *f) {}
  166. static inline void pgdat_resize_unlock(struct pglist_data *p, unsigned long *f) {}
  167. static inline void pgdat_resize_init(struct pglist_data *pgdat) {}
  168.  
  169. static inline unsigned zone_span_seqbegin(struct zone *zone)
  170. {
  171.     return 0;
  172. }
  173. static inline int zone_span_seqretry(struct zone *zone, unsigned iv)
  174. {
  175.     return 0;
  176. }
  177. static inline void zone_span_writelock(struct zone *zone) {}
  178. static inline void zone_span_writeunlock(struct zone *zone) {}
  179. static inline void zone_seqlock_init(struct zone *zone) {}
  180.  
  181. static inline int mhp_notimplemented(const char *func)
  182. {
  183.     printk(KERN_WARNING "%s() called, with CONFIG_MEMORY_HOTPLUG disabled\n", func);
  184.     dump_stack();
  185.     return -ENOSYS;
  186. }
  187.  
  188. static inline void register_page_bootmem_info_node(struct pglist_data *pgdat)
  189. {
  190. }
  191.  
  192. #endif /* ! CONFIG_MEMORY_HOTPLUG */
  193.  
  194. /*
  195.  * Walk through all memory which is registered as resource.
  196.  * arg is (start_pfn, nr_pages, private_arg_pointer)
  197.  */
  198. extern int walk_memory_resource(unsigned long start_pfn,
  199.             unsigned long nr_pages, void *arg,
  200.             int (*func)(unsigned long, unsigned long, void *));
  201.  
  202. #ifdef CONFIG_MEMORY_HOTREMOVE
  203.  
  204. extern int is_mem_section_removable(unsigned long pfn, unsigned long nr_pages);
  205.  
  206. #else
  207. static inline int is_mem_section_removable(unsigned long pfn,
  208.                     unsigned long nr_pages)
  209. {
  210.     return 0;
  211. }
  212. #endif /* CONFIG_MEMORY_HOTREMOVE */
  213.  
  214. extern int add_memory(int nid, u64 start, u64 size);
  215. extern int arch_add_memory(int nid, u64 start, u64 size);
  216. extern int remove_memory(u64 start, u64 size);
  217. extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
  218.                                 int nr_pages);
  219. extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
  220. extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map,
  221.                       unsigned long pnum);
  222.  
  223. #endif /* __LINUX_MEMORY_HOTPLUG_H */
  224.