]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
KVM: selftests: Add backing src parameter to dirty_log_perf_test
authorBen Gardon <bgardon@google.com>
Tue, 2 Feb 2021 18:57:33 +0000 (10:57 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 4 Feb 2021 10:27:19 +0000 (05:27 -0500)
Add a parameter to control the backing memory type for
dirty_log_perf_test so that the test can be run with hugepages.

To: linux-kselftest@vger.kernel.org
CC: Peter Xu <peterx@redhat.com>
CC: Andrew Jones <drjones@redhat.com>
CC: Thomas Huth <thuth@redhat.com>
Signed-off-by: Ben Gardon <bgardon@google.com>
Message-Id: <20210202185734.1680553-28-bgardon@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/demand_paging_test.c
tools/testing/selftests/kvm/dirty_log_perf_test.c
tools/testing/selftests/kvm/include/kvm_util.h
tools/testing/selftests/kvm/include/perf_test_util.h
tools/testing/selftests/kvm/include/test_util.h
tools/testing/selftests/kvm/lib/perf_test_util.c
tools/testing/selftests/kvm/lib/test_util.c
tools/testing/selftests/kvm/memslot_modification_stress_test.c

index e8fda95f8389de029daed2925c1ae425968f0188..5f7a229c3af10174f7cd97ca2a83492108527add 100644 (file)
@@ -266,7 +266,8 @@ static void run_test(enum vm_guest_mode mode, void *arg)
        int vcpu_id;
        int r;
 
-       vm = perf_test_create_vm(mode, nr_vcpus, guest_percpu_mem_size);
+       vm = perf_test_create_vm(mode, nr_vcpus, guest_percpu_mem_size,
+                                VM_MEM_SRC_ANONYMOUS);
 
        perf_test_args.wr_fract = 1;
 
index a0231be3984dfeab95d86f286c8ae454454be33f..3b558fba1c883bea4a1b953dba5f9b59b6ef9f3e 100644 (file)
@@ -93,6 +93,7 @@ struct test_params {
        uint64_t phys_offset;
        int wr_fract;
        bool partition_vcpu_memory_access;
+       enum vm_mem_backing_src_type backing_src;
 };
 
 static void run_test(enum vm_guest_mode mode, void *arg)
@@ -112,7 +113,8 @@ static void run_test(enum vm_guest_mode mode, void *arg)
        struct kvm_enable_cap cap = {};
        struct timespec clear_dirty_log_total = (struct timespec){0};
 
-       vm = perf_test_create_vm(mode, nr_vcpus, guest_percpu_mem_size);
+       vm = perf_test_create_vm(mode, nr_vcpus, guest_percpu_mem_size,
+                                p->backing_src);
 
        perf_test_args.wr_fract = p->wr_fract;
 
@@ -242,7 +244,7 @@ static void help(char *name)
 {
        puts("");
        printf("usage: %s [-h] [-i iterations] [-p offset] "
-              "[-m mode] [-b vcpu bytes] [-v vcpus] [-o]\n", name);
+              "[-m mode] [-b vcpu bytes] [-v vcpus] [-o] [-s mem type]\n", name);
        puts("");
        printf(" -i: specify iteration counts (default: %"PRIu64")\n",
               TEST_HOST_LOOP_N);
@@ -259,6 +261,9 @@ static void help(char *name)
        printf(" -v: specify the number of vCPUs to run.\n");
        printf(" -o: Overlap guest memory accesses instead of partitioning\n"
               "     them into a separate region of memory for each vCPU.\n");
+       printf(" -s: specify the type of memory that should be used to\n"
+              "     back the guest data region.\n\n");
+       backing_src_help();
        puts("");
        exit(0);
 }
@@ -270,6 +275,7 @@ int main(int argc, char *argv[])
                .iterations = TEST_HOST_LOOP_N,
                .wr_fract = 1,
                .partition_vcpu_memory_access = true,
+               .backing_src = VM_MEM_SRC_ANONYMOUS,
        };
        int opt;
 
@@ -280,7 +286,7 @@ int main(int argc, char *argv[])
 
        guest_modes_append_default();
 
