On Wed, Apr 20, 2022 at 06:36:24AM -0400, Paolo Bonzini wrote: > Red Hat's QE team reported test failure on access_tracking_perf_test: > > Testing guest mode: PA-bits:ANY, VA-bits:48, 4K pages > guest physical test memory offset: 0x3fffbffff000 > > Populating memory : 0.684014577s > Writing to populated memory : 0.006230175s > Reading from populated memory : 0.004557805s > ==== Test Assertion Failure ==== > lib/kvm_util.c:1411: false > pid=125806 tid=125809 errno=4 - Interrupted system call > 1 0x0000000000402f7c: addr_gpa2hva at kvm_util.c:1411 > 2 (inlined by) addr_gpa2hva at kvm_util.c:1405 > 3 0x0000000000401f52: lookup_pfn at access_tracking_perf_test.c:98 > 4 (inlined by) mark_vcpu_memory_idle at access_tracking_perf_test.c:152 > 5 (inlined by) vcpu_thread_main at access_tracking_perf_test.c:232 > 6 0x00007fefe9ff81ce: ?? ??:0 > 7 0x00007fefe9c64d82: ?? ??:0 > No vm physical memory at 0xffbffff000 > > I can easily reproduce it with a Intel(R) Xeon(R) CPU E5-2630 with 46 bits > PA. > > It turns out that the address translation for clearing idle page tracking > returned a wrong result; addr_gva2gpa()'s last step, which is based on > "pte[index[0]].pfn", did the calculation with 40 bits length and the > high 12 bits got truncated. In above case the GPA address to be returned > should be 0x3fffbffff000 for GVA 0xc0000000, but it got truncated into > 0xffbffff000 and the subsequent gpa2hva lookup failed. > > The width of operations on bit fields greater than 32-bit is > implementation defined, and differs between GCC (which uses the bitfield > precision) and clang (which uses 64-bit arithmetic), so this is a > potential minefield. Remove the bit fields and using manual masking > instead. > > Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2075036 > Reported-by: Peter Xu <peterx@xxxxxxxxxx> Should be: Reported-by: Nana Liu <nanliu@xxxxxxxxxx> Meanwhile: Reviewed-by: Peter Xu <peterx@xxxxxxxxxx> Tested-by: Peter Xu <peterx@xxxxxxxxxx> Thanks, -- Peter Xu