x86/fpu: Correct AVX512 state tracking
authorNoah Goldstein <goldstein.w.n@gmail.com>
Tue, 16 Nov 2021 16:14:21 +0000 (17:14 +0100)
committerBorislav Petkov <bp@suse.de>
Tue, 16 Nov 2021 16:19:41 +0000 (17:19 +0100)
Add a separate, local mask for tracking AVX512 usage which does not
include the opmask xfeature set. Opmask registers usage does not cause
frequency throttling so it is a completely unnecessary false positive.

While at it, carve it out into a separate function to keep that
abomination extracted out.

 [ bp: Rediff and cleanup ontop of 5.16-rc1. ]

Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20210920053951.4093668-1-goldstein.w.n@gmail.com
arch/x86/kernel/fpu/core.c

index 8ea306b1bf8ec15c9a8b943da7d524dc167b7ce8..dd3777ac0443fb47f6e4657cec61f27c2e9b51f5 100644 (file)
@@ -98,6 +98,19 @@ bool irq_fpu_usable(void)
 }
 EXPORT_SYMBOL(irq_fpu_usable);
 
+/*
+ * Track AVX512 state use because it is known to slow the max clock
+ * speed of the core.
+ */
+static void update_avx_timestamp(struct fpu *fpu)
+{
+
+#define AVX512_TRACKING_MASK   (XFEATURE_MASK_ZMM_Hi256 | XFEATURE_MASK_Hi16_ZMM)
+
+       if (fpu->fpstate->regs.xsave.header.xfeatures & AVX512_TRACKING_MASK)
+               fpu->avx512_timestamp = jiffies;
+}
+
 /*
  * Save the FPU register state in fpu->fpstate->regs. The register state is
  * preserved.
@@ -116,13 +129,7 @@ void save_fpregs_to_fpstate(struct fpu *fpu)
 {
        if (likely(use_xsave())) {
                os_xsave(fpu->fpstate);
-
-               /*
-                * AVX512 state is tracked here because its use is
-                * known to slow the max clock speed of the core.
-                */
-               if (fpu->fpstate->regs.xsave.header.xfeatures & XFEATURE_MASK_AVX512)
-                       fpu->avx512_timestamp = jiffies;
+               update_avx_timestamp(fpu);
                return;
        }