From: Alastair D'Silva <alastair@xxxxxxxxxxx> If an external driver module supplies physical memory and needs to expose the memory on a specific NUMA node, it needs to be able to call try_online_node to allocate the data structures for the node. The previous assertion that all callers want to online the node, and that the provided memory address starts at 0 is no longer true, so these parameters must alse be exposed. Signed-off-by: Alastair D'Silva <alastair@xxxxxxxxxxx> --- include/linux/memory_hotplug.h | 4 ++-- kernel/cpu.c | 2 +- mm/memory_hotplug.c | 20 +++++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index ae892eef8b82..9272e7955541 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -109,7 +109,7 @@ extern void __online_page_set_limits(struct page *page); extern void __online_page_increment_counters(struct page *page); extern void __online_page_free(struct page *page); -extern int try_online_node(int nid); +int try_online_node(int nid, u64 start, bool set_node_online); extern int arch_add_memory(int nid, u64 start, u64 size, struct mhp_restrictions *restrictions); @@ -274,7 +274,7 @@ static inline void register_page_bootmem_info_node(struct pglist_data *pgdat) { } -static inline int try_online_node(int nid) +static inline int try_online_node(int nid, u64 start, bool set_node_online) { return 0; } diff --git a/kernel/cpu.c b/kernel/cpu.c index 077fde6fb953..ffe5f7239a5c 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -1167,7 +1167,7 @@ static int do_cpu_up(unsigned int cpu, enum cpuhp_state target) return -EINVAL; } - err = try_online_node(cpu_to_node(cpu)); + err = try_online_node(cpu_to_node(cpu), 0, true); if (err) return err; diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 382b3a0c9333..9c2784f89e60 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1004,7 +1004,7 @@ static void rollback_node_hotadd(int nid) /** - * try_online_node - online a node if offlined + * __try_online_node - online a node if offlined * @nid: the node ID * @start: start addr of the node * @set_node_online: Whether we want to online the node @@ -1039,18 +1039,28 @@ static int __try_online_node(int nid, u64 start, bool set_node_online) return ret; } -/* - * Users of this function always want to online/register the node +/** + * try_online_node - online a node if offlined + * @nid: the node ID + * @start: start addr of the node + * @set_node_online: Whether we want to online the node + * called by cpu_up() to online a node without onlined memory. + * + * Returns: + * 1 -> a new node has been allocated + * 0 -> the node is already online + * -ENOMEM -> the node could not be allocated */ -int try_online_node(int nid) +int try_online_node(int nid, u64 start, bool set_node_online) { int ret; mem_hotplug_begin(); - ret = __try_online_node(nid, 0, true); + ret = __try_online_node(nid, start, set_node_online); mem_hotplug_done(); return ret; } +EXPORT_SYMBOL_GPL(try_online_node); static int check_hotplug_memory_range(u64 start, u64 size) { -- 2.21.0