forked from luck/tmp_suning_uos_patched
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
|
* @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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user