Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ddf84433 authored by Vineet Gupta's avatar Vineet Gupta
Browse files

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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);
};

+14 −9
Original line number Diff line number Diff line
@@ -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);
	}

	/* 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)
+2 −6
Original line number Diff line number Diff line
@@ -88,12 +88,8 @@ 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);
}