diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index f3d257c45225..d753740cb06c 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -9,6 +9,7 @@
 #include <asm/alternative.h>
 
 #include <linux/kmsan-checks.h>
+#include <linux/kernel.h>
 
 /* duplicated to the one in bootmem.h */
 extern unsigned long max_pfn;
@@ -44,6 +45,17 @@ void clear_page_orig(void *page);
 void clear_page_rep(void *page);
 void clear_page_erms(void *page);
 
+#define MEMSET_AVX2_ZERO(reg)					\
+	asm volatile("vpxor %ymm" #reg ", %ymm" #reg ", %ymm" #reg)
+#define MEMSET_AVX2_STORE(loc, reg)				\
+	asm volatile("vmovntdq %%ymm" #reg ", %0" : "=m" (loc))
+
+#define YMM_BYTES		(256 / 8)
+#define BYTES_TO_YMM(x)		((x) / YMM_BYTES)
+extern void kernel_fpu_begin_mask(unsigned int kfpu_mask);
+extern void kernel_fpu_end(void);
+extern bool irq_fpu_usable(void);
+
 static inline void clear_page(void *page)
 {
 	/*
@@ -51,6 +63,182 @@ static inline void clear_page(void *page)
 	 * below clobbers @page, so we perform unpoisoning before it.
 	 */
 	kmsan_unpoison_memory(page, PAGE_SIZE);
+
+	if (system_state >= SYSTEM_RUNNING && irq_fpu_usable()) {
+		kernel_fpu_begin_mask(0);
+		MEMSET_AVX2_ZERO(0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x00], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x01], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x02], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x03], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x04], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x05], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x06], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x07], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x08], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x09], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x0a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x0b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x0c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x0d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x0e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x0f], 0);
+
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x10], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x11], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x12], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x13], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x14], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x15], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x16], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x17], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x18], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x19], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x1a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x1b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x1c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x1d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x1e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x1f], 0);
+
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x20], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x21], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x22], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x23], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x24], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x25], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x26], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x27], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x28], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x29], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x2a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x2b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x2c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x2d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x2e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x2f], 0);
+
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x30], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x31], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x32], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x33], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x34], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x35], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x36], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x37], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x38], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x39], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x3a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x3b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x3c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x3d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x3e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x3f], 0);
+
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x40], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x41], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x42], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x43], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x44], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x45], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x46], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x47], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x48], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x49], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x4a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x4b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x4c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x4d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x4e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x4f], 0);
+
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x50], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x51], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x52], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x53], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x54], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x55], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x56], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x57], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x58], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x59], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x5a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x5b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x5c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x5d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x5e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x5f], 0);
+
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x60], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x61], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x62], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x63], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x64], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x65], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x66], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x67], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x68], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x69], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x6a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x6b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x6c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x6d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x6e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x6f], 0);
+
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x70], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x71], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x72], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x73], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x74], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x75], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x76], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x77], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x78], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x79], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x7a], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x7b], 0);
+
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x7c], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x7d], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x7e], 0);
+		MEMSET_AVX2_STORE(((unsigned char *)page)[YMM_BYTES * 0x7f], 0);
+
+		kernel_fpu_end();
+		return;
+	}
+
 	alternative_call_2(clear_page_orig,
 			   clear_page_rep, X86_FEATURE_REP_GOOD,
 			   clear_page_erms, X86_FEATURE_ERMS,
