| From foo@baz Tue Aug 14 16:14:56 CEST 2018 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Fri, 13 Jul 2018 16:23:21 +0200 |
| Subject: x86/kvm: Serialize L1D flush parameter setter |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit dd4bfa739a72508b75760b393d129ed7b431daab upstream |
| |
| Writes to the parameter files are not serialized at the sysfs core |
| level, so local serialization is required. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Tested-by: Jiri Kosina <jkosina@suse.cz> |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Link: https://lkml.kernel.org/r/20180713142322.873642605@linutronix.de |
| Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kvm/vmx.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/kvm/vmx.c |
| +++ b/arch/x86/kvm/vmx.c |
| @@ -194,6 +194,7 @@ extern const ulong vmx_return; |
| |
| static DEFINE_STATIC_KEY_FALSE(vmx_l1d_should_flush); |
| static DEFINE_STATIC_KEY_FALSE(vmx_l1d_flush_always); |
| +static DEFINE_MUTEX(vmx_l1d_flush_mutex); |
| |
| /* Storage for pre module init parameter parsing */ |
| static enum vmx_l1d_flush_state __read_mostly vmentry_l1d_flush_param = VMENTER_L1D_FLUSH_AUTO; |
| @@ -258,7 +259,7 @@ static int vmentry_l1d_flush_parse(const |
| |
| static int vmentry_l1d_flush_set(const char *s, const struct kernel_param *kp) |
| { |
| - int l1tf; |
| + int l1tf, ret; |
| |
| if (!boot_cpu_has(X86_BUG_L1TF)) |
| return 0; |
| @@ -278,7 +279,10 @@ static int vmentry_l1d_flush_set(const c |
| return 0; |
| } |
| |
| - return vmx_setup_l1d_flush(l1tf); |
| + mutex_lock(&vmx_l1d_flush_mutex); |
| + ret = vmx_setup_l1d_flush(l1tf); |
| + mutex_unlock(&vmx_l1d_flush_mutex); |
| + return ret; |
| } |
| |
| static int vmentry_l1d_flush_get(char *s, const struct kernel_param *kp) |