* [PATCH 0/3] KVM: selftests: Small fixes for dirty_log_perf_test
@ 2021-09-15 21:30 David Matlack
2021-09-15 21:30 ` [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test David Matlack
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: David Matlack @ 2021-09-15 21:30 UTC (permalink / raw)
To: Paolo Bonzini
Cc: kvm, Andrew Jones, Ben Gardon, Axel Rasmussen, Yanan Wang, David Matlack
This series fixes 2 bugs in dirty_log_perf_test:
- Incorrect interleaving of help messages for -s and -x (patch 2)
- Buffer overflow when using multiple slots (patch 3)
Both bugs were introduced by commit 609e6202ea5f ("KVM: selftests:
Support multiple slots in dirty_log_perf_test").
Patch 1 is a small tangentially related cleanup to use a consistent
flag for the backing source across all selftests.
David Matlack (3):
KVM: selftests: Change backing_src flag to -s in demand_paging_test
KVM: selftests: Refactor help message for -s backing_src
KVM: selftests: Fix dirty bitmap offset calculation
.../selftests/kvm/access_tracking_perf_test.c | 6 ++---
.../selftests/kvm/demand_paging_test.c | 13 +++++------
.../selftests/kvm/dirty_log_perf_test.c | 23 +++++++++++++------
.../testing/selftests/kvm/include/test_util.h | 5 +++-
.../selftests/kvm/kvm_page_table_test.c | 7 ++----
tools/testing/selftests/kvm/lib/test_util.c | 17 ++++++++++----
6 files changed, 43 insertions(+), 28 deletions(-)
--
2.33.0.309.g3052b89438-goog
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test
2021-09-15 21:30 [PATCH 0/3] KVM: selftests: Small fixes for dirty_log_perf_test David Matlack
@ 2021-09-15 21:30 ` David Matlack
2021-09-15 21:56 ` Ben Gardon
2021-09-16 8:34 ` Andrew Jones
2021-09-15 21:30 ` [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src David Matlack
2021-09-15 21:30 ` [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation David Matlack
2 siblings, 2 replies; 14+ messages in thread
From: David Matlack @ 2021-09-15 21:30 UTC (permalink / raw)
To: Paolo Bonzini
Cc: kvm, Andrew Jones, Ben Gardon, Axel Rasmussen, Yanan Wang, David Matlack
Every other KVM selftest uses -s for the backing_src, so switch
demand_paging_test to match.
Signed-off-by: David Matlack <dmatlack@google.com>
---
tools/testing/selftests/kvm/demand_paging_test.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
index e79c1b64977f..735c081e774e 100644
--- a/tools/testing/selftests/kvm/demand_paging_test.c
+++ b/tools/testing/selftests/kvm/demand_paging_test.c
@@ -416,7 +416,7 @@ static void help(char *name)
{
puts("");
printf("usage: %s [-h] [-m vm_mode] [-u uffd_mode] [-d uffd_delay_usec]\n"
- " [-b memory] [-t type] [-v vcpus] [-o]\n", name);
+ " [-b memory] [-s type] [-v vcpus] [-o]\n", name);
guest_modes_help();
printf(" -u: use userfaultfd to handle vCPU page faults. Mode is a\n"
" UFFD registration mode: 'MISSING' or 'MINOR'.\n");
@@ -426,7 +426,7 @@ static void help(char *name)
printf(" -b: specify the size of the memory region which should be\n"
" demand paged by each vCPU. e.g. 10M or 3G.\n"
" Default: 1G\n");
- printf(" -t: The type of backing memory to use. Default: anonymous\n");
+ printf(" -s: The type of backing memory to use. Default: anonymous\n");
backing_src_help();
printf(" -v: specify the number of vCPUs to run.\n");
printf(" -o: Overlap guest memory accesses instead of partitioning\n"
@@ -446,7 +446,7 @@ int main(int argc, char *argv[])
guest_modes_append_default();
- while ((opt = getopt(argc, argv, "hm:u:d:b:t:v:o")) != -1) {
+ while ((opt = getopt(argc, argv, "hm:u:d:b:s:v:o")) != -1) {
switch (opt) {
case 'm':
guest_modes_cmdline(optarg);
@@ -465,7 +465,7 @@ int main(int argc, char *argv[])
case 'b':
guest_percpu_mem_size = parse_size(optarg);
break;
- case 't':
+ case 's':
p.src_type = parse_backing_src_type(optarg);
break;
case 'v':
@@ -485,7 +485,7 @@ int main(int argc, char *argv[])
if (p.uffd_mode == UFFDIO_REGISTER_MODE_MINOR &&
!backing_src_is_shared(p.src_type)) {
- TEST_FAIL("userfaultfd MINOR mode requires shared memory; pick a different -t");
+ TEST_FAIL("userfaultfd MINOR mode requires shared memory; pick a different -s");
}
for_each_guest_mode(run_test, &p);
--
2.33.0.309.g3052b89438-goog
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src
2021-09-15 21:30 [PATCH 0/3] KVM: selftests: Small fixes for dirty_log_perf_test David Matlack
2021-09-15 21:30 ` [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test David Matlack
@ 2021-09-15 21:30 ` David Matlack
2021-09-15 21:55 ` Ben Gardon
2021-09-16 8:41 ` Andrew Jones
2021-09-15 21:30 ` [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation David Matlack
2 siblings, 2 replies; 14+ messages in thread
From: David Matlack @ 2021-09-15 21:30 UTC (permalink / raw)
To: Paolo Bonzini
Cc: kvm, Andrew Jones, Ben Gardon, Axel Rasmussen, Yanan Wang, David Matlack
All selftests that support the backing_src option were printing their
own description of the flag and then calling backing_src_help() to dump
the list of available backing sources. Consolidate the flag printing in
backing_src_help() to align indentation, reduce duplicated strings, and
improve consistency across tests.
Note: Passing "-s" to backing_src_help is unnecessary since every test
uses the same flag. However I decided to keep it for code readability
at the call sites.
While here this opportunistically fixes the incorrectly interleaved
printing -x help message and list of backing source types in
dirty_log_perf_test.
Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
Signed-off-by: David Matlack <dmatlack@google.com>
---
.../selftests/kvm/access_tracking_perf_test.c | 6 ++----
.../testing/selftests/kvm/demand_paging_test.c | 5 ++---
.../testing/selftests/kvm/dirty_log_perf_test.c | 8 +++-----
tools/testing/selftests/kvm/include/test_util.h | 5 ++++-
.../testing/selftests/kvm/kvm_page_table_test.c | 7 ++-----
tools/testing/selftests/kvm/lib/test_util.c | 17 +++++++++++++----
6 files changed, 26 insertions(+), 22 deletions(-)
diff --git a/tools/testing/selftests/kvm/access_tracking_perf_test.c b/tools/testing/selftests/kvm/access_tracking_perf_test.c
index 71e277c7c3f3..5d95113c7b7c 100644
--- a/tools/testing/selftests/kvm/access_tracking_perf_test.c
+++ b/tools/testing/selftests/kvm/access_tracking_perf_test.c
@@ -371,9 +371,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(" -s: specify the type of memory that should be used to\n"
- " back the guest data region.\n\n");
- backing_src_help();
+ backing_src_help("-s");
puts("");
exit(0);
}
@@ -381,7 +379,7 @@ static void help(char *name)
int main(int argc, char *argv[])
{
struct test_params params = {
- .backing_src = VM_MEM_SRC_ANONYMOUS,
+ .backing_src = DEFAULT_VM_MEM_SRC,
.vcpu_memory_bytes = DEFAULT_PER_VCPU_MEM_SIZE,
.vcpus = 1,
};
diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
index 735c081e774e..96cd3e0357f6 100644
--- a/tools/testing/selftests/kvm/demand_paging_test.c
+++ b/tools/testing/selftests/kvm/demand_paging_test.c
@@ -426,8 +426,7 @@ static void help(char *name)
printf(" -b: specify the size of the memory region which should be\n"
" demand paged by each vCPU. e.g. 10M or 3G.\n"
" Default: 1G\n");
- printf(" -s: The type of backing memory to use. Default: anonymous\n");
- backing_src_help();
+ backing_src_help("-s");
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");
@@ -439,7 +438,7 @@ int main(int argc, char *argv[])
{
int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
struct test_params p = {
- .src_type = VM_MEM_SRC_ANONYMOUS,
+ .src_type = DEFAULT_VM_MEM_SRC,
.partition_vcpu_memory_access = true,
};
int opt;
diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c
index 3c30d0045d8d..5ad9f2bc7369 100644
--- a/tools/testing/selftests/kvm/dirty_log_perf_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
@@ -308,11 +308,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("-s");
printf(" -x: Split the memory region into this number of memslots.\n"
- " (default: 1)");
- backing_src_help();
+ " (default: 1)\n");
puts("");
exit(0);
}
@@ -324,7 +322,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,
+ .backing_src = DEFAULT_VM_MEM_SRC,
.slots = 1,
};
int opt;
diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
index d79be15dd3d2..2f09f2994733 100644
--- a/tools/testing/selftests/kvm/include/test_util.h
+++ b/tools/testing/selftests/kvm/include/test_util.h
@@ -68,6 +68,7 @@ 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,
@@ -90,6 +91,8 @@ enum vm_mem_backing_src_type {
NUM_SRC_TYPES,
};
+#define DEFAULT_VM_MEM_SRC VM_MEM_SRC_ANONYMOUS
+
struct vm_mem_backing_src_alias {
const char *name;
uint32_t flag;
@@ -100,7 +103,7 @@ size_t get_trans_hugepagesz(void);
size_t get_def_hugetlb_pagesz(void);
const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i);
size_t get_backing_src_pagesz(uint32_t i);
-void backing_src_help(void);
+void backing_src_help(const char *flag);
enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name);
/*
diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
index 0d04a7db7f24..36407cb0ec85 100644
--- a/tools/testing/selftests/kvm/kvm_page_table_test.c
+++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
@@ -456,10 +456,7 @@ static void help(char *name)
" (default: 1G)\n");
printf(" -v: specify the number of vCPUs to run\n"
" (default: 1)\n");
- printf(" -s: specify the type of memory that should be used to\n"
- " back the guest data region.\n"
- " (default: anonymous)\n\n");
- backing_src_help();
+ backing_src_help("-s");
puts("");
}
@@ -468,7 +465,7 @@ int main(int argc, char *argv[])
int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
struct test_params p = {
.test_mem_size = DEFAULT_TEST_MEM_SIZE,
- .src_type = VM_MEM_SRC_ANONYMOUS,
+ .src_type = DEFAULT_VM_MEM_SRC,
};
int opt;
diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
index af1031fed97f..ea23a86132ed 100644
--- a/tools/testing/selftests/kvm/lib/test_util.c
+++ b/tools/testing/selftests/kvm/lib/test_util.c
@@ -279,13 +279,22 @@ size_t get_backing_src_pagesz(uint32_t i)
}
}
-void backing_src_help(void)
+void print_available_backing_src_types(const char *prefix)
{
int i;
- printf("Available backing src types:\n");
+ printf("%sAvailable backing src types:\n", prefix);
+
for (i = 0; i < NUM_SRC_TYPES; i++)
- printf("\t%s\n", vm_mem_backing_src_alias(i)->name);
+ printf("%s %s\n", prefix, vm_mem_backing_src_alias(i)->name);
+}
+
+void backing_src_help(const char *flag)
+{
+ printf(" %s: specify the type of memory that should be used to\n"
+ " back the guest data region. (default: %s)\n",
+ flag, vm_mem_backing_src_alias(DEFAULT_VM_MEM_SRC)->name);
+ print_available_backing_src_types(" ");
}
enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
@@ -296,7 +305,7 @@ enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
if (!strcmp(type_name, vm_mem_backing_src_alias(i)->name))
return i;
- backing_src_help();
+ print_available_backing_src_types("");
TEST_FAIL("Unknown backing src type: %s", type_name);
return -1;
}
--
2.33.0.309.g3052b89438-goog
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation
2021-09-15 21:30 [PATCH 0/3] KVM: selftests: Small fixes for dirty_log_perf_test David Matlack
2021-09-15 21:30 ` [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test David Matlack
2021-09-15 21:30 ` [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src David Matlack
@ 2021-09-15 21:30 ` David Matlack
2021-09-15 21:55 ` Ben Gardon
2 siblings, 1 reply; 14+ messages in thread
From: David Matlack @ 2021-09-15 21:30 UTC (permalink / raw)
To: Paolo Bonzini
Cc: kvm, Andrew Jones, Ben Gardon, Axel Rasmussen, Yanan Wang, David Matlack
The calculation to get the per-slot dirty bitmap was incorrect leading
to a buffer overrun. Fix it by dividing the number of pages by
BITS_PER_LONG, since each element of the bitmap is a long and there is
one bit per page.
Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
Signed-off-by: David Matlack <dmatlack@google.com>
---
tools/testing/selftests/kvm/dirty_log_perf_test.c | 15 +++++++++++++--
1 file changed, 13 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 5ad9f2bc7369..0dd4626571e9 100644
--- a/tools/testing/selftests/kvm/dirty_log_perf_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
@@ -118,6 +118,12 @@ static inline void disable_dirty_logging(struct kvm_vm *vm, int slots)
toggle_dirty_logging(vm, slots, false);
}
+static unsigned long *get_slot_bitmap(unsigned long *bitmap, uint64_t page_offset)
+{
+ /* Guaranteed to be evenly divisible by the TEST_ASSERT in run_test. */
+ return &bitmap[page_offset / BITS_PER_LONG];
+}
+
static void get_dirty_log(struct kvm_vm *vm, int slots, unsigned long *bitmap,
uint64_t nr_pages)
{
@@ -126,7 +132,8 @@ static void get_dirty_log(struct kvm_vm *vm, int slots, unsigned long *bitmap,
for (i = 0; i < slots; i++) {
int slot = PERF_TEST_MEM_SLOT_INDEX + i;
- unsigned long *slot_bitmap = bitmap + i * slot_pages;
+ uint64_t page_offset = slot_pages * i;
+ unsigned long *slot_bitmap = get_slot_bitmap(bitmap, page_offset);
kvm_vm_get_dirty_log(vm, slot, slot_bitmap);
}
@@ -140,7 +147,8 @@ static void clear_dirty_log(struct kvm_vm *vm, int slots, unsigned long *bitmap,
for (i = 0; i < slots; i++) {
int slot = PERF_TEST_MEM_SLOT_INDEX + i;
- unsigned long *slot_bitmap = bitmap + i * slot_pages;
+ uint64_t page_offset = slot_pages * i;
+ unsigned long *slot_bitmap = get_slot_bitmap(bitmap, page_offset);
kvm_vm_clear_dirty_log(vm, slot, slot_bitmap, 0, slot_pages);
}
@@ -172,6 +180,9 @@ static void run_test(enum vm_guest_mode mode, void *arg)
guest_num_pages = vm_adjust_num_guest_pages(mode, guest_num_pages);
host_num_pages = vm_num_host_pages(mode, guest_num_pages);
bmap = bitmap_alloc(host_num_pages);
+ TEST_ASSERT((host_num_pages / p->slots) % BITS_PER_LONG == 0,
+ "The number of pages per slot must be divisible by %d.",
+ BITS_PER_LONG);
if (dirty_log_manual_caps) {
cap.cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2;
--
2.33.0.309.g3052b89438-goog
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation
2021-09-15 21:30 ` [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation David Matlack
@ 2021-09-15 21:55 ` Ben Gardon
2021-09-16 8:49 ` Andrew Jones
0 siblings, 1 reply; 14+ messages in thread
From: Ben Gardon @ 2021-09-15 21:55 UTC (permalink / raw)
To: David Matlack
Cc: Paolo Bonzini, kvm, Andrew Jones, Axel Rasmussen, Yanan Wang
On Wed, Sep 15, 2021 at 2:30 PM David Matlack <dmatlack@google.com> wrote:
>
> The calculation to get the per-slot dirty bitmap was incorrect leading
> to a buffer overrun. Fix it by dividing the number of pages by
> BITS_PER_LONG, since each element of the bitmap is a long and there is
> one bit per page.
>
> Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
> Signed-off-by: David Matlack <dmatlack@google.com>
I was a little confused initially because we're allocating only one
dirty bitmap in userspace even when we have multiple slots, but that's
not a problem.
Reviewed-by: Ben Gardon <bgardon@google.com>
>
> ---
> tools/testing/selftests/kvm/dirty_log_perf_test.c | 15 +++++++++++++--
> 1 file changed, 13 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 5ad9f2bc7369..0dd4626571e9 100644
> --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c
> +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
> @@ -118,6 +118,12 @@ static inline void disable_dirty_logging(struct kvm_vm *vm, int slots)
> toggle_dirty_logging(vm, slots, false);
> }
>
> +static unsigned long *get_slot_bitmap(unsigned long *bitmap, uint64_t page_offset)
> +{
> + /* Guaranteed to be evenly divisible by the TEST_ASSERT in run_test. */
> + return &bitmap[page_offset / BITS_PER_LONG];
> +}
> +
> static void get_dirty_log(struct kvm_vm *vm, int slots, unsigned long *bitmap,
> uint64_t nr_pages)
> {
> @@ -126,7 +132,8 @@ static void get_dirty_log(struct kvm_vm *vm, int slots, unsigned long *bitmap,
>
> for (i = 0; i < slots; i++) {
> int slot = PERF_TEST_MEM_SLOT_INDEX + i;
> - unsigned long *slot_bitmap = bitmap + i * slot_pages;
> + uint64_t page_offset = slot_pages * i;
> + unsigned long *slot_bitmap = get_slot_bitmap(bitmap, page_offset);
>
> kvm_vm_get_dirty_log(vm, slot, slot_bitmap);
> }
> @@ -140,7 +147,8 @@ static void clear_dirty_log(struct kvm_vm *vm, int slots, unsigned long *bitmap,
>
> for (i = 0; i < slots; i++) {
> int slot = PERF_TEST_MEM_SLOT_INDEX + i;
> - unsigned long *slot_bitmap = bitmap + i * slot_pages;
> + uint64_t page_offset = slot_pages * i;
> + unsigned long *slot_bitmap = get_slot_bitmap(bitmap, page_offset);
>
> kvm_vm_clear_dirty_log(vm, slot, slot_bitmap, 0, slot_pages);
> }
> @@ -172,6 +180,9 @@ static void run_test(enum vm_guest_mode mode, void *arg)
> guest_num_pages = vm_adjust_num_guest_pages(mode, guest_num_pages);
> host_num_pages = vm_num_host_pages(mode, guest_num_pages);
> bmap = bitmap_alloc(host_num_pages);
> + TEST_ASSERT((host_num_pages / p->slots) % BITS_PER_LONG == 0,
> + "The number of pages per slot must be divisible by %d.",
> + BITS_PER_LONG);
>
> if (dirty_log_manual_caps) {
> cap.cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2;
> --
> 2.33.0.309.g3052b89438-goog
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src
2021-09-15 21:30 ` [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src David Matlack
@ 2021-09-15 21:55 ` Ben Gardon
2021-09-16 8:41 ` Andrew Jones
1 sibling, 0 replies; 14+ messages in thread
From: Ben Gardon @ 2021-09-15 21:55 UTC (permalink / raw)
To: David Matlack
Cc: Paolo Bonzini, kvm, Andrew Jones, Axel Rasmussen, Yanan Wang
On Wed, Sep 15, 2021 at 2:30 PM David Matlack <dmatlack@google.com> wrote:
>
> All selftests that support the backing_src option were printing their
> own description of the flag and then calling backing_src_help() to dump
> the list of available backing sources. Consolidate the flag printing in
> backing_src_help() to align indentation, reduce duplicated strings, and
> improve consistency across tests.
>
> Note: Passing "-s" to backing_src_help is unnecessary since every test
> uses the same flag. However I decided to keep it for code readability
> at the call sites.
>
> While here this opportunistically fixes the incorrectly interleaved
> printing -x help message and list of backing source types in
> dirty_log_perf_test.
>
> Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
> Signed-off-by: David Matlack <dmatlack@google.com>
Reviewed-by: Ben Gardon <bgardon@google.com>
> ---
> .../selftests/kvm/access_tracking_perf_test.c | 6 ++----
> .../testing/selftests/kvm/demand_paging_test.c | 5 ++---
> .../testing/selftests/kvm/dirty_log_perf_test.c | 8 +++-----
> tools/testing/selftests/kvm/include/test_util.h | 5 ++++-
> .../testing/selftests/kvm/kvm_page_table_test.c | 7 ++-----
> tools/testing/selftests/kvm/lib/test_util.c | 17 +++++++++++++----
> 6 files changed, 26 insertions(+), 22 deletions(-)
>
> diff --git a/tools/testing/selftests/kvm/access_tracking_perf_test.c b/tools/testing/selftests/kvm/access_tracking_perf_test.c
> index 71e277c7c3f3..5d95113c7b7c 100644
> --- a/tools/testing/selftests/kvm/access_tracking_perf_test.c
> +++ b/tools/testing/selftests/kvm/access_tracking_perf_test.c
> @@ -371,9 +371,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(" -s: specify the type of memory that should be used to\n"
> - " back the guest data region.\n\n");
> - backing_src_help();
> + backing_src_help("-s");
> puts("");
> exit(0);
> }
> @@ -381,7 +379,7 @@ static void help(char *name)
> int main(int argc, char *argv[])
> {
> struct test_params params = {
> - .backing_src = VM_MEM_SRC_ANONYMOUS,
> + .backing_src = DEFAULT_VM_MEM_SRC,
> .vcpu_memory_bytes = DEFAULT_PER_VCPU_MEM_SIZE,
> .vcpus = 1,
> };
> diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
> index 735c081e774e..96cd3e0357f6 100644
> --- a/tools/testing/selftests/kvm/demand_paging_test.c
> +++ b/tools/testing/selftests/kvm/demand_paging_test.c
> @@ -426,8 +426,7 @@ static void help(char *name)
> printf(" -b: specify the size of the memory region which should be\n"
> " demand paged by each vCPU. e.g. 10M or 3G.\n"
> " Default: 1G\n");
> - printf(" -s: The type of backing memory to use. Default: anonymous\n");
> - backing_src_help();
> + backing_src_help("-s");
> 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");
> @@ -439,7 +438,7 @@ int main(int argc, char *argv[])
> {
> int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
> struct test_params p = {
> - .src_type = VM_MEM_SRC_ANONYMOUS,
> + .src_type = DEFAULT_VM_MEM_SRC,
> .partition_vcpu_memory_access = true,
> };
> int opt;
> diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c
> index 3c30d0045d8d..5ad9f2bc7369 100644
> --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c
> +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
> @@ -308,11 +308,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("-s");
> printf(" -x: Split the memory region into this number of memslots.\n"
> - " (default: 1)");
> - backing_src_help();
> + " (default: 1)\n");
> puts("");
> exit(0);
> }
> @@ -324,7 +322,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,
> + .backing_src = DEFAULT_VM_MEM_SRC,
> .slots = 1,
> };
> int opt;
> diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
> index d79be15dd3d2..2f09f2994733 100644
> --- a/tools/testing/selftests/kvm/include/test_util.h
> +++ b/tools/testing/selftests/kvm/include/test_util.h
> @@ -68,6 +68,7 @@ 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,
> @@ -90,6 +91,8 @@ enum vm_mem_backing_src_type {
> NUM_SRC_TYPES,
> };
>
> +#define DEFAULT_VM_MEM_SRC VM_MEM_SRC_ANONYMOUS
> +
> struct vm_mem_backing_src_alias {
> const char *name;
> uint32_t flag;
> @@ -100,7 +103,7 @@ size_t get_trans_hugepagesz(void);
> size_t get_def_hugetlb_pagesz(void);
> const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i);
> size_t get_backing_src_pagesz(uint32_t i);
> -void backing_src_help(void);
> +void backing_src_help(const char *flag);
> enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name);
>
> /*
> diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
> index 0d04a7db7f24..36407cb0ec85 100644
> --- a/tools/testing/selftests/kvm/kvm_page_table_test.c
> +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
> @@ -456,10 +456,7 @@ static void help(char *name)
> " (default: 1G)\n");
> printf(" -v: specify the number of vCPUs to run\n"
> " (default: 1)\n");
> - printf(" -s: specify the type of memory that should be used to\n"
> - " back the guest data region.\n"
> - " (default: anonymous)\n\n");
> - backing_src_help();
> + backing_src_help("-s");
> puts("");
> }
>
> @@ -468,7 +465,7 @@ int main(int argc, char *argv[])
> int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
> struct test_params p = {
> .test_mem_size = DEFAULT_TEST_MEM_SIZE,
> - .src_type = VM_MEM_SRC_ANONYMOUS,
> + .src_type = DEFAULT_VM_MEM_SRC,
> };
> int opt;
>
> diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
> index af1031fed97f..ea23a86132ed 100644
> --- a/tools/testing/selftests/kvm/lib/test_util.c
> +++ b/tools/testing/selftests/kvm/lib/test_util.c
> @@ -279,13 +279,22 @@ size_t get_backing_src_pagesz(uint32_t i)
> }
> }
>
> -void backing_src_help(void)
> +void print_available_backing_src_types(const char *prefix)
> {
> int i;
>
> - printf("Available backing src types:\n");
> + printf("%sAvailable backing src types:\n", prefix);
> +
> for (i = 0; i < NUM_SRC_TYPES; i++)
> - printf("\t%s\n", vm_mem_backing_src_alias(i)->name);
> + printf("%s %s\n", prefix, vm_mem_backing_src_alias(i)->name);
> +}
> +
> +void backing_src_help(const char *flag)
> +{
> + printf(" %s: specify the type of memory that should be used to\n"
> + " back the guest data region. (default: %s)\n",
> + flag, vm_mem_backing_src_alias(DEFAULT_VM_MEM_SRC)->name);
> + print_available_backing_src_types(" ");
> }
>
> enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
> @@ -296,7 +305,7 @@ enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
> if (!strcmp(type_name, vm_mem_backing_src_alias(i)->name))
> return i;
>
> - backing_src_help();
> + print_available_backing_src_types("");
> TEST_FAIL("Unknown backing src type: %s", type_name);
> return -1;
> }
> --
> 2.33.0.309.g3052b89438-goog
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test
2021-09-15 21:30 ` [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test David Matlack
@ 2021-09-15 21:56 ` Ben Gardon
2021-09-16 8:34 ` Andrew Jones
1 sibling, 0 replies; 14+ messages in thread
From: Ben Gardon @ 2021-09-15 21:56 UTC (permalink / raw)
To: David Matlack
Cc: Paolo Bonzini, kvm, Andrew Jones, Axel Rasmussen, Yanan Wang
On Wed, Sep 15, 2021 at 2:30 PM David Matlack <dmatlack@google.com> wrote:
>
> Every other KVM selftest uses -s for the backing_src, so switch
> demand_paging_test to match.
>
> Signed-off-by: David Matlack <dmatlack@google.com>
Reviewed-by: Ben Gardon <bgardon@google.com>
> ---
> tools/testing/selftests/kvm/demand_paging_test.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
> index e79c1b64977f..735c081e774e 100644
> --- a/tools/testing/selftests/kvm/demand_paging_test.c
> +++ b/tools/testing/selftests/kvm/demand_paging_test.c
> @@ -416,7 +416,7 @@ static void help(char *name)
> {
> puts("");
> printf("usage: %s [-h] [-m vm_mode] [-u uffd_mode] [-d uffd_delay_usec]\n"
> - " [-b memory] [-t type] [-v vcpus] [-o]\n", name);
> + " [-b memory] [-s type] [-v vcpus] [-o]\n", name);
> guest_modes_help();
> printf(" -u: use userfaultfd to handle vCPU page faults. Mode is a\n"
> " UFFD registration mode: 'MISSING' or 'MINOR'.\n");
> @@ -426,7 +426,7 @@ static void help(char *name)
> printf(" -b: specify the size of the memory region which should be\n"
> " demand paged by each vCPU. e.g. 10M or 3G.\n"
> " Default: 1G\n");
> - printf(" -t: The type of backing memory to use. Default: anonymous\n");
> + printf(" -s: The type of backing memory to use. Default: anonymous\n");
> backing_src_help();
> printf(" -v: specify the number of vCPUs to run.\n");
> printf(" -o: Overlap guest memory accesses instead of partitioning\n"
> @@ -446,7 +446,7 @@ int main(int argc, char *argv[])
>
> guest_modes_append_default();
>
> - while ((opt = getopt(argc, argv, "hm:u:d:b:t:v:o")) != -1) {
> + while ((opt = getopt(argc, argv, "hm:u:d:b:s:v:o")) != -1) {
> switch (opt) {
> case 'm':
> guest_modes_cmdline(optarg);
> @@ -465,7 +465,7 @@ int main(int argc, char *argv[])
> case 'b':
> guest_percpu_mem_size = parse_size(optarg);
> break;
> - case 't':
> + case 's':
> p.src_type = parse_backing_src_type(optarg);
> break;
> case 'v':
> @@ -485,7 +485,7 @@ int main(int argc, char *argv[])
>
> if (p.uffd_mode == UFFDIO_REGISTER_MODE_MINOR &&
> !backing_src_is_shared(p.src_type)) {
> - TEST_FAIL("userfaultfd MINOR mode requires shared memory; pick a different -t");
> + TEST_FAIL("userfaultfd MINOR mode requires shared memory; pick a different -s");
> }
>
> for_each_guest_mode(run_test, &p);
> --
> 2.33.0.309.g3052b89438-goog
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test
2021-09-15 21:30 ` [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test David Matlack
2021-09-15 21:56 ` Ben Gardon
@ 2021-09-16 8:34 ` Andrew Jones
1 sibling, 0 replies; 14+ messages in thread
From: Andrew Jones @ 2021-09-16 8:34 UTC (permalink / raw)
To: David Matlack; +Cc: Paolo Bonzini, kvm, Ben Gardon, Axel Rasmussen, Yanan Wang
On Wed, Sep 15, 2021 at 09:30:32PM +0000, David Matlack wrote:
> Every other KVM selftest uses -s for the backing_src, so switch
> demand_paging_test to match.
>
> Signed-off-by: David Matlack <dmatlack@google.com>
> ---
> tools/testing/selftests/kvm/demand_paging_test.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
Reviewed-by: Andrew Jones <drjones@redhat.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src
2021-09-15 21:30 ` [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src David Matlack
2021-09-15 21:55 ` Ben Gardon
@ 2021-09-16 8:41 ` Andrew Jones
2021-09-16 16:24 ` David Matlack
1 sibling, 1 reply; 14+ messages in thread
From: Andrew Jones @ 2021-09-16 8:41 UTC (permalink / raw)
To: David Matlack; +Cc: Paolo Bonzini, kvm, Ben Gardon, Axel Rasmussen, Yanan Wang
On Wed, Sep 15, 2021 at 09:30:33PM +0000, David Matlack wrote:
> All selftests that support the backing_src option were printing their
> own description of the flag and then calling backing_src_help() to dump
> the list of available backing sources. Consolidate the flag printing in
> backing_src_help() to align indentation, reduce duplicated strings, and
> improve consistency across tests.
>
> Note: Passing "-s" to backing_src_help is unnecessary since every test
> uses the same flag. However I decided to keep it for code readability
> at the call sites.
I think I'd prefer not passing "-s", but I won't insist.
>
> While here this opportunistically fixes the incorrectly interleaved
> printing -x help message and list of backing source types in
> dirty_log_perf_test.
>
> Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
> Signed-off-by: David Matlack <dmatlack@google.com>
> ---
> .../selftests/kvm/access_tracking_perf_test.c | 6 ++----
> .../testing/selftests/kvm/demand_paging_test.c | 5 ++---
> .../testing/selftests/kvm/dirty_log_perf_test.c | 8 +++-----
> tools/testing/selftests/kvm/include/test_util.h | 5 ++++-
> .../testing/selftests/kvm/kvm_page_table_test.c | 7 ++-----
> tools/testing/selftests/kvm/lib/test_util.c | 17 +++++++++++++----
> 6 files changed, 26 insertions(+), 22 deletions(-)
>
> diff --git a/tools/testing/selftests/kvm/access_tracking_perf_test.c b/tools/testing/selftests/kvm/access_tracking_perf_test.c
> index 71e277c7c3f3..5d95113c7b7c 100644
> --- a/tools/testing/selftests/kvm/access_tracking_perf_test.c
> +++ b/tools/testing/selftests/kvm/access_tracking_perf_test.c
> @@ -371,9 +371,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(" -s: specify the type of memory that should be used to\n"
> - " back the guest data region.\n\n");
> - backing_src_help();
> + backing_src_help("-s");
> puts("");
> exit(0);
> }
> @@ -381,7 +379,7 @@ static void help(char *name)
> int main(int argc, char *argv[])
> {
> struct test_params params = {
> - .backing_src = VM_MEM_SRC_ANONYMOUS,
> + .backing_src = DEFAULT_VM_MEM_SRC,
> .vcpu_memory_bytes = DEFAULT_PER_VCPU_MEM_SIZE,
> .vcpus = 1,
> };
> diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
> index 735c081e774e..96cd3e0357f6 100644
> --- a/tools/testing/selftests/kvm/demand_paging_test.c
> +++ b/tools/testing/selftests/kvm/demand_paging_test.c
> @@ -426,8 +426,7 @@ static void help(char *name)
> printf(" -b: specify the size of the memory region which should be\n"
> " demand paged by each vCPU. e.g. 10M or 3G.\n"
> " Default: 1G\n");
> - printf(" -s: The type of backing memory to use. Default: anonymous\n");
> - backing_src_help();
> + backing_src_help("-s");
> 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");
> @@ -439,7 +438,7 @@ int main(int argc, char *argv[])
> {
> int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
> struct test_params p = {
> - .src_type = VM_MEM_SRC_ANONYMOUS,
> + .src_type = DEFAULT_VM_MEM_SRC,
> .partition_vcpu_memory_access = true,
> };
> int opt;
> diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c
> index 3c30d0045d8d..5ad9f2bc7369 100644
> --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c
> +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
> @@ -308,11 +308,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("-s");
> printf(" -x: Split the memory region into this number of memslots.\n"
> - " (default: 1)");
> - backing_src_help();
> + " (default: 1)\n");
> puts("");
> exit(0);
> }
> @@ -324,7 +322,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,
> + .backing_src = DEFAULT_VM_MEM_SRC,
> .slots = 1,
> };
> int opt;
> diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
> index d79be15dd3d2..2f09f2994733 100644
> --- a/tools/testing/selftests/kvm/include/test_util.h
> +++ b/tools/testing/selftests/kvm/include/test_util.h
> @@ -68,6 +68,7 @@ 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);
>
> +
New extra blank line. Added on purpose?
> enum vm_mem_backing_src_type {
> VM_MEM_SRC_ANONYMOUS,
> VM_MEM_SRC_ANONYMOUS_THP,
> @@ -90,6 +91,8 @@ enum vm_mem_backing_src_type {
> NUM_SRC_TYPES,
> };
>
> +#define DEFAULT_VM_MEM_SRC VM_MEM_SRC_ANONYMOUS
> +
> struct vm_mem_backing_src_alias {
> const char *name;
> uint32_t flag;
> @@ -100,7 +103,7 @@ size_t get_trans_hugepagesz(void);
> size_t get_def_hugetlb_pagesz(void);
> const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i);
> size_t get_backing_src_pagesz(uint32_t i);
> -void backing_src_help(void);
> +void backing_src_help(const char *flag);
> enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name);
>
> /*
> diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
> index 0d04a7db7f24..36407cb0ec85 100644
> --- a/tools/testing/selftests/kvm/kvm_page_table_test.c
> +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
> @@ -456,10 +456,7 @@ static void help(char *name)
> " (default: 1G)\n");
> printf(" -v: specify the number of vCPUs to run\n"
> " (default: 1)\n");
> - printf(" -s: specify the type of memory that should be used to\n"
> - " back the guest data region.\n"
> - " (default: anonymous)\n\n");
> - backing_src_help();
> + backing_src_help("-s");
> puts("");
> }
>
> @@ -468,7 +465,7 @@ int main(int argc, char *argv[])
> int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
> struct test_params p = {
> .test_mem_size = DEFAULT_TEST_MEM_SIZE,
> - .src_type = VM_MEM_SRC_ANONYMOUS,
> + .src_type = DEFAULT_VM_MEM_SRC,
> };
> int opt;
>
> diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
> index af1031fed97f..ea23a86132ed 100644
> --- a/tools/testing/selftests/kvm/lib/test_util.c
> +++ b/tools/testing/selftests/kvm/lib/test_util.c
> @@ -279,13 +279,22 @@ size_t get_backing_src_pagesz(uint32_t i)
> }
> }
>
> -void backing_src_help(void)
> +void print_available_backing_src_types(const char *prefix)
This can probably be static.
> {
> int i;
>
> - printf("Available backing src types:\n");
> + printf("%sAvailable backing src types:\n", prefix);
> +
> for (i = 0; i < NUM_SRC_TYPES; i++)
> - printf("\t%s\n", vm_mem_backing_src_alias(i)->name);
> + printf("%s %s\n", prefix, vm_mem_backing_src_alias(i)->name);
> +}
> +
> +void backing_src_help(const char *flag)
> +{
> + printf(" %s: specify the type of memory that should be used to\n"
> + " back the guest data region. (default: %s)\n",
> + flag, vm_mem_backing_src_alias(DEFAULT_VM_MEM_SRC)->name);
> + print_available_backing_src_types(" ");
> }
>
> enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
> @@ -296,7 +305,7 @@ enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
> if (!strcmp(type_name, vm_mem_backing_src_alias(i)->name))
> return i;
>
> - backing_src_help();
> + print_available_backing_src_types("");
> TEST_FAIL("Unknown backing src type: %s", type_name);
> return -1;
> }
> --
> 2.33.0.309.g3052b89438-goog
>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Thanks,
drew
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation
2021-09-15 21:55 ` Ben Gardon
@ 2021-09-16 8:49 ` Andrew Jones
2021-09-16 16:37 ` David Matlack
2021-09-22 11:09 ` Paolo Bonzini
0 siblings, 2 replies; 14+ messages in thread
From: Andrew Jones @ 2021-09-16 8:49 UTC (permalink / raw)
To: Ben Gardon; +Cc: David Matlack, Paolo Bonzini, kvm, Axel Rasmussen, Yanan Wang
On Wed, Sep 15, 2021 at 02:55:03PM -0700, Ben Gardon wrote:
> On Wed, Sep 15, 2021 at 2:30 PM David Matlack <dmatlack@google.com> wrote:
> >
> > The calculation to get the per-slot dirty bitmap was incorrect leading
> > to a buffer overrun. Fix it by dividing the number of pages by
> > BITS_PER_LONG, since each element of the bitmap is a long and there is
> > one bit per page.
> >
> > Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
> > Signed-off-by: David Matlack <dmatlack@google.com>
>
> I was a little confused initially because we're allocating only one
> dirty bitmap in userspace even when we have multiple slots, but that's
> not a problem.
It's also confusing to me. Wouldn't it be better to create a bitmap per
slot? I think the new constraint that host mem must be a multiple of 64
is unfortunate.
Thanks,
drew
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src
2021-09-16 8:41 ` Andrew Jones
@ 2021-09-16 16:24 ` David Matlack
0 siblings, 0 replies; 14+ messages in thread
From: David Matlack @ 2021-09-16 16:24 UTC (permalink / raw)
To: Andrew Jones
Cc: Paolo Bonzini, kvm list, Ben Gardon, Axel Rasmussen, Yanan Wang
On Thu, Sep 16, 2021 at 1:41 AM Andrew Jones <drjones@redhat.com> wrote:
>
> On Wed, Sep 15, 2021 at 09:30:33PM +0000, David Matlack wrote:
> > All selftests that support the backing_src option were printing their
> > own description of the flag and then calling backing_src_help() to dump
> > the list of available backing sources. Consolidate the flag printing in
> > backing_src_help() to align indentation, reduce duplicated strings, and
> > improve consistency across tests.
> >
> > Note: Passing "-s" to backing_src_help is unnecessary since every test
> > uses the same flag. However I decided to keep it for code readability
> > at the call sites.
>
> I think I'd prefer not passing "-s", but I won't insist.
>
> >
> > While here this opportunistically fixes the incorrectly interleaved
> > printing -x help message and list of backing source types in
> > dirty_log_perf_test.
> >
> > Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
> > Signed-off-by: David Matlack <dmatlack@google.com>
> > ---
> > .../selftests/kvm/access_tracking_perf_test.c | 6 ++----
> > .../testing/selftests/kvm/demand_paging_test.c | 5 ++---
> > .../testing/selftests/kvm/dirty_log_perf_test.c | 8 +++-----
> > tools/testing/selftests/kvm/include/test_util.h | 5 ++++-
> > .../testing/selftests/kvm/kvm_page_table_test.c | 7 ++-----
> > tools/testing/selftests/kvm/lib/test_util.c | 17 +++++++++++++----
> > 6 files changed, 26 insertions(+), 22 deletions(-)
> >
> > diff --git a/tools/testing/selftests/kvm/access_tracking_perf_test.c b/tools/testing/selftests/kvm/access_tracking_perf_test.c
> > index 71e277c7c3f3..5d95113c7b7c 100644
> > --- a/tools/testing/selftests/kvm/access_tracking_perf_test.c
> > +++ b/tools/testing/selftests/kvm/access_tracking_perf_test.c
> > @@ -371,9 +371,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(" -s: specify the type of memory that should be used to\n"
> > - " back the guest data region.\n\n");
> > - backing_src_help();
> > + backing_src_help("-s");
> > puts("");
> > exit(0);
> > }
> > @@ -381,7 +379,7 @@ static void help(char *name)
> > int main(int argc, char *argv[])
> > {
> > struct test_params params = {
> > - .backing_src = VM_MEM_SRC_ANONYMOUS,
> > + .backing_src = DEFAULT_VM_MEM_SRC,
> > .vcpu_memory_bytes = DEFAULT_PER_VCPU_MEM_SIZE,
> > .vcpus = 1,
> > };
> > diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c
> > index 735c081e774e..96cd3e0357f6 100644
> > --- a/tools/testing/selftests/kvm/demand_paging_test.c
> > +++ b/tools/testing/selftests/kvm/demand_paging_test.c
> > @@ -426,8 +426,7 @@ static void help(char *name)
> > printf(" -b: specify the size of the memory region which should be\n"
> > " demand paged by each vCPU. e.g. 10M or 3G.\n"
> > " Default: 1G\n");
> > - printf(" -s: The type of backing memory to use. Default: anonymous\n");
> > - backing_src_help();
> > + backing_src_help("-s");
> > 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");
> > @@ -439,7 +438,7 @@ int main(int argc, char *argv[])
> > {
> > int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
> > struct test_params p = {
> > - .src_type = VM_MEM_SRC_ANONYMOUS,
> > + .src_type = DEFAULT_VM_MEM_SRC,
> > .partition_vcpu_memory_access = true,
> > };
> > int opt;
> > diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/testing/selftests/kvm/dirty_log_perf_test.c
> > index 3c30d0045d8d..5ad9f2bc7369 100644
> > --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c
> > +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c
> > @@ -308,11 +308,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("-s");
> > printf(" -x: Split the memory region into this number of memslots.\n"
> > - " (default: 1)");
> > - backing_src_help();
> > + " (default: 1)\n");
> > puts("");
> > exit(0);
> > }
> > @@ -324,7 +322,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,
> > + .backing_src = DEFAULT_VM_MEM_SRC,
> > .slots = 1,
> > };
> > int opt;
> > diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h
> > index d79be15dd3d2..2f09f2994733 100644
> > --- a/tools/testing/selftests/kvm/include/test_util.h
> > +++ b/tools/testing/selftests/kvm/include/test_util.h
> > @@ -68,6 +68,7 @@ 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);
> >
> > +
>
> New extra blank line. Added on purpose?
No that's a mistake. Will fix in v2.
>
> > enum vm_mem_backing_src_type {
> > VM_MEM_SRC_ANONYMOUS,
> > VM_MEM_SRC_ANONYMOUS_THP,
> > @@ -90,6 +91,8 @@ enum vm_mem_backing_src_type {
> > NUM_SRC_TYPES,
> > };
> >
> > +#define DEFAULT_VM_MEM_SRC VM_MEM_SRC_ANONYMOUS
> > +
> > struct vm_mem_backing_src_alias {
> > const char *name;
> > uint32_t flag;
> > @@ -100,7 +103,7 @@ size_t get_trans_hugepagesz(void);
> > size_t get_def_hugetlb_pagesz(void);
> > const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i);
> > size_t get_backing_src_pagesz(uint32_t i);
> > -void backing_src_help(void);
> > +void backing_src_help(const char *flag);
> > enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name);
> >
> > /*
> > diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
> > index 0d04a7db7f24..36407cb0ec85 100644
> > --- a/tools/testing/selftests/kvm/kvm_page_table_test.c
> > +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
> > @@ -456,10 +456,7 @@ static void help(char *name)
> > " (default: 1G)\n");
> > printf(" -v: specify the number of vCPUs to run\n"
> > " (default: 1)\n");
> > - printf(" -s: specify the type of memory that should be used to\n"
> > - " back the guest data region.\n"
> > - " (default: anonymous)\n\n");
> > - backing_src_help();
> > + backing_src_help("-s");
> > puts("");
> > }
> >
> > @@ -468,7 +465,7 @@ int main(int argc, char *argv[])
> > int max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS);
> > struct test_params p = {
> > .test_mem_size = DEFAULT_TEST_MEM_SIZE,
> > - .src_type = VM_MEM_SRC_ANONYMOUS,
> > + .src_type = DEFAULT_VM_MEM_SRC,
> > };
> > int opt;
> >
> > diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c
> > index af1031fed97f..ea23a86132ed 100644
> > --- a/tools/testing/selftests/kvm/lib/test_util.c
> > +++ b/tools/testing/selftests/kvm/lib/test_util.c
> > @@ -279,13 +279,22 @@ size_t get_backing_src_pagesz(uint32_t i)
> > }
> > }
> >
> > -void backing_src_help(void)
> > +void print_available_backing_src_types(const char *prefix)
>
> This can probably be static.
Ack. Will fix in v2.
>
> > {
> > int i;
> >
> > - printf("Available backing src types:\n");
> > + printf("%sAvailable backing src types:\n", prefix);
> > +
> > for (i = 0; i < NUM_SRC_TYPES; i++)
> > - printf("\t%s\n", vm_mem_backing_src_alias(i)->name);
> > + printf("%s %s\n", prefix, vm_mem_backing_src_alias(i)->name);
> > +}
> > +
> > +void backing_src_help(const char *flag)
> > +{
> > + printf(" %s: specify the type of memory that should be used to\n"
> > + " back the guest data region. (default: %s)\n",
> > + flag, vm_mem_backing_src_alias(DEFAULT_VM_MEM_SRC)->name);
> > + print_available_backing_src_types(" ");
> > }
> >
> > enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
> > @@ -296,7 +305,7 @@ enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name)
> > if (!strcmp(type_name, vm_mem_backing_src_alias(i)->name))
> > return i;
> >
> > - backing_src_help();
> > + print_available_backing_src_types("");
> > TEST_FAIL("Unknown backing src type: %s", type_name);
> > return -1;
> > }
> > --
> > 2.33.0.309.g3052b89438-goog
> >
>
>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
>
> Thanks,
> drew
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation
2021-09-16 8:49 ` Andrew Jones
@ 2021-09-16 16:37 ` David Matlack
2021-09-22 11:09 ` Paolo Bonzini
1 sibling, 0 replies; 14+ messages in thread
From: David Matlack @ 2021-09-16 16:37 UTC (permalink / raw)
To: Andrew Jones; +Cc: Ben Gardon, Paolo Bonzini, kvm, Axel Rasmussen, Yanan Wang
On Thu, Sep 16, 2021 at 1:49 AM Andrew Jones <drjones@redhat.com> wrote:
>
> On Wed, Sep 15, 2021 at 02:55:03PM -0700, Ben Gardon wrote:
> > On Wed, Sep 15, 2021 at 2:30 PM David Matlack <dmatlack@google.com> wrote:
> > >
> > > The calculation to get the per-slot dirty bitmap was incorrect leading
> > > to a buffer overrun. Fix it by dividing the number of pages by
> > > BITS_PER_LONG, since each element of the bitmap is a long and there is
> > > one bit per page.
> > >
> > > Fixes: 609e6202ea5f ("KVM: selftests: Support multiple slots in dirty_log_perf_test")
> > > Signed-off-by: David Matlack <dmatlack@google.com>
> >
> > I was a little confused initially because we're allocating only one
> > dirty bitmap in userspace even when we have multiple slots, but that's
> > not a problem.
>
> It's also confusing to me. Wouldn't it be better to create a bitmap per
> slot? I think the new constraint that host mem must be a multiple of 64
> is unfortunate.
I don't think think the multiple-of-64 (256K) constraint will matter
much in practice. But it wouldn't be very complicated to switch to a
bitmap per slot, and would prevent further confusion.
I'll switch it over in v2.
>
> Thanks,
> drew
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation
2021-09-16 8:49 ` Andrew Jones
2021-09-16 16:37 ` David Matlack
@ 2021-09-22 11:09 ` Paolo Bonzini
2021-09-22 11:19 ` Andrew Jones
1 sibling, 1 reply; 14+ messages in thread
From: Paolo Bonzini @ 2021-09-22 11:09 UTC (permalink / raw)
To: Andrew Jones, Ben Gardon; +Cc: David Matlack, kvm, Axel Rasmussen, Yanan Wang
On 16/09/21 10:49, Andrew Jones wrote:
>> I was a little confused initially because we're allocating only one
>> dirty bitmap in userspace even when we have multiple slots, but that's
>> not a problem.
> It's also confusing to me. Wouldn't it be better to create a bitmap per
> slot? I think the new constraint that host mem must be a multiple of 64
> is unfortunate.
Yeah, I wouldn't mind if someone took a look at that. Also because
anyway this patch doesn't apply to master right now, I've queued 1-2 only.
Paolo
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation
2021-09-22 11:09 ` Paolo Bonzini
@ 2021-09-22 11:19 ` Andrew Jones
0 siblings, 0 replies; 14+ messages in thread
From: Andrew Jones @ 2021-09-22 11:19 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: Ben Gardon, David Matlack, kvm, Axel Rasmussen, Yanan Wang
On Wed, Sep 22, 2021 at 01:09:57PM +0200, Paolo Bonzini wrote:
> On 16/09/21 10:49, Andrew Jones wrote:
> > > I was a little confused initially because we're allocating only one
> > > dirty bitmap in userspace even when we have multiple slots, but that's
> > > not a problem.
> > It's also confusing to me. Wouldn't it be better to create a bitmap per
> > slot? I think the new constraint that host mem must be a multiple of 64
> > is unfortunate.
>
> Yeah, I wouldn't mind if someone took a look at that. Also because anyway
> this patch doesn't apply to master right now, I've queued 1-2 only.
David posted a v2 on Sept. 17 with the bitmap split up per slot for patch
3/3. I think the other patches got some tweaks too.
Thanks
drew
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2021-09-22 11:20 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-15 21:30 [PATCH 0/3] KVM: selftests: Small fixes for dirty_log_perf_test David Matlack
2021-09-15 21:30 ` [PATCH 1/3] KVM: selftests: Change backing_src flag to -s in demand_paging_test David Matlack
2021-09-15 21:56 ` Ben Gardon
2021-09-16 8:34 ` Andrew Jones
2021-09-15 21:30 ` [PATCH 2/3] KVM: selftests: Refactor help message for -s backing_src David Matlack
2021-09-15 21:55 ` Ben Gardon
2021-09-16 8:41 ` Andrew Jones
2021-09-16 16:24 ` David Matlack
2021-09-15 21:30 ` [PATCH 3/3] KVM: selftests: Fix dirty bitmap offset calculation David Matlack
2021-09-15 21:55 ` Ben Gardon
2021-09-16 8:49 ` Andrew Jones
2021-09-16 16:37 ` David Matlack
2021-09-22 11:09 ` Paolo Bonzini
2021-09-22 11:19 ` Andrew Jones
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).