From: Sean Christopherson <seanjc@google.com>
To: Vipin Sharma <vipinsh@google.com>
Cc: dmatlack@google.com, pbonzini@redhat.com, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] KVM: selftests: Run dirty_log_perf_test on specific cpus
Date: Wed, 17 Aug 2022 17:24:22 +0000 [thread overview]
Message-ID: <Yv0kRhSjSqz0i0lG@google.com> (raw)
In-Reply-To: <20220817152956.4056410-1-vipinsh@google.com>
On Wed, Aug 17, 2022, Vipin Sharma wrote:
> Add command line options to run the vcpus and the main process on the
> specific cpus on a host machine. This is useful as it provides
> options to analyze performance based on the vcpus and dirty log worker
> locations, like on the different numa nodes or on the same numa nodes.
The two options should probably be separate patches, they are related but still
two very distinct changes.
> Signed-off-by: Vipin Sharma <vipinsh@google.com>
> Suggested-by: David Matlack <dmatlack@google.com>
> Suggested-by: Sean Christopherson <seanjc@google.com>
> Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>
> This is based on the discussion at
> https://lore.kernel.org/lkml/20220801151928.270380-1-vipinsh@google.com/
This can and should be captured in the changelog proper:
Link: https://lore.kernel.org/lkml/20220801151928.270380-1-vipinsh@google.com
> @@ -348,12 +353,74 @@ static void run_test(enum vm_guest_mode mode, void *arg)
> perf_test_destroy_vm(vm);
> }
>
> +static int parse_num(const char *num_str)
> +{
> + int num;
> + char *end_ptr;
> +
> + errno = 0;
> + num = (int)strtol(num_str, &end_ptr, 10);
> + TEST_ASSERT(num_str != end_ptr && *end_ptr == '\0',
> + "Invalid number string.\n");
> + TEST_ASSERT(errno == 0, "Conversion error: %d\n", errno);
Is the paranoia truly necessary? What happens if parse_cpu_list() simply uses
atoi() and is passed garbage?
> +
> + return num;
> +}
> +
> +static int parse_cpu_list(const char *arg)
> +{
> + char delim[2] = ",";
> + char *cpu, *cpu_list;
> + int i = 0, cpu_num;
> +
> + cpu_list = strdup(arg);
> + TEST_ASSERT(cpu_list, "Low memory\n");
Heh, probably a little less than "low". Just be literal and let the user figure
out why the allocation failed instead.
TEST_ASSERT(cpu_list, "strdup() allocation failed\n");
> +
> + cpu = strtok(cpu_list, delim);
> + while (cpu) {
> + cpu_num = parse_num(cpu);
> + TEST_ASSERT(cpu_num >= 0, "Invalid cpu number: %d\n", cpu_num);
> + vcpu_to_lcpu_map[i++] = cpu_num;
> + cpu = strtok(NULL, delim);
> + }
> +
> + free(cpu_list);
The tokenization and parsing is nearly identical between parse_cpu_list() and
assign_dirty_log_perf_test_cpu(). The code can be made into a common helper by
passing in the destination, e.g.
static int parse_cpu_list(const char *arg, cpu_set_t *cpuset, int *vcpu_map)
{
const char delim[] = ",";
char *cpustr, *cpu_list;
int i = 0, cpu;
TEST_ASSERT(!!cpuset ^ !!vcpu_map);
cpu_list = strdup(arg);
TEST_ASSERT(cpu_list, "Low memory\n");
cpustr = strtok(cpu_list, delim);
while (cpustr) {
cpu = atoi(cpustr);
TEST_ASSERT(cpu >= 0, "Invalid cpu number: %d\n", cpu);
if (vcpu_map)
vcpu_to_lcpu_map[i++] = cpu_num;
else
CPU_SET(cpu_num, cpuset);
cpu = strtok(NULL, delim);
}
free(cpu_list);
return i;
}
> @@ -383,6 +450,26 @@ 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(" -c: Comma separated values of the logical CPUs which will run\n"
> + " the vCPUs. Number of values should be equal to the number\n"
> + " of vCPUs.\n\n"
> + " Example: ./dirty_log_perf_test -v 3 -c 22,43,1\n"
> + " This means that the vcpu 0 will run on the logical cpu 22,\n"
> + " vcpu 1 on the logical cpu 43 and vcpu 2 on the logical cpu 1.\n"
> + " (default: No cpu mapping)\n\n");
> + printf(" -d: Comma separated values of the logical CPUs on which\n"
> + " dirty_log_perf_test will run. Without -c option, all of\n"
> + " the vcpus and main process will run on the cpus provided here.\n"
> + " This option also accepts a single cpu. (default: No cpu mapping)\n\n"
> + " Example 1: ./dirty_log_perf_test -v 3 -c 22,43,1 -d 101\n"
> + " Main application thread will run on logical cpu 101 and\n"
> + " vcpus will run on the logical cpus 22, 43 and 1\n\n"
> + " Example 2: ./dirty_log_perf_test -v 3 -d 101\n"
> + " Main application thread and vcpus will run on the logical\n"
> + " cpu 101\n\n"
> + " Example 3: ./dirty_log_perf_test -v 3 -d 101,23,53\n"
> + " Main application thread and vcpus will run on logical cpus\n"
> + " 101, 23 and 53.\n");
> puts("");
> exit(0);
> }
> @@ -455,6 +550,13 @@ int main(int argc, char *argv[])
> }
> }
>
I wonder if we should make -c and -d mutually exclusive. Tweak -c to include the
application thread, i.e. TEST_ASSERT(nr_lcpus == nr_vcpus+1) and require 1:1 pinning
for all tasks. E.g. allowing "-c ..., -d 0,1,22" seems unnecessary.
> + if (nr_lcpus != -1) {
> + TEST_ASSERT(nr_lcpus == nr_vcpus,
> + "Number of vCPUs (%d) are not equal to number of logical cpus provided (%d).",
> + nr_vcpus, nr_lcpus);
> + p.vcpu_to_lcpu = vcpu_to_lcpu_map;
> + }
> +
> TEST_ASSERT(p.iterations >= 2, "The test should have at least two iterations");
>
> pr_info("Test iterations: %"PRIu64"\n", p.iterations);
next prev parent reply other threads:[~2022-08-17 17:25 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-17 15:29 [PATCH] KVM: selftests: Run dirty_log_perf_test on specific cpus Vipin Sharma
2022-08-17 17:24 ` Sean Christopherson [this message]
2022-08-17 18:16 ` Vipin Sharma
2022-08-17 21:29 ` Sean Christopherson
2022-08-18 17:58 ` Vipin Sharma
2022-08-18 18:10 ` Sean Christopherson
2022-08-18 18:28 ` Vipin Sharma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Yv0kRhSjSqz0i0lG@google.com \
--to=seanjc@google.com \
--cc=dmatlack@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=vipinsh@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.