Skip to content

Commit

Permalink
mm/memory_hotplug: allow to specify a default online_type
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Reviewed-by: Wei Yang <[email protected]>
Reviewed-by: Baoquan He <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Acked-by: Pankaj Gupta <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Oscar Salvador <[email protected]>
Cc: "Rafael J. Wysocki" <[email protected]>
Cc: Wei Yang <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Eduardo Habkost <[email protected]>
Cc: Haiyang Zhang <[email protected]>
Cc: Igor Mammedov <[email protected]>
Cc: "K. Y. Srinivasan" <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Stephen Hemminger <[email protected]>
Cc: Vitaly Kuznetsov <[email protected]>
Cc: Wei Liu <[email protected]>
Cc: Yumei Huang <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
davidhildenbrand authored and torvalds committed Apr 7, 2020
1 parent 862919e commit 5f47adf
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 10 deletions.
11 changes: 5 additions & 6 deletions drivers/base/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions include/linux/memory_hotplug.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
8 changes: 4 additions & 4 deletions mm/memory_hotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 5f47adf

Please sign in to comment.