ARC: [SMP] cpumask not needed in IPI send path
authorVineet Gupta <vgupta@synopsys.com>
Mon, 25 Nov 2013 07:29:03 +0000 (12:59 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Mon, 23 Dec 2013 06:35:04 +0000 (12:05 +0530)
The current IPI sending callstack needlessly involves cpumask.

   arch_send_call_function_single_ipi(cpu) / smp_send_reschedule(cpu)
      ipi_send_msg(cpumask_of(cpu)) --> [cpu to cpumask]
         plat_smp_ops.ipi_send(callmap)
            for_each_cpu(callmap) --> [cpuask to cpu]
               do_plat_specific_ipi_PER_CPU

Given that current backends are not capable of 1:N IPIs, lets simplify
the interface for now, by keeping "a" cpu all along.

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/smp.h
arch/arc/kernel/smp.c
arch/arc/plat-arcfpga/smp.c

index eefc29f..9b40e3b 100644 (file)
@@ -46,13 +46,13 @@ extern int smp_ipi_irq_setup(int cpu, int irq);
  *
  * @info:              SoC SMP specific info for /proc/cpuinfo etc
  * @cpu_kick:          For Master to kickstart a cpu (optionally at a PC)
- * @ipi_send:          To send IPI to a @cpumask
+ * @ipi_send:          To send IPI to a @cpu
  * @ips_clear:         To clear IPI received by @cpu at @irq
  */
 struct plat_smp_ops {
        const char      *info;
        void            (*cpu_kick)(int cpu, unsigned long pc);
-       void            (*ipi_send)(void *callmap);
+       void            (*ipi_send)(int cpu);
        void            (*ipi_clear)(int cpu, int irq);
 };
 
index c2f9ebb..f2fdef9 100644 (file)
@@ -220,28 +220,33 @@ struct ipi_data {
 
 static DEFINE_PER_CPU(struct ipi_data, ipi_data);
 
-static void ipi_send_msg(const struct cpumask *callmap, enum ipi_msg_type msg)
+static void ipi_send_msg_one(int cpu, enum ipi_msg_type msg)
 {
+       struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
        unsigned long flags;
-       unsigned int cpu;
 
        local_irq_save(flags);
 
-       for_each_cpu(cpu, callmap) {
-               struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
-               set_bit(msg, &ipi->bits);
-       }
+       set_bit(msg, &ipi->bits);
 
        /* Call the platform specific cross-CPU call function  */
        if (plat_smp_ops.ipi_send)
-               plat_smp_ops.ipi_send((void *)callmap);
+               plat_smp_ops.ipi_send(cpu);
 
        local_irq_restore(flags);
 }
 
+static void ipi_send_msg(const struct cpumask *callmap, enum ipi_msg_type msg)
+{
+       unsigned int cpu;
+
+       for_each_cpu(cpu, callmap)
+               ipi_send_msg_one(cpu, msg);
+}
+
 void smp_send_reschedule(int cpu)
 {
-       ipi_send_msg(cpumask_of(cpu), IPI_RESCHEDULE);
+       ipi_send_msg_one(cpu, IPI_RESCHEDULE);
 }
 
 void smp_send_stop(void)
@@ -254,7 +259,7 @@ void smp_send_stop(void)
 
 void arch_send_call_function_single_ipi(int cpu)
 {
-       ipi_send_msg(cpumask_of(cpu), IPI_CALL_FUNC);
+       ipi_send_msg_one(cpu, IPI_CALL_FUNC);
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
index 91b5534..5e4fe95 100644 (file)
@@ -88,13 +88,9 @@ void iss_model_init_smp(unsigned int cpu)
        smp_ipi_irq_setup(cpu, IDU_INTERRUPT_0 + cpu);
 }
 
-static void iss_model_ipi_send(void *arg)
+static void iss_model_ipi_send(int cpu)
 {
-       struct cpumask *callmap = arg;
-       unsigned int cpu;
-
-       for_each_cpu(cpu, callmap)
-               idu_irq_assert(cpu);
+       idu_irq_assert(cpu);
 }
 
 static void iss_model_ipi_clear(int cpu, int irq)