diff options
Diffstat (limited to 'include/linux/memory_hotplug.h')
-rw-r--r-- | include/linux/memory_hotplug.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 29c1472efad..c6fd2c0323f 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h | |||
@@ -73,6 +73,61 @@ static inline int memory_add_physaddr_to_nid(u64 start) | |||
73 | } | 73 | } |
74 | #endif | 74 | #endif |
75 | 75 | ||
76 | #ifdef CONFIG_HAVE_ARCH_NODEDATA_EXTENSION | ||
77 | /* | ||
78 | * For supporting node-hotadd, we have to allocate a new pgdat. | ||
79 | * | ||
80 | * If an arch has generic style NODE_DATA(), | ||
81 | * node_data[nid] = kzalloc() works well. But it depends on the architecture. | ||
82 | * | ||
83 | * In general, generic_alloc_nodedata() is used. | ||
84 | * Now, arch_free_nodedata() is just defined for error path of node_hot_add. | ||
85 | * | ||
86 | */ | ||
87 | static inline pg_data_t *arch_alloc_nodedata(int nid) | ||
88 | { | ||
89 | return NULL; | ||
90 | } | ||
91 | static inline void arch_free_nodedata(pg_data_t *pgdat) | ||
92 | { | ||
93 | } | ||
94 | |||
95 | #else /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */ | ||
96 | |||
97 | #define arch_alloc_nodedata(nid) generic_alloc_nodedata(nid) | ||
98 | #define arch_free_nodedata(pgdat) generic_free_nodedata(pgdat) | ||
99 | |||
100 | #ifdef CONFIG_NUMA | ||
101 | /* | ||
102 | * If ARCH_HAS_NODEDATA_EXTENSION=n, this func is used to allocate pgdat. | ||
103 | * XXX: kmalloc_node() can't work well to get new node's memory at this time. | ||
104 | * Because, pgdat for the new node is not allocated/initialized yet itself. | ||
105 | * To use new node's memory, more consideration will be necessary. | ||
106 | */ | ||
107 | #define generic_alloc_nodedata(nid) \ | ||
108 | ({ \ | ||
109 | kzalloc(sizeof(pg_data_t), GFP_KERNEL); \ | ||
110 | }) | ||
111 | /* | ||
112 | * This definition is just for error path in node hotadd. | ||
113 | * For node hotremove, we have to replace this. | ||
114 | */ | ||
115 | #define generic_free_nodedata(pgdat) kfree(pgdat) | ||
116 | |||
117 | #else /* !CONFIG_NUMA */ | ||
118 | |||
119 | /* never called */ | ||
120 | static inline pg_data_t *generic_alloc_nodedata(int nid) | ||
121 | { | ||
122 | BUG(); | ||
123 | return NULL; | ||
124 | } | ||
125 | static inline void generic_free_nodedata(pg_data_t *pgdat) | ||
126 | { | ||
127 | } | ||
128 | #endif /* CONFIG_NUMA */ | ||
129 | #endif /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */ | ||
130 | |||
76 | #else /* ! CONFIG_MEMORY_HOTPLUG */ | 131 | #else /* ! CONFIG_MEMORY_HOTPLUG */ |
77 | /* | 132 | /* |
78 | * Stub functions for when hotplug is off | 133 | * Stub functions for when hotplug is off |