History

mm/memory_hotplug: allow to specify a default online_type

For now, distributions implement advanced udev rules to essentially - Don't online any hotplugged memory (s390x) - Online all memory to ZONE_NORMAL (e.g., most virt environments like hyperv) - Online all memory to ZONE_MOVABLE in case the zone imbalance is taken care of (e.g., bare metal, special virt environments) In summary: All memory is usually onlined the same way, however, the kernel always has to ask user space to come up with the same answer. E.g., Hyper-V always waits for a memory block to get onlined before continuing, otherwise it might end up adding memory faster than onlining it, which can result in strange OOM situations. This waiting slows down adding of a bigger amount of memory. Let's allow to specify a default online_type, not just "online" and "offline". This allows distributions to configure the default online_type when booting up and be done with it. We can now specify "offline", "online", "online_movable" and "online_kernel" via - "memhp_default_state=" on the kernel cmdline - /sys/devices/system/memory/auto_online_blocks just like we are able to specify for a single memory block via /sys/devices/system/memory/memoryX/state

David Hildenbrand committed 6 years ago

Commit 5f47adf1 parent 862919e3 files · +11 −10Browse files

Unified · Split

3 files
  1. drivers/base/memory.c +5 −6
  2. include/linux/memory_hotplug.h +2 −0
  3. mm/memory_hotplug.c +4 −4
drivers/base/memory.c+5−6
@@ -34,7 +34,7 @@ static const char *const online_type_to_str[] = { · 33 unmodified lines
34 [MMOP_ONLINE_MOVABLE] = "online_movable",34 [MMOP_ONLINE_MOVABLE] = "online_movable",
35};35};
36 36
37static int memhp_online_type_from_str(const char *str)37int memhp_online_type_from_str(const char *str)
38{38{
39 int i;39 int i;
40 40
@@ -386,13 +386,12 @@ static ssize_t auto_online_blocks_store(struct device *dev, · 345 unmodified lines
386 struct device_attribute *attr,386 struct device_attribute *attr,
387 const char *buf, size_t count)387 const char *buf, size_t count)
388{388{
389 if (sysfs_streq(buf, "online"))389 const int online_type = memhp_online_type_from_str(buf);
390 memhp_default_online_type = MMOP_ONLINE;390
391 else if (sysfs_streq(buf, "offline"))391 if (online_type < 0)
392 memhp_default_online_type = MMOP_OFFLINE;
393 else
394 return -EINVAL;392 return -EINVAL;
395 393
394 memhp_default_online_type = online_type;
396 return count;395 return count;
397}396}
398 397
include/linux/memory_hotplug.h+2−0
@@ -117,6 +117,8 @@ extern int arch_add_memory(int nid, u64 start, u64 size, · 116 unmodified lines
117 struct mhp_restrictions *restrictions);117 struct mhp_restrictions *restrictions);
118extern u64 max_mem_size;118extern u64 max_mem_size;
119 119
120extern int memhp_online_type_from_str(const char *str);
121
120/* Default online_type (MMOP_*) when new memory blocks are added. */122/* Default online_type (MMOP_*) when new memory blocks are added. */
121extern int memhp_default_online_type;123extern int memhp_default_online_type;
122/* If movable_node boot option specified */124/* If movable_node boot option specified */
mm/memory_hotplug.c+4−4
@@ -74,10 +74,10 @@ int memhp_default_online_type = MMOP_ONLINE; · 73 unmodified lines
74 74
75static int __init setup_memhp_default_state(char *str)75static int __init setup_memhp_default_state(char *str)
76{76{
77 if (!strcmp(str, "online"))77 const int online_type = memhp_online_type_from_str(str);
78 memhp_default_online_type = MMOP_ONLINE;78
79 else if (!strcmp(str, "offline"))79 if (online_type >= 0)
80 memhp_default_online_type = MMOP_OFFLINE;80 memhp_default_online_type = online_type;
81 81
82 return 1;82 return 1;
83}83}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t