diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index cfdf8c2..bb6740b 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -229,6 +229,7 @@ extern const char * const x86_power_flags[32]; #define cpu_has_ds boot_cpu_has(X86_FEATURE_DS) #define cpu_has_pebs boot_cpu_has(X86_FEATURE_PEBS) #define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLSH) +#define cpu_has_selfsnoop boot_cpu_has(X86_FEATURE_SELFSNOOP) #define cpu_has_bts boot_cpu_has(X86_FEATURE_BTS) #define cpu_has_gbpages boot_cpu_has(X86_FEATURE_GBPAGES) #define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON) diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index e89d248..07d0518 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -150,7 +150,7 @@ static void __cpa_flush_all(void *arg) */ __flush_tlb_all(); - if (cache && boot_cpu_data.x86_model >= 4) + if (cache && boot_cpu_data.x86_model >= 4 && !cpu_has_selfsnoop) wbinvd(); } @@ -181,7 +181,7 @@ static void cpa_flush_range(unsigned long start, int numpages, int cache) on_each_cpu(__cpa_flush_range, NULL, 1); - if (!cache) + if (!cache || cpu_has_selfsnoop) return; /*