aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/memory_hotplug.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 979b18cbd343..484e86761b3e 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -77,6 +77,9 @@ static struct {
77#define memhp_lock_acquire() lock_map_acquire(&mem_hotplug.dep_map) 77#define memhp_lock_acquire() lock_map_acquire(&mem_hotplug.dep_map)
78#define memhp_lock_release() lock_map_release(&mem_hotplug.dep_map) 78#define memhp_lock_release() lock_map_release(&mem_hotplug.dep_map)
79 79
80bool memhp_auto_online;
81EXPORT_SYMBOL_GPL(memhp_auto_online);
82
80void get_online_mems(void) 83void get_online_mems(void)
81{ 84{
82 might_sleep(); 85 might_sleep();
@@ -1261,8 +1264,13 @@ int zone_for_memory(int nid, u64 start, u64 size, int zone_default,
1261 return zone_default; 1264 return zone_default;
1262} 1265}
1263 1266
1267static int online_memory_block(struct memory_block *mem, void *arg)
1268{
1269 return memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE);
1270}
1271
1264/* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ 1272/* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */
1265int __ref add_memory_resource(int nid, struct resource *res) 1273int __ref add_memory_resource(int nid, struct resource *res, bool online)
1266{ 1274{
1267 u64 start, size; 1275 u64 start, size;
1268 pg_data_t *pgdat = NULL; 1276 pg_data_t *pgdat = NULL;
@@ -1322,6 +1330,11 @@ int __ref add_memory_resource(int nid, struct resource *res)
1322 /* create new memmap entry */ 1330 /* create new memmap entry */
1323 firmware_map_add_hotplug(start, start + size, "System RAM"); 1331 firmware_map_add_hotplug(start, start + size, "System RAM");
1324 1332
1333 /* online pages if requested */
1334 if (online)
1335 walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1),
1336 NULL, online_memory_block);
1337
1325 goto out; 1338 goto out;
1326 1339
1327error: 1340error:
@@ -1345,7 +1358,7 @@ int __ref add_memory(int nid, u64 start, u64 size)
1345 if (IS_ERR(res)) 1358 if (IS_ERR(res))
1346 return PTR_ERR(res); 1359 return PTR_ERR(res);
1347 1360
1348 ret = add_memory_resource(nid, res); 1361 ret = add_memory_resource(nid, res, memhp_auto_online);
1349 if (ret < 0) 1362 if (ret < 0)
1350 release_memory_resource(res); 1363 release_memory_resource(res);
1351 return ret; 1364 return ret;