When possible, affine child tasks to a different pCPU than the parent task in the hardware disable test. On preemptible kernels, running 4 + 4*16 child tasks on the same 4 pCPUs as the parent can result in runtimes of several minutes due to the children making it difficult for the parent to make forward progress. Signed-off-by: Sean Christopherson --- .../selftests/kvm/hardware_disable_test.c | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/testing/selftests/kvm/hardware_disable_test.c index 3147f5c97e94..1bcbd13e9994 100644 --- a/tools/testing/selftests/kvm/hardware_disable_test.c +++ b/tools/testing/selftests/kvm/hardware_disable_test.c @@ -22,6 +22,7 @@ #define DELAY_US_MAX 2000 sem_t *sem; +static cpu_set_t child_cpu_set; static void guest_code(void) { @@ -84,16 +85,11 @@ static void run_test(u32 run) { struct kvm_vcpu *vcpu; struct kvm_vm *vm; - cpu_set_t cpu_set; pthread_t threads[VCPU_NUM]; pthread_t throw_away; void *b; u32 i, j; - CPU_ZERO(&cpu_set); - for (i = 0; i < VCPU_NUM; i++) - CPU_SET(i, &cpu_set); - vm = vm_create(VCPU_NUM); pr_debug("%s: [%d] start vcpus\n", __func__, run); @@ -101,12 +97,12 @@ static void run_test(u32 run) vcpu = vm_vcpu_add(vm, i, guest_code); check_create_thread(&threads[i], NULL, run_vcpu, vcpu); - check_set_affinity(threads[i], &cpu_set); + check_set_affinity(threads[i], &child_cpu_set); for (j = 0; j < SLEEPING_THREAD_NUM; ++j) { check_create_thread(&throw_away, NULL, sleeping_thread, (void *)NULL); - check_set_affinity(throw_away, &cpu_set); + check_set_affinity(throw_away, &child_cpu_set); } } pr_debug("%s: [%d] all threads launched\n", __func__, run); @@ -147,12 +143,30 @@ void wait_for_child_setup(pid_t pid) } } +static void setup_child_cpu_set(void) +{ + int cpu; + + kvm_sched_getaffinity(0, sizeof(child_cpu_set), &child_cpu_set); + + if (CPU_COUNT(&child_cpu_set) < 2) + return; + + cpu = pin_task_to_random_cpu(pthread_self(), &child_cpu_set); + CPU_CLR(cpu, &child_cpu_set); + + while (CPU_COUNT(&child_cpu_set) > VCPU_NUM) + CPU_CLR(kvm_pick_random_cpu(&child_cpu_set), &child_cpu_set); +} + int main(int argc, char **argv) { u32 i; int s, r; pid_t pid; + setup_child_cpu_set(); + sem = sem_open("vm_sem", O_CREAT | O_EXCL, 0644, 0); sem_unlink("vm_sem"); -- 2.55.0.508.g3f0d502094-goog