diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memory_hotplug.c | 17 |
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 | ||
80 | bool memhp_auto_online; | ||
81 | EXPORT_SYMBOL_GPL(memhp_auto_online); | ||
82 | |||
80 | void get_online_mems(void) | 83 | void 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 | ||
1267 | static 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 */ |
1265 | int __ref add_memory_resource(int nid, struct resource *res) | 1273 | int __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 | ||
1327 | error: | 1340 | error: |
@@ -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; |