lkml.org 
[lkml]   [2010]   [May]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] permit to online CPUs before local memory comes online
Could you please help me review this patch and give me
some inputs ? such as, is it acceptable to do that,
I mean, online CPUs of a NUMA node without local
memory

The patch is against upstream vanilla kernel.

I mis-spelled the mail address of linux-mm when I sent
the email for the first time, please forgive me
if you receive two copies.


thanks,
-minskey


On 04/27/2010 12:57 PM, minskey wrote:
>
>
> This patch enables users to online CPUs even if the CPUs belongs to
> a numa node which doesn't have onlined local memory.
>
> The zonlists(pg_data_t.node_zonelists[]) of a numa node are created
> either in system boot/init period, or at the time of local memory
> online. For a numa node without onlined local memory, its zonelists
> are not initialized at present. As a result, any memory allocation
> operations executed by CPUs within this node will fail. In fact, an
> out-of-memory error is triggered when attempt to online CPUs before
> memory comes to online.
>
> This patch tries to create zonelists for such numa nodes, so that
> the memory allocation for this node can be fallback'ed to other
> nodes.
>
> Signed-off-by: minskey guo<chaohong.guo@intel.com>
> ---
> include/linux/memory_hotplug.h | 1 +
> kernel/cpu.c | 26 ++++++++++++++++++++++++++
> mm/memory_hotplug.c | 25 +++++++++++++++++++++++++
> 3 files changed, 52 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
> index 35b07b7..864035f 100644
> --- a/include/linux/memory_hotplug.h
> +++ b/include/linux/memory_hotplug.h
> @@ -202,6 +202,7 @@ static inline int is_mem_section_removable(unsigned long pfn,
> }
> #endif /* CONFIG_MEMORY_HOTREMOVE */
>
> +extern int mem_online_node(int nid);
> extern int add_memory(int nid, u64 start, u64 size);
> extern int arch_add_memory(int nid, u64 start, u64 size);
> extern int remove_memory(u64 start, u64 size);
> diff --git a/kernel/cpu.c b/kernel/cpu.c
> index f8cced2..c31b9cb 100644
> --- a/kernel/cpu.c
> +++ b/kernel/cpu.c
> @@ -335,6 +335,12 @@ out_notify:
> int __cpuinit cpu_up(unsigned int cpu)
> {
> int err = 0;
> +
> +#ifdef CONFIG_MEMORY_HOTPLUG
> + int nid;
> + pg_data_t *pgdat;
> +#endif
> +
> if (!cpu_possible(cpu)) {
> printk(KERN_ERR "can't online cpu %d because it is not "
> "configured as may-hotadd at boot time\n", cpu);
> @@ -345,6 +351,26 @@ int __cpuinit cpu_up(unsigned int cpu)
> return -EINVAL;
> }
>
> +#ifdef CONFIG_MEMORY_HOTPLUG
> + nid = cpu_to_node(cpu);
> + if (!node_online(nid)) {
> + err = mem_online_node(nid);
> + if (err)
> + return err;
> + }
> +
> + pgdat = NODE_DATA(nid);
> + if (!pgdat) {
> + printk(KERN_ERR
> + "Can't online cpu %d due to NULL pgdat\n", cpu);
> + return -ENOMEM;
> + }
> +
> + if (pgdat->node_zonelists->_zonerefs->zone == NULL) {
> + build_all_zonelists();
> + }
> +#endif
> +
> cpu_maps_update_begin();
>
> if (cpu_hotplug_disabled) {
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index be211a5..2d24bef 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -482,6 +482,31 @@ static void rollback_node_hotadd(int nid, pg_data_t *pgdat)
> }
>
>
> +/*
> + * called by cpu_up() to online a node without onlined memory.
> + */
> +int mem_online_node(int nid)
> +{
> + pg_data_t *pgdat;
> + int ret;
> +
> + lock_system_sleep();
> + pgdat = hotadd_new_pgdat(nid, 0);
> + if (pgdat) {
> + ret = -ENOMEM;
> + goto out;
> + }
> + node_set_online(nid);
> + ret = register_one_node(nid);
> + BUG_ON(ret);
> +
> +out:
> + unlock_system_sleep();
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(mem_online_node);
> +
> +
> /* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */
> int __ref add_memory(int nid, u64 start, u64 size)
> {



\
 
 \ /
  Last update: 2010-05-07 09:21    [W:0.038 / U:0.104 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site