[IA64] add init declaration to memory initialization functions
[deliverable/linux.git] / arch / ia64 / mm / discontig.c
index a3788fb84809a0c1c1f565f853d639bb219290e0..2f5e44862e9116b492055f012e72ff2710924eca 100644 (file)
@@ -50,8 +50,10 @@ static nodemask_t memory_less_mask __initdata;
  * To prevent cache aliasing effects, align per-node structures so that they
  * start at addresses that are strided by node number.
  */
+#define MAX_NODE_ALIGN_OFFSET  (32 * 1024 * 1024)
 #define NODEDATA_ALIGN(addr, node)                                             \
-       ((((addr) + 1024*1024-1) & ~(1024*1024-1)) + (node)*PERCPU_PAGE_SIZE)
+       ((((addr) + 1024*1024-1) & ~(1024*1024-1)) +                            \
+            (((node)*PERCPU_PAGE_SIZE) & (MAX_NODE_ALIGN_OFFSET - 1)))
 
 /**
  * build_node_maps - callback to setup bootmem structs for each node
@@ -350,14 +352,12 @@ static void __init initialize_pernode_data(void)
  *     for best.
  * @nid: node id
  * @pernodesize: size of this node's pernode data
- * @align: alignment to use for this node's pernode data
  */
-static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize,
-       unsigned long align)
+static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize)
 {
        void *ptr = NULL;
        u8 best = 0xff;
-       int bestnode = -1, node;
+       int bestnode = -1, node, anynode = 0;
 
        for_each_online_node(node) {
                if (node_isset(node, memory_less_mask))
@@ -366,13 +366,15 @@ static void __init *memory_less_node_alloc(int nid, unsigned long pernodesize,
                        best = node_distance(nid, node);
                        bestnode = node;
                }
+               anynode = node;
        }
 
-       ptr = __alloc_bootmem_node(mem_data[bestnode].pgdat,
-               pernodesize, align, __pa(MAX_DMA_ADDRESS));
+       if (bestnode == -1)
+               bestnode = anynode;
+
+       ptr = __alloc_bootmem_node(mem_data[bestnode].pgdat, pernodesize,
+               PERCPU_PAGE_SIZE, __pa(MAX_DMA_ADDRESS));
 
-       if (!ptr)
-               panic("NO memory for memory less node\n");
        return ptr;
 }
 
@@ -413,8 +415,7 @@ static void __init memory_less_nodes(void)
 
        for_each_node_mask(node, memory_less_mask) {
                pernodesize = compute_pernodesize(node);
-               pernode = memory_less_node_alloc(node, pernodesize,
-                       (node) ? (node * PERCPU_PAGE_SIZE) : (1024*1024));
+               pernode = memory_less_node_alloc(node, pernodesize);
                fill_pernode(node, __pa(pernode), pernodesize);
        }
 
@@ -524,15 +525,20 @@ void __init find_memory(void)
  * find_pernode_space() does most of this already, we just need to set
  * local_per_cpu_offset
  */
-void *per_cpu_init(void)
+void __cpuinit *per_cpu_init(void)
 {
        int cpu;
+       static int first_time = 1;
+
 
        if (smp_processor_id() != 0)
                return __per_cpu_start + __per_cpu_offset[smp_processor_id()];
 
-       for (cpu = 0; cpu < NR_CPUS; cpu++)
-               per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu];
+       if (first_time) {
+               first_time = 0;
+               for (cpu = 0; cpu < NR_CPUS; cpu++)
+                       per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu];
+       }
 
        return __per_cpu_start + __per_cpu_offset[smp_processor_id()];
 }
@@ -555,9 +561,13 @@ void show_mem(void)
        show_free_areas();
        printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
        for_each_pgdat(pgdat) {
-               unsigned long present = pgdat->node_present_pages;
+               unsigned long present;
+               unsigned long flags;
                int shared = 0, cached = 0, reserved = 0;
+
                printk("Node ID: %d\n", pgdat->node_id);
+               pgdat_resize_lock(pgdat, &flags);
+               present = pgdat->node_present_pages;
                for(i = 0; i < pgdat->node_spanned_pages; i++) {
                        struct page *page;
                        if (pfn_valid(pgdat->node_start_pfn + i))
@@ -571,6 +581,7 @@ void show_mem(void)
                        else if (page_count(page))
                                shared += page_count(page)-1;
                }
+               pgdat_resize_unlock(pgdat, &flags);
                total_present += present;
                total_reserved += reserved;
                total_cached += cached;
This page took 0.024771 seconds and 5 git commands to generate.