FAILED: patch "[PATCH] KVM: selftests: Fix 32-bit truncation of vm_get_max_gfn()" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From ef4c9f4f654622fa15b7a94a9bd1f19e76bb7feb Mon Sep 17 00:00:00 2001
From: David Matlack <[email protected]>
Date: Fri, 21 May 2021 17:38:28 +0000
Subject: [PATCH] KVM: selftests: Fix 32-bit truncation of vm_get_max_gfn()
vm_get_max_gfn() casts vm->max_gfn from a uint64_t to an unsigned int, which causes the upper 32-bits of the max_gfn to get truncated.
Nobody noticed until now likely because vm_get_max_gfn() is only used as a mechanism to create a memslot in an unused region of the guest physical address space (the top), and the top of the 32-bit physical address space was always good enough.
This fix reveals a bug in memslot_modification_stress_test which was trying to create a dummy memslot past the end of guest physical memory. Fix that by moving the dummy memslot lower.
Message-Id: <[email protected]>
tools/testing/selftests/kvm/include/kvm_util.h +1 -1
@@ -302,7 +302,7 @@ bool vm_is_unrestricted_guest(struct kvm_vm *vm);unsigned int vm_get_page_size (struct kvm_vm *vm);unsigned int vm_get_page_shift (struct kvm_vm *vm); -unsigned int vm_get_max_gfn (struct kvm_vm *vm); +uint64_t vm_get_max_gfn (struct kvm_vm *vm);int vm_get_fd (struct kvm_vm *vm);unsigned int vm_calc_num_guest_pages (enum vm_guest_mode mode,size_t size);
tools/testing/selftests/kvm/lib/kvm_util.c +1 -1
@@ -2117,7 +2117,7 @@ unsigned int vm_get_page_shift(struct kvm_vm *vm)return vm->page_shift; } -unsigned int vm_get_max_gfn (struct kvm_vm *vm) +uint64_t vm_get_max_gfn (struct kvm_vm *vm) {return vm->max_gfn; }
tools/testing/selftests/kvm/lib/perf_test_util.c +3 -1
@@ -2,6 +2,7 @@/* * Copyright (C) 2020, Google LLC. */ +#include <inttypes.h> #include "kvm_util.h" #include "perf_test_util.h"
@@ -80,7 +81,8 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int vcpus,*/ TEST_ASSERT (guest_num_pages <vm_get_max_gfn (vm),"Requested more guest memory than address space allows.\n" -" guest pages: %lx max gfn: %x vcpus: %d wss: %lx]\n" , +" guest pages: %" PRIx64" max gfn: %" PRIx64 +" vcpus: %d wss: %" PRIx64"]\n" , guest_num_pages,vm_get_max_gfn (vm), vcpus, vcpu_memory_bytes);
tools/testing/selftests/kvm/memslot_modification_stress_test.c +11 -7
@@ -71,14 +71,22 @@ struct memslot_antagonist_args { };static void add_remove_memslot (struct kvm_vm *vm,useconds_t delay, -uint64_t nr_modifications,uint64_t gpa) +uint64_t nr_modifications) { +const uint64_t pages =1 ; +uint64_t gpa;int i; +/* +* Add the dummy memslot just below the perf_test_util memslot, which is +* at the top of the guest physical address space. +*/ + gpa = guest_test_phys_mem - pages *vm_get_page_size (vm); +for (i =0 ; i < nr_modifications; i++) {usleep (delay);vm_userspace_mem_region_add (vm,VM_MEM_SRC_ANONYMOUS , gpa, -DUMMY_MEMSLOT_INDEX ,1 ,0 ); +DUMMY_MEMSLOT_INDEX , pages,0 );vm_mem_region_delete (vm,DUMMY_MEMSLOT_INDEX ); }
@@ -120,11 +128,7 @@ static void run_test(enum vm_guest_mode mode, void *arg)pr_info ("Started all vCPUs\n" );add_remove_memslot (vm, p->memslot_modification_delay, - p->nr_memslot_modifications, - guest_test_phys_mem + - (guest_percpu_mem_size * nr_vcpus) + - perf_test_args.host_page_size + - perf_test_args.guest_page_size); + p->nr_memslot_modifications); run_vcpus = false;