KVM: selftests: create -r argument to specify random seed
authorColton Lewis <coltonlewis@google.com>
Mon, 7 Nov 2022 18:22:06 +0000 (18:22 +0000)
committerSean Christopherson <seanjc@google.com>
Wed, 16 Nov 2022 18:17:31 +0000 (10:17 -0800)
Create a -r argument to specify a random seed. If no argument is
provided, the seed defaults to 1. The random seed is set with
perf_test_set_random_seed() and must be set before guest_code runs to
apply.

Signed-off-by: Colton Lewis <coltonlewis@google.com>
Reviewed-by: David Matlack <dmatlack@google.com>
Link: https://lore.kernel.org/r/20221107182208.479157-3-coltonlewis@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/dirty_log_perf_test.c
tools/testing/selftests/kvm/include/perf_test_util.h
tools/testing/selftests/kvm/lib/perf_test_util.c

index 0612158..eb63ca1 100644 (file)
@@ -132,6 +132,7 @@ struct test_params {
        bool partition_vcpu_memory_access;
        enum vm_mem_backing_src_type backing_src;
        int slots;
+       uint32_t random_seed;
 };
 
 static void toggle_dirty_logging(struct kvm_vm *vm, int slots, bool enable)
@@ -225,6 +226,8 @@ static void run_test(enum vm_guest_mode mode, void *arg)
                                 p->slots, p->backing_src,
                                 p->partition_vcpu_memory_access);
 
+       pr_info("Random seed: %u\n", p->random_seed);
+       perf_test_set_random_seed(vm, p->random_seed);
        perf_test_set_wr_fract(vm, p->wr_fract);
 
        guest_num_pages = (nr_vcpus * guest_percpu_mem_size) >> vm->page_shift;
@@ -352,7 +355,7 @@ static void help(char *name)
 {
        puts("");
        printf("usage: %s [-h] [-i iterations] [-p offset] [-g] "
-              "[-m mode] [-n] [-b vcpu bytes] [-v vcpus] [-o] [-s mem type]"
+              "[-m mode] [-n] [-b vcpu bytes] [-v vcpus] [-o] [-r random seed ] [-s mem type]"
               "[-x memslots] [-c physical cpus to run test on]\n", name);
        puts("");
        printf(" -i: specify iteration counts (default: %"PRIu64")\n",
@@ -380,6 +383,7 @@ 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(" -r: specify the starting random seed.\n");
        backing_src_help("-s");
        printf(" -x: Split the memory region into this number of memslots.\n"
               "     (default: 1)\n");
@@ -408,6 +412,7 @@ int main(int argc, char *argv[])
                .partition_vcpu_memory_access = true,
                .backing_src = DEFAULT_VM_MEM_SRC,
                .slots = 1,
+               .random_seed = 1,
        };
        int opt;
 
@@ -418,7 +423,7 @@ int main(int argc, char *argv[])
 
        guest_modes_append_default();
 
-       while ((opt = getopt(argc, argv, "b:c:ef:ghi:m:nop:s:v:x:")) != -1) {
+       while ((opt = getopt(argc, argv, "b:c:ef:ghi:m:nop:r:s:v:x:")) != -1) {
                switch (opt) {
                case 'b':
                        guest_percpu_mem_size = parse_size(optarg);
@@ -454,6 +459,9 @@ int main(int argc, char *argv[])
                case 'p':
                        p.phys_offset = strtoull(optarg, NULL, 0);
                        break;
+               case 'r':
+                       p.random_seed = atoi_positive("Random seed", optarg);
+                       break;
                case 's':
                        p.backing_src = parse_backing_src_type(optarg);
                        break;
index 849c875..5a0e48b 100644 (file)
@@ -35,6 +35,7 @@ struct perf_test_args {
        uint64_t gpa;
        uint64_t size;
        uint64_t guest_page_size;
+       uint32_t random_seed;
        int wr_fract;
 
        /* Run vCPUs in L2 instead of L1, if the architecture supports it. */
@@ -56,6 +57,7 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int nr_vcpus,
 void perf_test_destroy_vm(struct kvm_vm *vm);
 
 void perf_test_set_wr_fract(struct kvm_vm *vm, int wr_fract);
+void perf_test_set_random_seed(struct kvm_vm *vm, uint32_t random_seed);
 
 void perf_test_start_vcpu_threads(int vcpus, void (*vcpu_fn)(struct perf_test_vcpu_args *));
 void perf_test_join_vcpu_threads(int vcpus);
index 3a1d0a4..d48ee4f 100644 (file)
@@ -231,6 +231,12 @@ void perf_test_set_wr_fract(struct kvm_vm *vm, int wr_fract)
        sync_global_to_guest(vm, perf_test_args);
 }
 
+void perf_test_set_random_seed(struct kvm_vm *vm, uint32_t random_seed)
+{
+       perf_test_args.random_seed = random_seed;
+       sync_global_to_guest(vm, perf_test_args.random_seed);
+}
+
 uint64_t __weak perf_test_nested_pages(int nr_vcpus)
 {
        return 0;