ARC: [SMP] cpumask not needed in IPI send path

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>
This commit is contained in:
Vineet Gupta 2013-11-25 12:59:03 +05:30
parent 413541dd66
commit ddf84433f4
3 changed files with 18 additions and 17 deletions

View File

@ -46,13 +46,13 @@ extern int smp_ipi_irq_setup(int cpu, int irq);
* *
* @info: SoC SMP specific info for /proc/cpuinfo etc * @info: SoC SMP specific info for /proc/cpuinfo etc
* @cpu_kick: For Master to kickstart a cpu (optionally at a PC) * @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 * @ips_clear: To clear IPI received by @cpu at @irq
*/ */
struct plat_smp_ops { struct plat_smp_ops {
const char *info; const char *info;
void (*cpu_kick)(int cpu, unsigned long pc); 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); void (*ipi_clear)(int cpu, int irq);
}; };

View File

@ -220,28 +220,33 @@ struct ipi_data {
static DEFINE_PER_CPU(struct ipi_data, 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 long flags;
unsigned int cpu;
local_irq_save(flags); local_irq_save(flags);
for_each_cpu(cpu, callmap) { set_bit(msg, &ipi->bits);
struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
set_bit(msg, &ipi->bits);
}
/* Call the platform specific cross-CPU call function */ /* Call the platform specific cross-CPU call function */
if (plat_smp_ops.ipi_send) if (plat_smp_ops.ipi_send)
plat_smp_ops.ipi_send((void *)callmap); plat_smp_ops.ipi_send(cpu);
local_irq_restore(flags); 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) 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) void smp_send_stop(void)
@ -254,7 +259,7 @@ void smp_send_stop(void)
void arch_send_call_function_single_ipi(int cpu) 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) void arch_send_call_function_ipi_mask(const struct cpumask *mask)

View File

@ -88,13 +88,9 @@ void iss_model_init_smp(unsigned int cpu)
smp_ipi_irq_setup(cpu, IDU_INTERRUPT_0 + 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; idu_irq_assert(cpu);
unsigned int cpu;
for_each_cpu(cpu, callmap)
idu_irq_assert(cpu);
} }
static void iss_model_ipi_clear(int cpu, int irq) static void iss_model_ipi_clear(int cpu, int irq)