Commit 0af48f42 authored by venkatesh.pallipadi@intel.com's avatar venkatesh.pallipadi@intel.com Committed by H. Peter Anvin

x86: cpa_flush_array wbinvd should be done on all CPUs

cpa_flush_array seems to prefer wbinvd() over clflush at 4M threshold.
clflush needs to be done on only one CPU as per instruction definition.
wbinvd() however, should be done on all CPUs.

[ Impact: fix missing flush which could cause data corruption ]
Signed-off-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent 0b827537
...@@ -204,6 +204,11 @@ static void cpa_flush_range(unsigned long start, int numpages, int cache) ...@@ -204,6 +204,11 @@ static void cpa_flush_range(unsigned long start, int numpages, int cache)
} }
} }
static void wbinvd_local(void *unused)
{
wbinvd();
}
static void cpa_flush_array(unsigned long *start, int numpages, int cache, static void cpa_flush_array(unsigned long *start, int numpages, int cache,
int in_flags, struct page **pages) int in_flags, struct page **pages)
{ {
...@@ -219,7 +224,8 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache, ...@@ -219,7 +224,8 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache,
/* 4M threshold */ /* 4M threshold */
if (numpages >= 1024) { if (numpages >= 1024) {
if (boot_cpu_data.x86 >= 4) if (boot_cpu_data.x86 >= 4)
wbinvd(); on_each_cpu(wbinvd_local, NULL, 1);
return; return;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment