Commit 545b8c8d authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

smp: Cleanup smp_call_function*()



Get rid of the __call_single_node union and cleanup the API a little
to avoid external code relying on the structure layout as much.

Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
parent 7a9f50a0
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -702,7 +702,6 @@ unsigned long arch_align_stack(unsigned long sp)
	return sp & ALMASK;
	return sp & ALMASK;
}
}


static DEFINE_PER_CPU(call_single_data_t, backtrace_csd);
static struct cpumask backtrace_csd_busy;
static struct cpumask backtrace_csd_busy;


static void handle_backtrace(void *info)
static void handle_backtrace(void *info)
@@ -711,6 +710,9 @@ static void handle_backtrace(void *info)
	cpumask_clear_cpu(smp_processor_id(), &backtrace_csd_busy);
	cpumask_clear_cpu(smp_processor_id(), &backtrace_csd_busy);
}
}


static DEFINE_PER_CPU(call_single_data_t, backtrace_csd) =
	CSD_INIT(handle_backtrace, NULL);

static void raise_backtrace(cpumask_t *mask)
static void raise_backtrace(cpumask_t *mask)
{
{
	call_single_data_t *csd;
	call_single_data_t *csd;
@@ -730,7 +732,6 @@ static void raise_backtrace(cpumask_t *mask)
		}
		}


		csd = &per_cpu(backtrace_csd, cpu);
		csd = &per_cpu(backtrace_csd, cpu);
		csd->func = handle_backtrace;
		smp_call_function_single_async(cpu, csd);
		smp_call_function_single_async(cpu, csd);
	}
	}
}
}
+6 −19
Original line number Original line Diff line number Diff line
@@ -687,36 +687,23 @@ EXPORT_SYMBOL(flush_tlb_one);


#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST


static DEFINE_PER_CPU(call_single_data_t, tick_broadcast_csd);

void tick_broadcast(const struct cpumask *mask)
{
	call_single_data_t *csd;
	int cpu;

	for_each_cpu(cpu, mask) {
		csd = &per_cpu(tick_broadcast_csd, cpu);
		smp_call_function_single_async(cpu, csd);
	}
}

static void tick_broadcast_callee(void *info)
static void tick_broadcast_callee(void *info)
{
{
	tick_receive_broadcast();
	tick_receive_broadcast();
}
}


static int __init tick_broadcast_init(void)
static DEFINE_PER_CPU(call_single_data_t, tick_broadcast_csd) =
	CSD_INIT(tick_broadcast_callee, NULL);

void tick_broadcast(const struct cpumask *mask)
{
{
	call_single_data_t *csd;
	call_single_data_t *csd;
	int cpu;
	int cpu;


	for (cpu = 0; cpu < NR_CPUS; cpu++) {
	for_each_cpu(cpu, mask) {
		csd = &per_cpu(tick_broadcast_csd, cpu);
		csd = &per_cpu(tick_broadcast_csd, cpu);
		csd->func = tick_broadcast_callee;
		smp_call_function_single_async(cpu, csd);
	}
	}

	return 0;
}
}
early_initcall(tick_broadcast_init);


#endif /* CONFIG_GENERIC_CLOCKEVENTS_BROADCAST */
#endif /* CONFIG_GENERIC_CLOCKEVENTS_BROADCAST */
+1 −3
Original line number Original line Diff line number Diff line
@@ -178,9 +178,7 @@ static void zpci_handle_fallback_irq(void)
		if (atomic_inc_return(&cpu_data->scheduled) > 1)
		if (atomic_inc_return(&cpu_data->scheduled) > 1)
			continue;
			continue;


		cpu_data->csd.func = zpci_handle_remote_irq;
		INIT_CSD(&cpu_data->csd, zpci_handle_remote_irq, &cpu_data->scheduled);
		cpu_data->csd.info = &cpu_data->scheduled;
		cpu_data->csd.flags = 0;
		smp_call_function_single_async(cpu, &cpu_data->csd);
		smp_call_function_single_async(cpu, &cpu_data->csd);
	}
	}
}
}
+3 −4
Original line number Original line Diff line number Diff line
@@ -74,10 +74,9 @@ static ssize_t cpuid_read(struct file *file, char __user *buf,


	init_completion(&cmd.done);
	init_completion(&cmd.done);
	for (; count; count -= 16) {
	for (; count; count -= 16) {
		call_single_data_t csd = {
		call_single_data_t csd;
			.func = cpuid_smp_cpuid,

			.info = &cmd,
		INIT_CSD(&csd, cpuid_smp_cpuid, &cmd);
		};


		cmd.regs.eax = pos;
		cmd.regs.eax = pos;
		cmd.regs.ecx = pos >> 32;
		cmd.regs.ecx = pos >> 32;
+3 −4
Original line number Original line Diff line number Diff line
@@ -169,12 +169,11 @@ static void __wrmsr_safe_on_cpu(void *info)
int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
{
{
	struct msr_info_completion rv;
	struct msr_info_completion rv;
	call_single_data_t csd = {
	call_single_data_t csd;
		.func	= __rdmsr_safe_on_cpu,
		.info	= &rv,
	};
	int err;
	int err;


	INIT_CSD(&csd, __rdmsr_safe_on_cpu, &rv);

	memset(&rv, 0, sizeof(rv));
	memset(&rv, 0, sizeof(rv));
	init_completion(&rv.done);
	init_completion(&rv.done);
	rv.msr.msr_no = msr_no;
	rv.msr.msr_no = msr_no;
Loading