From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D002635C696 for ; Fri, 31 Jul 2026 19:56:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527780; cv=none; b=bdZIyUypWDkiUjtI6uYzysI+eEkwOBawtYRua/Kw9Lu8E8F42gEY7Jvwg6DP2Hw6efcUFIusgVYFR0lUFAxSj5E5HcCUEFJIbJbPphOwM1CXgg0IaxaxxxCeR/oEWDbQ7NiJCwDdQPzSaKSJjyO+Qc5W48dH4rAESKorQPS/JxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527780; c=relaxed/simple; bh=jIqegcMSdQEr3CCSBl7CEcF3KSy6gnzkLIXn/FjtTSY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UAKCuyXBrA2KF1OMEpdtDVq5mTd4UsNazQ7jekkFyNfu1T1vPhBRC+3Bx5vh6GiTXogGko71kuqQsi9Zf8F5zMPFmeWvS/+PuRAKR2RQ4hVg7NcK/d071VQJq6d1pvo/eBgzj+7rj6VsGEl+AF2qIan4zo6id4+syVzPf4/yiQU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=c2dTgw0p; arc=none smtp.client-ip=209.85.210.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="c2dTgw0p" Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-8487eb67173so2706404b3a.2 for ; Fri, 31 Jul 2026 12:56:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527777; x=1786132577; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=I1vB8uido3pB5A8nVpiV1ZvPN5oqRESsQC5EjXRdj5A=; b=c2dTgw0p8niztkwbGXye8nUWLzWnMBWSNDf/p0zIhhtm5ztYqObq+BNk3M3vH23ibO TdPDd5FtN+x5EpV4k8VNMsNtgi1GmGDN0PeE45YhHbPcmxMlpUpH42cue3VBtu/VE9wr qG6G7WQ6nhhiUme3xaz5wQ/ljy92nOUeGbhvC6K+yioOnKw7bnNWYHXXlVxZqVORct1y 2w/BaWC6eYw8M1gUz6/8f/gnaWPLZWwyrx5MrpNn9g8+IKumM3e0SPAumxsT5s+ofwt8 MKt7ztF5NWc2D3G3a57xVplVYUkm7nPPUY4qU+SYQ/F77Nf9v0oc1YKYYhGTglm9f7tl 0AYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527777; x=1786132577; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=I1vB8uido3pB5A8nVpiV1ZvPN5oqRESsQC5EjXRdj5A=; b=UZ7AFn6KE/giDiTGEzeMr/fO3Ss/tOc6pq+O6sklBpWMM+anpx7sSsQGusvokdr91B RaHyJwiT9wN+KCFhqFmXf7x+M6uWRyDdPPf57Cr9Lz79GglZqKZrQt7Xpz+N4KTmRJlM atfA8GXt+kAvEbhn7P1BOBSp7BlhmY78JBLjyFcFXaC9AG+8/DQZ8L6kLdNTb+aDUpEL Tg0t6wrdlwAQHbaJIHVFdq1BbH2XYLiuGJK//zW0M48K+RYRjnAL33JqLLIevSG/D35y FqZyNL8kl1LpITfRxp7vccc1a5xEnPWFBpubwnuzzXTNfvTziP+AFIsoCD4vo834d3s1 Df1g== X-Forwarded-Encrypted: i=1; AHgh+Rp7IhHWopIRJGBgi6EpJKrdTTlEjvKFRR9Gg9oeScTKn/zyO/Jt5CMqX1JVTDAGb6yHC5sl1c40Ju+0AnM=@vger.kernel.org X-Gm-Message-State: AOJu0YyDPAl1mrXk/bXxY+ZWfgvXJt3/zSbamLmDc7fFLXPNaoNqQXfZ LIkLUT6+CAudJTWS96kG8axl71mQKXRiAqdqe5S/H8w0w6oSPBVYTyF07KCb0JtjmviRprIGWHk 0S3klXA== X-Received: from pfbi2-n1.prod.google.com ([2002:a05:6a00:a502:10b0:845:c4b8:9730]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:9a87:0:b0:848:2f73:8ffd with SMTP id d2e1a72fcca58-84ee49339bemr849272b3a.70.1785527777019; Fri, 31 Jul 2026 12:56:17 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:01 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-2-seanjc@google.com> Subject: [PATCH v3 01/12] KVM: selftests: Add a KVM syscall wrapper for sched_setaffinity() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add and use a KVM wrapper for sched_setaffinity() so that selftests don't need to manually assert that the syscall succeeded. No functional change intended. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_syscalls.h | 1 + tools/testing/selftests/kvm/rseq_test.c | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index 5dae6143ddb0..01dca99009c2 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -95,6 +95,7 @@ __KVM_SYSCALL_DEFINE(fallocate, 4, int, fd, int, mode, lo= ff_t, offset, loff_t, l __KVM_SYSCALL_DEFINE(ftruncate, 2, unsigned int, fd, off_t, length); __KVM_SYSCALL_DEFINE(madvise, 3, void *, addr, size_t, length, int, advice= ); __KVM_SYSCALL_DEFINE(sched_getaffinity, 3, pid_t, pid, size_t, cpusetsize,= cpu_set_t *, mask); +__KVM_SYSCALL_DEFINE(sched_setaffinity, 3, pid_t, pid, size_t, cpusetsize,= cpu_set_t *, mask); =20 #define kvm_free_fd(fd) \ do { \ diff --git a/tools/testing/selftests/kvm/rseq_test.c b/tools/testing/selfte= sts/kvm/rseq_test.c index 557e393c223b..edcaf0fbe20c 100644 --- a/tools/testing/selftests/kvm/rseq_test.c +++ b/tools/testing/selftests/kvm/rseq_test.c @@ -75,7 +75,7 @@ static void *migration_worker(void *__rseq_tid) { pid_t rseq_tid =3D (pid_t)(unsigned long)__rseq_tid; cpu_set_t allowed_mask; - int r, i, cpu; + int i, cpu; =20 CPU_ZERO(&allowed_mask); =20 @@ -96,9 +96,7 @@ static void *migration_worker(void *__rseq_tid) * stable, i.e. while changing affinity is in-progress. */ smp_wmb(); - r =3D sched_setaffinity(rseq_tid, sizeof(allowed_mask), &allowed_mask); - TEST_ASSERT(!r, "sched_setaffinity failed, errno =3D %d (%s)", - errno, strerror(errno)); + kvm_sched_setaffinity(rseq_tid, sizeof(allowed_mask), &allowed_mask); smp_wmb(); atomic_inc(&seq_cnt); =20 --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B8E2374735 for ; Fri, 31 Jul 2026 19:56:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527781; cv=none; b=TRCp/y7vqbeoNNrLGbnUoRDtJUCUyDdnqE746Hfj6OvS1XC1K6/l2ivPLJ78IJokCHFWGdHLcunlCf5E/nyxY5oGdpW9AYrv48e3++7CQhBviFvX4nUo0nlqdH7PkDxtecAjbAL3nZL2vfd6y6jU4DVTkY0ZF41KCSh3bRU+CrY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527781; c=relaxed/simple; bh=GTCdXxGxuqpPISX7zn1bGR9hfy0DxUEEavsRgWp0XqI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=aInCc5Db5R9BF2nqMYNGGHCGk+fQsHGEgcyxUqnvvzhlHTDWzpEc+OWsIDrkht2VkW4HVkPxFyZ3RQyJQGabNJqR35Tb1pIdsW9jD5TvsHml1UiJ28TpQNQ1e+ZDONlpyORIrp9zonvT6MlOhcpUWg7jHaLWI0OoF+TzYWPokXM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Liey1uSx; arc=none smtp.client-ip=209.85.215.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Liey1uSx" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cb48f41343aso1722040a12.1 for ; Fri, 31 Jul 2026 12:56:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527779; x=1786132579; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=6tcAvkg/zKE4Wpx2bpF+dHLf7/L283ci232zJUD1488=; b=Liey1uSxpfKCH6JZeLyUxzZ7+n64L7Ns6lCIr+nI/s9trFUIhi1tXdbG20rGJuIAR+ aW3TNt+JPMbwTLAAbvdx9qYUmoCNZHq1j1SiJQdHmq2CUGvYolGipBGyb5VyKF1qKk2m RS9wRTbFHRRhYtL/JYb0Tcb5u3VJhuTy9mvptfv74a1t/HlpnVr14YBL+qkH0juXzEk4 jxwICG+b9SupYtrxv7whoPRRjulpTaRzuZCOtaynoovSWv3pJ6ZvWf3T5NhUCRkgmngb ZAmX40ckyns3VTONZKYsb6Nrq+5SLqNHuc1rdFWBgIWosQFVwwZlCDa4ZfTm6f1i5qnD vTDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527779; x=1786132579; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=6tcAvkg/zKE4Wpx2bpF+dHLf7/L283ci232zJUD1488=; b=dy9jrvAb0sM1Hc/23aRLahxTI2JrD8YAc7isfoHkM+GXZIr4jNNySIbBr5ggw+V5Wj g6NHabHgcx8kLq+chuOKmFSkKi+cx7NYbju9f+8kl27Ho/9078h3Udtuv3/u17U/xU71 3j6dqM8rRTbUvdHBGAs6+EU+ncYIzROOfIHf4lNb8EJKyzsBFMja61ckPt3IZ6dk34dx cISsREa/GNbu0lcswgiaCw4MwsTGidBm4zHG4qaSKoi/97rGK0YRz8BJFHhFhcIXUh4C yjsi2WjE3fZhcyZnRsl66FZYb6laYeyrjqJLh6ILoMHum0/K8RoSgyGoSejhZ6om2fpd kE1A== X-Forwarded-Encrypted: i=1; AHgh+RrjkQY9JdaNxh+hWQucoDvJXTQSDyvAJh/jqzXSkZv7tsyGne3bA1koDzHWiIcRM0OZX46cLi1bPF+/Xew=@vger.kernel.org X-Gm-Message-State: AOJu0YzaR77v79rwdfG61AGq/mJojKIX0okSUEZwbGzYstdDhzvEkn7S ZXJHutuysxPPQcqYQGfUr85UfsFiX2Ex+EW71mk9ShG42K6L0Pq91t8StrE5zpSUNKmktK0qwga 9OkpJsg== X-Received: from pgj184.prod.google.com ([2002:a63:9c1:0:b0:c99:aff5:7078]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7290:b0:3bf:651d:fee0 with SMTP id adf61e73a8af0-3c92ae1d81fmr774604637.19.1785527778610; Fri, 31 Jul 2026 12:56:18 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:02 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-3-seanjc@google.com> Subject: [PATCH v3 02/12] KVM: selftests: Set threads CPU affinity before doing work in hardware disable test From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Affine worker threads to their target pCPU set *before* doing any work in the hardware disable test. When running a preemptible kernel on a NUMA system with a large number of CPUs (100+ of CPUs), waiting to set the affinity of the grandchildren until after the grandchild is fully spun up results in total test runtimes of over a minute, presumably due to cross-node NUMA penalties and scheduler lock contention. E.g. from the perspective of the caller, when waiting to affine the tasks, pthread_create() takes ~100x longer. Signed-off-by: Sean Christopherson --- .../selftests/kvm/hardware_disable_test.c | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/te= sting/selftests/kvm/hardware_disable_test.c index 3147f5c97e94..f088b4af3ccc 100644 --- a/tools/testing/selftests/kvm/hardware_disable_test.c +++ b/tools/testing/selftests/kvm/hardware_disable_test.c @@ -21,6 +21,7 @@ #define FORK_NUM (1ULL << 9) #define DELAY_US_MAX 2000 =20 +static cpu_set_t threads_cpu_set; sem_t *sem; =20 static void guest_code(void) @@ -35,6 +36,8 @@ static void *run_vcpu(void *arg) struct kvm_vcpu *vcpu =3D arg; struct kvm_run *run =3D vcpu->run; =20 + kvm_sched_setaffinity(0, sizeof(cpu_set_t), &threads_cpu_set); + vcpu_run(vcpu); =20 TEST_ASSERT(false, "%s: exited with reason %d: %s", @@ -47,6 +50,8 @@ static void *sleeping_thread(void *arg) { int fd; =20 + kvm_sched_setaffinity(0, sizeof(cpu_set_t), &threads_cpu_set); + while (true) { fd =3D open("/dev/null", O_RDWR); close(fd); @@ -64,14 +69,6 @@ static inline void check_create_thread(pthread_t *thread= , pthread_attr_t *attr, TEST_ASSERT(r =3D=3D 0, "%s: failed to create thread", __func__); } =20 -static inline void check_set_affinity(pthread_t thread, cpu_set_t *cpu_set) -{ - int r; - - r =3D pthread_setaffinity_np(thread, sizeof(cpu_set_t), cpu_set); - TEST_ASSERT(r =3D=3D 0, "%s: failed set affinity", __func__); -} - static inline void check_join(pthread_t thread, void **retval) { int r; @@ -84,16 +81,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; =20 - CPU_ZERO(&cpu_set); - for (i =3D 0; i < VCPU_NUM; i++) - CPU_SET(i, &cpu_set); - vm =3D vm_create(VCPU_NUM); =20 pr_debug("%s: [%d] start vcpus\n", __func__, run); @@ -101,12 +93,10 @@ static void run_test(u32 run) vcpu =3D vm_vcpu_add(vm, i, guest_code); =20 check_create_thread(&threads[i], NULL, run_vcpu, vcpu); - check_set_affinity(threads[i], &cpu_set); =20 for (j =3D 0; j < SLEEPING_THREAD_NUM; ++j) { check_create_thread(&throw_away, NULL, sleeping_thread, (void *)NULL); - check_set_affinity(throw_away, &cpu_set); } } pr_debug("%s: [%d] all threads launched\n", __func__, run); @@ -153,6 +143,9 @@ int main(int argc, char **argv) int s, r; pid_t pid; =20 + for (i =3D 0; i < VCPU_NUM; i++) + CPU_SET(i, &threads_cpu_set); + sem =3D sem_open("vm_sem", O_CREAT | O_EXCL, 0644, 0); sem_unlink("vm_sem"); =20 --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ECBC5376A15 for ; Fri, 31 Jul 2026 19:56:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527783; cv=none; b=e/SMJtmKUJ3b3mrlZBybILhCAVZKy6ZR8t7/9DhwcEF2h07imZcDuRezPT2Z+XvwLx/h/XQU4cqWUx7zOp6tT2+nONalgDpDx033tXKoiBIcgm7buX871F2koyeUEWuD/rRPxs0AIcd1/SMqw1UsphfRMe39wAMRZZD4ILN+V00= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527783; c=relaxed/simple; bh=cFWa99Xo2ScAZGQfMvB0ds8Ya6pH9puVFr0S2RC2rBc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WruUl6FY/nLr+tWh+dzTqy/e3ayyoxIcNAfgWCtZTaP6r7vPUlRoiU2Kx9N7oqC95n3AukWgag+6zRjhTEUfDqR+uO9OQa4Mzkl20hscy1+F9Uq4quycnvh/Nlwyf3JLqnlHg1eSRtftJwK187XHPUPm6xhEM3LpqM8rFwyjpNM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Uqmhx+xd; arc=none smtp.client-ip=209.85.215.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Uqmhx+xd" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cab048cdb3eso1679390a12.0 for ; Fri, 31 Jul 2026 12:56:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527780; x=1786132580; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=QWTFo4fs/kSU6lr4ZzfhIdwS/NOVkYn2PmTaiQ/QINI=; b=Uqmhx+xde/OQk9o3ODE/bJ8K14+7evpgyTRwVq4pNNe1Ja3Va4Xr5mvEtJeeKLLiNb Q5HY382K7kNjMHGs/ozuMEMCIphJKTuN3HsY3i8Z7ouQptTJ7ss3jeuutxP2TLHMpN9w V8oRpkL8Amo8pBM69+OI1BvROvbVw/VaqpSvdsBntP/CLOFzonvxD668UTVe37xdtGMw LfXKmRJkdoHdExvcf4tCqD9YDzzTnr0fYmwmeZ8hkSOZB7dCKOHVzEtwgdoYU1f9NaAb czwJZYpuKRZavKQMNM/9s7JOE/qKtIuyHQk6+o42OxEmJgd89el6wGMqKEYR0LfaGcDW SnEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527780; x=1786132580; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=QWTFo4fs/kSU6lr4ZzfhIdwS/NOVkYn2PmTaiQ/QINI=; b=epOgldixsgzNMZq/B9WxF6kwyCH/QBUs0C/b9N9kVigVyaABv32G5/15DqYBbubvNN azNGE+pLLgy3r8/XRlYnxA9Aqq+EmHeHBijU5Em2gSu4NtgpKifGdkj1CiHFf1iOi2bP CYIZEx9cqTBLYqI1Rz2Rrz06Fvi5w8FZY9oNBa9TNcEY+LI6RM99JWkSB0YUT/M/Jigc B7TiqPKlfa0bYYx55OOKNoKDS/hD7fSnL5Q1ODxoCXSiif3lrvhitkdFvlpcaB/grwec /25E5cRQAIjOXNZI+xsHZ3fcnb8aCUMJBv5DDR6hgNShogKRuB+VVJ/cgpuE7SWhqmec 3S4Q== X-Forwarded-Encrypted: i=1; AHgh+RqzpYxsAFsqAI3zRgaPFU34t1wEl2ttT3ZpMfO1IMW0ro0C5idMFFZWSidlDPpCPThqoLxCmh2BwBA0fnc=@vger.kernel.org X-Gm-Message-State: AOJu0YxSMq5t1dsGG0EItW/7YvdYnD+iI1Ywpd4Ul31rFr0CnQqNeNsB 78PO/zbmCA4X4jK5zorz4ktwrvYvnMa00uZCVXjStjgrX2tTFt/e/t3gHuTRrCLhswAN0X+JuBm e02/+VA== X-Received: from pgnp30.prod.google.com ([2002:a63:7f5e:0:b0:cbb:b782:6be1]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:13aa:b0:847:1d73:f753 with SMTP id d2e1a72fcca58-84ee48a4d18mr834507b3a.45.1785527779971; Fri, 31 Jul 2026 12:56:19 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:03 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-4-seanjc@google.com> Subject: [PATCH v3 03/12] KVM: selftests: Pre-set threads affinity in hardware disable test when possible From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When building against a libc that provides pthread_attr_setaffinity_np(), pre-set the grandchildren threads CPU affinity in the hardware disable test to further reduce the perceived latency of pthread_create(). On large NUMA systems, this reduces the average runtime from ~10s to ~5s. Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/hardware_disable_test.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/te= sting/selftests/kvm/hardware_disable_test.c index f088b4af3ccc..b4edeadfa3f4 100644 --- a/tools/testing/selftests/kvm/hardware_disable_test.c +++ b/tools/testing/selftests/kvm/hardware_disable_test.c @@ -36,7 +36,9 @@ static void *run_vcpu(void *arg) struct kvm_vcpu *vcpu =3D arg; struct kvm_run *run =3D vcpu->run; =20 +#ifndef _GNU_SOURCE kvm_sched_setaffinity(0, sizeof(cpu_set_t), &threads_cpu_set); +#endif =20 vcpu_run(vcpu); =20 @@ -50,7 +52,9 @@ static void *sleeping_thread(void *arg) { int fd; =20 +#ifndef _GNU_SOURCE kvm_sched_setaffinity(0, sizeof(cpu_set_t), &threads_cpu_set); +#endif =20 while (true) { fd =3D open("/dev/null", O_RDWR); @@ -80,22 +84,28 @@ static inline void check_join(pthread_t thread, void **= retval) static void run_test(u32 run) { struct kvm_vcpu *vcpu; + pthread_attr_t attr; struct kvm_vm *vm; pthread_t threads[VCPU_NUM]; pthread_t throw_away; void *b; u32 i, j; =20 + TEST_ASSERT_EQ(pthread_attr_init(&attr), 0); +#ifdef _GNU_SOURCE + TEST_ASSERT_EQ(pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &thr= eads_cpu_set), 0); +#endif + vm =3D vm_create(VCPU_NUM); =20 pr_debug("%s: [%d] start vcpus\n", __func__, run); for (i =3D 0; i < VCPU_NUM; ++i) { vcpu =3D vm_vcpu_add(vm, i, guest_code); =20 - check_create_thread(&threads[i], NULL, run_vcpu, vcpu); + check_create_thread(&threads[i], &attr, run_vcpu, vcpu); =20 for (j =3D 0; j < SLEEPING_THREAD_NUM; ++j) { - check_create_thread(&throw_away, NULL, sleeping_thread, + check_create_thread(&throw_away, &attr, sleeping_thread, (void *)NULL); } } --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7913E3783C5 for ; Fri, 31 Jul 2026 19:56:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527785; cv=none; b=OfN2ClF4QwPQxazcRCMzfG6SP3/g9C7uVTOQsr3+kwgp09vao6pzfUUW90PZ7kfMLB7El8+xYrzulq/hUCnB89JOu92SkmwqYrmOjzuMxymLIYnTHFsUjdDBhTvDBfBqaPugp8EB9YetkC65G2X7LpM8t13xtMS8SsVO+kp4qN4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527785; c=relaxed/simple; bh=HRd/veKnQQoNlLPIk/S30A+ciXDQdelNm8xjt5JmDww=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=D48RSr3dLTs6asoCZ8hL7CORra+Y9XEKHNbqonpSQgP2aXp2xWo6jHA44+SxuHI4inKOUAEHn4xmxE67f0xT20Tf7/SvTA4TEPe/aq95xqtG4s6hJdt6Sp9d62p2o/FOy9jD5OFQ4CBlEBi7MeoPk4JyUy7nxprm4fuekfb0+BA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kuwZ9nnC; arc=none smtp.client-ip=209.85.210.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="kuwZ9nnC" Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-84857446424so2574633b3a.1 for ; Fri, 31 Jul 2026 12:56:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527781; x=1786132581; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=kus6EqucfaH9HPf637yAVY0TPxuMIU/5NctVRnWGiLw=; b=kuwZ9nnCBp25sDmsCpXeLCHdLl0kOHxkB9Sal3rgP72LpIhACzVXE2TrfC4JdTJwSf 9olvjxqSFloYekIwd4w5h7/jC3exV8EHZlEdKELndFNSMJLsvICbVaya8DwIvDgWOphT BZ+8tvjNKAQBHVaT8YL5jdl2YugNHHt9qIRM0pXxrQGskmJfwz3PwIew74sQ0/mf6sv3 rX40MgOZ/IvdSd0zFxgmY2bVyqqiVhq7y/G03mJXUFPqLylb6oYOlYLRKusCszUhXh5R LxNd7l+jVmKqs9v2vV3kbNHe6JDgRxo1Nm0kJdTWjZRsED+MVracJKf4+Tv5KoxI5dhX OVUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527781; x=1786132581; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=kus6EqucfaH9HPf637yAVY0TPxuMIU/5NctVRnWGiLw=; b=fIAHxOqc6Sh1yvzCM51aUAevHnC9v3ZLMZeJNryMiAqkmicxNTIyat1yuXdEgnyPKj ICaWVE7CsTldbRb9NMLPOpvSsLAhokFnQUpQWCNY5ORBko8rzJy0cV6+S7lnakLbc44w 9aeh2ui10TsGvDD6pJMU4S6Ns1BCMYD5xOL0yUxIDBxtXI8kDv3r2eOhPhc6CZTlGVZ/ pgP6vDxx9wptyZx/XtxtWl7ABfMnxx0jSelEr5QRxxdpwWsCXkq0EmoL6pDOy9G58BnP CdVhLGUm1MvwVlhwfobC+MxhS1I8D75Jip35RhnFQ2xK7LFijnshlB2wRsMxdVdsppnv dxnw== X-Forwarded-Encrypted: i=1; AHgh+RqadnMnLp3forLyLx/d5R1cEfog74EPPgvoOri5b07FIyWx+qPhv8d1mYPYNHnmQ/XTvnEb3OydnooxR4o=@vger.kernel.org X-Gm-Message-State: AOJu0YyqvDAC60g7YUqnu2ZewP0+mEVR+9Xh7vbrdlYe7eBM7RzVZXXG R9j1W8Sx3Dr2QsM95Mrs8eWWP/7aYxbUnPf9wHyQLE2Hjzp4rSFOsRVh+BhSjDsr7ROqFR8ln6B qXSnl5g== X-Received: from pgiz17.prod.google.com ([2002:a63:c051:0:b0:c9f:dabd:440f]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4c95:b0:848:63fb:fd91 with SMTP id d2e1a72fcca58-84ee490ac2fmr778630b3a.41.1785527781042; Fri, 31 Jul 2026 12:56:21 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:04 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-5-seanjc@google.com> Subject: [PATCH v3 04/12] KVM: selftests: Return the target CPU from pin_task_to_random_cpu() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When pinning a task to a random CPU, return which CPU the task was pinned to so that the caller can do things like avoid running other tasks on the target CPU. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_util.h | 2 +- tools/testing/selftests/kvm/lib/kvm_util.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index b39e713c30a4..61d72e1e7601 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1094,7 +1094,7 @@ static inline void pin_task_to_cpu(pthread_t task, in= t cpu) TEST_ASSERT(!r, "Failed to set thread affinity to pCPU '%u'", cpu); } =20 -void pin_task_to_random_cpu(pthread_t task, cpu_set_t *possible_cpus); +int pin_task_to_random_cpu(pthread_t task, cpu_set_t *possible_cpus); =20 static inline int pin_task_to_any_cpu(pthread_t task) { diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 3794575d2ca0..af2bad0553f9 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -668,7 +668,7 @@ void kvm_print_vcpu_pinning_help(void) " (default: no pinning)\n", name, name); } =20 -void pin_task_to_random_cpu(pthread_t task, cpu_set_t *possible_cpus) +int pin_task_to_random_cpu(pthread_t task, cpu_set_t *possible_cpus) { int target_idx; int nr_cpus; @@ -682,11 +682,12 @@ void pin_task_to_random_cpu(pthread_t task, cpu_set_t= *possible_cpus) for (cpu =3D 0; cpu < CPU_SETSIZE; cpu++) { if (CPU_ISSET(cpu, possible_cpus) && target_idx-- =3D=3D 0) { pin_task_to_cpu(task, cpu); - return; + return cpu; } } =20 TEST_FAIL("Failed to find random CPU in possible_cpus"); + return -1; } =20 void kvm_parse_vcpu_pinning(const char *pcpus_string, u32 vcpu_to_pcpu[], --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 42358377563 for ; Fri, 31 Jul 2026 19:56:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527786; cv=none; b=QHBx02imiO11wojmGutm4x6Q83oz/9IS9MtJbI06GYS6QBa7I1R2ZVtj1UL097F/HdvqBwevFcGVvGzTyBXu7VBsP+zn64vFWna/VQ/+A83FIoiwJfSZ09X3dM25DECaXp5YfQfQv/o0I2dvqYtpHucc/TPoorH80IRA/ZL7nPA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527786; c=relaxed/simple; bh=/TJjnxpVpH8WmXNaVzrS2AeOgP3QdjHKxDY/CbjUI8M=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=XN9hqaT3wOLZ1NTI3wwoJD28qapUBc/U9iX5PIyRibNhvY1vVBWcgOllXR+0YbJJ190QXYUSDwtOkJQYLWantsBrcaRq8ZV0esaCgbFon4QyMlvOcwRF3d0TdKiIsIDeoUqo5cAKTk03d5pq2dJ9lLw2XcY02WLY6ZwA0cz9dyY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=T6RMoV8q; arc=none smtp.client-ip=209.85.210.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="T6RMoV8q" Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-848662cd2a1so1720616b3a.2 for ; Fri, 31 Jul 2026 12:56:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527782; x=1786132582; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=Bs3K8CpV0aK6wpGyTBasGbTbkVQEzOsTzupfjJkDnT8=; b=T6RMoV8qn0c/W+cns8wL6/JmEkZz8g4PGOvKgBvQPCtLtXCPAQQ0lp0EmyV9gNXjja xNziTiLLs0oRmyQsWvrpMWUkyHbswLF4yPvk4EwBahNXyo8fHvX18Kom7+i7bGAz4yvn TTUS72naIHfsLxKG7p5+PRIZxCZG0Lms/rvlebP1sVjI/NYUQpLjiGhDb1lXfRCNIK1e RusdEF5k/2OAqgjbj5n4Vo2dLAbS20ZjN4BIZh5LXcYd4cmHyRjWKVlXdhIxXf9Lwvj4 3kxKeJWZpPFe8aersI39m2Zywdt+uAqKEPgVBciT2c7n88o+2sJ3mRsTigKL7u5KDaCB TFzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527782; x=1786132582; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=Bs3K8CpV0aK6wpGyTBasGbTbkVQEzOsTzupfjJkDnT8=; b=l6zHtDtofasg3wncTs/DlIXVRcFMB1xKpUgCeIUTO4v8gTVo5gAlv+yoWiB3TV5aIb DL6JEyYFdl/UGzlxCSVWOWCnT9p20etvvW4zedN5LGLXL2AiZm53FB1EYd7sQ23IDYCZ Z684sQEPWsbEWBrUpUGK3xqG9QIg7uEXFJG6/5jUTK09tGOc5Xouh2HZAm6tyNKLH+Zc fPUSCTPnt1AUyeeFybUdZbbixp2Oipn+Cio0qDuh6putik6mlWZ9d9epYv01c/kDhHO1 aDFrBLfhoYyaU/9wkVnuASPpmWEaqMVQBty01rcOCpRNM0iY2rb2DX2rC4wEf6o9GW38 yL7Q== X-Forwarded-Encrypted: i=1; AHgh+RoaLyH44+9U5eN1YPpLVEgSF879gl/5XtEQuhaNzE1x8SXWJgE7vS/TAzNZuNciIZ3UVPt/Z0g8bJGtqsM=@vger.kernel.org X-Gm-Message-State: AOJu0YzCL3qFMb8AjvDylhJGpoyncPD6eW93ePmReOxB4C0diyp4VUPZ zen2Qvbq0sOsdk0qNJLeW1eWAkP4mQ3ALlv1eyyy/wPX8QzHV/yMnuxdKFYepKws9jmseM7u/2j RcZ8idA== X-Received: from pfh33.prod.google.com ([2002:a05:6a00:12e1:b0:848:46c7:cfe2]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:f04:b0:84e:d46f:4921 with SMTP id d2e1a72fcca58-84ee4915b80mr752468b3a.66.1785527782134; Fri, 31 Jul 2026 12:56:22 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:05 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-6-seanjc@google.com> Subject: [PATCH v3 05/12] KVM: selftests: Extract picking of random CPU from cpu_set_t to separate API From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extract kvm_pick_random_cpu() out of pin_task_to_random_cpu() so that tests can choose a random CPU without having to immediately pin a task to that CPU. No functional change intended. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_util.h | 11 ++++++++++- tools/testing/selftests/kvm/lib/kvm_util.c | 7 ++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 61d72e1e7601..5a7a455b5387 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1084,6 +1084,8 @@ struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm= _vm *vm); =20 void kvm_set_files_rlimit(u32 nr_vcpus); =20 +int kvm_pick_random_cpu(cpu_set_t *possible_cpus); + int __pin_task_to_cpu(pthread_t task, int cpu); =20 static inline void pin_task_to_cpu(pthread_t task, int cpu) @@ -1094,7 +1096,14 @@ static inline void pin_task_to_cpu(pthread_t task, i= nt cpu) TEST_ASSERT(!r, "Failed to set thread affinity to pCPU '%u'", cpu); } =20 -int pin_task_to_random_cpu(pthread_t task, cpu_set_t *possible_cpus); +static inline int pin_task_to_random_cpu(pthread_t task, cpu_set_t *possib= le_cpus) +{ + int cpu; + + cpu =3D kvm_pick_random_cpu(possible_cpus); + pin_task_to_cpu(task, cpu); + return cpu; +} =20 static inline int pin_task_to_any_cpu(pthread_t task) { diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index af2bad0553f9..9ddc047d5c27 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -668,7 +668,7 @@ void kvm_print_vcpu_pinning_help(void) " (default: no pinning)\n", name, name); } =20 -int pin_task_to_random_cpu(pthread_t task, cpu_set_t *possible_cpus) +int kvm_pick_random_cpu(cpu_set_t *possible_cpus) { int target_idx; int nr_cpus; @@ -680,12 +680,9 @@ int pin_task_to_random_cpu(pthread_t task, cpu_set_t *= possible_cpus) target_idx =3D kvm_random_u64(&kvm_rng) % nr_cpus; =20 for (cpu =3D 0; cpu < CPU_SETSIZE; cpu++) { - if (CPU_ISSET(cpu, possible_cpus) && target_idx-- =3D=3D 0) { - pin_task_to_cpu(task, cpu); + if (CPU_ISSET(cpu, possible_cpus) && target_idx-- =3D=3D 0) return cpu; - } } - TEST_FAIL("Failed to find random CPU in possible_cpus"); return -1; } --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C7C1B36EAA8 for ; Fri, 31 Jul 2026 19:56:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527788; cv=none; b=FKutNUrl+WX0MI7DlGlPukxl09pWe6wVN0JxzHXKRlZISgcidd8JBnlVGmhGBcVS3vhJFuhZ8QEe/oQTc/WOT/nOAdk5yGNeklwv0mxlM+0SK5JiDIBas2fbLyqkXOFg+zULGK4LQRVLCJL2kWGMC5DO9jlOsUDklRDdVbXT1JQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527788; c=relaxed/simple; bh=ZX3lsEpQM2XoeKfIgtWIwUcQylpJU5vh25cC6mG48ng=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Ee5S1/h1aBYbMBEX9KFUEToLM5LZu7Y0h1Sjrus/Ui9MT36WccvXJKDhhqTiLNXyPRpyuM6yH/N32e8lqI4NVWrYOguBNbuMzRfyC8edBVLx6KGW30gkJA0V55M9SK2T5O5Qs3dXttUaNm87SUB6hyV0DL8cUykgCN6kPC5FWDw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=WTxGFHak; arc=none smtp.client-ip=209.85.210.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="WTxGFHak" Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-84859a64079so2611001b3a.3 for ; Fri, 31 Jul 2026 12:56:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527783; x=1786132583; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=x1rfv+ZTByjOzukF+HUPO8Wjg2keXlPKVWZZNi7BXT8=; b=WTxGFHak7ma9tC2lOGufYaJT/ssQYW8FSXo5OdWbmZC50xJ/JVqVnikKwKpPJtQbZ5 hsOVX+rJBhZK+gTEZ9atxJre5RVdXBwOOlDYNd3BztJPlKJ3CG9idY0yZRrK/mg1D534 dD3c/FSbtHXP8jx9FL4IrD8UEUn6bCf8/sccsGuvguEPRQt/7k6cyl2IlF61ZYoMCBjM P1dCWddMvEvMOHc56aX6+USFVlc4A69k5DtTiCC3UwOHY5Y5N8t9y2nTR2c2ck0UH2lL R1IddgTXB8F7Mt/KxT6FuCWn5RUBi743676JToTZuFEdpLIV4BO7OGtZ6jRnDsakdk1h lNDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527783; x=1786132583; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=x1rfv+ZTByjOzukF+HUPO8Wjg2keXlPKVWZZNi7BXT8=; b=kaTb+a0XQOTF/uG3cfkZIUT/qM82KGIr8suToEqafQDxjuw5coeW98I3RcVYno1qer hNu5xiZox05TAz8/jJEq6DiSwLNLHswvcuYQtM4WXY9Tb/Z7WqVdu3mdnDY7d1oQt+9K XO+aT3dJmcvxTm4AbF8gxqp6A7nQ1L6NsI9tzM1pYq7h/wWgqdYt3FlGEn6xee208St9 7zLvS+Xfi4MTCiWpIYNiWO9H/MIPJ7y+nHLamk20Y3IcSIb+/yZ+Usv0kopAfBcM2Z4e q7rTsZsYWv+8Vl1ZaqJ/8I8R5hITNzrmwGzonfOGKcUIDd7aHoHWJJ6GDucwayptLNKE /Ykg== X-Forwarded-Encrypted: i=1; AHgh+Rom6TSaNfa142HoW/NE2r1T+b6oiy9VMXO0wBkWeX9wJJ3Tj6HalcwGhHNnnkpP7XzykcjeYyKNST1wrbQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4sgXd6BgQVVe3rYhLSPpS0C4wrVkghEf6yL9NmFBzjU/u+9q+ yKzpV9bcdoeWB56V9oq9PovUsPRheP1gDZHTECLli6lSRva/Gf8L2LnGL8pLhCSs9hQF1SyELNC GcklLpg== X-Received: from pfjx14.prod.google.com ([2002:aa7:9a4e:0:b0:845:ebfa:4051]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:138d:b0:848:5010:ad39 with SMTP id d2e1a72fcca58-84ee48d1617mr785061b3a.46.1785527783246; Fri, 31 Jul 2026 12:56:23 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:06 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-7-seanjc@google.com> Subject: [PATCH v3 06/12] KVM: selftests: Affine threads to random CPUs in hardware disable test From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Affine the worker threads to random CPUs in the hardware disable test, and honor the starting CPU set in the process. Hardcoding to CPUs 0-3 is both wrong and less interesting than running on random CPUs. Opportunistically convert the local 'i' to an int, as the macros it tests against are signed, and using 'i' as an iterator is conventionally declared as an int. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/hardware_disable_test.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/te= sting/selftests/kvm/hardware_disable_test.c index b4edeadfa3f4..fcc06c602fca 100644 --- a/tools/testing/selftests/kvm/hardware_disable_test.c +++ b/tools/testing/selftests/kvm/hardware_disable_test.c @@ -149,12 +149,17 @@ void wait_for_child_setup(pid_t pid) =20 int main(int argc, char **argv) { - u32 i; - int s, r; + cpu_set_t allowed_cpu_set; + int s, r, cpu, i; pid_t pid; =20 - for (i =3D 0; i < VCPU_NUM; i++) - CPU_SET(i, &threads_cpu_set); + kvm_sched_getaffinity(0, sizeof(cpu_set_t), &allowed_cpu_set); + + for (i =3D 0; i < VCPU_NUM && CPU_COUNT(&allowed_cpu_set); i++) { + cpu =3D kvm_pick_random_cpu(&allowed_cpu_set); + CPU_CLR(cpu, &allowed_cpu_set); + CPU_SET(cpu, &threads_cpu_set); + } =20 sem =3D sem_open("vm_sem", O_CREAT | O_EXCL, 0644, 0); sem_unlink("vm_sem"); --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4201232F76D for ; Fri, 31 Jul 2026 19:56:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527790; cv=none; b=KPz2cMPjHuBuGy1bnuvd76CoW0mRaQEr76w1Zcgkp8THsk79GNg3Rk7dBJLIPPXl5cAcbEe1V87TIsw8hIchOStN7nVbaPKZb6NEiyQCSKv89Aosrb77VDHpUaogHI8YO+aLPOi79Z8cgoNYfRxlOXuuAruQwoAdaQn2uxmLvss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527790; c=relaxed/simple; bh=GSlZ/QfH22uYNIQc6bnCNCACqwR92zhApm/uHM2zGa0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dyup4iIldl+a4dBpQBXGJgEy3RN11aL6hbNksxg/PtG0s0c3aPnTSa1bMy9O5vmvg8FhFVYQ0OC7bbr9dScRw85GnUcgb8reXjfbkvCGWWopsGjVy9Sue2sYAlRYVMSaVL7NNh7JkRzrlWfy2vAxGvKcKv8AGLQmQmOuEvfk0ck= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=C8u3WcBA; arc=none smtp.client-ip=209.85.210.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="C8u3WcBA" Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-84a251c2e3eso3014034b3a.1 for ; Fri, 31 Jul 2026 12:56:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527784; x=1786132584; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=NUF7ZMtALHs5ft2o/4IkbgfVOeTdBoOGjjUFtC1Jiy0=; b=C8u3WcBA4I9JMWPU1OPJl8Ym1b5Ad6/bKS8weqFpXAE1bdIfoqqe/P/qtq60yCbqxq ly/xSgHWcnaFXOg7svcUULwAXc5hIYlJ8mLm4mS7s8xUXZ/EWHivn06s0+jQIyDbckNV 6oYBzD5sYp8TQyb11M1INrwks0Lz8tth4goZAYrACPWLvH8m2vSJ6MaWH+u5Kh9r2RuS awTv7SNxjKhulNSGGlo3GXjMiYy5U5yFWDMQz3DbQImNHsNlwk9whcpzjb+IAB8cGN1q /fIDxgFCMUG3uvJrfVtZxSiDabx15DIIAuCsqHLxIwBMW6XuKh/V3SgIlq9dYzK2u/nV JnsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527784; x=1786132584; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=NUF7ZMtALHs5ft2o/4IkbgfVOeTdBoOGjjUFtC1Jiy0=; b=HIQP9mKPYPr3F+GcnGzCe1Fs9LGT53XVum2qaOvGlf90U7e5HqTeBnN1rEr/+reW1v nm9MIDp6gFU6LBBiF58cYPRj2T9ysJUf+mW8kZeJJAqVukYIVzNnkj9/uvtZwsCe9omH AYq1oWP/3reNf9+/EszNOX4ZBchjq2aPt28Zw0sujb8hG0Eg5R/5w6DzYbqj11FYYi9C d+p1An/ot0XbLSFIRHFUvDsX2DtaoCU4jvXZcQnchmdRKQSd3+6HCsXi4QsFW5oJ4Zm5 qUpCTv5x10JzhcbHOHV3Z/bvNIKRFQIZp4N8byBxaFwkG1ItPwZIwsrdO7b/gjhcKVb8 wkfQ== X-Forwarded-Encrypted: i=1; AHgh+RrwQmMbegLab99t/qcwTweXxdIeLBwHNPj44/qqZRXCesQF2Ioh0t2G4F+fhKgQUoP8IRcq3aPv1iiMzGk=@vger.kernel.org X-Gm-Message-State: AOJu0YzQ8fT/CLolKHiaTyTdHM+EtLSmODH9wou2Xegr63ZC0aJzgzmk viIfXhMNJ2BIIIVqYzXhQhNm9neo36G7vOBkUu3z25sB6YSxtGuRMTPP1JSV5Fpr6wZ6Mw/59PV 47W9btw== X-Received: from pfva4.prod.google.com ([2002:a05:6a00:c84:b0:845:4ca2:60a5]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1d8c:b0:845:df5c:2567 with SMTP id d2e1a72fcca58-84ee492fc27mr727552b3a.25.1785527784352; Fri, 31 Jul 2026 12:56:24 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:07 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-8-seanjc@google.com> Subject: [PATCH v3 07/12] KVM: selftests: Drop unreachable, dead code from hardware disable test From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop all of the code that is unreachable in the hardware disable test, as it adds a lot of noise that makes the test seem far more complicated than it actually is. Signed-off-by: Sean Christopherson --- .../selftests/kvm/hardware_disable_test.c | 41 +++++++------------ 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/te= sting/selftests/kvm/hardware_disable_test.c index fcc06c602fca..de8e63da7b58 100644 --- a/tools/testing/selftests/kvm/hardware_disable_test.c +++ b/tools/testing/selftests/kvm/hardware_disable_test.c @@ -15,6 +15,7 @@ #include =20 #include "kvm_util.h" +#include "ucall_common.h" =20 #define VCPU_NUM 4 #define SLEEPING_THREAD_NUM (1 << 4) @@ -28,7 +29,7 @@ static void guest_code(void) { for (;;) ; /* Some busy work */ - printf("Should not be reached.\n"); + GUEST_ASSERT(0); } =20 static void *run_vcpu(void *arg) @@ -42,10 +43,8 @@ static void *run_vcpu(void *arg) =20 vcpu_run(vcpu); =20 - TEST_ASSERT(false, "%s: exited with reason %d: %s", - __func__, run->exit_reason, - exit_reason_str(run->exit_reason)); - pthread_exit(NULL); + TEST_FAIL("vCPU%d exited with reason %d: %s", + vcpu->id, run->exit_reason, exit_reason_str(run->exit_reason)); } =20 static void *sleeping_thread(void *arg) @@ -56,12 +55,11 @@ static void *sleeping_thread(void *arg) kvm_sched_setaffinity(0, sizeof(cpu_set_t), &threads_cpu_set); #endif =20 - while (true) { + while (1) { fd =3D open("/dev/null", O_RDWR); close(fd); } - TEST_ASSERT(false, "%s: exited", __func__); - pthread_exit(NULL); + TEST_FAIL("%s: exited", __func__); } =20 static inline void check_create_thread(pthread_t *thread, pthread_attr_t *= attr, @@ -73,22 +71,12 @@ static inline void check_create_thread(pthread_t *threa= d, pthread_attr_t *attr, TEST_ASSERT(r =3D=3D 0, "%s: failed to create thread", __func__); } =20 -static inline void check_join(pthread_t thread, void **retval) -{ - int r; - - r =3D pthread_join(thread, retval); - TEST_ASSERT(r =3D=3D 0, "%s: failed to join thread", __func__); -} - static void run_test(u32 run) { struct kvm_vcpu *vcpu; pthread_attr_t attr; struct kvm_vm *vm; - pthread_t threads[VCPU_NUM]; - pthread_t throw_away; - void *b; + pthread_t thread; u32 i, j; =20 TEST_ASSERT_EQ(pthread_attr_init(&attr), 0); @@ -102,19 +90,18 @@ static void run_test(u32 run) for (i =3D 0; i < VCPU_NUM; ++i) { vcpu =3D vm_vcpu_add(vm, i, guest_code); =20 - check_create_thread(&threads[i], &attr, run_vcpu, vcpu); + check_create_thread(&thread, &attr, run_vcpu, vcpu); =20 - for (j =3D 0; j < SLEEPING_THREAD_NUM; ++j) { - check_create_thread(&throw_away, &attr, sleeping_thread, + for (j =3D 0; j < SLEEPING_THREAD_NUM; ++j) + check_create_thread(&thread, &attr, sleeping_thread, (void *)NULL); - } } pr_debug("%s: [%d] all threads launched\n", __func__, run); sem_post(sem); - for (i =3D 0; i < VCPU_NUM; ++i) - check_join(threads[i], &b); - /* Should not be reached */ - TEST_ASSERT(false, "%s: [%d] child escaped the ninja", __func__, run); + + /* Wait for the parent to SIGKILL this child. */ + while (1) + pause(); } =20 void wait_for_child_setup(pid_t pid) --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 74E8337C0FE for ; Fri, 31 Jul 2026 19:56:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527792; cv=none; b=TS2PoamcyAbCfVJAVi3uz81GAmT4gz5UKk7EhCvDFZOGtPrXYZmV5SPzW2zHDMxVV6X42x/QuIh5qvDIJeVo6HjvnQJIZ6Rsiyyn9UfOHNtNe43ZhPNOwr8HghaAFRl08W65pXVYsDLaoDtpo5BbMtgbSgqCrnW0Ld5eKZ/vORo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527792; c=relaxed/simple; bh=j918cwqL/ciiClok5bu2lgLWCkshe+ip6E3s0GYNNtw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UXb8AxKb3TPUpuwCNhuxPlzpFKDkZziIpgApp6u5a4Vhs6U4/FNvfNOwlaD8zAo3x2YHo+7YDWswrF5c0nG/KJ8nZxKiLZcJfJIz0DJRZ7sfaVb9Iqk9/pWnxov9OJQAT1Itm+fCb3ptlCKMfDXYHAme8fiAjFCUUdQ4i7Gq484= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=cmYdyEig; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="cmYdyEig" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cacd6d37edso16465695ad.0 for ; Fri, 31 Jul 2026 12:56:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527786; x=1786132586; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=1R0kVuc0YiboOrBkjuAbd9w4DMb8Ec7ySOjPjmt82TA=; b=cmYdyEigg5B6yGhpMOH+cc7TLbWC0ORGDOJMZrQwHnr0/zT0P2sT6jqtcKhBISTsBo Gg2B7KCIH3ywwKlqcGU7CL7AlYQl8Cc5cPhn/a7OFg67BsmunCjECkzcAJKPt61r38LH 0SpV6iyU3+XPzQ4fXfcOvukNYo+ynh1g2+Wr6tq/yAAt44b/nOwOmhC7tPD3g0pKRg12 D5XOzHkkd9qion6wKMPj37LHS4WXcFT9SK4m/M4z6p3jFmHhpEwcgsmHP4Uly9EEoHOH CzGEYVaP99Bvs39mIrZo3VSGih9m4n+r2NkQZG46Clk+o+uNx6o+MRCL4h/v14Mx8LMn TKUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527786; x=1786132586; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=1R0kVuc0YiboOrBkjuAbd9w4DMb8Ec7ySOjPjmt82TA=; b=VfRtlvLsqIlN1WBjNzMZvbu9nGzFYG2pikbzN/l6uhmHWzedtSyqqsy4wyT+q2nAv0 5ghj966bCTQ30rcUF2p8c4IZqgVirFozM0CzyizFSvDzDbRktHAsZ1SJ21IWc8fc/gKO V1ZBhFov0CMUFKpyPko5/zSjhlfSHW1ZITaZ6isarWaeiiwhP4wKkwTw1Tr7+QLfsYzW QLOcCHSgEq7uXDytjdeqo/0ZsmxEd7Xfm0BhxuOVF4Cj6VDdQlxKrNzOrJjeCNlPzUOT HGWg46K02wH5Wtcs3Njv/e6LUOG+LjXXX8MXHm74auflOhm8w88EEYfDuUkKsFtQE/ta NScg== X-Forwarded-Encrypted: i=1; AHgh+Ro8zGf29GPS9FmCxaRbbJx5Ytsm8sFFLoMHWyVCO0kHvEwuomVXPz5NBhxVkInG4psm0bf+a+ifHdvPp6w=@vger.kernel.org X-Gm-Message-State: AOJu0Yyfg2ZE9B1e3REi8WQcuGnXb06pjjFLSHw4wNFAG4exjxPqil1U uJGFdkXZZMdTkphP8ECXcd43Ezak/HORK6ZUQH2pPHhlPIKHSWOlPB8myq6QqrrhhFherzmGFyS JcPKKsw== X-Received: from plbkh11.prod.google.com ([2002:a17:903:64b:b0:2cc:e845:dd38]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ea01:b0:2cc:d807:369c with SMTP id d9443c01a7336-2d0528f55f6mr10395055ad.45.1785527785471; Fri, 31 Jul 2026 12:56:25 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:08 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-9-seanjc@google.com> Subject: [PATCH v3 08/12] KVM: selftests: Add KVM syscall wrapper for pthread_create() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add and use a KVM wrapper for pthread_create() syscall so that selftests don't need to manually assert that the syscall succeeded. Note, most tests don't actually assert success, but they all obviously rely on the syscall to succeed. Other than explicitly failing if pthread_create() fails, no functional change intended. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/arch_timer.c | 14 ++++---------- tools/testing/selftests/kvm/arm64/vgic_irq.c | 10 +++------- .../selftests/kvm/arm64/vgic_lpi_stress.c | 4 ++-- tools/testing/selftests/kvm/dirty_log_test.c | 2 +- .../selftests/kvm/hardware_disable_test.c | 16 +++------------- .../testing/selftests/kvm/include/kvm_syscalls.h | 5 +++++ tools/testing/selftests/kvm/irq_test.c | 2 +- tools/testing/selftests/kvm/irqfd_test.c | 2 +- .../testing/selftests/kvm/kvm_page_table_test.c | 4 ++-- tools/testing/selftests/kvm/lib/memstress.c | 2 +- .../testing/selftests/kvm/lib/userfaultfd_util.c | 4 ++-- tools/testing/selftests/kvm/memslot_perf_test.c | 2 +- tools/testing/selftests/kvm/mmu_stress_test.c | 2 +- .../selftests/kvm/pre_fault_memory_test.c | 2 +- tools/testing/selftests/kvm/rseq_test.c | 4 ++-- tools/testing/selftests/kvm/s390/memop.c | 2 +- .../selftests/kvm/set_memory_region_test.c | 2 +- tools/testing/selftests/kvm/steal_time.c | 2 +- tools/testing/selftests/kvm/x86/hyperv_ipi.c | 11 ++++------- .../testing/selftests/kvm/x86/hyperv_tlb_flush.c | 9 +++------ .../kvm/x86/private_mem_conversions_test.c | 2 +- .../kvm/x86/private_mem_kvm_exits_test.c | 5 ++--- .../selftests/kvm/x86/recalc_apic_map_test.c | 2 +- .../selftests/kvm/x86/sev_migrate_tests.c | 2 +- tools/testing/selftests/kvm/x86/sync_regs_test.c | 2 +- .../testing/selftests/kvm/x86/tsc_scaling_sync.c | 2 +- tools/testing/selftests/kvm/x86/xapic_ipi_test.c | 8 ++------ .../testing/selftests/kvm/x86/xen_shinfo_test.c | 3 +-- 28 files changed, 50 insertions(+), 77 deletions(-) diff --git a/tools/testing/selftests/kvm/arch_timer.c b/tools/testing/selft= ests/kvm/arch_timer.c index f8b02597897b..a6a66b5b7ea9 100644 --- a/tools/testing/selftests/kvm/arch_timer.c +++ b/tools/testing/selftests/kvm/arch_timer.c @@ -141,28 +141,22 @@ static void test_run(struct kvm_vm *vm) { pthread_t pt_vcpu_migration; unsigned int i; - int ret; =20 pthread_mutex_init(&vcpu_done_map_lock, NULL); vcpu_done_map =3D bitmap_zalloc(test_args.nr_vcpus); TEST_ASSERT(vcpu_done_map, "Failed to allocate vcpu done bitmap"); =20 - for (i =3D 0; i < (unsigned long)test_args.nr_vcpus; i++) { - ret =3D pthread_create(&pt_vcpu_run[i], NULL, test_vcpu_run, - (void *)(unsigned long)i); - TEST_ASSERT(!ret, "Failed to create vCPU-%d pthread", i); - } + for (i =3D 0; i < (unsigned long)test_args.nr_vcpus; i++) + kvm_pthread_create(&pt_vcpu_run[i], NULL, test_vcpu_run, + (void *)(unsigned long)i); =20 /* Spawn a thread to control the vCPU migrations */ if (test_args.migration_freq_ms) { srand(time(NULL)); =20 - ret =3D pthread_create(&pt_vcpu_migration, NULL, - test_vcpu_migration, NULL); - TEST_ASSERT(!ret, "Failed to create the migration pthread"); + kvm_pthread_create(&pt_vcpu_migration, NULL, test_vcpu_migration, NULL); } =20 - for (i =3D 0; i < test_args.nr_vcpus; i++) pthread_join(pt_vcpu_run[i], NULL); =20 diff --git a/tools/testing/selftests/kvm/arm64/vgic_irq.c b/tools/testing/s= elftests/kvm/arm64/vgic_irq.c index 5e231998617e..2d6f20d5c117 100644 --- a/tools/testing/selftests/kvm/arm64/vgic_irq.c +++ b/tools/testing/selftests/kvm/arm64/vgic_irq.c @@ -988,7 +988,7 @@ static void test_vgic_two_cpus(void *gcode) struct test_args args =3D {}; struct kvm_vm *vm; gva_t args_gva; - int gic_fd, ret; + int gic_fd; =20 vm =3D vm_create_with_vcpus(2, gcode, vcpus); =20 @@ -1004,12 +1004,8 @@ static void test_vgic_two_cpus(void *gcode) =20 gic_fd =3D vgic_v3_setup(vm, 2, 64); =20 - ret =3D pthread_create(&thr[0], NULL, test_vcpu_run, vcpus[0]); - if (ret) - TEST_FAIL("Can't create thread for vcpu 0 (%d)\n", ret); - ret =3D pthread_create(&thr[1], NULL, test_vcpu_run, vcpus[1]); - if (ret) - TEST_FAIL("Can't create thread for vcpu 1 (%d)\n", ret); + kvm_pthread_create(&thr[0], NULL, test_vcpu_run, vcpus[0]); + kvm_pthread_create(&thr[1], NULL, test_vcpu_run, vcpus[1]); =20 pthread_join(thr[0], NULL); pthread_join(thr[1], NULL); diff --git a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c b/tools/te= sting/selftests/kvm/arm64/vgic_lpi_stress.c index d64d434d3f06..549e0547d905 100644 --- a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c +++ b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c @@ -311,10 +311,10 @@ static void run_test(void) pthread_barrier_init(&test_setup_barrier, NULL, nr_vcpus + nr_devices + 1= ); =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_create(&vcpu_threads[i], NULL, vcpu_worker_thread, vcpus[i]); + kvm_pthread_create(&vcpu_threads[i], NULL, vcpu_worker_thread, vcpus[i]); =20 for (i =3D 0; i < nr_devices; i++) - pthread_create(&lpi_threads[i], NULL, lpi_worker_thread, (void *)i); + kvm_pthread_create(&lpi_threads[i], NULL, lpi_worker_thread, (void *)i); =20 pthread_barrier_wait(&test_setup_barrier); =20 diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/s= elftests/kvm/dirty_log_test.c index e8419d7da1ea..ca22e5f09ac2 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -691,7 +691,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) =20 TEST_ASSERT_EQ(vcpu_stop, false); =20 - pthread_create(&vcpu_thread, NULL, vcpu_worker, vcpu); + kvm_pthread_create(&vcpu_thread, NULL, vcpu_worker, vcpu); =20 for (iteration =3D 1; iteration <=3D p->iterations; iteration++) { unsigned long i, reap_i; diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/te= sting/selftests/kvm/hardware_disable_test.c index de8e63da7b58..72bac346bdd9 100644 --- a/tools/testing/selftests/kvm/hardware_disable_test.c +++ b/tools/testing/selftests/kvm/hardware_disable_test.c @@ -5,7 +5,6 @@ * return notifiers. */ #include -#include #include #include #include @@ -14,6 +13,7 @@ =20 #include =20 +#include "kvm_syscalls.h" #include "kvm_util.h" #include "ucall_common.h" =20 @@ -62,15 +62,6 @@ static void *sleeping_thread(void *arg) TEST_FAIL("%s: exited", __func__); } =20 -static inline void check_create_thread(pthread_t *thread, pthread_attr_t *= attr, - void *(*f)(void *), void *arg) -{ - int r; - - r =3D pthread_create(thread, attr, f, arg); - TEST_ASSERT(r =3D=3D 0, "%s: failed to create thread", __func__); -} - static void run_test(u32 run) { struct kvm_vcpu *vcpu; @@ -90,11 +81,10 @@ static void run_test(u32 run) for (i =3D 0; i < VCPU_NUM; ++i) { vcpu =3D vm_vcpu_add(vm, i, guest_code); =20 - check_create_thread(&thread, &attr, run_vcpu, vcpu); + kvm_pthread_create(&thread, &attr, run_vcpu, vcpu); =20 for (j =3D 0; j < SLEEPING_THREAD_NUM; ++j) - check_create_thread(&thread, &attr, sleeping_thread, - (void *)NULL); + kvm_pthread_create(&thread, &attr, sleeping_thread, (void *)NULL); } pr_debug("%s: [%d] all threads launched\n", __func__, run); sem_post(sem); diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index 01dca99009c2..e75be8378779 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -12,6 +12,7 @@ #include #include =20 +#include #include #include =20 @@ -97,6 +98,10 @@ __KVM_SYSCALL_DEFINE(madvise, 3, void *, addr, size_t, l= ength, int, advice); __KVM_SYSCALL_DEFINE(sched_getaffinity, 3, pid_t, pid, size_t, cpusetsize,= cpu_set_t *, mask); __KVM_SYSCALL_DEFINE(sched_setaffinity, 3, pid_t, pid, size_t, cpusetsize,= cpu_set_t *, mask); =20 +typedef void *(*pthread_fn_t)(void *); +__KVM_SYSCALL_DEFINE(pthread_create, 4, pthread_t *, thread, + const pthread_attr_t *, attr, pthread_fn_t, fn, void *, arg); + #define kvm_free_fd(fd) \ do { \ kvm_close(fd); \ diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 240f6f0fdbe4..7da5f8d75e85 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -296,7 +296,7 @@ int main(int argc, char **argv) kvm_sched_getaffinity(0, sizeof(available_cpus), &available_cpus); =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_create(&vcpu_threads[i], NULL, vcpu_thread_main, vcpus[i]); + kvm_pthread_create(&vcpu_threads[i], NULL, vcpu_thread_main, vcpus[i]); =20 for (i =3D 0; i < nr_vcpus; i++) { struct kvm_vcpu *vcpu =3D vcpus[i]; diff --git a/tools/testing/selftests/kvm/irqfd_test.c b/tools/testing/selft= ests/kvm/irqfd_test.c index 5d7590d01868..8b39144a2834 100644 --- a/tools/testing/selftests/kvm/irqfd_test.c +++ b/tools/testing/selftests/kvm/irqfd_test.c @@ -128,7 +128,7 @@ int main(int argc, char *argv[]) =20 close(__eventfd); =20 - pthread_create(&racing_thread, NULL, secondary_irqfd_juggler, vm2); + kvm_pthread_create(&racing_thread, NULL, secondary_irqfd_juggler, vm2); =20 for (i =3D 0; i < 10000; i++) { WRITE_ONCE(__eventfd, kvm_new_eventfd()); diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/test= ing/selftests/kvm/kvm_page_table_test.c index a910e3abb8c7..8222bdb63e49 100644 --- a/tools/testing/selftests/kvm/kvm_page_table_test.c +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c @@ -364,8 +364,8 @@ static void run_test(enum vm_guest_mode mode, void *arg) *current_stage =3D KVM_BEFORE_MAPPINGS; =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_create(&vcpu_threads[i], NULL, vcpu_worker, - test_args.vcpus[i]); + kvm_pthread_create(&vcpu_threads[i], NULL, vcpu_worker, + test_args.vcpus[i]); =20 vcpus_complete_new_stage(*current_stage); pr_info("Started all vCPUs successfully\n"); diff --git a/tools/testing/selftests/kvm/lib/memstress.c b/tools/testing/se= lftests/kvm/lib/memstress.c index 3599b75d97c9..0bfa623ce9b5 100644 --- a/tools/testing/selftests/kvm/lib/memstress.c +++ b/tools/testing/selftests/kvm/lib/memstress.c @@ -294,7 +294,7 @@ void memstress_start_vcpu_threads(int nr_vcpus, vcpu->vcpu_idx =3D i; WRITE_ONCE(vcpu->running, false); =20 - pthread_create(&vcpu->thread, NULL, vcpu_thread_main, vcpu); + kvm_pthread_create(&vcpu->thread, NULL, vcpu_thread_main, vcpu); } =20 for (i =3D 0; i < nr_vcpus; i++) { diff --git a/tools/testing/selftests/kvm/lib/userfaultfd_util.c b/tools/tes= ting/selftests/kvm/lib/userfaultfd_util.c index ef8d76f71f83..4b3e3158ed87 100644 --- a/tools/testing/selftests/kvm/lib/userfaultfd_util.c +++ b/tools/testing/selftests/kvm/lib/userfaultfd_util.c @@ -167,8 +167,8 @@ struct uffd_desc *uffd_setup_demand_paging(int uffd_mod= e, useconds_t delay, uffd_desc->reader_args[i].handler =3D handler; uffd_desc->reader_args[i].pipe =3D pipes[0]; =20 - pthread_create(&uffd_desc->readers[i], NULL, uffd_handler_thread_fn, - &uffd_desc->reader_args[i]); + kvm_pthread_create(&uffd_desc->readers[i], NULL, uffd_handler_thread_fn, + &uffd_desc->reader_args[i]); =20 PER_VCPU_DEBUG("Created uffd thread %i for HVA range [%p, %p)\n", i, hva, hva + len); diff --git a/tools/testing/selftests/kvm/memslot_perf_test.c b/tools/testin= g/selftests/kvm/memslot_perf_test.c index 4d9ad6104a6e..eb49305db404 100644 --- a/tools/testing/selftests/kvm/memslot_perf_test.c +++ b/tools/testing/selftests/kvm/memslot_perf_test.c @@ -366,7 +366,7 @@ static void launch_vm(struct vm_data *data) { pr_info_v("Launching the test VM\n"); =20 - pthread_create(&data->vcpu_thread, NULL, vcpu_worker, data); + kvm_pthread_create(&data->vcpu_thread, NULL, vcpu_worker, data); =20 /* Ensure the guest thread is spun up. */ wait_for_vcpu(); diff --git a/tools/testing/selftests/kvm/mmu_stress_test.c b/tools/testing/= selftests/kvm/mmu_stress_test.c index 3d5f33a63b2b..9448498849ff 100644 --- a/tools/testing/selftests/kvm/mmu_stress_test.c +++ b/tools/testing/selftests/kvm/mmu_stress_test.c @@ -222,7 +222,7 @@ static pthread_t *spawn_workers(struct kvm_vm *vm, stru= ct kvm_vcpu **vcpus, info[i].vcpu =3D vcpus[i]; info[i].start_gpa =3D gpa; info[i].end_gpa =3D gpa + nr_bytes; - pthread_create(&threads[i], NULL, vcpu_worker, &info[i]); + kvm_pthread_create(&threads[i], NULL, vcpu_worker, &info[i]); } return threads; } diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/te= sting/selftests/kvm/pre_fault_memory_test.c index a0fcae3cb7a8..88287ccb9093 100644 --- a/tools/testing/selftests/kvm/pre_fault_memory_test.c +++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c @@ -84,7 +84,7 @@ static void pre_fault_memory(struct kvm_vcpu *vcpu, u64 b= ase_gpa, u64 offset, * Concurrently delete (and recreate) the slot to test KVM's handling * of a racing memslot deletion with prefaulting. */ - pthread_create(&slot_worker, NULL, delete_slot_worker, &data); + kvm_pthread_create(&slot_worker, NULL, delete_slot_worker, &data); =20 while (!READ_ONCE(data.worker_ready)) cpu_relax(); diff --git a/tools/testing/selftests/kvm/rseq_test.c b/tools/testing/selfte= sts/kvm/rseq_test.c index edcaf0fbe20c..0921b8d90d4a 100644 --- a/tools/testing/selftests/kvm/rseq_test.c +++ b/tools/testing/selftests/kvm/rseq_test.c @@ -239,8 +239,8 @@ int main(int argc, char *argv[]) */ vm =3D vm_create_with_one_vcpu(&vcpu, guest_code); =20 - pthread_create(&migration_thread, NULL, migration_worker, - (void *)(unsigned long)kvm_gettid()); + kvm_pthread_create(&migration_thread, NULL, migration_worker, + (void *)(unsigned long)kvm_gettid()); =20 if (latency >=3D 0) { /* diff --git a/tools/testing/selftests/kvm/s390/memop.c b/tools/testing/selft= ests/kvm/s390/memop.c index 0244848621b3..96b32bd74009 100644 --- a/tools/testing/selftests/kvm/s390/memop.c +++ b/tools/testing/selftests/kvm/s390/memop.c @@ -678,7 +678,7 @@ static void test_cmpxchg_key_concurrent(void) HOST_SYNC(t.vcpu, STAGE_SKEYS_SET); prepare_mem12(); MOP(t.vcpu, LOGICAL, WRITE, mem1, max_block, GADDR_V(mem2)); - pthread_create(&thread, NULL, run_guest, &t.vcpu); + kvm_pthread_create(&thread, NULL, run_guest, &t.vcpu); =20 for (int i =3D 0; i < cmpxchg_iter_outer; i++) { do { diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/t= esting/selftests/kvm/set_memory_region_test.c index a152ab65c657..12f5022bb164 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -133,7 +133,7 @@ static struct kvm_vm *spawn_vm(struct kvm_vcpu **vcpu, = pthread_t *vcpu_thread, hva =3D addr_gpa2hva(vm, MEM_REGION_GPA); memset(hva, 0, 2 * 4096); =20 - pthread_create(vcpu_thread, NULL, vcpu_worker, *vcpu); + kvm_pthread_create(vcpu_thread, NULL, vcpu_worker, *vcpu); =20 /* Ensure the guest thread is spun up. */ wait_for_vcpu(); diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selft= ests/kvm/steal_time.c index 0b88c743ee7d..f5f708be5aa0 100644 --- a/tools/testing/selftests/kvm/steal_time.c +++ b/tools/testing/selftests/kvm/steal_time.c @@ -548,7 +548,7 @@ int main(int ac, char **av) =20 /* Steal time from the VCPU. The steal time thread has the same CPU affi= nity as the VCPUs. */ run_delay =3D get_run_delay(); - pthread_create(&thread, NULL, do_steal_time, NULL); + kvm_pthread_create(&thread, NULL, do_steal_time, NULL); pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset); TEST_ASSERT(CPU_COUNT(&cpuset) =3D=3D 1 && CPU_ISSET(cpu, &cpuset), "Worker failed to inherit parent's CPU affinity"); diff --git a/tools/testing/selftests/kvm/x86/hyperv_ipi.c b/tools/testing/s= elftests/kvm/x86/hyperv_ipi.c index 771535f9aad3..3cf451f3153e 100644 --- a/tools/testing/selftests/kvm/x86/hyperv_ipi.c +++ b/tools/testing/selftests/kvm/x86/hyperv_ipi.c @@ -245,7 +245,7 @@ int main(int argc, char *argv[]) struct kvm_vcpu *vcpu[3]; gva_t hcall_page; pthread_t threads[2]; - int stage =3D 1, r; + int stage =3D 1; struct ucall uc; =20 TEST_REQUIRE(kvm_has_cap(KVM_CAP_HYPERV_SEND_IPI)); @@ -272,11 +272,8 @@ int main(int argc, char *argv[]) vcpu_args_set(vcpu[0], 2, hcall_page, addr_gva2gpa(vm, hcall_page)); vcpu_set_hv_cpuid(vcpu[0]); =20 - r =3D pthread_create(&threads[0], NULL, vcpu_thread, vcpu[1]); - TEST_ASSERT(!r, "pthread_create failed errno=3D%d", r); - - r =3D pthread_create(&threads[1], NULL, vcpu_thread, vcpu[2]); - TEST_ASSERT(!r, "pthread_create failed errno=3D%d", errno); + kvm_pthread_create(&threads[0], NULL, vcpu_thread, vcpu[1]); + kvm_pthread_create(&threads[1], NULL, vcpu_thread, vcpu[2]); =20 while (true) { vcpu_run(vcpu[0]); @@ -306,5 +303,5 @@ int main(int argc, char *argv[]) cancel_join_vcpu_thread(threads[1], vcpu[2]); kvm_vm_free(vm); =20 - return r; + return 0; } diff --git a/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c b/tools/tes= ting/selftests/kvm/x86/hyperv_tlb_flush.c index b4be9a175379..87fac1968a47 100644 --- a/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c +++ b/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c @@ -575,7 +575,7 @@ int main(int argc, char *argv[]) u64 *pte; struct test_data *data; struct ucall uc; - int stage =3D 1, r, i; + int stage =3D 1, i; =20 TEST_REQUIRE(kvm_has_cap(KVM_CAP_HYPERV_TLBFLUSH)); =20 @@ -632,11 +632,8 @@ int main(int argc, char *argv[]) vcpu_set_msr(vcpu[2], HV_X64_MSR_VP_INDEX, WORKER_VCPU_ID_2); vcpu_set_hv_cpuid(vcpu[2]); =20 - r =3D pthread_create(&threads[0], NULL, vcpu_thread, vcpu[1]); - TEST_ASSERT(!r, "pthread_create() failed"); - - r =3D pthread_create(&threads[1], NULL, vcpu_thread, vcpu[2]); - TEST_ASSERT(!r, "pthread_create() failed"); + kvm_pthread_create(&threads[0], NULL, vcpu_thread, vcpu[1]); + kvm_pthread_create(&threads[1], NULL, vcpu_thread, vcpu[2]); =20 while (true) { vcpu_run(vcpu[0]); diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c= b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c index 1d2f5d4fd45d..e419b08f1fa6 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c @@ -412,7 +412,7 @@ static void test_mem_conversions(enum vm_mem_backing_sr= c_type src_type, u32 nr_v */ virt_map(vm, gpa, gpa, PER_CPU_DATA_SIZE / vm->page_size); =20 - pthread_create(&threads[i], NULL, __test_mem_conversions, vcpus[i]); + kvm_pthread_create(&threads[i], NULL, __test_mem_conversions, vcpus[i]); } =20 WRITE_ONCE(run_vcpus, true); diff --git a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c b= /tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c index 10db9fe6d906..e26524fb4b50 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c @@ -65,9 +65,8 @@ static void test_private_access_memslot_deleted(void) /* Request to access page privately */ vm_mem_set_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE); =20 - pthread_create(&vm_thread, NULL, - (void *(*)(void *))run_vcpu_get_exit_reason, - (void *)vcpu); + kvm_pthread_create(&vm_thread, NULL, + (pthread_fn_t)run_vcpu_get_exit_reason, (void *)vcpu); =20 vm_mem_region_delete(vm, EXITS_TEST_SLOT); =20 diff --git a/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c b/tools= /testing/selftests/kvm/x86/recalc_apic_map_test.c index cbc92a862ea9..13abb65620d5 100644 --- a/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c +++ b/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c @@ -57,7 +57,7 @@ int main(void) for (i =3D 0; i < KVM_MAX_VCPUS; i++) vcpu_set_msr(vcpus[i], MSR_IA32_APICBASE, LAPIC_X2APIC); =20 - TEST_ASSERT_EQ(pthread_create(&thread, NULL, race, vcpus[0]), 0); + kvm_pthread_create(&thread, NULL, race, vcpus[0]); =20 vcpuN =3D vcpus[KVM_MAX_VCPUS - 1]; for (t =3D time(NULL) + TIMEOUT; time(NULL) < t;) { diff --git a/tools/testing/selftests/kvm/x86/sev_migrate_tests.c b/tools/te= sting/selftests/kvm/x86/sev_migrate_tests.c index d59abb198d86..66c7ce49620a 100644 --- a/tools/testing/selftests/kvm/x86/sev_migrate_tests.c +++ b/tools/testing/selftests/kvm/x86/sev_migrate_tests.c @@ -128,7 +128,7 @@ static void test_sev_migrate_locking(void) sizeof(input[i].source_vms)); =20 for (i =3D 0; i < NR_LOCK_TESTING_THREADS; ++i) - pthread_create(&pt[i], NULL, locking_test_thread, &input[i]); + kvm_pthread_create(&pt[i], NULL, locking_test_thread, &input[i]); =20 for (i =3D 0; i < NR_LOCK_TESTING_THREADS; ++i) pthread_join(pt[i], NULL); diff --git a/tools/testing/selftests/kvm/x86/sync_regs_test.c b/tools/testi= ng/selftests/kvm/x86/sync_regs_test.c index 5b0c2359bbb4..f7228af7d594 100644 --- a/tools/testing/selftests/kvm/x86/sync_regs_test.c +++ b/tools/testing/selftests/kvm/x86/sync_regs_test.c @@ -181,7 +181,7 @@ static void race_sync_regs(struct kvm_vcpu *vcpu, void = *racer) !!(run->s.regs.sregs.cr4 & X86_CR4_PAE), !!(run->s.regs.sregs.efer & EFER_LME)); =20 - TEST_ASSERT_EQ(pthread_create(&thread, NULL, racer, (void *)run), 0); + kvm_pthread_create(&thread, NULL, racer, (void *)run); =20 for (t =3D time(NULL) + TIMEOUT; time(NULL) < t;) { /* diff --git a/tools/testing/selftests/kvm/x86/tsc_scaling_sync.c b/tools/tes= ting/selftests/kvm/x86/tsc_scaling_sync.c index 59da8d4da607..54b4b8d06d3b 100644 --- a/tools/testing/selftests/kvm/x86/tsc_scaling_sync.c +++ b/tools/testing/selftests/kvm/x86/tsc_scaling_sync.c @@ -94,7 +94,7 @@ int main(int argc, char *argv[]) pthread_t cpu_threads[NR_TEST_VCPUS]; unsigned long cpu; for (cpu =3D 0; cpu < NR_TEST_VCPUS; cpu++) - pthread_create(&cpu_threads[cpu], NULL, run_vcpu, (void *)cpu); + kvm_pthread_create(&cpu_threads[cpu], NULL, run_vcpu, (void *)cpu); =20 unsigned long failures =3D 0; for (cpu =3D 0; cpu < NR_TEST_VCPUS; cpu++) { diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 3a326c5e74ca..271ec09c629e 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -387,7 +387,6 @@ void get_cmdline_args(int argc, char *argv[], int *run_= secs, =20 int main(int argc, char *argv[]) { - int r; int wait_secs; const int max_halter_wait =3D 10; int run_secs =3D 0; @@ -428,9 +427,7 @@ int main(int argc, char *argv[]) params[1].pipis_rcvd =3D pipis_rcvd; =20 /* Start halter vCPU thread and wait for it to execute first HLT. */ - r =3D pthread_create(&threads[0], NULL, vcpu_thread, ¶ms[0]); - TEST_ASSERT(r =3D=3D 0, - "pthread_create halter failed errno=3D%d", errno); + kvm_pthread_create(&threads[0], NULL, vcpu_thread, ¶ms[0]); fprintf(stderr, "Halter vCPU thread started\n"); =20 wait_secs =3D 0; @@ -447,8 +444,7 @@ int main(int argc, char *argv[]) "Halter vCPU thread reported its APIC ID: %u after %d seconds.\n", data->halter_apic_id, wait_secs); =20 - r =3D pthread_create(&threads[1], NULL, vcpu_thread, ¶ms[1]); - TEST_ASSERT(r =3D=3D 0, "pthread_create sender failed errno=3D%d", errno); + kvm_pthread_create(&threads[1], NULL, vcpu_thread, ¶ms[1]); =20 fprintf(stderr, "IPI sender vCPU thread started. Letting vCPUs run for %d seconds.\n", diff --git a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c b/tools/test= ing/selftests/kvm/x86/xen_shinfo_test.c index 5076f6a75455..20f518fe2450 100644 --- a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c +++ b/tools/testing/selftests/kvm/x86/xen_shinfo_test.c @@ -894,8 +894,7 @@ int main(int argc, char *argv[]) if (verbose) printf("Testing shinfo lock corruption (KVM_XEN_HVM_EVTCHN_SEND)\n"); =20 - ret =3D pthread_create(&thread, NULL, &juggle_shinfo_state, (void *)vm= ); - TEST_ASSERT(ret =3D=3D 0, "pthread_create() failed: %s", strerror(ret)= ); + kvm_pthread_create(&thread, NULL, &juggle_shinfo_state, (void *)vm); =20 struct kvm_irq_routing_xen_evtchn uxe =3D { .port =3D 1, --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 782EC359A6F for ; Fri, 31 Jul 2026 19:56:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527792; cv=none; b=AIYkebfCzH3Pl244y8K3f9QqoQt0SkcylNVElf/nqOe+jR5VbpeQjZsmdgp9oQ+8eFM9tok42HnhSRghza8BtugK4McMB03kZEC7ytJYBFphiyMQxSPtkmLWcq3QLRjbZAFoYsfRcUnRsIEryA+Vjj8xUjRFqj2LvdqD8OKA34Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527792; c=relaxed/simple; bh=L2daUKAaC9ECpQpu5ODjy4lo+CkKGGhKM8s856OlXLo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GHqksF5T0j4k3rb8yiuiIJdP3jDgjK7UL1BbzAk/U0b2Op3ZliOyY+sUc43KqIIeKd4Zu6GCDr7PmKr5es7JQItIrZ+T8wTwOPnAJvmYYMg1WpfeFrAkCkmf+96Af7W7owoFvY4YVkZP/5CyRuoolaoIkNi8Xkb793dsSudPjdo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=bUNv56Jn; arc=none smtp.client-ip=209.85.210.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="bUNv56Jn" Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-84a3514f912so2363783b3a.3 for ; Fri, 31 Jul 2026 12:56:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527787; x=1786132587; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=WT44MxQUWgN2yFdZkSrr/Ua/CnkjLi1Rcv3VTroVkdU=; b=bUNv56JnHPYySHKe7SNLp7tNcrzgUfQZ/peOIcWxPtO92l9CK/bGOpzr60bTEmBD87 H611xq/+Yip4gDDLxeAImTVU5htimLwKmbm3RxPLTv/fXFv+LKOSyvQnPf4ggQuj7pgs bfYatSGeZRL4D88pahi9h/YDk+pvC7NbC5FBGaTHEbYtN6hjOOz5U8c1K94pUR9tzGRx I4A5fc0gW/YmRjI+oQ3fQcfnHrW405wLafiZSPIsOnWfIueWpyzkILPPUmQDHQs3V4DH 6+aT7rM7LEPTh8r/evq//CivW+0g2ZvYV353RLH1jd93CZp/dOZIn7HDv0Z2FdiTHAfN eoxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527787; x=1786132587; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=WT44MxQUWgN2yFdZkSrr/Ua/CnkjLi1Rcv3VTroVkdU=; b=Y9eU4FGnjIB8Pk7F24hds3/Hcx9W+UHZjrGzq6FS+BcdFXWNUoTvfqrB4ckIg5xYxR n3cWeUiGPz/zIBKNaB9xR5yeEFYqVEV4R9SPVqCqbLWFzKRJV7bAJ7cjot4pJqXx07DB p6aVaaBrzxW3jAb39p9wL7X9xhLRRc2C7OrkknZiXXCAUG2Z7HjM9sFP/TAnfuKnvF6h /fmDacpiGUg64KOQbzDMUPB8GmqW0lXXqZAs7A2A65mJyvWsEbDnfKnbsbQJzlc7ZYeN +ARio13gQG80aJRU+n3eaUuHZnC3uFPNd01mBDw+baP2I9S8A+XR5FSkL0D88vbjRNe+ gZEw== X-Forwarded-Encrypted: i=1; AHgh+Rqk9Z6MJ8jGcnLZOg+tdB1vR/F83rQu7KwHXN0YETgY796WhIP15D6c6/jt6QE0Tt91C6C878VwsVlvNZo=@vger.kernel.org X-Gm-Message-State: AOJu0Yy2K2kczqeaMbgEgozWdKgqyMTnhdRfYZDLezLqoRNrbjJ93R7P G30eoVCUyT5mGO0fbiuCZcvhZEZDE55l6aAkGb4Smob3DWIlnocK52D827o4gV5p6IbSzJD0iix +aNRX0w== X-Received: from pfw13.prod.google.com ([2002:a05:6a00:a26d:b0:84a:1bf6:cb4a]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:92a6:b0:848:76c4:fba9 with SMTP id d2e1a72fcca58-84ee478e97fmr774656b3a.7.1785527786711; Fri, 31 Jul 2026 12:56:26 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:09 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-10-seanjc@google.com> Subject: [PATCH v3 09/12] KVM: selftests: Add KVM syscall wrappers for pthread_{cancel,join}() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add and use KVM wrappers for pthread_{cancel,join}() so that selftests don't need to manually assert that the syscalls succeeded. Note, the vast majority tests don't actually assert success, but they all obviously rely on the syscall to succeed. Other than explicitly failing if a syscall fails, no functional change intended. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/arch_timer.c | 4 ++-- tools/testing/selftests/kvm/arm64/vgic_irq.c | 4 ++-- tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c | 4 ++-- tools/testing/selftests/kvm/dirty_log_test.c | 2 +- tools/testing/selftests/kvm/include/kvm_syscalls.h | 2 ++ tools/testing/selftests/kvm/irq_test.c | 2 +- tools/testing/selftests/kvm/irqfd_test.c | 2 +- tools/testing/selftests/kvm/kvm_page_table_test.c | 2 +- tools/testing/selftests/kvm/lib/memstress.c | 2 +- tools/testing/selftests/kvm/lib/userfaultfd_util.c | 3 +-- tools/testing/selftests/kvm/memslot_perf_test.c | 2 +- tools/testing/selftests/kvm/mmu_stress_test.c | 2 +- tools/testing/selftests/kvm/pre_fault_memory_test.c | 2 +- tools/testing/selftests/kvm/rseq_test.c | 2 +- tools/testing/selftests/kvm/s390/memop.c | 2 +- tools/testing/selftests/kvm/set_memory_region_test.c | 4 ++-- tools/testing/selftests/kvm/steal_time.c | 2 +- tools/testing/selftests/kvm/x86/hyperv_ipi.c | 10 ++-------- tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c | 10 ++-------- .../selftests/kvm/x86/private_mem_conversions_test.c | 2 +- .../selftests/kvm/x86/private_mem_kvm_exits_test.c | 2 +- .../testing/selftests/kvm/x86/recalc_apic_map_test.c | 4 ++-- tools/testing/selftests/kvm/x86/sev_migrate_tests.c | 2 +- tools/testing/selftests/kvm/x86/sync_regs_test.c | 4 ++-- tools/testing/selftests/kvm/x86/tsc_scaling_sync.c | 2 +- tools/testing/selftests/kvm/x86/xapic_ipi_test.c | 12 ++---------- tools/testing/selftests/kvm/x86/xen_shinfo_test.c | 8 ++------ 27 files changed, 38 insertions(+), 61 deletions(-) diff --git a/tools/testing/selftests/kvm/arch_timer.c b/tools/testing/selft= ests/kvm/arch_timer.c index a6a66b5b7ea9..03160ad666f5 100644 --- a/tools/testing/selftests/kvm/arch_timer.c +++ b/tools/testing/selftests/kvm/arch_timer.c @@ -158,10 +158,10 @@ static void test_run(struct kvm_vm *vm) } =20 for (i =3D 0; i < test_args.nr_vcpus; i++) - pthread_join(pt_vcpu_run[i], NULL); + kvm_pthread_join(pt_vcpu_run[i], NULL); =20 if (test_args.migration_freq_ms) - pthread_join(pt_vcpu_migration, NULL); + kvm_pthread_join(pt_vcpu_migration, NULL); =20 bitmap_free(vcpu_done_map); } diff --git a/tools/testing/selftests/kvm/arm64/vgic_irq.c b/tools/testing/s= elftests/kvm/arm64/vgic_irq.c index 2d6f20d5c117..3cb85932ee85 100644 --- a/tools/testing/selftests/kvm/arm64/vgic_irq.c +++ b/tools/testing/selftests/kvm/arm64/vgic_irq.c @@ -1007,8 +1007,8 @@ static void test_vgic_two_cpus(void *gcode) kvm_pthread_create(&thr[0], NULL, test_vcpu_run, vcpus[0]); kvm_pthread_create(&thr[1], NULL, test_vcpu_run, vcpus[1]); =20 - pthread_join(thr[0], NULL); - pthread_join(thr[1], NULL); + kvm_pthread_join(thr[0], NULL); + kvm_pthread_join(thr[1], NULL); =20 close(gic_fd); kvm_vm_free(vm); diff --git a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c b/tools/te= sting/selftests/kvm/arm64/vgic_lpi_stress.c index 549e0547d905..9a69c439a0f8 100644 --- a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c +++ b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c @@ -321,13 +321,13 @@ static void run_test(void) clock_gettime(CLOCK_MONOTONIC, &start); =20 for (i =3D 0; i < nr_devices; i++) - pthread_join(lpi_threads[i], NULL); + kvm_pthread_join(lpi_threads[i], NULL); =20 delta =3D timespec_elapsed(start); write_guest_global(vm, test_data.request_vcpus_stop, true); =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_join(vcpu_threads[i], NULL); + kvm_pthread_join(vcpu_threads[i], NULL); =20 report_stats(delta); } diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/s= elftests/kvm/dirty_log_test.c index ca22e5f09ac2..af5eb0334a74 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -805,7 +805,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) WRITE_ONCE(host_quit, true); sem_post(&sem_vcpu_cont); =20 - pthread_join(vcpu_thread, NULL); + kvm_pthread_join(vcpu_thread, NULL); =20 pr_info("Total bits checked: dirty (%lu), clear (%lu)\n", host_dirty_count, host_clear_count); diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index e75be8378779..d6c18e13b9c8 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -101,6 +101,8 @@ __KVM_SYSCALL_DEFINE(sched_setaffinity, 3, pid_t, pid, = size_t, cpusetsize, cpu_s typedef void *(*pthread_fn_t)(void *); __KVM_SYSCALL_DEFINE(pthread_create, 4, pthread_t *, thread, const pthread_attr_t *, attr, pthread_fn_t, fn, void *, arg); +__KVM_SYSCALL_DEFINE(pthread_join, 2, pthread_t, thread, void **, thread_r= eturn); +__KVM_SYSCALL_DEFINE(pthread_cancel, 1, pthread_t, thread); =20 #define kvm_free_fd(fd) \ do { \ diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 7da5f8d75e85..168c52734fef 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -356,7 +356,7 @@ int main(int argc, char **argv) WRITE_AND_SYNC_TO_GUEST(vm, done, true); =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_join(vcpu_threads[i], NULL); + kvm_pthread_join(vcpu_threads[i], NULL); =20 return 0; } diff --git a/tools/testing/selftests/kvm/irqfd_test.c b/tools/testing/selft= ests/kvm/irqfd_test.c index 8b39144a2834..ebb2478878de 100644 --- a/tools/testing/selftests/kvm/irqfd_test.c +++ b/tools/testing/selftests/kvm/irqfd_test.c @@ -139,5 +139,5 @@ int main(int argc, char *argv[]) } =20 WRITE_ONCE(done, true); - pthread_join(racing_thread, NULL); + kvm_pthread_join(racing_thread, NULL); } diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/test= ing/selftests/kvm/kvm_page_table_test.c index 8222bdb63e49..974813ea8953 100644 --- a/tools/testing/selftests/kvm/kvm_page_table_test.c +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c @@ -413,7 +413,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) } =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_join(vcpu_threads[i], NULL); + kvm_pthread_join(vcpu_threads[i], NULL); =20 ret =3D sem_destroy(&test_stage_updated); TEST_ASSERT(ret =3D=3D 0, "Error in sem_destroy"); diff --git a/tools/testing/selftests/kvm/lib/memstress.c b/tools/testing/se= lftests/kvm/lib/memstress.c index 0bfa623ce9b5..2864562f57b4 100644 --- a/tools/testing/selftests/kvm/lib/memstress.c +++ b/tools/testing/selftests/kvm/lib/memstress.c @@ -312,7 +312,7 @@ void memstress_join_vcpu_threads(int nr_vcpus) WRITE_ONCE(memstress_args.stop_vcpus, true); =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_join(vcpu_threads[i].thread, NULL); + kvm_pthread_join(vcpu_threads[i].thread, NULL); } =20 static void toggle_dirty_logging(struct kvm_vm *vm, int slots, bool enable) diff --git a/tools/testing/selftests/kvm/lib/userfaultfd_util.c b/tools/tes= ting/selftests/kvm/lib/userfaultfd_util.c index 4b3e3158ed87..f7ce5a6ddcc2 100644 --- a/tools/testing/selftests/kvm/lib/userfaultfd_util.c +++ b/tools/testing/selftests/kvm/lib/userfaultfd_util.c @@ -187,8 +187,7 @@ void uffd_stop_demand_paging(struct uffd_desc *uffd) "Unable to write to pipefd %i for uffd_desc %p", i, uffd); =20 for (i =3D 0; i < uffd->num_readers; ++i) - TEST_ASSERT(!pthread_join(uffd->readers[i], NULL), - "Pthread_join failed on reader %i for uffd_desc %p", i, uffd); + kvm_pthread_join(uffd->readers[i], NULL); =20 close(uffd->uffd); =20 diff --git a/tools/testing/selftests/kvm/memslot_perf_test.c b/tools/testin= g/selftests/kvm/memslot_perf_test.c index eb49305db404..e1299611be32 100644 --- a/tools/testing/selftests/kvm/memslot_perf_test.c +++ b/tools/testing/selftests/kvm/memslot_perf_test.c @@ -381,7 +381,7 @@ static void free_vm(struct vm_data *data) =20 static void wait_guest_exit(struct vm_data *data) { - pthread_join(data->vcpu_thread, NULL); + kvm_pthread_join(data->vcpu_thread, NULL); } =20 static void let_guest_run(struct sync_area *sync) diff --git a/tools/testing/selftests/kvm/mmu_stress_test.c b/tools/testing/= selftests/kvm/mmu_stress_test.c index 9448498849ff..741e343962ed 100644 --- a/tools/testing/selftests/kvm/mmu_stress_test.c +++ b/tools/testing/selftests/kvm/mmu_stress_test.c @@ -409,7 +409,7 @@ int main(int argc, char *argv[]) =20 /* Sanity check that the vCPUs actually ran. */ for (i =3D 0; i < nr_vcpus; i++) - pthread_join(threads[i], NULL); + kvm_pthread_join(threads[i], NULL); =20 /* * Deliberately exit without deleting the remaining memslots or closing diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/te= sting/selftests/kvm/pre_fault_memory_test.c index 88287ccb9093..c57631aab3d3 100644 --- a/tools/testing/selftests/kvm/pre_fault_memory_test.c +++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c @@ -116,7 +116,7 @@ static void pre_fault_memory(struct kvm_vcpu *vcpu, u64= base_gpa, u64 offset, */ if (!slot_recreated) { WRITE_ONCE(data.recreate_slot, true); - pthread_join(slot_worker, NULL); + kvm_pthread_join(slot_worker, NULL); slot_recreated =3D true; =20 /* diff --git a/tools/testing/selftests/kvm/rseq_test.c b/tools/testing/selfte= sts/kvm/rseq_test.c index 0921b8d90d4a..b386aece68fd 100644 --- a/tools/testing/selftests/kvm/rseq_test.c +++ b/tools/testing/selftests/kvm/rseq_test.c @@ -312,7 +312,7 @@ int main(int argc, char *argv[]) " e.g. via cpuidle.off=3D1 or via -l , or run with -u to\n" " disable this sanity check.", i); =20 - pthread_join(migration_thread, NULL); + kvm_pthread_join(migration_thread, NULL); =20 kvm_vm_free(vm); =20 diff --git a/tools/testing/selftests/kvm/s390/memop.c b/tools/testing/selft= ests/kvm/s390/memop.c index 96b32bd74009..ce8db96ccf7e 100644 --- a/tools/testing/selftests/kvm/s390/memop.c +++ b/tools/testing/selftests/kvm/s390/memop.c @@ -701,7 +701,7 @@ static void test_cmpxchg_key_concurrent(void) } } =20 - pthread_join(thread, NULL); + kvm_pthread_join(thread, NULL); =20 MOP(t.vcpu, LOGICAL, READ, mem2, max_block, GADDR_V(mem2)); TEST_ASSERT(popcount_eq(*(__uint128_t *)mem1, *(__uint128_t *)mem2), diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/t= esting/selftests/kvm/set_memory_region_test.c index 12f5022bb164..dffe9654f45b 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -216,7 +216,7 @@ static void test_move_memory_region(bool disable_slot_z= ap_quirk) /* Defered sync from when the memslot was misaligned (above). */ wait_for_vcpu(); =20 - pthread_join(vcpu_thread, NULL); + kvm_pthread_join(vcpu_thread, NULL); =20 kvm_vm_free(vm); } @@ -302,7 +302,7 @@ static void test_delete_memory_region(bool disable_slot= _zap_quirk) */ vm_mem_region_delete(vm, 0); =20 - pthread_join(vcpu_thread, NULL); + kvm_pthread_join(vcpu_thread, NULL); =20 run =3D vcpu->run; =20 diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selft= ests/kvm/steal_time.c index f5f708be5aa0..6cb1eb4c40c9 100644 --- a/tools/testing/selftests/kvm/steal_time.c +++ b/tools/testing/selftests/kvm/steal_time.c @@ -556,7 +556,7 @@ int main(int ac, char **av) do sched_yield(); while (get_run_delay() - run_delay < MIN_RUN_DELAY_NS); - pthread_join(thread, NULL); + kvm_pthread_join(thread, NULL); run_delay =3D get_run_delay() - run_delay; TEST_ASSERT(run_delay >=3D MIN_RUN_DELAY_NS, "Expected run_delay >=3D %ld, got %ld", diff --git a/tools/testing/selftests/kvm/x86/hyperv_ipi.c b/tools/testing/s= elftests/kvm/x86/hyperv_ipi.c index 3cf451f3153e..d2efb1043534 100644 --- a/tools/testing/selftests/kvm/x86/hyperv_ipi.c +++ b/tools/testing/selftests/kvm/x86/hyperv_ipi.c @@ -225,15 +225,9 @@ static void *vcpu_thread(void *arg) static void cancel_join_vcpu_thread(pthread_t thread, struct kvm_vcpu *vcp= u) { void *retval; - int r; =20 - r =3D pthread_cancel(thread); - TEST_ASSERT(!r, "pthread_cancel on vcpu_id=3D%d failed with errno=3D%d", - vcpu->id, r); - - r =3D pthread_join(thread, &retval); - TEST_ASSERT(!r, "pthread_join on vcpu_id=3D%d failed with errno=3D%d", - vcpu->id, r); + kvm_pthread_cancel(thread); + kvm_pthread_join(thread, &retval); TEST_ASSERT(retval =3D=3D PTHREAD_CANCELED, "expected retval=3D%p, got %p", PTHREAD_CANCELED, retval); diff --git a/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c b/tools/tes= ting/selftests/kvm/x86/hyperv_tlb_flush.c index 87fac1968a47..e4fc9bb6f329 100644 --- a/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c +++ b/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c @@ -551,15 +551,9 @@ static void *vcpu_thread(void *arg) static void cancel_join_vcpu_thread(pthread_t thread, struct kvm_vcpu *vcp= u) { void *retval; - int r; =20 - r =3D pthread_cancel(thread); - TEST_ASSERT(!r, "pthread_cancel on vcpu_id=3D%d failed with errno=3D%d", - vcpu->id, r); - - r =3D pthread_join(thread, &retval); - TEST_ASSERT(!r, "pthread_join on vcpu_id=3D%d failed with errno=3D%d", - vcpu->id, r); + kvm_pthread_cancel(thread); + kvm_pthread_join(thread, &retval); TEST_ASSERT(retval =3D=3D PTHREAD_CANCELED, "expected retval=3D%p, got %p", PTHREAD_CANCELED, retval); diff --git a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c= b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c index e419b08f1fa6..3aa0673f79f3 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_conversions_test.c @@ -418,7 +418,7 @@ static void test_mem_conversions(enum vm_mem_backing_sr= c_type src_type, u32 nr_v WRITE_ONCE(run_vcpus, true); =20 for (i =3D 0; i < nr_vcpus; i++) - pthread_join(threads[i], NULL); + kvm_pthread_join(threads[i], NULL); =20 kvm_vm_free(vm); =20 diff --git a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c b= /tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c index e26524fb4b50..e6d16e9d6120 100644 --- a/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c +++ b/tools/testing/selftests/kvm/x86/private_mem_kvm_exits_test.c @@ -70,7 +70,7 @@ static void test_private_access_memslot_deleted(void) =20 vm_mem_region_delete(vm, EXITS_TEST_SLOT); =20 - pthread_join(vm_thread, &thread_return); + kvm_pthread_join(vm_thread, &thread_return); exit_reason =3D (u32)(u64)thread_return; =20 TEST_ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); diff --git a/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c b/tools= /testing/selftests/kvm/x86/recalc_apic_map_test.c index 13abb65620d5..e3e397f32bff 100644 --- a/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c +++ b/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c @@ -65,8 +65,8 @@ int main(void) vcpu_set_msr(vcpuN, MSR_IA32_APICBASE, LAPIC_DISABLED); } =20 - TEST_ASSERT_EQ(pthread_cancel(thread), 0); - TEST_ASSERT_EQ(pthread_join(thread, NULL), 0); + kvm_pthread_cancel(thread); + kvm_pthread_join(thread, NULL); =20 kvm_vm_free(vm); =20 diff --git a/tools/testing/selftests/kvm/x86/sev_migrate_tests.c b/tools/te= sting/selftests/kvm/x86/sev_migrate_tests.c index 66c7ce49620a..de006e1c861c 100644 --- a/tools/testing/selftests/kvm/x86/sev_migrate_tests.c +++ b/tools/testing/selftests/kvm/x86/sev_migrate_tests.c @@ -131,7 +131,7 @@ static void test_sev_migrate_locking(void) kvm_pthread_create(&pt[i], NULL, locking_test_thread, &input[i]); =20 for (i =3D 0; i < NR_LOCK_TESTING_THREADS; ++i) - pthread_join(pt[i], NULL); + kvm_pthread_join(pt[i], NULL); for (i =3D 0; i < NR_LOCK_TESTING_THREADS; ++i) kvm_vm_free(input[i].vm); } diff --git a/tools/testing/selftests/kvm/x86/sync_regs_test.c b/tools/testi= ng/selftests/kvm/x86/sync_regs_test.c index f7228af7d594..99a5bbeffc5d 100644 --- a/tools/testing/selftests/kvm/x86/sync_regs_test.c +++ b/tools/testing/selftests/kvm/x86/sync_regs_test.c @@ -199,8 +199,8 @@ static void race_sync_regs(struct kvm_vcpu *vcpu, void = *racer) } } =20 - TEST_ASSERT_EQ(pthread_cancel(thread), 0); - TEST_ASSERT_EQ(pthread_join(thread, NULL), 0); + kvm_pthread_cancel(thread); + kvm_pthread_join(thread, NULL); =20 kvm_x86_state_cleanup(state); } diff --git a/tools/testing/selftests/kvm/x86/tsc_scaling_sync.c b/tools/tes= ting/selftests/kvm/x86/tsc_scaling_sync.c index 54b4b8d06d3b..2a3a9bd8b338 100644 --- a/tools/testing/selftests/kvm/x86/tsc_scaling_sync.c +++ b/tools/testing/selftests/kvm/x86/tsc_scaling_sync.c @@ -99,7 +99,7 @@ int main(int argc, char *argv[]) unsigned long failures =3D 0; for (cpu =3D 0; cpu < NR_TEST_VCPUS; cpu++) { void *this_cpu_failures; - pthread_join(cpu_threads[cpu], &this_cpu_failures); + kvm_pthread_join(cpu_threads[cpu], &this_cpu_failures); failures +=3D (unsigned long)this_cpu_failures; } =20 diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 271ec09c629e..33e78b284c67 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -231,17 +231,9 @@ static void *vcpu_thread(void *arg) static void cancel_join_vcpu_thread(pthread_t thread, struct kvm_vcpu *vcp= u) { void *retval; - int r; =20 - r =3D pthread_cancel(thread); - TEST_ASSERT(r =3D=3D 0, - "pthread_cancel on vcpu_id=3D%d failed with errno=3D%d", - vcpu->id, r); - - r =3D pthread_join(thread, &retval); - TEST_ASSERT(r =3D=3D 0, - "pthread_join on vcpu_id=3D%d failed with errno=3D%d", - vcpu->id, r); + kvm_pthread_cancel(thread); + kvm_pthread_join(thread, &retval); TEST_ASSERT(retval =3D=3D PTHREAD_CANCELED, "expected retval=3D%p, got %p", PTHREAD_CANCELED, retval); diff --git a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c b/tools/test= ing/selftests/kvm/x86/xen_shinfo_test.c index 20f518fe2450..3ec5e67b21ef 100644 --- a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c +++ b/tools/testing/selftests/kvm/x86/xen_shinfo_test.c @@ -437,7 +437,6 @@ int main(int argc, char *argv[]) struct kvm_vm *vm; pthread_t thread; bool verbose; - int ret; =20 verbose =3D argc > 1 && (!strncmp(argv[1], "-v", 3) || !strncmp(argv[1], "--verbose", 10)); @@ -948,11 +947,8 @@ int main(int argc, char *argv[]) TEST_ASSERT(!evtchn_irq_expected, "Expected event channel IRQ but it didn't happen"); =20 - ret =3D pthread_cancel(thread); - TEST_ASSERT(ret =3D=3D 0, "pthread_cancel() failed: %s", strerror(ret)= ); - - ret =3D pthread_join(thread, 0); - TEST_ASSERT(ret =3D=3D 0, "pthread_join() failed: %s", strerror(ret)); + kvm_pthread_cancel(thread); + kvm_pthread_join(thread, 0); goto done; =20 case TEST_GUEST_SAW_IRQ: --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 834A037883C for ; Fri, 31 Jul 2026 19:56:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527793; cv=none; b=N9RkgbbJQYWtP1iBL4xc5iYqCUQ3wP66S6LctjSqOi0Af1S3924BuGKjcda8nXuPE+LnCdddu2KX41R47QFdP8sSCNWb4Df3deMYeP6waSrDjgyjkzzx93tI4voNaVTa8o+stJ43c1sYs8lETDWeBtI2AJcwuTLGi809s3K5toA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527793; c=relaxed/simple; bh=eFedP1FKrSCUz33LyUYB/hbFk56NqWKwZqQkDaFxLJ0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Yav/3CQOORrfD7OYrFDwiDytamY9M7maTADUkBKHrLacCfu+ktFhj6YIJn6rMvlfCQ56WUvVz3RvAzP0WWdj6LvZNXcfgapGHlHh7obcgQZWd9kcDkbjVWjfI+43LoeeTeZw4MbpIEVHYKgB2uCD13GfI4B25CqLzCEV7bkNNwM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=t5ldT9n8; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="t5ldT9n8" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cc7e86e7c5so25383475ad.3 for ; Fri, 31 Jul 2026 12:56:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527788; x=1786132588; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=t+9CTldHkmPcTJwS5mSWfk0XaYsDahSdFAriIqs5uQo=; b=t5ldT9n8Hip8+XrIzZcZ6P3tllYzBhAe9EWvkDWFCi4gRI9H6jbF0jVJKhFlVY7B8W T6cm1nemIa829vZ3+voMlyWVpR4zKmOWuLc8clznJ72caGP+T7iiNWleM84g0SKUldpE KERA1IkpL1hHy1HjmpOpvdO4/cLjKGjDIYIIjaaPflZTT+/TRWra7ZOpAbdUKnQWe1NM UjBQTp2NYtaCxCJVEiUnsRuIYNwrR4kGa10si/4UIuXRryw8WiY9tPXqIGBiZnk5mmWD EnEYYUoMJ0FgLVRE0DTcNKZTfJXVSfxVVQFM3E7nXIcE397S/7vBvNWP9mcZITmjQYXw hFJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527788; x=1786132588; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=t+9CTldHkmPcTJwS5mSWfk0XaYsDahSdFAriIqs5uQo=; b=hTnsc4SL0YnP88V/OWCuYLaKZmKp+x0SL1fqVEcF3G5xy1+t+ZncXcwWGSUUFUsbfK bK9bIcnGBAsEWotahfUY5h8iqtQBMiPF/LUFHzplRpuwZlQ0mejaUoIGvdoutwYl3+Bb KZ2HKHBKi/ShD2tWN8fvhg0Fz7mQVubX4C8U5FtAABuHqI/R2ZM3LI8ikW9VI3Yp+n+7 gy5M7+H7z4/01Z3iyusKbychz7YQ0IniFXQGFNUdywDrAEdYcgtMJo5gNa3QBCgXn/oE pCIvSSdIUd40jxINh+tDJ1UBdEyWb6/8isEJ4HRBhzSCUhL/6cXg6xOXItUs5rj2lasV n3Yg== X-Forwarded-Encrypted: i=1; AHgh+RqZP1aFIXdjG3NG/7+FoGbv49oF5mYr8Fdt9R4xfF+8jr/ug5W97ymAFbCAP7QNhIoGOnaFe8Twozku7qc=@vger.kernel.org X-Gm-Message-State: AOJu0YxQBfzqyBcO2YhWCYMq5sP+QRMnkCUG3kS0wYhlao9aK+Or5zId VSew6PenOMQwzrTrdGutOE2FY8qkt6kEhbexO5ZufreNlwJvkb77OzoWkL413YMcxCpGjQIfQPQ m/jhHtA== X-Received: from plbj20.prod.google.com ([2002:a17:903:4654:b0:2c6:be9a:d6c2]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:26cd:b0:2cf:82e6:a5 with SMTP id d9443c01a7336-2d0521bbfddmr11886345ad.13.1785527787901; Fri, 31 Jul 2026 12:56:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:10 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-11-seanjc@google.com> Subject: [PATCH v3 10/12] KVM: selftests: Add helper APIs to cancel+join pthreads From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Deduplicate test code that does cancel()+join() on pthreads by adding a collection of syscall wrappers. The tests that asynchronously cancel pthreads, i.e. use PTHREAD_CANCEL_ASYNCHRONOUS, are particularly ugly, especially since it's not immediately obvious why those tests assert on the thread being CANCELED, whereas others do not. No functional change intended. Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/kvm_syscalls.h | 24 +++++++++++++++++++ tools/testing/selftests/kvm/x86/hyperv_ipi.c | 15 ++---------- .../selftests/kvm/x86/hyperv_tlb_flush.c | 15 ++---------- .../selftests/kvm/x86/recalc_apic_map_test.c | 3 +-- .../selftests/kvm/x86/sync_regs_test.c | 3 +-- .../selftests/kvm/x86/xapic_ipi_test.c | 15 ++---------- .../selftests/kvm/x86/xen_shinfo_test.c | 3 +-- 7 files changed, 33 insertions(+), 45 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index d6c18e13b9c8..c0657e54aee5 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -104,6 +104,30 @@ __KVM_SYSCALL_DEFINE(pthread_create, 4, pthread_t *, t= hread, __KVM_SYSCALL_DEFINE(pthread_join, 2, pthread_t, thread, void **, thread_r= eturn); __KVM_SYSCALL_DEFINE(pthread_cancel, 1, pthread_t, thread); =20 +static inline void __kvm_pthread_cancel_join(pthread_t thread, void **r) +{ + kvm_pthread_cancel(thread); + kvm_pthread_join(thread, r); +} + +static inline void kvm_pthread_cancel_join(pthread_t thread) +{ + __kvm_pthread_cancel_join(thread, NULL); +} + +/* + * Cancel+Join a pthread that was configured with PTHREAD_CANCEL_ASYNCHRON= OUS + * and is expected to exit only in response to cancellation. + */ +static inline void kvm_pthread_cancel_join_async(pthread_t thread) +{ + void *r; + + __kvm_pthread_cancel_join(thread, &r); + TEST_ASSERT(r =3D=3D PTHREAD_CANCELED, + "expected retval=3D%p, got %p", PTHREAD_CANCELED, r); +} + #define kvm_free_fd(fd) \ do { \ kvm_close(fd); \ diff --git a/tools/testing/selftests/kvm/x86/hyperv_ipi.c b/tools/testing/s= elftests/kvm/x86/hyperv_ipi.c index d2efb1043534..a2fc0bca8011 100644 --- a/tools/testing/selftests/kvm/x86/hyperv_ipi.c +++ b/tools/testing/selftests/kvm/x86/hyperv_ipi.c @@ -222,17 +222,6 @@ static void *vcpu_thread(void *arg) return NULL; } =20 -static void cancel_join_vcpu_thread(pthread_t thread, struct kvm_vcpu *vcp= u) -{ - void *retval; - - kvm_pthread_cancel(thread); - kvm_pthread_join(thread, &retval); - TEST_ASSERT(retval =3D=3D PTHREAD_CANCELED, - "expected retval=3D%p, got %p", PTHREAD_CANCELED, - retval); -} - int main(int argc, char *argv[]) { struct kvm_vm *vm; @@ -293,8 +282,8 @@ int main(int argc, char *argv[]) } =20 done: - cancel_join_vcpu_thread(threads[0], vcpu[1]); - cancel_join_vcpu_thread(threads[1], vcpu[2]); + kvm_pthread_cancel_join_async(threads[0]); + kvm_pthread_cancel_join_async(threads[1]); kvm_vm_free(vm); =20 return 0; diff --git a/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c b/tools/tes= ting/selftests/kvm/x86/hyperv_tlb_flush.c index e4fc9bb6f329..dc9d40830a7f 100644 --- a/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c +++ b/tools/testing/selftests/kvm/x86/hyperv_tlb_flush.c @@ -548,17 +548,6 @@ static void *vcpu_thread(void *arg) return NULL; } =20 -static void cancel_join_vcpu_thread(pthread_t thread, struct kvm_vcpu *vcp= u) -{ - void *retval; - - kvm_pthread_cancel(thread); - kvm_pthread_join(thread, &retval); - TEST_ASSERT(retval =3D=3D PTHREAD_CANCELED, - "expected retval=3D%p, got %p", PTHREAD_CANCELED, - retval); -} - int main(int argc, char *argv[]) { struct kvm_vm *vm; @@ -652,8 +641,8 @@ int main(int argc, char *argv[]) } =20 done: - cancel_join_vcpu_thread(threads[0], vcpu[1]); - cancel_join_vcpu_thread(threads[1], vcpu[2]); + kvm_pthread_cancel_join_async(threads[0]); + kvm_pthread_cancel_join_async(threads[1]); kvm_vm_free(vm); =20 return 0; diff --git a/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c b/tools= /testing/selftests/kvm/x86/recalc_apic_map_test.c index e3e397f32bff..6252a96320ee 100644 --- a/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c +++ b/tools/testing/selftests/kvm/x86/recalc_apic_map_test.c @@ -65,8 +65,7 @@ int main(void) vcpu_set_msr(vcpuN, MSR_IA32_APICBASE, LAPIC_DISABLED); } =20 - kvm_pthread_cancel(thread); - kvm_pthread_join(thread, NULL); + kvm_pthread_cancel_join(thread); =20 kvm_vm_free(vm); =20 diff --git a/tools/testing/selftests/kvm/x86/sync_regs_test.c b/tools/testi= ng/selftests/kvm/x86/sync_regs_test.c index 99a5bbeffc5d..ed0c21b427c9 100644 --- a/tools/testing/selftests/kvm/x86/sync_regs_test.c +++ b/tools/testing/selftests/kvm/x86/sync_regs_test.c @@ -199,8 +199,7 @@ static void race_sync_regs(struct kvm_vcpu *vcpu, void = *racer) } } =20 - kvm_pthread_cancel(thread); - kvm_pthread_join(thread, NULL); + kvm_pthread_cancel_join(thread); =20 kvm_x86_state_cleanup(state); } diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 33e78b284c67..469e3ab16460 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -228,17 +228,6 @@ static void *vcpu_thread(void *arg) return NULL; } =20 -static void cancel_join_vcpu_thread(pthread_t thread, struct kvm_vcpu *vcp= u) -{ - void *retval; - - kvm_pthread_cancel(thread); - kvm_pthread_join(thread, &retval); - TEST_ASSERT(retval =3D=3D PTHREAD_CANCELED, - "expected retval=3D%p, got %p", PTHREAD_CANCELED, - retval); -} - void do_migrations(struct test_data_page *data, int run_secs, int delay_us= ecs, u64 *pipis_rcvd) { @@ -450,8 +439,8 @@ int main(int argc, char *argv[]) /* * Cancel threads and wait for them to stop. */ - cancel_join_vcpu_thread(threads[0], params[0].vcpu); - cancel_join_vcpu_thread(threads[1], params[1].vcpu); + kvm_pthread_cancel_join_async(threads[0]); + kvm_pthread_cancel_join_async(threads[1]); =20 /* * If the host support Idle HLT, i.e. KVM *might* be using Idle HLT, diff --git a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c b/tools/test= ing/selftests/kvm/x86/xen_shinfo_test.c index 3ec5e67b21ef..aaa414c677ad 100644 --- a/tools/testing/selftests/kvm/x86/xen_shinfo_test.c +++ b/tools/testing/selftests/kvm/x86/xen_shinfo_test.c @@ -947,8 +947,7 @@ int main(int argc, char *argv[]) TEST_ASSERT(!evtchn_irq_expected, "Expected event channel IRQ but it didn't happen"); =20 - kvm_pthread_cancel(thread); - kvm_pthread_join(thread, 0); + kvm_pthread_cancel_join(thread); goto done; =20 case TEST_GUEST_SAW_IRQ: --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4FCDE37DEA9 for ; Fri, 31 Jul 2026 19:56:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527792; cv=none; b=S3/0X2C7yvCnUeLSdA5FasQcVtEcj7GTeR1dfXWxHsIPdCLZpRcK/7rC9UzLtYiZzZlNv6ewYUkKuaUfqRuZvBeqUDty+XhoH6LFwAHXbe1LijoJLjBRyMZAdddeHHW4QfjLaWvhD724GC8RaMsYx3N2JuFNxOqvtJfcnBkPPjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527792; c=relaxed/simple; bh=D2cCds+Rmi8+J6lQPkFl0u/IOfzO+nxs2jcefDTat0Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=X3oyYE0J31N1hEJHyrITNL7noR6D2btstMR60H0sgKyWSqf4g85nQ4RdFlEBBXMg07jAtoj6y/FdOzfNtybNmQ/pK7EI+CcQuFIyOo2MTU/yNLE28nHDImYZV+Ir+/MGyUkna9eIUqAAglW02vNk3WHxF5FBmmBdLR8MbeYiKwE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=TOO6NDKy; arc=none smtp.client-ip=209.85.210.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TOO6NDKy" Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-8485b7e18b4so2605163b3a.1 for ; Fri, 31 Jul 2026 12:56:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527789; x=1786132589; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=Hu2nzxTULIrNid+T0wW8lXLrPPrctqAZSUyi9Ewmd1M=; b=TOO6NDKyp6oWalcayU/MGrBelVcHdGG8tFRh0F9qziCrRmo5S7yyHs6WehoE99e6iw UjlMTFFH7bQWAqjsKI4hZAIndMZ4EGIhpmitH88MoJ4jXSLQKAbE3L/NIeORSEqF02n5 r7cU9aFoYsp0kMfhy/0Isqll8YrndrUtQj0Uy6ruVgFuBUds6B7nYx2lSi5dahrd2cCl zuvBy4I5ZQ8eOYq+yb6yAfjfGJx9YkzoOXGLpg7PoXH667eyZfdYhwFuVr/LrCv7JF1o yl+oG2uTj13fgUKpMIgmkIALfvtHrcKW1V1/rIsLopmKLa1mj59Yn4NWa5MWcJK5deWY 3MyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527789; x=1786132589; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=Hu2nzxTULIrNid+T0wW8lXLrPPrctqAZSUyi9Ewmd1M=; b=Fo00jTVxjnqebEa71QyArqImvJOUrcdJFRu1czEJZP5L27Nuxzus6AALNiz0XqrZ2r cBJUDazvjs+F0zJhICbw/V3HW7JauIsBSrnIxkMebejzXfZCodH+horgEf0STO7vCLLM CxFb1lfyuIOpFLTjI6jHJF/XHDhVjIDX/DK3KgKzyAGXuWKYpthepPLWWr3qhAKfeoP7 n8+Tf1os9bpoFZjUdH4HVsTWFVZETsoF6amvmKb1hW0a+9SN+VPYQW9tHsyOMAty9FqV JEOKkfI1BTL7CRXL15n9wbJ/MKsmCMDyRyY99WmH+p7pyfls70bz6kP2Yh8HcAgkOHAg Ib6w== X-Forwarded-Encrypted: i=1; AHgh+Rqa+ifcgXcu9JjLEHovZB1WeEXBoWfKiw/4JrDcl872Lgip1YyqOMHI28iSfc8cn7339Rok0lv6PN2tSVU=@vger.kernel.org X-Gm-Message-State: AOJu0Ywz4Hv1I9m98OeuzCpUGam+5+dTNE+p6wOLyqSyQE79rK5LaM9o FV3cnvzhwq1hegQ7YMM2s4ddJe2CV49g3zEVAItF56gxGk5hBuobMo6kIjsTpjLak1/5O/z5W95 jMzGJlw== X-Received: from pgii34.prod.google.com ([2002:a63:2222:0:b0:cbb:8eba:c0a3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3399:b0:848:7a8a:48c4 with SMTP id d2e1a72fcca58-84ee4953ae9mr806765b3a.40.1785527788955; Fri, 31 Jul 2026 12:56:28 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:11 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-12-seanjc@google.com> Subject: [PATCH v3 11/12] KVM: selftests: Add KVM syscall wrappers for pthread_{g,s}etaffinity_np() From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add and use KVM wrappers for pthread_{g,s}etaffinity_np() so that selftests don't need to manually assert that the syscalls succeeded, and so that they don't need to manually pass in sizeof(cpu_set_t) for the size. Note, the steal time test didn't assert success, but the TEST_ASSERT() one line later makes it quite clear the test relies on pthread_getaffinity_np() succeeding. Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/include/kvm_syscalls.h | 16 ++++++++++++++++ tools/testing/selftests/kvm/steal_time.c | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index c0657e54aee5..dc7461894aef 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -98,6 +98,22 @@ __KVM_SYSCALL_DEFINE(madvise, 3, void *, addr, size_t, l= ength, int, advice); __KVM_SYSCALL_DEFINE(sched_getaffinity, 3, pid_t, pid, size_t, cpusetsize,= cpu_set_t *, mask); __KVM_SYSCALL_DEFINE(sched_setaffinity, 3, pid_t, pid, size_t, cpusetsize,= cpu_set_t *, mask); =20 +__KVM_SYSCALL_DEFINE(pthread_getaffinity_np, 3, pthread_t, thread, + size_t, cpusetsize, cpu_set_t *, cpuset); +__KVM_SYSCALL_DEFINE(pthread_setaffinity_np, 3, pthread_t, thread, + size_t, cpusetsize, const cpu_set_t *, cpuset); + +static inline void kvm_pthread_getaffinity(pthread_t thread, cpu_set_t *cp= uset) +{ + kvm_pthread_getaffinity_np(thread, sizeof(cpu_set_t), cpuset); +} + +static inline void kvm_pthread_setaffinity(pthread_t thread, + const cpu_set_t *cpuset) +{ + kvm_pthread_setaffinity_np(thread, sizeof(cpu_set_t), cpuset); +} + typedef void *(*pthread_fn_t)(void *); __KVM_SYSCALL_DEFINE(pthread_create, 4, pthread_t *, thread, const pthread_attr_t *, attr, pthread_fn_t, fn, void *, arg); diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selft= ests/kvm/steal_time.c index 6cb1eb4c40c9..bc3c62b72c58 100644 --- a/tools/testing/selftests/kvm/steal_time.c +++ b/tools/testing/selftests/kvm/steal_time.c @@ -549,7 +549,7 @@ int main(int ac, char **av) /* Steal time from the VCPU. The steal time thread has the same CPU affi= nity as the VCPUs. */ run_delay =3D get_run_delay(); kvm_pthread_create(&thread, NULL, do_steal_time, NULL); - pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset); + kvm_pthread_getaffinity(thread, &cpuset); TEST_ASSERT(CPU_COUNT(&cpuset) =3D=3D 1 && CPU_ISSET(cpu, &cpuset), "Worker failed to inherit parent's CPU affinity"); =20 --=20 2.55.0.508.g3f0d502094-goog From nobody Fri Oct 2 12:24:37 2026 Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 894013793BF for ; Fri, 31 Jul 2026 19:56:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527793; cv=none; b=HRlh8BD017LJQB7FYlFEl5BTlWjeKU0ZRQO6yVX3SEe5UHNWlUbliOAa12CDSVWAoCyXwZpOqQJcLxX75UuvCaog/5omEKYz6F8fe1KgkyJR3Kmuq/7CGBiMXkWaW3UVpoXhWyO/Uq8yzsUGCY+cB7GONW01WrDbuLe1CXnML9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785527793; c=relaxed/simple; bh=/OJMHDnQk4DxGr7QQt6Ocl9NtwW1FgQMJGQWB3tRuDc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IH1F+ZRcIRMKLbMjdbyuk65eztKYug905W1+N31GrRlGR/51MfBzNpVeLGhQ2IYcJNDQ5TewHPpwwECs9EXCIldnv2jirA3YOTiB/KtatsSrCMeQq05c8lBlqaC+LC7fOQ1Ha05QwrH/8G6VjGwug6cUwToaXYAPwPqvP5dL4vE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fNTiSkwY; arc=none smtp.client-ip=209.85.215.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fNTiSkwY" Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-cb4cdf95b5aso2327522a12.1 for ; Fri, 31 Jul 2026 12:56:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785527790; x=1786132590; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=hp708L//iArg9TjvY21pP5toBSAUeUQGGXgQT+srdHg=; b=fNTiSkwYVPjsx5lnsCBn+6gZcgAV+iQDlueby/7E4NWVaalMHhC6/iS98/cd6TpXKe 0pA0biXNMxP8NLG1Dozb54kCU/5tU/630/AS0vjVm+VaxvKGWdJtPurgQLTC3f6dHsvT TJxpjsA992Dzre03MqMhTnftdDqmc+3+jmHJa/VOlhfhmtsA6MYxSjz+ibnyakYHMbCe z6epsd2MB1lEqHbl9rnq4YZux+lQV/yAk2p7GDXK8JULrsvCZErSrg35Yxi3ueQqeunh wiLuy8K5r6zXecAOqw4jE+NgJn0ylR9s3mKiPRiQlElWEvHlDug7GdWMOaJDKLfMjB29 GlYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785527790; x=1786132590; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=hp708L//iArg9TjvY21pP5toBSAUeUQGGXgQT+srdHg=; b=rmoVxLylKsmTtW1N7TaUokKxiqkwjoU69b+KMzoNlhUAEYX5L57lSDkLjMEZlrfuug mdLVVv1BP5JwDFgJ6DS/0IAV5gylXmcgnr7mF9zE4TyLjEUPTi/SAebUStmuWf5yc0mm uKO2HTMm5EP93Au/AGZEML5cxWrAFffilIvI6VyHBQn2MEKKnO2a9jwmGsHheLrDRHoK eZ1oYkzvGlGxXKuGzJJGwpT9c9t+uy3KqUrbW5Yoy6nAReg57ilScvBPCFy0CkojLjIM fLJjYHxBztZk0pTkW+3sJ2f1Bx4+38DGZ2VeKW1MhmdhqsyUaM64XsT6AZtP9pOpBhqt 4yTA== X-Forwarded-Encrypted: i=1; AHgh+RohMM+g+II1eFkEj/7ca6nmhR3NJ+wky1FDsa71k0Cy145xlVPsH5x4jm3eM0MhBtX1R/cjqlgiUAc8HZA=@vger.kernel.org X-Gm-Message-State: AOJu0YwxSGYumK9JRugkZBOcLq4cy7GiJ8No/6nOAWhCTAGHtuyVxRWN ZTvKQGR02x2EA2/RD97KtraB4o/8ixqfZIZLnvLNZ/luL9IJv+zHr2TF8KBonmBlbbedLBPo+Ow NtLgYag== X-Received: from pgmh4.prod.google.com ([2002:a63:5744:0:b0:c92:dd1e:dc60]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:aa7:88ca:0:b0:847:893f:2d0c with SMTP id d2e1a72fcca58-84ee47e512dmr830032b3a.5.1785527790077; Fri, 31 Jul 2026 12:56:30 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 31 Jul 2026 12:56:12 -0700 In-Reply-To: <20260731195612.2697986-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260731195612.2697986-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.508.g3f0d502094-goog Message-ID: <20260731195612.2697986-13-seanjc@google.com> Subject: [PATCH v3 12/12] KVM: selftests: Clean up global constants in hardware disable test From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename the global constants in the hardware disable test to better capture what they control, and open code the literal number of sleeping tasks and iterations instead of using power-of-2 math to express values that are 100% arbitrary. Opportunistically tag the global semaphore with "static". No functional change intended. Signed-off-by: Sean Christopherson --- .../selftests/kvm/hardware_disable_test.c | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/te= sting/selftests/kvm/hardware_disable_test.c index 72bac346bdd9..43a36ef3ead8 100644 --- a/tools/testing/selftests/kvm/hardware_disable_test.c +++ b/tools/testing/selftests/kvm/hardware_disable_test.c @@ -17,13 +17,13 @@ #include "kvm_util.h" #include "ucall_common.h" =20 -#define VCPU_NUM 4 -#define SLEEPING_THREAD_NUM (1 << 4) -#define FORK_NUM (1ULL << 9) -#define DELAY_US_MAX 2000 +#define NR_VCPUS 4 +#define NR_SLEEPERS_PER_VCPU 16 +#define NR_ITERATIONS 512 +#define DELAY_US_MAX 2000 =20 static cpu_set_t threads_cpu_set; -sem_t *sem; +static sem_t *sem; =20 static void guest_code(void) { @@ -75,15 +75,15 @@ static void run_test(u32 run) TEST_ASSERT_EQ(pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &thr= eads_cpu_set), 0); #endif =20 - vm =3D vm_create(VCPU_NUM); + vm =3D vm_create(NR_VCPUS); =20 pr_debug("%s: [%d] start vcpus\n", __func__, run); - for (i =3D 0; i < VCPU_NUM; ++i) { + for (i =3D 0; i < NR_VCPUS; ++i) { vcpu =3D vm_vcpu_add(vm, i, guest_code); =20 kvm_pthread_create(&thread, &attr, run_vcpu, vcpu); =20 - for (j =3D 0; j < SLEEPING_THREAD_NUM; ++j) + for (j =3D 0; j < NR_SLEEPERS_PER_VCPU; ++j) kvm_pthread_create(&thread, &attr, sleeping_thread, (void *)NULL); } pr_debug("%s: [%d] all threads launched\n", __func__, run); @@ -132,7 +132,7 @@ int main(int argc, char **argv) =20 kvm_sched_getaffinity(0, sizeof(cpu_set_t), &allowed_cpu_set); =20 - for (i =3D 0; i < VCPU_NUM && CPU_COUNT(&allowed_cpu_set); i++) { + for (i =3D 0; i < NR_VCPUS && CPU_COUNT(&allowed_cpu_set); i++) { cpu =3D kvm_pick_random_cpu(&allowed_cpu_set); CPU_CLR(cpu, &allowed_cpu_set); CPU_SET(cpu, &threads_cpu_set); @@ -141,7 +141,7 @@ int main(int argc, char **argv) sem =3D sem_open("vm_sem", O_CREAT | O_EXCL, 0644, 0); sem_unlink("vm_sem"); =20 - for (i =3D 0; i < FORK_NUM; ++i) { + for (i =3D 0; i < NR_ITERATIONS; ++i) { pid =3D fork(); TEST_ASSERT(pid >=3D 0, "%s: unable to fork", __func__); if (pid =3D=3D 0) --=20 2.55.0.508.g3f0d502094-goog