On Fri, Apr 09, 2021, Paolo Bonzini wrote: > On 09/04/21 09:55, Yang Weijiang wrote: > > During kvm-unit-test, below failure pattern is observed, this is due to testing thread > > migration + cache "lazy" flush during test, so forcely flush the cache to avoid the issue. > > Pin the test app to certain physical CPU can fix the issue as well. The error report is > > misleading, pke is the victim of the issue. > > > > test user cr4.pke: FAIL: error code 5 expected 4 > > Dump mapping: address: 0x123400000000 > > ------L4: 21ea007 > > ------L3: 21eb007 > > ------L2: 21ec000 > > ------L1: 2000000 > > > > Signed-off-by: Yang Weijiang <weijiang.yang@xxxxxxxxx> > > --- > > x86/access.c | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/x86/access.c b/x86/access.c > > index 7dc9eb6..379d533 100644 > > --- a/x86/access.c > > +++ b/x86/access.c > > @@ -211,6 +211,8 @@ static unsigned set_cr4_smep(int smep) > > ptl2[2] |= PT_USER_MASK; > > if (!r) > > shadow_cr4 = cr4; > > + > > + invlpg((void *)(ptl2[2] & ~PAGE_SIZE)); > > return r; > > } > > > > Applied, thanks. Egad, I can't keep up with this new Paolo :-D Would it also work to move the existing invlpg() into ac_test_do_access()? diff --git a/x86/access.c b/x86/access.c index 7dc9eb6..5f335dd 100644 --- a/x86/access.c +++ b/x86/access.c @@ -451,8 +451,6 @@ fault: static void ac_set_expected_status(ac_test_t *at) { - invlpg(at->virt); - if (at->ptep) at->expected_pte = *at->ptep; at->expected_pde = *at->pdep; @@ -658,6 +656,9 @@ static int ac_test_do_access(ac_test_t *at) set_cr4_smep(F(AC_CPU_CR4_SMEP)); + /* Flush after _all_ setup is done, toggling SMEP may also modify PMDs. */ + invlpg(at->virt); + if (F(AC_ACCESS_TWICE)) { asm volatile ( "mov $fixed2, %%rsi \n\t