Message ID | 20190530113058.1988-1-julien.grall@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64/cpufeature: Convert hook_lock to raw_spin_lock_t in cpu_enable_ssbs() | expand |
On Thu, May 30, 2019 at 12:30:58PM +0100, Julien Grall wrote: > cpu_enable_ssbs() is called via stop_machine() as part of the cpu_enable > callback. A spin lock is used to ensure the hook is registered before > the rest of the callback is executed. > > On -RT spin_lock() may sleep. However, all the callees in stop_machine() > are expected to not sleep. Therefore a raw_spin_lock() is required here. > > Given this is already done under stop_machine() and the work done under > the lock is quite small, the latency should not increase too much. > > Signed-off-by: Julien Grall <julien.grall@arm.com> > > --- > > It was noticed when looking at the current use of spin_lock in > arch/arm64. I don't have a platform calling that callback, so I have > hacked the code to reproduce the error and check it is now fixed. > --- > arch/arm64/kernel/cpufeature.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c > index ca27e08e3d8a..2a7159fda3ce 100644 > --- a/arch/arm64/kernel/cpufeature.c > +++ b/arch/arm64/kernel/cpufeature.c > @@ -1194,14 +1194,14 @@ static struct undef_hook ssbs_emulation_hook = { > static void cpu_enable_ssbs(const struct arm64_cpu_capabilities *__unused) > { > static bool undef_hook_registered = false; > - static DEFINE_SPINLOCK(hook_lock); > + static DEFINE_RAW_SPINLOCK(hook_lock); > > - spin_lock(&hook_lock); > + raw_spin_lock(&hook_lock); > if (!undef_hook_registered) { > register_undef_hook(&ssbs_emulation_hook); > undef_hook_registered = true; > } > - spin_unlock(&hook_lock); > + raw_spin_unlock(&hook_lock); Makes sense to me. We could probably avoid the lock entirely if we wanted to (via atomic_dec_if_positive), but I'm not sure it's really worth it. Will
Hi Will, On 5/30/19 1:01 PM, Will Deacon wrote: > On Thu, May 30, 2019 at 12:30:58PM +0100, Julien Grall wrote: >> cpu_enable_ssbs() is called via stop_machine() as part of the cpu_enable >> callback. A spin lock is used to ensure the hook is registered before >> the rest of the callback is executed. >> >> On -RT spin_lock() may sleep. However, all the callees in stop_machine() >> are expected to not sleep. Therefore a raw_spin_lock() is required here. >> >> Given this is already done under stop_machine() and the work done under >> the lock is quite small, the latency should not increase too much. >> >> Signed-off-by: Julien Grall <julien.grall@arm.com> >> >> --- >> >> It was noticed when looking at the current use of spin_lock in >> arch/arm64. I don't have a platform calling that callback, so I have >> hacked the code to reproduce the error and check it is now fixed. >> --- >> arch/arm64/kernel/cpufeature.c | 6 +++--- >> 1 file changed, 3 insertions(+), 3 deletions(-) >> >> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c >> index ca27e08e3d8a..2a7159fda3ce 100644 >> --- a/arch/arm64/kernel/cpufeature.c >> +++ b/arch/arm64/kernel/cpufeature.c >> @@ -1194,14 +1194,14 @@ static struct undef_hook ssbs_emulation_hook = { >> static void cpu_enable_ssbs(const struct arm64_cpu_capabilities *__unused) >> { >> static bool undef_hook_registered = false; >> - static DEFINE_SPINLOCK(hook_lock); >> + static DEFINE_RAW_SPINLOCK(hook_lock); >> >> - spin_lock(&hook_lock); >> + raw_spin_lock(&hook_lock); >> if (!undef_hook_registered) { >> register_undef_hook(&ssbs_emulation_hook); >> undef_hook_registered = true; >> } >> - spin_unlock(&hook_lock); >> + raw_spin_unlock(&hook_lock); > > Makes sense to me. We could probably avoid the lock entirely if we wanted > to (via atomic_dec_if_positive), but I'm not sure it's really worth it. I would prefer to remove the lock if it is possible. However, I was under the impression the lock is necessary so the hook is registered before any CPU attempt to configure the PSTATE. Cheers,
On Thu, May 30, 2019 at 12:30:58PM +0100, Julien Grall wrote: > cpu_enable_ssbs() is called via stop_machine() as part of the cpu_enable > callback. A spin lock is used to ensure the hook is registered before > the rest of the callback is executed. > > On -RT spin_lock() may sleep. However, all the callees in stop_machine() > are expected to not sleep. Therefore a raw_spin_lock() is required here. > > Given this is already done under stop_machine() and the work done under > the lock is quite small, the latency should not increase too much. > > Signed-off-by: Julien Grall <julien.grall@arm.com> Queued for 5.3. Thanks.
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index ca27e08e3d8a..2a7159fda3ce 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -1194,14 +1194,14 @@ static struct undef_hook ssbs_emulation_hook = { static void cpu_enable_ssbs(const struct arm64_cpu_capabilities *__unused) { static bool undef_hook_registered = false; - static DEFINE_SPINLOCK(hook_lock); + static DEFINE_RAW_SPINLOCK(hook_lock); - spin_lock(&hook_lock); + raw_spin_lock(&hook_lock); if (!undef_hook_registered) { register_undef_hook(&ssbs_emulation_hook); undef_hook_registered = true; } - spin_unlock(&hook_lock); + raw_spin_unlock(&hook_lock); if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE) { sysreg_clear_set(sctlr_el1, 0, SCTLR_ELx_DSSBS);
cpu_enable_ssbs() is called via stop_machine() as part of the cpu_enable callback. A spin lock is used to ensure the hook is registered before the rest of the callback is executed. On -RT spin_lock() may sleep. However, all the callees in stop_machine() are expected to not sleep. Therefore a raw_spin_lock() is required here. Given this is already done under stop_machine() and the work done under the lock is quite small, the latency should not increase too much. Signed-off-by: Julien Grall <julien.grall@arm.com> --- It was noticed when looking at the current use of spin_lock in arch/arm64. I don't have a platform calling that callback, so I have hacked the code to reproduce the error and check it is now fixed. --- arch/arm64/kernel/cpufeature.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)