Commit ddf84433 authored by Vineet Gupta's avatar Vineet Gupta

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: default avatarVineet Gupta <vgupta@synopsys.com>
parent 413541dd
......@@ -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);
};
......
......@@ -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)
......
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment