sparc64: Use function pointer for cross-call sending.
authorDavid S. Miller <davem@davemloft.net>
Mon, 4 Aug 2008 05:52:41 +0000 (22:52 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Aug 2008 20:51:37 +0000 (13:51 -0700)
Initialize it using the smp_setup_processor_id() hook.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/smp.c

index 340842e51ce131d5c3797e89eb376335e92e3374..3c6970ad774fd2b093a06cd9b0e8cc512dc6dabe 100644 (file)
@@ -756,6 +756,8 @@ dump_cpu_list_and_out:
        printk("]\n");
 }
 
+static void (*xcall_deliver)(u64, u64, u64, cpumask_t);
+
 /* Send cross call to all processors mentioned in MASK
  * except self.
  */
@@ -767,12 +769,7 @@ static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 d
        cpus_and(mask, mask, cpu_online_map);
        cpu_clear(this_cpu, mask);
 
-       if (tlb_type == spitfire)
-               spitfire_xcall_deliver(data0, data1, data2, mask);
-       else if (tlb_type == cheetah || tlb_type == cheetah_plus)
-               cheetah_xcall_deliver(data0, data1, data2, mask);
-       else
-               hypervisor_xcall_deliver(data0, data1, data2, mask);
+       xcall_deliver(data0, data1, data2, mask);
        /* NOTE: Caller runs local copy on master. */
 
        put_cpu();
@@ -1202,6 +1199,16 @@ void __devinit smp_prepare_boot_cpu(void)
 {
 }
 
+void __init smp_setup_processor_id(void)
+{
+       if (tlb_type == spitfire)
+               xcall_deliver = spitfire_xcall_deliver;
+       else if (tlb_type == cheetah || tlb_type == cheetah_plus)
+               xcall_deliver = cheetah_xcall_deliver;
+       else
+               xcall_deliver = hypervisor_xcall_deliver;
+}
+
 void __devinit smp_fill_in_sib_core_maps(void)
 {
        unsigned int i;