Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

Signed-off-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Wei Yang <richard.weiyang@gmail.com>
Reviewed-by: Baoquan He <bhe@redhat.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: Wei Liu <wei.liu@kernel.org>
Cc: Yumei Huang <yuhuang@redhat.com>
Link: http://lkml.kernel.org/r/20200317104942.11178-9-david@redhat.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

David Hildenbrand and committed by
Linus Torvalds
5f47adf7 862919e5

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