Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@
 */
struct early_node_data {
	struct ia64_node_data *node_data;
	pg_data_t *pgdat;
	unsigned long pernode_addr;
	unsigned long pernode_size;
	struct bootmem_data bootmem_data;
@@ -46,6 +45,8 @@ struct early_node_data {
static struct early_node_data mem_data[MAX_NUMNODES] __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
 * start at addresses that are strided by node number.
@@ -175,13 +176,13 @@ static void __init fill_pernode(int node, unsigned long pernode,
	pernode += PERCPU_PAGE_SIZE * cpus;
	pernode += node * L1_CACHE_BYTES;

	mem_data[node].pgdat = __va(pernode);
	pgdat_list[node] = __va(pernode);
	pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));

	mem_data[node].node_data = __va(pernode);
	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));

	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,
static int __init free_node_bootmem(unsigned long start, unsigned long len,
				    int node)
{
	free_bootmem_node(mem_data[node].pgdat, start, len);
	free_bootmem_node(pgdat_list[node], start, len);

	return 0;
}
@@ -287,7 +288,7 @@ static void __init reserve_pernode_space(void)
	int 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))
			continue;
@@ -317,12 +318,8 @@ static void __init reserve_pernode_space(void)
 */
static void __init initialize_pernode_data(void)
{
	pg_data_t *pgdat_list[MAX_NUMNODES];
	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 */
	for_each_online_node(node) {
		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)
	if (bestnode == -1)
		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));

	return ptr;
@@ -476,7 +473,7 @@ void __init find_memory(void)
		pernodesize = mem_data[node].pernode_size;
		map = pernode + pernodesize;

		init_bootmem_node(mem_data[node].pgdat,
		init_bootmem_node(pgdat_list[node],
				  map>>PAGE_SHIFT,
				  bdp->node_boot_start>>PAGE_SHIFT,
				  bdp->node_low_pfn);