Commit 07fd1761 authored by Cyril Bur's avatar Cyril Bur Committed by Michael Ellerman

powerpc/tm: Add commandline option to disable hardware transactional memory

Currently the kernel relies on firmware to inform it whether or not the
CPU supports HTM and as long as the kernel was built with
CONFIG_PPC_TRANSACTIONAL_MEM=y then it will allow userspace to make
use of the facility.

There may be situations where it would be advantageous for the kernel
to not allow userspace to use HTM, currently the only way to achieve
this is to recompile the kernel with CONFIG_PPC_TRANSACTIONAL_MEM=n.

This patch adds a simple commandline option so that HTM can be
disabled at boot time.
Signed-off-by: default avatarCyril Bur <cyrilbur@gmail.com>
[mpe: Simplify to a bool, move to prom.c, put doco in the right place.
 Always disable, regardless of initial state, to avoid user confusion.]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent ddd46ed2
...@@ -3185,6 +3185,10 @@ ...@@ -3185,6 +3185,10 @@
allowed (eg kernel_enable_fpu()/kernel_disable_fpu()). allowed (eg kernel_enable_fpu()/kernel_disable_fpu()).
There is some performance impact when enabling this. There is some performance impact when enabling this.
ppc_tm= [PPC]
Format: {"off"}
Disable Hardware Transactional Memory
print-fatal-signals= print-fatal-signals=
[KNL] debug: print fatal signals [KNL] debug: print fatal signals
......
...@@ -658,6 +658,35 @@ static void __init early_reserve_mem(void) ...@@ -658,6 +658,35 @@ static void __init early_reserve_mem(void)
#endif #endif
} }
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
static bool tm_disabled __initdata;
static int __init parse_ppc_tm(char *str)
{
bool res;
if (kstrtobool(str, &res))
return -EINVAL;
tm_disabled = !res;
return 0;
}
early_param("ppc_tm", parse_ppc_tm);
static void __init tm_init(void)
{
if (tm_disabled) {
pr_info("Disabling hardware transactional memory (HTM)\n");
cur_cpu_spec->cpu_user_features2 &=
~(PPC_FEATURE2_HTM_NOSC | PPC_FEATURE2_HTM);
cur_cpu_spec->cpu_features &= ~CPU_FTR_TM;
}
}
#else
static void tm_init(void) { }
#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
void __init early_init_devtree(void *params) void __init early_init_devtree(void *params)
{ {
phys_addr_t limit; phys_addr_t limit;
...@@ -767,6 +796,8 @@ void __init early_init_devtree(void *params) ...@@ -767,6 +796,8 @@ void __init early_init_devtree(void *params)
powerpc_firmware_features |= FW_FEATURE_PS3_POSSIBLE; powerpc_firmware_features |= FW_FEATURE_PS3_POSSIBLE;
#endif #endif
tm_init();
DBG(" <- early_init_devtree()\n"); DBG(" <- early_init_devtree()\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment