[IA64] Fix build breakage
authorTony Luck <tony.luck@intel.com>
Thu, 27 May 2010 22:35:13 +0000 (15:35 -0700)
committerTony Luck <tony.luck@intel.com>
Thu, 27 May 2010 22:35:13 +0000 (15:35 -0700)
In commit 0ac0c0d0f837c499afd02a802f9cf52d3027fa3b
cpusets: randomize node rotor used in cpuset_mem_spread_node()

Jack Steiner fixed a problem with too many small tasks being
assigned to node 0. Copy his code to ia64 to avoid build error.

    arch/ia64/kernel/smpboot.c:641: error: ‘cpu_to_node_map’ undeclared (first use in this function)

In commit 3bccd996276b108c138e8176793a26ecef54d573
numa: ia64: use generic percpu var numa_node_id() implementation

Lee Schermerhorn added some set_numa_node() calls - but these
only work on CONFIG_NUMA=y configurations. Surround the calls
with #ifdef CONFIG_NUMA

Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/kernel/smpboot.c
arch/ia64/mm/numa.c

index 518e876a410da1467608d4ea20ed03c2f606def4..6a1380e90f874b54573d880e72c9c46b88661fe7 100644 (file)
@@ -390,11 +390,13 @@ smp_callin (void)
 
        fix_b0_for_bsp();
 
+#ifdef CONFIG_NUMA
        /*
         * numa_node_id() works after this.
         */
        set_numa_node(cpu_to_node_map[cpuid]);
        set_numa_mem(local_memory_node(cpu_to_node_map[cpuid]));
+#endif
 
        ipi_call_lock_irq();
        spin_lock(&vector_lock);
@@ -638,7 +640,9 @@ void __devinit smp_prepare_boot_cpu(void)
 {
        cpu_set(smp_processor_id(), cpu_online_map);
        cpu_set(smp_processor_id(), cpu_callin_map);
+#ifdef CONFIG_NUMA
        set_numa_node(cpu_to_node_map[smp_processor_id()]);
+#endif
        per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
        paravirt_post_smp_prepare_boot_cpu();
 }
index 3efea7d0a351c5159d5e843406e744fe0948a33d..2437718bd6b16c27027f1d2bba3060fd45bf8862 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/init.h>
 #include <linux/bootmem.h>
 #include <linux/module.h>
+#include <linux/random.h>
 #include <asm/mmzone.h>
 #include <asm/numa.h>
 
@@ -50,6 +51,22 @@ paddr_to_nid(unsigned long paddr)
        return (i < num_node_memblks) ? node_memblk[i].nid : (num_node_memblks ? -1 : 0);
 }
 
+/*
+ * Return the bit number of a random bit set in the nodemask.
+ *   (returns -1 if nodemask is empty)
+ */
+int __node_random(const nodemask_t *maskp)
+{
+       int w, bit = -1;
+
+       w = nodes_weight(*maskp);
+       if (w)
+               bit = bitmap_ord_to_pos(maskp->bits,
+                       get_random_int() % w, MAX_NUMNODES);
+       return bit;
+}
+EXPORT_SYMBOL(__node_random);
+
 #if defined(CONFIG_SPARSEMEM) && defined(CONFIG_NUMA)
 /*
  * Because of holes evaluate on section limits.