Commit ae5a2c1c authored by Yasunori Goto's avatar Yasunori Goto Committed by Linus Torvalds

[PATCH] pgdat allocation and update for ia64 of memory hotplug: hold pgdat...

[PATCH] pgdat allocation and update for ia64 of memory hotplug: hold pgdat address at system running

This is a preparatory patch to make common code for updating of NODE_DATA() of
ia64 between boottime and hotplug.

Current code remembers pgdat address in mem_data which is used at just boot
time.  But its information can be used at hotplug time by moving to global
value.  The next patch uses this array.
Signed-off-by: default avatarYasunori Goto <y-goto@jp.fujitsu.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0fc44159
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
*/ */
struct early_node_data { struct early_node_data {
struct ia64_node_data *node_data; struct ia64_node_data *node_data;
pg_data_t *pgdat;
unsigned long pernode_addr; unsigned long pernode_addr;
unsigned long pernode_size; unsigned long pernode_size;
struct bootmem_data bootmem_data; struct bootmem_data bootmem_data;
...@@ -46,6 +45,8 @@ struct early_node_data { ...@@ -46,6 +45,8 @@ struct early_node_data {
static struct early_node_data mem_data[MAX_NUMNODES] __initdata; static struct early_node_data mem_data[MAX_NUMNODES] __initdata;
static nodemask_t memory_less_mask __initdata; static nodemask_t memory_less_mask __initdata;
static pg_data_t *pgdat_list[MAX_NUMNODES];
/* /*
* To prevent cache aliasing effects, align per-node structures so that they * To prevent cache aliasing effects, align per-node structures so that they
* start at addresses that are strided by node number. * start at addresses that are strided by node number.
...@@ -175,13 +176,13 @@ static void __init fill_pernode(int node, unsigned long pernode, ...@@ -175,13 +176,13 @@ static void __init fill_pernode(int node, unsigned long pernode,
pernode += PERCPU_PAGE_SIZE * cpus; pernode += PERCPU_PAGE_SIZE * cpus;
pernode += node * L1_CACHE_BYTES; pernode += node * L1_CACHE_BYTES;
mem_data[node].pgdat = __va(pernode); pgdat_list[node] = __va(pernode);
pernode += L1_CACHE_ALIGN(sizeof(pg_data_t)); pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
mem_data[node].node_data = __va(pernode); mem_data[node].node_data = __va(pernode);
pernode += L1_CACHE_ALIGN(sizeof(struct ia64_node_data)); pernode += L1_CACHE_ALIGN(sizeof(struct ia64_node_data));
mem_data[node].pgdat->bdata = bdp; pgdat_list[node]->bdata = bdp;
pernode += L1_CACHE_ALIGN(sizeof(pg_data_t)); pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
cpu_data = per_cpu_node_setup(cpu_data, node); cpu_data = per_cpu_node_setup(cpu_data, node);
...@@ -268,7 +269,7 @@ static int __init find_pernode_space(unsigned long start, unsigned long len, ...@@ -268,7 +269,7 @@ static int __init find_pernode_space(unsigned long start, unsigned long len,
static int __init free_node_bootmem(unsigned long start, unsigned long len, static int __init free_node_bootmem(unsigned long start, unsigned long len,
int node) int node)
{ {
free_bootmem_node(mem_data[node].pgdat, start, len); free_bootmem_node(pgdat_list[node], start, len);
return 0; return 0;
} }
...@@ -287,7 +288,7 @@ static void __init reserve_pernode_space(void) ...@@ -287,7 +288,7 @@ static void __init reserve_pernode_space(void)
int node; int node;
for_each_online_node(node) { for_each_online_node(node) {
pg_data_t *pdp = mem_data[node].pgdat; pg_data_t *pdp = pgdat_list[node];
if (node_isset(node, memory_less_mask)) if (node_isset(node, memory_less_mask))
continue; continue;
...@@ -317,12 +318,8 @@ static void __init reserve_pernode_space(void) ...@@ -317,12 +318,8 @@ static void __init reserve_pernode_space(void)
*/ */
static void __init initialize_pernode_data(void) static void __init initialize_pernode_data(void)
{ {
pg_data_t *pgdat_list[MAX_NUMNODES];
int cpu, node; int cpu, node;
for_each_online_node(node)
pgdat_list[node] = mem_data[node].pgdat;
/* Copy the pg_data_t list to each node and init the node field */ /* Copy the pg_data_t list to each node and init the node field */
for_each_online_node(node) { for_each_online_node(node) {
memcpy(mem_data[node].node_data->pg_data_ptrs, pgdat_list, memcpy(mem_data[node].node_data->pg_data_ptrs, pgdat_list,
...@@ -372,7 +369,7 @@ static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize) ...@@ -372,7 +369,7 @@ static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize)
if (bestnode == -1) if (bestnode == -1)
bestnode = anynode; bestnode = anynode;
ptr = __alloc_bootmem_node(mem_data[bestnode].pgdat, pernodesize, ptr = __alloc_bootmem_node(pgdat_list[bestnode], pernodesize,
PERCPU_PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); PERCPU_PAGE_SIZE, __pa(MAX_DMA_ADDRESS));
return ptr; return ptr;
...@@ -476,7 +473,7 @@ void __init find_memory(void) ...@@ -476,7 +473,7 @@ void __init find_memory(void)
pernodesize = mem_data[node].pernode_size; pernodesize = mem_data[node].pernode_size;
map = pernode + pernodesize; map = pernode + pernodesize;
init_bootmem_node(mem_data[node].pgdat, init_bootmem_node(pgdat_list[node],
map>>PAGE_SHIFT, map>>PAGE_SHIFT,
bdp->node_boot_start>>PAGE_SHIFT, bdp->node_boot_start>>PAGE_SHIFT,
bdp->node_low_pfn); bdp->node_low_pfn);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment