[PATCH 15/16] KVM: arm64: selftests: Augment existing timer test to handle variable offsets
Marc Zyngier
maz at kernel.org
Thu Feb 16 06:21:22 PST 2023
Allow a user to specify the physical and virtual offsets on the
command-line.
Signed-off-by: Marc Zyngier <maz at kernel.org>
---
.../selftests/kvm/aarch64/arch_timer.c | 23 ++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/kvm/aarch64/arch_timer.c b/tools/testing/selftests/kvm/aarch64/arch_timer.c
index 26556a266021..62af0e7d10b4 100644
--- a/tools/testing/selftests/kvm/aarch64/arch_timer.c
+++ b/tools/testing/selftests/kvm/aarch64/arch_timer.c
@@ -47,6 +47,7 @@ struct test_args {
int nr_iter;
int timer_period_ms;
int migration_freq_ms;
+ struct kvm_arm_counter_offsets offsets;
};
static struct test_args test_args = {
@@ -54,6 +55,7 @@ static struct test_args test_args = {
.nr_iter = NR_TEST_ITERS_DEF,
.timer_period_ms = TIMER_TEST_PERIOD_MS_DEF,
.migration_freq_ms = TIMER_TEST_MIGRATION_FREQ_MS,
+ .offsets = { .flags = 0 },
};
#define msecs_to_usecs(msec) ((msec) * 1000LL)
@@ -372,6 +374,13 @@ static struct kvm_vm *test_vm_create(void)
vm_init_descriptor_tables(vm);
vm_install_exception_handler(vm, VECTOR_IRQ_CURRENT, guest_irq_handler);
+ if (test_args.offsets.flags) {
+ if (kvm_has_cap(KVM_CAP_COUNTER_OFFSETS))
+ vm_ioctl(vm, KVM_ARM_SET_CNT_OFFSETS, &test_args.offsets);
+ else
+ __TEST_REQUIRE(test_args.offsets.flags, "no support for global offsets");
+ }
+
for (i = 0; i < nr_vcpus; i++)
vcpu_init_descriptor_tables(vcpus[i]);
@@ -403,6 +412,10 @@ static void test_print_help(char *name)
TIMER_TEST_PERIOD_MS_DEF);
pr_info("\t-m: Frequency (in ms) of vCPUs to migrate to different pCPU. 0 to turn off (default: %u)\n",
TIMER_TEST_MIGRATION_FREQ_MS);
+ pr_info("\t-o: Virtual counter offset (in counter cycles, default: %llu)\n",
+ test_args.offsets.virtual_offset);
+ pr_info("\t-O: Physical counter offset (in counter cycles, default: %llu)\n",
+ test_args.offsets.physical_offset);
pr_info("\t-h: print this help screen\n");
}
@@ -410,7 +423,7 @@ static bool parse_args(int argc, char *argv[])
{
int opt;
- while ((opt = getopt(argc, argv, "hn:i:p:m:")) != -1) {
+ while ((opt = getopt(argc, argv, "hn:i:p:m:o:O:")) != -1) {
switch (opt) {
case 'n':
test_args.nr_vcpus = atoi_positive("Number of vCPUs", optarg);
@@ -429,6 +442,14 @@ static bool parse_args(int argc, char *argv[])
case 'm':
test_args.migration_freq_ms = atoi_non_negative("Frequency", optarg);
break;
+ case 'o':
+ test_args.offsets.virtual_offset = strtol(optarg, NULL, 0);
+ test_args.offsets.flags |= KVM_COUNTER_SET_VOFFSET_FLAG;
+ break;
+ case 'O':
+ test_args.offsets.physical_offset = strtol(optarg, NULL, 0);
+ test_args.offsets.flags |= KVM_COUNTER_SET_POFFSET_FLAG;
+ break;
case 'h':
default:
goto err;
--
2.34.1
More information about the linux-arm-kernel
mailing list