}
 }
 
+static void __meminit scatter_node_data(void)
+{
+       pg_data_t **dst;
+       int node;
+
+       for_each_online_node(node) {
+               dst = LOCAL_DATA_ADDR(pgdat_list[node])->pg_data_ptrs;
+               memcpy(dst, pgdat_list, sizeof(pgdat_list));
+       }
+}
+
 /**
  * initialize_pernode_data - fixup per-cpu & per-node pointers
  *
 {
        int cpu, node;
 
-       /* 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,
-                      sizeof(pgdat_list));
-       }
+       scatter_node_data();
+
 #ifdef CONFIG_SMP
        /* Set the node_data pointer for each per-cpu struct */
        for (cpu = 0; cpu < NR_CPUS; cpu++) {
 
        zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page));
 }
+
+void arch_refresh_nodedata(int update_node, pg_data_t *update_pgdat)
+{
+       pgdat_list[update_node] = update_pgdat;
+       scatter_node_data();
+}
 
  */
 #define NODE_DATA(nid)         (local_node_data->pg_data_ptrs[nid])
 
+/*
+ * LOCAL_DATA_ADDR - This is to calculate the address of other node's
+ *                  "local_node_data" at hot-plug phase. The local_node_data
+ *                  is pointed by per_cpu_page. Kernel usually use it for
+ *                  just executing cpu. However, when new node is hot-added,
+ *                  the addresses of local data for other nodes are necessary
+ *                  to update all of them.
+ */
+#define LOCAL_DATA_ADDR(pgdat)                         \
+       ((struct ia64_node_data *)((u64)(pgdat) +       \
+                                  L1_CACHE_ALIGN(sizeof(struct pglist_data))))
+
 #endif /* CONFIG_NUMA */
 
 #endif /* _ASM_IA64_NODEDATA_H */
 
 static inline void arch_free_nodedata(pg_data_t *pgdat)
 {
 }
-static inline void arch_refresh_nodedata(int nid, pg_data_t *pgdat)
-{
-}
+extern void arch_refresh_nodedata(int nid, pg_data_t *pgdat);
 
 #else /* CONFIG_HAVE_ARCH_NODEDATA_EXTENSION */