]> err.no Git - linux-2.6/blobdiff - arch/ia64/mm/discontig.c
[PATCH] fix MAX_USER_RT_PRIO and MAX_RT_PRIO
[linux-2.6] / arch / ia64 / mm / discontig.c
index 54136fd0020232c15309b54f58d2af8b6fde7dd5..b5c90e54819542691785b8cc64e250a39d93f260 100644 (file)
@@ -125,6 +125,33 @@ static unsigned long __init compute_pernodesize(int node)
        return pernodesize;
 }
 
+/**
+ * per_cpu_node_setup - setup per-cpu areas on each node
+ * @cpu_data: per-cpu area on this node
+ * @node: node to setup
+ *
+ * Copy the static per-cpu data into the region we just set aside and then
+ * setup __per_cpu_offset for each CPU on this node.  Return a pointer to
+ * the end of the area.
+ */
+static void *per_cpu_node_setup(void *cpu_data, int node)
+{
+#ifdef CONFIG_SMP
+       int cpu;
+
+       for (cpu = 0; cpu < NR_CPUS; cpu++) {
+               if (node == node_cpuid[cpu].nid) {
+                       memcpy(__va(cpu_data), __phys_per_cpu_start,
+                              __per_cpu_end - __per_cpu_start);
+                       __per_cpu_offset[cpu] = (char*)__va(cpu_data) -
+                               __per_cpu_start;
+                       cpu_data += PERCPU_PAGE_SIZE;
+               }
+       }
+#endif
+       return cpu_data;
+}
+
 /**
  * fill_pernode - initialize pernode data.
  * @node: the node id.
@@ -135,7 +162,7 @@ static void __init fill_pernode(int node, unsigned long pernode,
        unsigned long pernodesize)
 {
        void *cpu_data;
-       int cpus = early_nr_cpus_node(node), cpu;
+       int cpus = early_nr_cpus_node(node);
        struct bootmem_data *bdp = &mem_data[node].bootmem_data;
 
        mem_data[node].pernode_addr = pernode;
@@ -155,23 +182,11 @@ static void __init fill_pernode(int node, unsigned long pernode,
        mem_data[node].pgdat->bdata = bdp;
        pernode += L1_CACHE_ALIGN(sizeof(pg_data_t));
 
-       /*
-        * Copy the static per-cpu data into the region we
-        * just set aside and then setup __per_cpu_offset
-        * for each CPU on this node.
-        */
-       for (cpu = 0; cpu < NR_CPUS; cpu++) {
-               if (node == node_cpuid[cpu].nid) {
-                       memcpy(__va(cpu_data), __phys_per_cpu_start,
-                              __per_cpu_end - __per_cpu_start);
-                       __per_cpu_offset[cpu] = (char*)__va(cpu_data) -
-                               __per_cpu_start;
-                       cpu_data += PERCPU_PAGE_SIZE;
-               }
-       }
+       cpu_data = per_cpu_node_setup(cpu_data, node);
 
        return;
 }
+
 /**
  * find_pernode_space - allocate memory for memory map and per-node structures
  * @start: physical start of range
@@ -300,8 +315,8 @@ static void __init reserve_pernode_space(void)
  */
 static void __init initialize_pernode_data(void)
 {
-       int cpu, node;
        pg_data_t *pgdat_list[MAX_NUMNODES];
+       int cpu, node;
 
        for_each_online_node(node)
                pgdat_list[node] = mem_data[node].pgdat;
@@ -311,12 +326,22 @@ static void __init initialize_pernode_data(void)
                memcpy(mem_data[node].node_data->pg_data_ptrs, pgdat_list,
                       sizeof(pgdat_list));
        }
-
+#ifdef CONFIG_SMP
        /* Set the node_data pointer for each per-cpu struct */
        for (cpu = 0; cpu < NR_CPUS; cpu++) {
                node = node_cpuid[cpu].nid;
                per_cpu(cpu_info, cpu).node_data = mem_data[node].node_data;
        }
+#else
+       {
+               struct cpuinfo_ia64 *cpu0_cpu_info;
+               cpu = 0;
+               node = node_cpuid[cpu].nid;
+               cpu0_cpu_info = (struct cpuinfo_ia64 *)(__phys_per_cpu_start +
+                       ((char *)&per_cpu__cpu_info - __per_cpu_start));
+               cpu0_cpu_info->node_data = mem_data[node].node_data;
+       }
+#endif /* CONFIG_SMP */
 }
 
 /**
@@ -461,6 +486,7 @@ void __init find_memory(void)
        find_initrd();
 }
 
+#ifdef CONFIG_SMP
 /**
  * per_cpu_init - setup per-cpu variables
  *
@@ -471,15 +497,15 @@ void *per_cpu_init(void)
 {
        int cpu;
 
-       if (smp_processor_id() == 0) {
-               for (cpu = 0; cpu < NR_CPUS; cpu++) {
-                       per_cpu(local_per_cpu_offset, cpu) =
-                               __per_cpu_offset[cpu];
-               }
-       }
+       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];
 
        return __per_cpu_start + __per_cpu_offset[smp_processor_id()];
 }
+#endif /* CONFIG_SMP */
 
 /**
  * show_mem - give short summary of memory stats