From patchwork Wed Aug 17 21:41:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Colton Lewis X-Patchwork-Id: 12946499 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1636CC32772 for ; Wed, 17 Aug 2022 21:42:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238436AbiHQVmU (ORCPT ); Wed, 17 Aug 2022 17:42:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42870 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231496AbiHQVmT (ORCPT ); Wed, 17 Aug 2022 17:42:19 -0400 Received: from mail-io1-xd49.google.com (mail-io1-xd49.google.com [IPv6:2607:f8b0:4864:20::d49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A1025A7AA6 for ; Wed, 17 Aug 2022 14:42:18 -0700 (PDT) Received: by mail-io1-xd49.google.com with SMTP id z30-20020a05660217de00b00688bd42dc1dso3319974iox.15 for ; Wed, 17 Aug 2022 14:42:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=fyTRrNfvfx7kQKbQTujWp6z2VNyweYkMPBwA6/c3HSs=; b=YpsejDrEcD1JWYzwaN2iVX8qsBy7cfCtjfswlOLxBiTmnwL8xbomqLSOWtjzLA3VhW mq9xkXcs2UiS66Ort6VoF8fqk8UzvzVYaSfPDagTVmreW6hoFpFI+QKWQvzMrKS04Joi ewo9+qY47o0zRCcOtYbTe4uzkijMQJ/0FAe9HBOMCfFeB4aGFdvrm9aoPC186MGa05hP rVSR90T4x+GoGZ2//RJ8rTA2QQUKcJ9zm6E8Z9gC3w4rwgooU6Q0xfUNHb4/xMs8e19T K9tyEIoj3ZAlf46WTgz1/b2oU9Y5cSAlSvU7CL8Bi9TCczez+4tYBSUv5cvbp4eTaeI2 9SOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=fyTRrNfvfx7kQKbQTujWp6z2VNyweYkMPBwA6/c3HSs=; b=StFK7Z5flRUT7d7lqG+LW2db0KVzzMILJRg4V4f66HY2M7G0Z+x2EyyGhZ+6AEkdCA rl+WPMyhCQgD07q13DpLPkqOwtmWE5781xzVLuecusXED9mEQ2Y6LE0oP8isprRSdW+L F8llzyUgJulwIiZ/dxjFrPPLItkdFW0aWwsqpVqGgs0JUh4vFdUVbeBWJbYyii9O0E2K 1doFUdmV+4Du1DEsZsIAfhwue88z6zll8YN32bE3mVexYsoFV5q10iCJauHdbvV/6rAw GbUeomLQB4AeuGPGWzSjb/yCMfSUWMS3c5lmqliDyG/Y0Q55Oz8pipATwQH92bZC49TQ w05A== X-Gm-Message-State: ACgBeo1P/pUQbWsuxf+7LqoHtbIcVopG6EBQfuaG1YVYGQqV2OfuZbn1 ufczLJm0cVS4uTAyQI3ZWLwiHL5xbxPCJJzJoJezua8qGjMQzDfadgNrRS6M/Fb3vfnCjFmLq2W 5DYomstID0qI8UmI2o2D/jtjfLXgPASbFt0gtTLpnJK/O65u9Zino+lC/mj+ev5YXQoirGKM= X-Google-Smtp-Source: AA6agR5HuMFnmMZ/3l8xQBf9Q3UB8WVuQfZaqy1uzKF3ufszdvVaBnRaPzc+MlRfoOESJaSCQcBxs1qSOuWKX5eOZw== X-Received: from coltonlewis-kvm.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:14ce]) (user=coltonlewis job=sendgmr) by 2002:a6b:cdcd:0:b0:67c:9b5b:2fa with SMTP id d196-20020a6bcdcd000000b0067c9b5b02famr86703iog.195.1660772537988; Wed, 17 Aug 2022 14:42:17 -0700 (PDT) Date: Wed, 17 Aug 2022 21:41:44 +0000 In-Reply-To: <20220817214146.3285106-1-coltonlewis@google.com> Message-Id: <20220817214146.3285106-2-coltonlewis@google.com> Mime-Version: 1.0 References: <20220817214146.3285106-1-coltonlewis@google.com> X-Mailer: git-send-email 2.37.1.595.g718a3a8f04-goog Subject: [PATCH v2 1/3] KVM: selftests: Create source of randomness for guest code. From: Colton Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, maz@kernel.org, dmatlack@google.com, seanjc@google.com, oupton@google.com, ricarkol@google.com, Colton Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Create for each vcpu an array of random numbers to be used as a source of randomness when executing guest code. Randomness should be useful for approaching more realistic conditions in dirty_log_perf_test. Create a -r argument to specify a random seed. If no argument is provided, the seed defaults to the current Unix timestamp. The random arrays are allocated and filled as part of VM creation. The additional memory used is one 32-bit number per guest VM page to ensure one number for each iteration of the inner loop of guest_code. Signed-off-by: Colton Lewis --- .../selftests/kvm/dirty_log_perf_test.c | 11 ++++- .../selftests/kvm/include/perf_test_util.h | 3 ++ .../selftests/kvm/lib/perf_test_util.c | 45 ++++++++++++++++++- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c index f99e39a672d3..362b946019e9 100644 --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c @@ -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,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) p->slots, p->backing_src, p->partition_vcpu_memory_access); + 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 +354,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]\n", name); puts(""); printf(" -i: specify iteration counts (default: %"PRIu64")\n", @@ -380,6 +382,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"); @@ -396,6 +399,7 @@ int main(int argc, char *argv[]) .partition_vcpu_memory_access = true, .backing_src = DEFAULT_VM_MEM_SRC, .slots = 1, + .random_seed = time(NULL), }; int opt; @@ -406,7 +410,7 @@ int main(int argc, char *argv[]) guest_modes_append_default(); - while ((opt = getopt(argc, argv, "eghi:p:m:nb:f:v:os:x:")) != -1) { + while ((opt = getopt(argc, argv, "eghi:p:m:nb:f:v:or:s:x:")) != -1) { switch (opt) { case 'e': /* 'e' is for evil. */ @@ -442,6 +446,9 @@ int main(int argc, char *argv[]) case 'o': p.partition_vcpu_memory_access = false; break; + case 'r': + p.random_seed = atoi(optarg); + break; case 's': p.backing_src = parse_backing_src_type(optarg); break; diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h index eaa88df0555a..9517956424fc 100644 --- a/tools/testing/selftests/kvm/include/perf_test_util.h +++ b/tools/testing/selftests/kvm/include/perf_test_util.h @@ -23,6 +23,7 @@ struct perf_test_vcpu_args { uint64_t gpa; uint64_t gva; uint64_t pages; + vm_vaddr_t random_array; /* Only used by the host userspace part of the vCPU thread */ struct kvm_vcpu *vcpu; @@ -35,6 +36,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. */ @@ -52,6 +54,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); diff --git a/tools/testing/selftests/kvm/lib/perf_test_util.c b/tools/testing/selftests/kvm/lib/perf_test_util.c index 9618b37c66f7..8d85923acb4e 100644 --- a/tools/testing/selftests/kvm/lib/perf_test_util.c +++ b/tools/testing/selftests/kvm/lib/perf_test_util.c @@ -70,6 +70,35 @@ void perf_test_guest_code(uint32_t vcpu_idx) } } +void perf_test_alloc_random_arrays(uint32_t nr_vcpus, uint32_t nr_randoms) +{ + struct perf_test_args *pta = &perf_test_args; + + for (uint32_t i = 0; i < nr_vcpus; i++) { + pta->vcpu_args[i].random_array = vm_vaddr_alloc( + pta->vm, + nr_randoms * sizeof(uint32_t), + KVM_UTIL_MIN_VADDR); + pr_debug("Random row %d vaddr: %p.\n", i, (void *)pta->vcpu_args[i].random_array); + } +} + +void perf_test_fill_random_arrays(uint32_t nr_vcpus, uint32_t nr_randoms) +{ + struct perf_test_args *pta = &perf_test_args; + uint32_t *host_row; + + for (uint32_t i = 0; i < nr_vcpus; i++) { + host_row = addr_gva2hva(pta->vm, pta->vcpu_args[i].random_array); + + for (uint32_t j = 0; j < nr_randoms; j++) + host_row[j] = random(); + + pr_debug("New randoms row %d: %d, %d, %d...\n", + i, host_row[0], host_row[1], host_row[2]); + } +} + void perf_test_setup_vcpus(struct kvm_vm *vm, int nr_vcpus, struct kvm_vcpu *vcpus[], uint64_t vcpu_memory_bytes, @@ -120,8 +149,9 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int nr_vcpus, pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode)); - /* By default vCPUs will write to memory. */ - pta->wr_fract = 1; + /* Set perf_test_args defaults. */ + pta->wr_fract = 100; + pta->random_seed = time(NULL); /* * Snapshot the non-huge page size. This is used by the guest code to @@ -211,6 +241,11 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int nr_vcpus, ucall_init(vm, NULL); + srandom(perf_test_args.random_seed); + pr_info("Random seed: %d\n", perf_test_args.random_seed); + perf_test_alloc_random_arrays(nr_vcpus, vcpu_memory_bytes >> vm->page_shift); + perf_test_fill_random_arrays(nr_vcpus, vcpu_memory_bytes >> vm->page_shift); + /* Export the shared variables to the guest. */ sync_global_to_guest(vm, perf_test_args); @@ -229,6 +264,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); +} + uint64_t __weak perf_test_nested_pages(int nr_vcpus) { return 0; From patchwork Wed Aug 17 21:41:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Colton Lewis X-Patchwork-Id: 12946500 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BBD34C25B08 for ; Wed, 17 Aug 2022 21:42:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241315AbiHQVmW (ORCPT ); Wed, 17 Aug 2022 17:42:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42876 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235981AbiHQVmU (ORCPT ); Wed, 17 Aug 2022 17:42:20 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D4920A896D for ; Wed, 17 Aug 2022 14:42:19 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-335ff2ef600so21368507b3.18 for ; Wed, 17 Aug 2022 14:42:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=dLH+sVNnmkewn/U0/amXG1XYi6OV47iSKUjKy/dJDlg=; b=VTJq1dOJrRJGBtj2GFXSHkrjy1oACwRoBxB3JIkF5uSEB79uAyNl6jncVcPXcc4I9/ 0MIkFlTgZ9Likz3TrGSjiYwGgkuD0t1xdoi1gSxmre1yGfFydGkAlGFxNXz9AIL3DwX7 5Zzbr+nPrBzI5glo003lw6AfxmIMRwqXqQISWdzS14al7efhzoBFCUX/zAFZeQktWU06 K5nBAIrDAPNYy5RPoY+6eOPG9NxHf7C6HbE102SFXBOncp/I9azsT1VWRKF+iK4FX3gq 4oPHBIAb7uAgLMx/3i3iNVVCt7xQ1CQWYTvRoONX5gFJSwkfYGT3Ns1xpJN7ApeNTWdj 6XMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=dLH+sVNnmkewn/U0/amXG1XYi6OV47iSKUjKy/dJDlg=; b=WviT5cIkvZ78aiDxONXhrVruJM7b9DtZgBqjSa/uYrQi5hYVfSxu0PNxPgHHSZ6JdL s0xlTNZFFaa7Xh2JtYw8zpJ6HhyMzWkujjAMSzxcdL5mQnsuQMAQ+zVxioCyvKtna6SX Z6DfNTkMVevYGJ34MKljIrIeScWvOD3qvu4OBZhesjRfE0KUJavvIhAP5jDQBkn6WCUW 12nsijRLraa+fUqoZHjpjhNSnOVPncaR613Zlzl/6txc/lOeO/FSxrUe3HBAV8BQVFUU ihMR4CGzgJ0Ri5UPg6hqjCqeVzly8K6KQs7AM0MC87N5ZRmQlWWWMeRA701iNcLGhOtl 1X2w== X-Gm-Message-State: ACgBeo24v5d9FuWmJmu35aL7aFYW/a4wrMPB2W5/8XFFclGHlrUR55uQ XW8h2KCbe3z5AbtuyzCOS/nEaS3Feu1xgeQCAS6J0l9hMCW7Pdac3Gu2S7KzmMVWlzup+3gcSrU oV1kbKJgcVRwKIc+Qso+tfn7saI4LssFFEKIRwD82mQE486F4DMw/wFpAFal0wonplHDeFGc= X-Google-Smtp-Source: AA6agR796yf1Bqdh4G1LFNWXiAXo4qzIBqafW2xFO2keohri5TZOOzXmcLs837ohybTjxJnMy2k7IYkGUfllO3U39Q== X-Received: from coltonlewis-kvm.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:14ce]) (user=coltonlewis job=sendgmr) by 2002:a5b:b8e:0:b0:67c:237b:760b with SMTP id l14-20020a5b0b8e000000b0067c237b760bmr169537ybq.627.1660772539048; Wed, 17 Aug 2022 14:42:19 -0700 (PDT) Date: Wed, 17 Aug 2022 21:41:45 +0000 In-Reply-To: <20220817214146.3285106-1-coltonlewis@google.com> Message-Id: <20220817214146.3285106-3-coltonlewis@google.com> Mime-Version: 1.0 References: <20220817214146.3285106-1-coltonlewis@google.com> X-Mailer: git-send-email 2.37.1.595.g718a3a8f04-goog Subject: [PATCH v2 2/3] KVM: selftests: Randomize which pages are written vs read. From: Colton Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, maz@kernel.org, dmatlack@google.com, seanjc@google.com, oupton@google.com, ricarkol@google.com, Colton Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Randomize which tables are written vs read using the random number arrays. Change the variable wr_fract and associated function calls to write_percent that now operates as a percentage from 0 to 100 where X means each page has an X% chance of being written. Change the -f argument to -w to reflect the new variable semantics. Keep the same default of 100 percent writes. Signed-off-by: Colton Lewis --- .../selftests/kvm/access_tracking_perf_test.c | 2 +- .../selftests/kvm/dirty_log_perf_test.c | 28 ++++++++++--------- .../selftests/kvm/include/perf_test_util.h | 4 +-- .../selftests/kvm/lib/perf_test_util.c | 9 +++--- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/kvm/access_tracking_perf_test.c b/tools/testing/selftests/kvm/access_tracking_perf_test.c index 1c2749b1481a..e87696b60e0f 100644 --- a/tools/testing/selftests/kvm/access_tracking_perf_test.c +++ b/tools/testing/selftests/kvm/access_tracking_perf_test.c @@ -272,7 +272,7 @@ static void run_iteration(struct kvm_vm *vm, int nr_vcpus, const char *descripti static void access_memory(struct kvm_vm *vm, int nr_vcpus, enum access_type access, const char *description) { - perf_test_set_wr_fract(vm, (access == ACCESS_READ) ? INT_MAX : 1); + perf_test_set_write_percent(vm, (access == ACCESS_READ) ? 0 : 100); iteration_work = ITERATION_ACCESS_MEMORY; run_iteration(vm, nr_vcpus, description); } diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c index 362b946019e9..9226eeea79bc 100644 --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c @@ -128,10 +128,10 @@ static void vcpu_worker(struct perf_test_vcpu_args *vcpu_args) struct test_params { unsigned long iterations; uint64_t phys_offset; - int wr_fract; bool partition_vcpu_memory_access; enum vm_mem_backing_src_type backing_src; int slots; + uint32_t write_percent; uint32_t random_seed; }; @@ -227,7 +227,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) p->partition_vcpu_memory_access); perf_test_set_random_seed(vm, p->random_seed); - perf_test_set_wr_fract(vm, p->wr_fract); + perf_test_set_write_percent(vm, p->write_percent); guest_num_pages = (nr_vcpus * guest_percpu_mem_size) >> vm->page_shift; guest_num_pages = vm_adjust_num_guest_pages(mode, guest_num_pages); @@ -355,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] [-r random seed ] [-s mem type]" - "[-x memslots]\n", name); + "[-x memslots] [-w percentage]\n", name); puts(""); printf(" -i: specify iteration counts (default: %"PRIu64")\n", TEST_HOST_LOOP_N); @@ -375,10 +375,6 @@ static void help(char *name) printf(" -b: specify the size of the memory region which should be\n" " dirtied by each vCPU. e.g. 10M or 3G.\n" " (default: 1G)\n"); - printf(" -f: specify the fraction of pages which should be written to\n" - " as opposed to simply read, in the form\n" - " 1/.\n" - " (default: 1 i.e. all pages are written to.)\n"); 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"); @@ -386,6 +382,11 @@ static void help(char *name) backing_src_help("-s"); printf(" -x: Split the memory region into this number of memslots.\n" " (default: 1)\n"); + printf(" -w: specify the percentage of pages which should be written to\n" + " as an integer from 0-100 inclusive. This is probabalistic,\n" + " so -w X means each page has an X%% chance of writing\n" + " and a (100-X)%% chance of reading.\n" + " (default: 100 i.e. all pages are written to.)\n"); puts(""); exit(0); } @@ -395,10 +396,10 @@ int main(int argc, char *argv[]) int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS); struct test_params p = { .iterations = TEST_HOST_LOOP_N, - .wr_fract = 1, .partition_vcpu_memory_access = true, .backing_src = DEFAULT_VM_MEM_SRC, .slots = 1, + .write_percent = 100, .random_seed = time(NULL), }; int opt; @@ -410,7 +411,7 @@ int main(int argc, char *argv[]) guest_modes_append_default(); - while ((opt = getopt(argc, argv, "eghi:p:m:nb:f:v:or:s:x:")) != -1) { + while ((opt = getopt(argc, argv, "eghi:p:m:nb:v:or:s:x:w:")) != -1) { switch (opt) { case 'e': /* 'e' is for evil. */ @@ -433,10 +434,11 @@ int main(int argc, char *argv[]) case 'b': guest_percpu_mem_size = parse_size(optarg); break; - case 'f': - p.wr_fract = atoi(optarg); - TEST_ASSERT(p.wr_fract >= 1, - "Write fraction cannot be less than one"); + case 'w': + perf_test_args.write_percent = atoi(optarg); + TEST_ASSERT(perf_test_args.write_percent >= 0 + && perf_test_args.write_percent <= 100, + "Write percentage must be between 0 and 100"); break; case 'v': nr_vcpus = atoi(optarg); diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h index 9517956424fc..8da4a839c585 100644 --- a/tools/testing/selftests/kvm/include/perf_test_util.h +++ b/tools/testing/selftests/kvm/include/perf_test_util.h @@ -37,7 +37,7 @@ struct perf_test_args { uint64_t size; uint64_t guest_page_size; uint32_t random_seed; - int wr_fract; + int write_percent; /* Run vCPUs in L2 instead of L1, if the architecture supports it. */ bool nested; @@ -53,7 +53,7 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int nr_vcpus, bool partition_vcpu_memory_access); 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_write_percent(struct kvm_vm *vm, uint32_t write_percent); 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 *)); diff --git a/tools/testing/selftests/kvm/lib/perf_test_util.c b/tools/testing/selftests/kvm/lib/perf_test_util.c index 8d85923acb4e..1a6b69713337 100644 --- a/tools/testing/selftests/kvm/lib/perf_test_util.c +++ b/tools/testing/selftests/kvm/lib/perf_test_util.c @@ -48,6 +48,7 @@ void perf_test_guest_code(uint32_t vcpu_idx) struct perf_test_vcpu_args *vcpu_args = &pta->vcpu_args[vcpu_idx]; uint64_t gva; uint64_t pages; + uint32_t *rnd_arr = (uint32_t *)vcpu_args->random_array; int i; gva = vcpu_args->gva; @@ -60,7 +61,7 @@ void perf_test_guest_code(uint32_t vcpu_idx) for (i = 0; i < pages; i++) { uint64_t addr = gva + (i * pta->guest_page_size); - if (i % pta->wr_fract == 0) + if (rnd_arr[i] % 100 < pta->write_percent) *(uint64_t *)addr = 0x0123456789ABCDEF; else READ_ONCE(*(uint64_t *)addr); @@ -150,7 +151,7 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int nr_vcpus, pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode)); /* Set perf_test_args defaults. */ - pta->wr_fract = 100; + pta->write_percent = 100; pta->random_seed = time(NULL); /* @@ -258,9 +259,9 @@ void perf_test_destroy_vm(struct kvm_vm *vm) kvm_vm_free(vm); } -void perf_test_set_wr_fract(struct kvm_vm *vm, int wr_fract) +void perf_test_set_write_percent(struct kvm_vm *vm, uint32_t write_percent) { - perf_test_args.wr_fract = wr_fract; + perf_test_args.write_percent = write_percent; sync_global_to_guest(vm, perf_test_args); } From patchwork Wed Aug 17 21:41:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Colton Lewis X-Patchwork-Id: 12946501 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 057FEC32773 for ; Wed, 17 Aug 2022 21:42:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241384AbiHQVmX (ORCPT ); Wed, 17 Aug 2022 17:42:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42892 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238882AbiHQVmV (ORCPT ); Wed, 17 Aug 2022 17:42:21 -0400 Received: from mail-il1-x14a.google.com (mail-il1-x14a.google.com [IPv6:2607:f8b0:4864:20::14a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F2EA2A8CF5 for ; Wed, 17 Aug 2022 14:42:20 -0700 (PDT) Received: by mail-il1-x14a.google.com with SMTP id w6-20020a056e02190600b002e74e05fdc2so2931075ilu.21 for ; Wed, 17 Aug 2022 14:42:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=eUN2ZDvPsolqQtzdBuIc7K4HgJ9E812yG7xKm8dwUDY=; b=IENcdKxq+beGG/Ls6s0DuC2g51R1wifMcmB2ZOBM4xmOeKP47+XVDjWUZ6r5eoepxd ZfkOZwtUyErnnVxJIQTKu3EHZjqp8AZ1jNicrrD3CKvakuei3iVFVlXy8ZiGl1FD6Ko1 bY7AN/5OZg/jwcoINiR7ma88pQobKvOwrbkOViLlcw0C6q1Qbo5NlhYd/b48FAf2y8w4 DZyoAruymoaHr4vVRUWI8OsMtFzK+tGWSzJNX30Do0nlAZtQ1KTqBI4QjwE/bcN9voAx JpfFGeL7Hk+mA43d1kP7adKosEnatm307bBvrHNuhglNy6UOltg6i74WpyVfyKQkHWJl IIKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=eUN2ZDvPsolqQtzdBuIc7K4HgJ9E812yG7xKm8dwUDY=; b=l5FD7r5TlFucwR1E4ZTEJHo1IrRFBLwxXVpEWHTZ/MDGD9sow4LuKkH/4eUi6bjoGT PAhdYUix0bmVzJhgwR1ngEUqCDozBbYMwpHUPWioFsHkEMS/BOxiBGL0FuFotI2BMZ0j Z/v8IrlZ8AJzDFpTjPoSniXHYdYOndkJVa2l9ATQPGq6sI6irIZ5RuOYkOsp0er7IaHL hVqMwuqToLPfrD9RudqpDkDQsxB0xwhzLBH8NMb7NPM+6n7+79wDyz4+aJSgfyCMwINc FpIZ774EpiCJpKgO5ekepx1LocbnJMIM1tNLjHSxPMVoQnFAagsFKQ7ryAdjA9Xv3ARg og8Q== X-Gm-Message-State: ACgBeo2TzK9PaTm7iUeRw3Ey0Mbwi6qCLZDd737XEBkKkklmMahHC1E9 RlU1eQEUEP95Z6APllEcr5M7caC9Km4TAjwTPbByehkOZDH6bFM5AG74yvPkXeqHc9Tek+EXXsU zskKeaFYjA7PU/8ii6fWStIPRfAkKMeV0ib+vlRdDTpl10/fNtrp6S2XeX1QqblrdkY+lIqk= X-Google-Smtp-Source: AA6agR4SZP5mmKPwiIJdWQbTKTAyFok9DEN4tuIUuQ22zel3ckRIV/05ackch0EsPL4eKAl1cvoOks/hiBRHBk44LQ== X-Received: from coltonlewis-kvm.c.googlers.com ([fda3:e722:ac3:cc00:2b:ff92:c0a8:14ce]) (user=coltonlewis job=sendgmr) by 2002:a05:6602:2e0e:b0:684:e4f9:734a with SMTP id o14-20020a0566022e0e00b00684e4f9734amr90184iow.200.1660772540287; Wed, 17 Aug 2022 14:42:20 -0700 (PDT) Date: Wed, 17 Aug 2022 21:41:46 +0000 In-Reply-To: <20220817214146.3285106-1-coltonlewis@google.com> Message-Id: <20220817214146.3285106-4-coltonlewis@google.com> Mime-Version: 1.0 References: <20220817214146.3285106-1-coltonlewis@google.com> X-Mailer: git-send-email 2.37.1.595.g718a3a8f04-goog Subject: [PATCH v2 3/3] KVM: selftests: Randomize page access order. From: Colton Lewis To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, maz@kernel.org, dmatlack@google.com, seanjc@google.com, oupton@google.com, ricarkol@google.com, Colton Lewis Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Create the ability to randomize page access order with the -a argument, including the possibility that the same pages may be hit multiple times during an iteration or not at all. Signed-off-by: Colton Lewis --- tools/testing/selftests/kvm/dirty_log_perf_test.c | 10 +++++++++- .../testing/selftests/kvm/include/perf_test_util.h | 2 ++ tools/testing/selftests/kvm/lib/perf_test_util.c | 13 ++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c index 9226eeea79bc..af9754bda0a4 100644 --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c @@ -133,6 +133,7 @@ struct test_params { int slots; uint32_t write_percent; uint32_t random_seed; + bool random_access; }; static void toggle_dirty_logging(struct kvm_vm *vm, int slots, bool enable) @@ -271,6 +272,9 @@ static void run_test(enum vm_guest_mode mode, void *arg) pr_info("Enabling dirty logging time: %ld.%.9lds\n\n", ts_diff.tv_sec, ts_diff.tv_nsec); + /* Set random access here, after population phase. */ + perf_test_set_random_access(vm, p->random_access); + while (iteration < p->iterations) { /* * Incrementing the iteration number will start the vCPUs @@ -353,10 +357,11 @@ static void run_test(enum vm_guest_mode mode, void *arg) static void help(char *name) { puts(""); - printf("usage: %s [-h] [-i iterations] [-p offset] [-g] " + printf("usage: %s [-h] [-a] [-i iterations] [-p offset] [-g] " "[-m mode] [-n] [-b vcpu bytes] [-v vcpus] [-o] [-r random seed ] [-s mem type]" "[-x memslots] [-w percentage]\n", name); puts(""); + printf(" -a: access memory randomly rather than in order.\n"); printf(" -i: specify iteration counts (default: %"PRIu64")\n", TEST_HOST_LOOP_N); printf(" -g: Do not enable KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2. This\n" @@ -413,6 +418,9 @@ int main(int argc, char *argv[]) while ((opt = getopt(argc, argv, "eghi:p:m:nb:v:or:s:x:w:")) != -1) { switch (opt) { + case 'a': + p.random_access = true; + break; case 'e': /* 'e' is for evil. */ run_vcpus_while_disabling_dirty_logging = true; diff --git a/tools/testing/selftests/kvm/include/perf_test_util.h b/tools/testing/selftests/kvm/include/perf_test_util.h index 8da4a839c585..237899f3f4fe 100644 --- a/tools/testing/selftests/kvm/include/perf_test_util.h +++ b/tools/testing/selftests/kvm/include/perf_test_util.h @@ -41,6 +41,7 @@ struct perf_test_args { /* Run vCPUs in L2 instead of L1, if the architecture supports it. */ bool nested; + bool random_access; struct perf_test_vcpu_args vcpu_args[KVM_MAX_VCPUS]; }; @@ -55,6 +56,7 @@ void perf_test_destroy_vm(struct kvm_vm *vm); void perf_test_set_write_percent(struct kvm_vm *vm, uint32_t write_percent); void perf_test_set_random_seed(struct kvm_vm *vm, uint32_t random_seed); +void perf_test_set_random_access(struct kvm_vm *vm, bool random_access); void perf_test_start_vcpu_threads(int vcpus, void (*vcpu_fn)(struct perf_test_vcpu_args *)); void perf_test_join_vcpu_threads(int vcpus); diff --git a/tools/testing/selftests/kvm/lib/perf_test_util.c b/tools/testing/selftests/kvm/lib/perf_test_util.c index 1a6b69713337..84e442a028c0 100644 --- a/tools/testing/selftests/kvm/lib/perf_test_util.c +++ b/tools/testing/selftests/kvm/lib/perf_test_util.c @@ -48,6 +48,7 @@ void perf_test_guest_code(uint32_t vcpu_idx) struct perf_test_vcpu_args *vcpu_args = &pta->vcpu_args[vcpu_idx]; uint64_t gva; uint64_t pages; + uint64_t addr; uint32_t *rnd_arr = (uint32_t *)vcpu_args->random_array; int i; @@ -59,7 +60,11 @@ void perf_test_guest_code(uint32_t vcpu_idx) while (true) { for (i = 0; i < pages; i++) { - uint64_t addr = gva + (i * pta->guest_page_size); + if (pta->random_access) + addr = gva + + ((rnd_arr[i] % pages) * pta->guest_page_size); + else + addr = gva + (i * pta->guest_page_size); if (rnd_arr[i] % 100 < pta->write_percent) *(uint64_t *)addr = 0x0123456789ABCDEF; @@ -271,6 +276,12 @@ void perf_test_set_random_seed(struct kvm_vm *vm, uint32_t random_seed) sync_global_to_guest(vm, perf_test_args); } +void perf_test_set_random_access(struct kvm_vm *vm, bool random_access) +{ + perf_test_args.random_access = random_access; + sync_global_to_guest(vm, perf_test_args); +} + uint64_t __weak perf_test_nested_pages(int nr_vcpus) { return 0;