]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mm/memory_hotplug: allow to specify a default online_type
authorDavid Hildenbrand <david@redhat.com>
Tue, 7 Apr 2020 03:07:44 +0000 (20:07 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 7 Apr 2020 17:43:41 +0000 (10:43 -0700)
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>
drivers/base/memory.c
include/linux/memory_hotplug.h
mm/memory_hotplug.c

index 7d2f829d00d7c429fd8fa06d3e160c5977a75665..dbec3a05590a5163da41494e2b434808688afbe7 100644 (file)
@@ -34,7 +34,7 @@ static const char *const online_type_to_str[] = {
        [MMOP_ONLINE_MOVABLE] = "online_movable",
 };
 
-static int memhp_online_type_from_str(const char *str)
+int memhp_online_type_from_str(const char *str)
 {
        int i;
 
@@ -386,13 +386,12 @@ static ssize_t auto_online_blocks_store(struct device *dev,
                                        struct device_attribute *attr,
                                        const char *buf, size_t count)
 {
-       if (sysfs_streq(buf, "online"))
-               memhp_default_online_type = MMOP_ONLINE;
-       else if (sysfs_streq(buf, "offline"))
-               memhp_default_online_type = MMOP_OFFLINE;
-       else
+       const int online_type = memhp_online_type_from_str(buf);
+
+       if (online_type < 0)
                return -EINVAL;
 
+       memhp_default_online_type = online_type;
        return count;
 }
 
index c6e090b34c4b043a84f6b8f23834743ce0e2046d..ef55115320fb9192bb0c69b2c01ec1005ce7942c 100644 (file)
@@ -117,6 +117,8 @@ extern int arch_add_memory(int nid, u64 start, u64 size,
                        struct mhp_restrictions *restrictions);
 extern u64 max_mem_size;
 
+extern int memhp_online_type_from_str(const char *str);
+
 /* Default online_type (MMOP_*) when new memory blocks are added. */
 extern int memhp_default_online_type;
 /* If movable_node boot option specified */
index 9436f7e6257a835b896e47aae31fbd93f32fcea1..2fb78c5ebaf335de6f5c7b16be5c294034b126da 100644 (file)
@@ -74,10 +74,10 @@ int memhp_default_online_type = MMOP_ONLINE;
 
 static int __init setup_memhp_default_state(char *str)
 {
-       if (!strcmp(str, "online"))
-               memhp_default_online_type = MMOP_ONLINE;
-       else if (!strcmp(str, "offline"))
-               memhp_default_online_type = MMOP_OFFLINE;
+       const int online_type = memhp_online_type_from_str(str);
+
+       if (online_type >= 0)
+               memhp_default_online_type = online_type;
 
        return 1;
 }