-       while ((opt = getopt(argc, argv, "hi:p:m:b:f:v:o")) != -1) {
+       while ((opt = getopt(argc, argv, "hi:p:m:b:f:v:os:")) != -1) {
                switch (opt) {
                case 'i':
                        p.iterations = atoi(optarg);
@@ -306,6 +312,8 @@ int main(int argc, char *argv[])
                        break;
                case 'o':
                        p.partition_vcpu_memory_access = false;
+               case 's':
+                       p.backing_src = parse_backing_src_type(optarg);
                        break;
                case 'h':
                default:
index 5cbb861525edfb312bc3632894f6af862b41c7c8..2d7eb6989e834b854b5a4a69623e9d9f4983638f 100644 (file)
@@ -79,12 +79,6 @@ struct vm_guest_mode_params {
 };
 extern const struct vm_guest_mode_params vm_guest_mode_params[];
 
-enum vm_mem_backing_src_type {
-       VM_MEM_SRC_ANONYMOUS,
-       VM_MEM_SRC_ANONYMOUS_THP,
-       VM_MEM_SRC_ANONYMOUS_HUGETLB,
-};
-
 int kvm_check_cap(long cap);
 int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap);
 int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
index f406534f04875bdd2f41a4402ca6b51b368787e2..005f2143adebd1bbc79950d6cc7690fc4edc84f6 100644 (file)
@@ -44,7 +44,8 @@ extern struct perf_test_args perf_test_args;
 extern uint64_t guest_test_phys_mem;
 
 struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int vcpus,
-                               uint64_t vcpu_memory_bytes);
+                                  uint64_t vcpu_memory_bytes,
+                                  enum vm_mem_backing_src_type backing_src);
 void perf_test_destroy_vm(struct kvm_vm *vm);
 void perf_test_setup_vcpus(struct kvm_vm *vm, int vcpus,
                           uint64_t vcpu_memory_bytes,
index b86090ef82dac1d5e3cd3083ca0ce18d01a08e24..b7f41399f22cc95a2802069312233f02dfea1b04 100644 (file)
@@ -67,4 +67,18 @@ struct timespec timespec_sub(struct timespec ts1, struct timespec ts2);
 struct timespec timespec_elapsed(struct timespec start);
 struct timespec timespec_div(struct timespec ts, int divisor);
 
+enum vm_mem_backing_src_type {
+       VM_MEM_SRC_ANONYMOUS,
+       VM_MEM_SRC_ANONYMOUS_THP,
+       VM_MEM_SRC_ANONYMOUS_HUGETLB,
+};
+
+struct vm_mem_backing_src_alias {
+       const char *name;
+       enum vm_mem_backing_src_type type;
+};
+
+void backing_src_help(void);
+enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name);
+
 #endif /* SELFTEST_KVM_TEST_UTIL_H */
index f5fed2fbe964ead7a7f5ba9a4b9c8f95d3fed22a..81490b9b4e32a96ecdadf918a6136fcd83aa5b9e 100644 (file)
@@ -49,7 +49,8 @@ static void guest_code(uint32_t vcpu_id)
 }
 
 struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int vcpus,
-                                  uint64_t vcpu_memory_bytes)
+                                  uint64_t vcpu_memory_bytes,
+                                  enum vm_mem_backing_src_type backing_src)
 {
        struct kvm_vm *vm;
        uint64_t guest_num_pages;
@@ -93,8 +94,7 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int vcpus,
        pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem);
 
        /* Add an extra memory slot for testing */
-       vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
-                                   guest_test_phys_mem,
+       vm_userspace_mem_region_add(vm, backing_src, guest_test_phys_mem,
                                    PERF_TEST_MEM_SLOT_INDEX,
                                    guest_num_pages, 0);
 
index 5f87ed32caf560324b8f9c742208df651931dc28..906c955384e2b2558096656095bdd175edbb6222 100644 (file)
@@ -10,6 +10,7 @@
 #include <limits.h>
 #include <stdlib.h>
 #include <time.h>
+#include "linux/kernel.h"
 
 #include "test_util.h"
 
@@ -109,3 +110,31 @@ void print_skip(const char *fmt, ...)
        va_end(ap);
        puts(", skipping test");
 }
+
+const struct vm_mem_backing_src_alias backing_src_aliases[] = {
+       {"anonymous", VM_MEM_SRC_ANONYMOUS,},
+       {"anonymous_thp", VM_MEM_SRC_ANONYMOUS_THP,},
+       {"anonymous_hugetlb", VM_MEM_SRC_ANONYMOUS_HUGETLB,},
+};
+
+void backing_src_help(void)
+{
+       int i;
+
+       printf("Available backing src types:\n");
+       for (i = 0; i < ARRAY_SIZE(backing_src_aliases); i++)
+               printf("\t%s\n", backing_src_aliases[i].name);
+}
+
+enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(backing_src_aliases); i++)
+               if (!strcmp(type_name, backing_src_aliases[i].name))
+                       return backing_src_aliases[i].type;
+
+       backing_src_help();
+       TEST_FAIL("Unknown backing src type: %s", type_name);
+       return -1;
+}
index cae1b90cb63f52dd9dc12ce80e32b2bedd67d6a2..6096bf0a5b34f0f8cb37cc15310e76fc721c73a1 100644 (file)
@@ -97,7 +97,8 @@ static void run_test(enum vm_guest_mode mode, void *arg)
        struct kvm_vm *vm;
        int vcpu_id;
 
-       vm = perf_test_create_vm(mode, nr_vcpus, guest_percpu_mem_size);
+       vm = perf_test_create_vm(mode, nr_vcpus, guest_percpu_mem_size,
+                                VM_MEM_SRC_ANONYMOUS);
 
        perf_test_args.wr_fract = 1;