Commit f11aa24b authored by Colton Lewis's avatar Colton Lewis Committed by Sean Christopherson
Browse files

KVM: selftests: create -r argument to specify random seed



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: default avatarColton Lewis <coltonlewis@google.com>
Reviewed-by: default avatarDavid Matlack <dmatlack@google.com>
Link: https://lore.kernel.org/r/20221107182208.479157-3-coltonlewis@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent b31f21a7
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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);
+6 −0
Original line number Diff line number Diff line
@@ -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;