forked from Minki/linux
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:
parent
413541dd66
commit
ddf84433f4
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user