The private_mem_conversions_test resets shared memory to an initial
pattern at the end of each test iteration. This reset is currently
performed before the (re)mapping pages as shared.

FALLOC_FL_PUNCH_HOLE indirectly zeroes memory, since old folios were
released and new folios are zeroed. This "clobbers" the intended
initial pattern, leaving the memory as all-zeroes for the next
iteration.

Move the memset() to occur after the hole-punch operation to ensure
the memory is correctly re-initialized with the desired pattern. While
at it, update the memset() to reset the entire data region, not just
the portion used in the last loop, to provide a fully clean slate for
the next iteration.

This was not observed before because guest_memfd was only used for
private memory, hence shared memory contents were not zeroed by the
hole punch operation.

Opportunistically add a test/check that truncation zeroes memory.

Fixes: 43f623f350ce1 ("KVM: selftests: Add x86-only selftest for private memory 
conversions")
Signed-off-by: Ackerley Tng <[email protected]>
---
 .../selftests/kvm/x86/private_mem_conversions_test.c  | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c 
b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c
index 41f6b38f04071..814187d06fcca 100644
--- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c
+++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c
@@ -202,15 +202,20 @@ static void guest_test_explicit_conversion(uint64_t 
base_gpa, bool do_fallocate)
                guest_sync_shared(gpa, size, p3, p4);
                memcmp_g(gpa, p4, size);
 
-               /* Reset the shared memory back to the initial pattern. */
-               memset((void *)gpa, init_p, size);
-
                /*
                 * Free (via PUNCH_HOLE) *all* private memory so that the next
                 * iteration starts from a clean slate, e.g. with respect to
                 * whether or not there are pages/folios in guest_mem.
                 */
                guest_map_shared(base_gpa, PER_CPU_DATA_SIZE, true);
+
+               /*
+                * Test that fallocate(PUNCH_HOLE) because hole-punching zeroes
+                * memory, then reset the entire block back to the initial
+                * pattern for the next GUEST_STAGE.
+                */
+               memcmp_g(base_gpa, 0, PER_CPU_DATA_SIZE);
+               memset((void *)base_gpa, init_p, PER_CPU_DATA_SIZE);
        }
 }
 
-- 
2.51.0.858.gf9c4a03a3a-goog


Reply via email to