]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
x86/kvm: Serialize L1D flush parameter setter
authorThomas Gleixner <tglx@linutronix.de>
Fri, 13 Jul 2018 14:23:21 +0000 (16:23 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 8 Aug 2018 12:08:07 +0000 (14:08 +0200)
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
CVE-2018-3620
CVE-2018-3646

Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
arch/x86/kvm/vmx.c

index d8cc7725d85edd6e000c53fc0ad97e89ea9184d6..418480f13c55bd689f89aa28dd1a3a0fd69de198 100644 (file)
@@ -199,6 +199,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;
@@ -263,7 +264,7 @@ static int vmentry_l1d_flush_parse(const char *s)
 
 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;
@@ -283,7 +284,10 @@ static int vmentry_l1d_flush_set(const char *s, const struct kernel_param *kp)
                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)