Remove the globally defined vcpu and pthread arrays, and reuse the one from kvm_vm and kvm_vcpu. Also use the helper functions to create vcpu threads with name. Signed-off-by: Wei Wang <wei.w.wang@xxxxxxxxx> --- .../selftests/kvm/aarch64/arch_timer.c | 42 +++++++------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/arch_timer.c b/tools/testing/selftests/kvm/aarch64/arch_timer.c index 574eb73f0e90..7c1057e8fca7 100644 --- a/tools/testing/selftests/kvm/aarch64/arch_timer.c +++ b/tools/testing/selftests/kvm/aarch64/arch_timer.c @@ -23,7 +23,6 @@ #define _GNU_SOURCE #include <stdlib.h> -#include <pthread.h> #include <linux/kvm.h> #include <linux/sizes.h> #include <linux/bitmap.h> @@ -76,8 +75,6 @@ struct test_vcpu_shared_data { uint64_t xcnt; }; -static struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; -static pthread_t pt_vcpu_run[KVM_MAX_VCPUS]; static struct test_vcpu_shared_data vcpu_shared_data[KVM_MAX_VCPUS]; static int vtimer_irq, ptimer_irq; @@ -212,7 +209,8 @@ static void guest_code(void) static void *test_vcpu_run(void *arg) { - unsigned int vcpu_idx = (unsigned long)arg; + struct kvm_vcpu *vcpu = (struct kvm_vcpu *)arg; + unsigned int vcpu_idx = vcpu->id; struct ucall uc; struct kvm_vcpu *vcpu = vcpus[vcpu_idx]; struct kvm_vm *vm = vcpu->vm; @@ -263,18 +261,19 @@ static uint32_t test_get_pcpu(void) return pcpu; } -static int test_migrate_vcpu(unsigned int vcpu_idx) +static int test_migrate_vcpu(struct kvm_vcpu *vcpu) { int ret; cpu_set_t cpuset; uint32_t new_pcpu = test_get_pcpu(); + uint32_t vcpu_idx = vcpu->id; CPU_ZERO(&cpuset); CPU_SET(new_pcpu, &cpuset); pr_debug("Migrating vCPU: %u to pCPU: %u\n", vcpu_idx, new_pcpu); - ret = pthread_setaffinity_np(pt_vcpu_run[vcpu_idx], + ret = pthread_setaffinity_np(vcpu->thread, sizeof(cpuset), &cpuset); /* Allow the error where the vCPU thread is already finished */ @@ -287,6 +286,7 @@ static int test_migrate_vcpu(unsigned int vcpu_idx) static void *test_vcpu_migration(void *arg) { + struct kvm_vm *vm = (struct kvm_vm *)arg; unsigned int i, n_done; bool vcpu_done; @@ -303,7 +303,7 @@ static void *test_vcpu_migration(void *arg) continue; } - test_migrate_vcpu(i); + test_migrate_vcpu(vm->vcpus[i]); } } while (test_args.nr_vcpus != n_done); @@ -314,31 +314,21 @@ static void test_run(struct kvm_vm *vm) { pthread_t pt_vcpu_migration; unsigned int i; - int ret; pthread_mutex_init(&vcpu_done_map_lock, NULL); vcpu_done_map = bitmap_zalloc(test_args.nr_vcpus); TEST_ASSERT(vcpu_done_map, "Failed to allocate vcpu done bitmap\n"); - for (i = 0; i < (unsigned long)test_args.nr_vcpus; i++) { - ret = pthread_create(&pt_vcpu_run[i], NULL, test_vcpu_run, - (void *)(unsigned long)i); - TEST_ASSERT(!ret, "Failed to create vCPU-%d pthread\n", i); - } + vm_vcpu_threads_create(vm, test_vcpu_run, 0); /* Spawn a thread to control the vCPU migrations */ if (test_args.migration_freq_ms) { srand(time(NULL)); - - ret = pthread_create(&pt_vcpu_migration, NULL, - test_vcpu_migration, NULL); - TEST_ASSERT(!ret, "Failed to create the migration pthread\n"); + pthread_create_with_name(&pt_vcpu_migration, + test_vcpu_migration, vm, "control-thread"); } - - for (i = 0; i < test_args.nr_vcpus; i++) - pthread_join(pt_vcpu_run[i], NULL); - + vm_vcpu_threads_join(vm); if (test_args.migration_freq_ms) pthread_join(pt_vcpu_migration, NULL); @@ -364,16 +354,16 @@ static int gic_fd; static struct kvm_vm *test_vm_create(void) { struct kvm_vm *vm; - unsigned int i; - int nr_vcpus = test_args.nr_vcpus; + struct kvm_vcpu *vcpu; + int i, nr_vcpus = test_args.nr_vcpus; - vm = vm_create_with_vcpus(nr_vcpus, guest_code, vcpus); + vm = vm_create_with_vcpus(nr_vcpus, guest_code, NULL); vm_init_descriptor_tables(vm); vm_install_exception_handler(vm, VECTOR_IRQ_CURRENT, guest_irq_handler); - for (i = 0; i < nr_vcpus; i++) - vcpu_init_descriptor_tables(vcpus[i]); + vm_iterate_over_cpus(vm, vcpu, i) + vcpu_init_descriptor_tables(vcpu); ucall_init(vm, NULL); test_init_timer_irq(vm); -- 2.27.0