mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-23 11:08:07 +00:00
powerpc: Make doorbell check preemption safe
Doorbell can be used to cause ipi on cpus which are sibling threads on the same core. So icp_native_cause_ipi checks if the destination cpu is a sibling thread of the current cpu and uses doorbell in such cases. But while running with CONFIG_PREEMPT=y, since this section is preemtible, we can run into issues if after we check if the destination cpu is a sibling cpu, the task gets migrated from a sibling cpu to a cpu on another core. Fix this by using get_cpu()/ put_cpu() Signed-off-by: Shreyas B. Prabhu <shreyas@linux.vnet.ibm.com> Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
4bece972fc
commit
3609d819a3
@ -147,12 +147,16 @@ static void icp_native_cause_ipi(int cpu, unsigned long data)
|
||||
{
|
||||
kvmppc_set_host_ipi(cpu, 1);
|
||||
#ifdef CONFIG_PPC_DOORBELL
|
||||
if (cpu_has_feature(CPU_FTR_DBELL) &&
|
||||
(cpumask_test_cpu(cpu, cpu_sibling_mask(smp_processor_id()))))
|
||||
doorbell_cause_ipi(cpu, data);
|
||||
else
|
||||
if (cpu_has_feature(CPU_FTR_DBELL)) {
|
||||
if (cpumask_test_cpu(cpu, cpu_sibling_mask(get_cpu()))) {
|
||||
doorbell_cause_ipi(cpu, data);
|
||||
put_cpu();
|
||||
return;
|
||||
}
|
||||
put_cpu();
|
||||
}
|
||||
#endif
|
||||
icp_native_set_qirr(cpu, IPI_PRIORITY);
|
||||
icp_native_set_qirr(cpu, IPI_PRIORITY);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user