From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 B4005288C0E for ; Thu, 4 Jun 2026 02:02:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538554; cv=none; b=QVTzXkP7nwDROXcH67Lfb195byFM21vt1GwvdLUmERPMxWjhZjp9/u/ogf4YVdlASsQc6nJ5Imypxvfz+gOh2WuoXOPGJF/oB2UAG63ayFxRpyPFiXxP7rIqaZ+ijUn9RW6w2zTOi1ays9xw931c4HHwDPRqsEhGazItNMNpT6o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538554; c=relaxed/simple; bh=0z+V+TeY8jKea8mg/kC84ZrjyVx0UFR/LyvnavfpXZU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jBFiTB3xDaky07vXMXNQ3C5yNAx+TDbvmXKTMHsoa0HV63t8+N8R8oWWLk7ec3zeIvLD3iN1ipM7qKYjgapb9MPYD3CSxQeBTdvfuppYPI9Ao+58zjLHoYHGAyGlR9+7dRFs8BAZz5ZS94whmBR/pUtJqaDvI38FVpcQZZaBx7E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=EJohtCKo; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="EJohtCKo" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c10cd7df22so3372005ad.2 for ; Wed, 03 Jun 2026 19:02:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538552; x=1781143352; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=64OTf44ce74lsi56sZk7djG5JIWSOY+do5GiODE7GcA=; b=EJohtCKo/LTLvJZevneAbOC3NwnaOkQOLv0rxJsHwWlG0QQmMNPXjAgt3+andnlFpR vI+nQ29e1viw2keLHCu9hjpjVNmQw9R946VbiXWDuH4nOyLwdUJGsj4Ek95+5D0JGJPD nmP06Ds+0fKRccHHby1e4gsfgombsBgb8TqvDObMyeHy39GK1iomRDL911pzu/AhztZg R132ux6/bqvhxuKs+LLgq9ajZr9+/8XNMsXZR6WFlxZw2/QhTAqmQS7IwW78NgSCze16 /dpjw8EGn10dZCHys6LAWbZag4YwisBsInVD/2ElAruxnlEMJVj4DHLIwnsktwATzHj8 QHqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538552; x=1781143352; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=64OTf44ce74lsi56sZk7djG5JIWSOY+do5GiODE7GcA=; b=MVHSt2xzp4q8YNgog+q9XD0R36b+yiofnl9xNnIQqj8XzuRJIKQGvPYuDW+scRpAtP 4AAqPZxl2tGaBif0hdtPOzKaJziByeSMcOeF9I+9vlA88fm58nPJjAWv+ncMOIEWtN1F pnlELDsVOPHEbSxBXiZaGB+bSZ3Fnq1YFzCoSi36LwEZ3FAEJ3W3gy/0voepcX0vHGlK GH/9XakWxWmWZvr8E2Ml+3D6UfViGlSvycJQ+safVkHxkr3ujNUsL+ckNeYufpkPhYqM DyLXTAMUGk7A9E0CyWu6p+hig/LJykHwMrFPNZjYP9OcEsqgpI/gkh+zp3rGt9UX+mLH Lpyw== X-Forwarded-Encrypted: i=1; AFNElJ+ZmT0G7mfbhUo87lAyxyygs/7GmgJ2b7ZcIO8sz9kGh9RuyAaUi6c3qmesY1iaSuy43p5Xn+ewTOo44EA=@vger.kernel.org X-Gm-Message-State: AOJu0YzZXAuVzyE3hPcAzGbn4x3nh5IP3aAu7TKSF2cxyW7fm8LhEeym sX4k+QC+yFReajuELhItEvHnBfNSrx7oPERT1vo8vw0Sx3Zupe/++GlO/XeiiZn8UPBmb9YRAZ6 MwtR9Y4Q6 X-Received: from plha8.prod.google.com ([2002:a17:902:ecc8:b0:2bd:7c8c:4ef4]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:41cf:b0:2c0:ca93:1303 with SMTP id d9443c01a7336-2c1639ee9e7mr61572755ad.6.1780538551741; Wed, 03 Jun 2026 19:02:31 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:23 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-2-jrhilke@google.com> Subject: [PATCH v5 01/21] KVM: selftests: Build and link selftests/vfio/lib into KVM selftests From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Include libvfio.mk into the KVM selftests Makefile and link it into all KVM selftests by adding it to LIBKVM_OBJS. This lays the groundwork for future changes to utilize VFIO devices to verify IRQ bypass in KVM selftests. Note that KVM selftests build their own copy of selftests/vfio/lib and the resulting object files are placed in $(OUTPUT)/lib. This allows the KVM and VFIO selftests to apply different CFLAGS when building without conflicting with each other. Signed-off-by: David Matlack Signed-off-by: Josh Hilke --- tools/testing/selftests/kvm/Makefile.kvm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 9118a5a51b89..2da11e1f3d9a 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -254,6 +254,7 @@ OVERRIDE_TARGETS =3D 1 # which causes the environment variable to override the makefile). include ../lib.mk include ../cgroup/lib/libcgroup.mk +include ../vfio/lib/libvfio.mk =20 INSTALL_HDR_PATH =3D $(top_srcdir)/usr LINUX_HDR_PATH =3D $(INSTALL_HDR_PATH)/include/ @@ -308,7 +309,9 @@ LIBKVM_S :=3D $(filter %.S,$(LIBKVM)) LIBKVM_C_OBJ :=3D $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_C)) LIBKVM_S_OBJ :=3D $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) LIBKVM_STRING_OBJ :=3D $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) -LIBKVM_OBJS =3D $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) $(LIB= CGROUP_O) +LIBKVM_OBJS =3D $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) +LIBKVM_OBJS +=3D $(LIBCGROUP_O) +LIBKVM_OBJS +=3D $(LIBVFIO_O) SPLIT_TEST_GEN_PROGS :=3D $(patsubst %, $(OUTPUT)/%, $(SPLIT_TESTS)) SPLIT_TEST_GEN_OBJ :=3D $(patsubst %, $(OUTPUT)/$(ARCH)/%.o, $(SPLIT_TESTS= )) =20 --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 8D3542C11DF for ; Thu, 4 Jun 2026 02:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538557; cv=none; b=GOEnPxbZVWpZpJoyZeWY2exn0Z4+SE9BMV2jK/B1U54iJbgOdLkbaElNW1BAEDLKESS8Vqxegpa7zCKnMDwgC5hq58JCdnJnQKQxZ/GzMgWA/w/2efwcxvkboyD6RiUp4y7dJKYvYsYZWQqo0UKEgX6UyaW1eszi836DnRRDwns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538557; c=relaxed/simple; bh=k3Yc1XFg6EauSlB403XZ71rI8Xpea7Gw0rMMppNrkpE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=sG7U9XU49cPKFLJcIqbDRZwwRCZYJtDnpHGtiuWMrmtVA8kh3aVSFGxiddNJvVGr6rbwGgZBIdvQySfCHtMowI1p9WhDOy+9zN9Si/R8AU9j3u1R9grRw+0jeEe19qMglofe2XbouNVPm1M2FEW1iUkuwdiDDwo+5VTz+K1Kz8Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=AHAgSBrK; arc=none smtp.client-ip=209.85.215.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="AHAgSBrK" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c85a2cda4d0so117268a12.3 for ; Wed, 03 Jun 2026 19:02:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538553; x=1781143353; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Yv/smi8BVjBhAR0WbWcaPoaVTMVUt7+IZnoA91Z0pSw=; b=AHAgSBrKXLhWGblGNtDcJMfYT3XtznUTZa4rclc5kshijOklUiPU/dlulZ9xP7yGII Wk32F4j5ewnV8BEwQ47tlOcaRWNsu3EmIwKbLD45PrOpcqAYMYjRsffSjJAUDWXYZ+tl zG6PqK63DfGlLcRzu5OZN0G69aZLqnfaqngJ799wTIdvuCg7WmHP8IOxxcWtdZJx0lOB 6Qz1P4rMDlA9RzhUviXf7yoa5bf7AML3TFILSkQGkZubvQ61INYH8qEaMCzL/cNYBrss AH//m89klCLw06srsKLdFQxneCcZMSjiGfhD5aJkN7LQM7EggMRwaJfQcy9vVMGVecfn 71CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538553; x=1781143353; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Yv/smi8BVjBhAR0WbWcaPoaVTMVUt7+IZnoA91Z0pSw=; b=h6Ra1rT/PQ07neSY6c87x0UZZi10YOtgIB5d2L2O6er738u7HQsH2HRBtac59YvE5O 7iaOT+X4lU/mrq7gP+4zWrSL2lSmQ4IG5YpQt7RDYP0qSEisaPeReEfx6SL+H/Epq+Wd IUxzt2vSRf8y6ogbe23+Y+iSScomrfv1erxj1N2RcFiNjaaNvkXkGp9C73QFYJPQ4Mgo 7w684ocm+cKcRN1THDAwAzeWO06fKJVTyESQnpqUR980eWjhSJG2yaoUCfDqFUqqF17Q ZyPecAhZUipMc6SVoKc5x6TD0kojmnu0hjxeFRlD1yCAQDu6v1/4nw+xFb8ujrQN5H4e XIMg== X-Forwarded-Encrypted: i=1; AFNElJ9xTUDiCSezbsDGhqlmOyWeW2dH5E56cdYi3+iyw/s5cRCR/GN5EcFEU95Ql0mw8hF5xoVrIgyDznCnUN8=@vger.kernel.org X-Gm-Message-State: AOJu0Yw94J2knN0AQWMvKjqpNjNGcw/+6ogepXZ/fybgFQClQlUgrilA phYr7CxM5NJh3aFiBzZ/m2ZrLOYq1qCGJh06jdbUfUCQaMIADFRNBWls45c1LV5zDXIzZOQaENX 52dUcoJQY X-Received: from pgbcs9.prod.google.com ([2002:a05:6a02:4189:b0:c76:8ec1:5090]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:a98:b0:3b2:924c:566e with SMTP id adf61e73a8af0-3b49766642bmr6444151637.36.1780538552537; Wed, 03 Jun 2026 19:02:32 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:24 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-3-jrhilke@google.com> Subject: [PATCH v5 02/21] KVM: selftests: Add guest read/write macros From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add SYNC_FROM_GUEST_AND_READ(vm, variable), to read a variable value from the guest. Add WRITE_AND_SYNC_TO_GUEST(vm, variable, value) to write a value to a guest variable. These macros improve the readability of code which reads and writes data between host and guest in tests. Also update existing guest reads/writes to use these macros in the following tests: - tools/testing/selftests/kvm/dirty_log_test.c - tools/testing/selftests/kvm/mmu_stress_test.c - tools/testing/selftests/kvm/steal_time.c No functional changes are intended. Suggested-by: Sean Christopherson Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/dirty_log_test.c | 9 +++----- .../testing/selftests/kvm/include/kvm_util.h | 10 +++++++++ tools/testing/selftests/kvm/mmu_stress_test.c | 9 +++----- tools/testing/selftests/kvm/steal_time.c | 22 +++++++------------ 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/s= elftests/kvm/dirty_log_test.c index 12446a4b6e8d..561b80064230 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -698,8 +698,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) =20 sync_global_to_guest(vm, iteration); =20 - WRITE_ONCE(nr_writes, 0); - sync_global_to_guest(vm, nr_writes); + WRITE_AND_SYNC_TO_GUEST(vm, nr_writes, 0); =20 dirty_ring_prev_iteration_last_page =3D dirty_ring_last_page; WRITE_ONCE(dirty_ring_vcpu_ring_full, false); @@ -761,16 +760,14 @@ static void run_test(enum vm_guest_mode mode, void *a= rg) * writing memory during verification, pages that this thread * sees as clean may be written with this iteration's value. */ - WRITE_ONCE(vcpu_stop, true); - sync_global_to_guest(vm, vcpu_stop); + WRITE_AND_SYNC_TO_GUEST(vm, vcpu_stop, true); sem_wait(&sem_vcpu_stop); =20 /* * Clear vcpu_stop after the vCPU thread has acknowledge the * stop request and is waiting, i.e. is definitely not running! */ - WRITE_ONCE(vcpu_stop, false); - sync_global_to_guest(vm, vcpu_stop); + WRITE_AND_SYNC_TO_GUEST(vm, vcpu_stop, false); =20 /* * Sync the number of writes performed before verification, the diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 2ecaaa0e9965..88211d696a11 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1138,6 +1138,16 @@ vm_adjust_num_guest_pages(enum vm_guest_mode mode, u= nsigned int num_guest_pages) memcpy(&(g), _p, sizeof(g)); \ }) =20 +#define SYNC_FROM_GUEST_AND_READ(_vm, _variable) ({ \ + sync_global_from_guest(_vm, _variable); \ + READ_ONCE(_variable); \ +}) + +#define WRITE_AND_SYNC_TO_GUEST(_vm, _variable, _value) do { \ + WRITE_ONCE(_variable, _value); \ + sync_global_to_guest(_vm, _variable); \ +} while (0) + /* * Write a global value, but only in the VM's (guest's) domain. Primarily= used * for "globals" that hold per-VM values (VMs always duplicate code and gl= obal diff --git a/tools/testing/selftests/kvm/mmu_stress_test.c b/tools/testing/= selftests/kvm/mmu_stress_test.c index 54d281419d31..473ef4c0ea9f 100644 --- a/tools/testing/selftests/kvm/mmu_stress_test.c +++ b/tools/testing/selftests/kvm/mmu_stress_test.c @@ -155,10 +155,8 @@ static void *vcpu_worker(void *data) "Expected EFAULT on write to RO memory, got r =3D %d, errno =3D %d",= r, errno); =20 atomic_inc(&nr_ro_faults); - if (atomic_read(&nr_ro_faults) =3D=3D nr_vcpus) { - WRITE_ONCE(all_vcpus_hit_ro_fault, true); - sync_global_to_guest(vm, all_vcpus_hit_ro_fault); - } + if (atomic_read(&nr_ro_faults) =3D=3D nr_vcpus) + WRITE_AND_SYNC_TO_GUEST(vm, all_vcpus_hit_ro_fault, true); =20 #if defined(__x86_64__) || defined(__aarch64__) /* @@ -383,8 +381,7 @@ int main(int argc, char *argv[]) rendezvous_with_vcpus(&time_run2, "run 2"); =20 mprotect(mem, slot_size, PROT_READ); - mprotect_ro_done =3D true; - sync_global_to_guest(vm, mprotect_ro_done); + WRITE_AND_SYNC_TO_GUEST(vm, mprotect_ro_done, true); =20 rendezvous_with_vcpus(&time_ro, "mprotect RO"); mprotect(mem, slot_size, PROT_READ | PROT_WRITE); diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selft= ests/kvm/steal_time.c index 76fcdd1fd3cb..2de87549fcc0 100644 --- a/tools/testing/selftests/kvm/steal_time.c +++ b/tools/testing/selftests/kvm/steal_time.c @@ -70,8 +70,8 @@ static bool is_steal_time_supported(struct kvm_vcpu *vcpu) static void steal_time_init(struct kvm_vcpu *vcpu, u32 i) { /* ST_GPA_BASE is identity mapped */ - st_gva[i] =3D (void *)(ST_GPA_BASE + i * STEAL_TIME_SIZE); - sync_global_to_guest(vcpu->vm, st_gva[i]); + WRITE_AND_SYNC_TO_GUEST(vcpu->vm, st_gva[i], + (void *)(ST_GPA_BASE + i * STEAL_TIME_SIZE)); =20 vcpu_set_msr(vcpu, MSR_KVM_STEAL_TIME, (ulong)st_gva[i] | KVM_MSR_ENABLED= ); } @@ -187,8 +187,7 @@ static void steal_time_init(struct kvm_vcpu *vcpu, u32 = i) }; =20 /* ST_GPA_BASE is identity mapped */ - st_gva[i] =3D (void *)(ST_GPA_BASE + i * STEAL_TIME_SIZE); - sync_global_to_guest(vm, st_gva[i]); + WRITE_AND_SYNC_TO_GUEST(vm, st_gva[i], (void *)(ST_GPA_BASE + i * STEAL_T= IME_SIZE)); =20 st_ipa =3D (ulong)st_gva[i]; vcpu_ioctl(vcpu, KVM_SET_DEVICE_ATTR, &dev); @@ -310,10 +309,8 @@ static bool is_steal_time_supported(struct kvm_vcpu *v= cpu) static void steal_time_init(struct kvm_vcpu *vcpu, u32 i) { /* ST_GPA_BASE is identity mapped */ - st_gva[i] =3D (void *)(ST_GPA_BASE + i * STEAL_TIME_SIZE); - st_gpa[i] =3D addr_gva2gpa(vcpu->vm, (gva_t)st_gva[i]); - sync_global_to_guest(vcpu->vm, st_gva[i]); - sync_global_to_guest(vcpu->vm, st_gpa[i]); + WRITE_AND_SYNC_TO_GUEST(vcpu->vm, st_gva[i], (void *)(ST_GPA_BASE + i * S= TEAL_TIME_SIZE)); + WRITE_AND_SYNC_TO_GUEST(vcpu->vm, st_gpa[i], addr_gva2gpa(vcpu->vm, (gva_= t)st_gva[i])); } =20 static void steal_time_dump(struct kvm_vm *vm, u32 vcpu_idx) @@ -442,8 +439,7 @@ static void steal_time_init(struct kvm_vcpu *vcpu, u32 = i) }; =20 /* ST_GPA_BASE is identity mapped */ - st_gva[i] =3D (void *)(ST_GPA_BASE + i * STEAL_TIME_SIZE); - sync_global_to_guest(vm, st_gva[i]); + WRITE_AND_SYNC_TO_GUEST(vm, st_gva[i], (void *)(ST_GPA_BASE + i * STEAL_T= IME_SIZE)); =20 err =3D __vcpu_ioctl(vcpu, KVM_HAS_DEVICE_ATTR, &attr); TEST_ASSERT(err =3D=3D 0, "No PV stealtime Feature"); @@ -549,8 +545,7 @@ int main(int ac, char **av) =20 /* Second VCPU run, expect guest stolen time to be <=3D run_delay */ run_vcpu(vcpus[i]); - sync_global_from_guest(vm, guest_stolen_time[i]); - stolen_time =3D guest_stolen_time[i]; + stolen_time =3D SYNC_FROM_GUEST_AND_READ(vm, guest_stolen_time[i]); run_delay =3D get_run_delay(); TEST_ASSERT(stolen_time <=3D run_delay, "Expected stolen time <=3D %ld, got %ld", @@ -570,8 +565,7 @@ int main(int ac, char **av) =20 /* Run VCPU again to confirm stolen time is consistent with run_delay */ run_vcpu(vcpus[i]); - sync_global_from_guest(vm, guest_stolen_time[i]); - stolen_time =3D guest_stolen_time[i] - stolen_time; + stolen_time =3D SYNC_FROM_GUEST_AND_READ(vm, guest_stolen_time[i]) - sto= len_time; TEST_ASSERT(stolen_time >=3D run_delay, "Expected stolen time >=3D %ld, got %ld", run_delay, stolen_time); --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 AABDA2DD5E2 for ; Thu, 4 Jun 2026 02:02:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538557; cv=none; b=A1wDs1FS8lRBupdz5VAe4Pjqpsnbr+16IFgen+L+1YkBS7XQnakDnNQPfGJYNqWr5G/TULfwTQzUyMNymg4TbgK5C59jumhM7CW703azjp9q0STUTfjz6nrA8fHDgQjzZUhdE5G8+b4h8lA1BpZ6L6V+dym4KufV1si3nYlR/wM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538557; c=relaxed/simple; bh=XynlGgzvtyslGT34xYN3QY4dTtAI3O/O7Ds3dz2U1yU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=LOPspb8/2I9gz29U0Fm+3U9hcsBXrCcD7750yZxML4b1VCrDI7wHbSvyKsTsUSoN4i4m4TU7oTxV9SZ9Nh2NkmG5TmbDEqSI+4/HpRVdFexPm5lTF5QtGcO6m6Jd7HThmBEZa3lPx2mTa9Fm96UdSpm5da44M7/16mkMeBqtLrk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=NB1Wkfpe; arc=none smtp.client-ip=209.85.210.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="NB1Wkfpe" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-8423efbfb61so122912b3a.0 for ; Wed, 03 Jun 2026 19:02:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538554; x=1781143354; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=lSHpiYqQ0cIYiARVnuV9XXk5L30RA1M6/dELqPY2Y/8=; b=NB1Wkfpeush8papsDKLWXmAe5uBriuBCFuG23n70BpDnCo8GVYdX9qbcb+Cu8Cyi+9 Lp/3zmhzKhdPPPJmFYShfLgdaCx2/qkOYyRoxDr2X8PTG+BSO/+YRGilSNvqkYrrmXz9 1Afh9pa1aEw5zg5GXV6T1AgV/nU2PMOnfa4f5VnSmnGsO2x/LBeM7YSrQF1FawlTrAN2 HL55lEZYCSoq+DPN1JpYZSu7OLT5GNz3ODasG4cakqVxBK3n1KF90Pv1SrbFKMqdljkO qDNp4ghX8blWiC9OUOnU3x4VqtPql/IypIK6LVHFCqQ1oWtf51OCO482aPqfNWGwWy+j 8z3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538554; x=1781143354; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lSHpiYqQ0cIYiARVnuV9XXk5L30RA1M6/dELqPY2Y/8=; b=EZN0tz7tcS7ae8O1kGvmS0TWY9h3s4hp0P9rOKLYmDcbW/o0LCD+CS8pKKjPdeZqOl GF/PCxtxFmw5hVaiSs7xrvhOSYMdVqzWfQHPrVtxpLqptyRpNUg976MglftmICdjsSti M4ngiDcorAAb6St8Vi3PInNjvlklprhLoK8zSE86SpjWLHAyKZpMIv/P/PMmCzQzlUQi NCZ0o9MMANHR8kj6C/IPfh7dxwHt+bO4s7SKMkARagatKbLFKIp9VcDBJjkRXjeo8OhD HXEH3dc4n5vFh0ezGNME9FLQ1jVj/vcWXfjU9Y814Yqv7/XAfMg3GCmUcNboEkJiQQGy F1OA== X-Forwarded-Encrypted: i=1; AFNElJ+aujWnq8kd30UqoUYC/l6FA5pnhogF9EpOMw4PLI9DulzZvRUS5nPmHuFRhigzpLiEtNwnHo4XanF/+ZI=@vger.kernel.org X-Gm-Message-State: AOJu0YxvqP1OYTasibbWZneag/yragyyLnXdzkddXzLxmSm7+NQ0qfN9 iUyGb79iqxYZSqEwE/vHsyYPNmwRFU0+CcPin9V+8Vo1MT5D3BCgeVIebmLaDjV12cX0lhkEAge WgJSmxyqn X-Received: from pfbdi4.prod.google.com ([2002:a05:6a00:4804:b0:842:3a6c:99f5]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:300b:b0:838:127d:a167 with SMTP id d2e1a72fcca58-84284e31e34mr5214998b3a.16.1780538553361; Wed, 03 Jun 2026 19:02:33 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:25 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-4-jrhilke@google.com> Subject: [PATCH v5 03/21] KVM: selftests: Rename guest_rng to kvm_rng From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename functions prefixed with 'guest_random_' to 'kvm_random_' and the global random state variable 'guest_rng' to 'kvm_rng'. This expands their usage and reflects that the random number generator can be used by both the host and the guest. No functional changes are intended. Suggested-by: Sean Christopherson Signed-off-by: Josh Hilke --- .../selftests/kvm/dirty_log_perf_test.c | 4 ++-- tools/testing/selftests/kvm/dirty_log_test.c | 2 +- .../testing/selftests/kvm/include/test_util.h | 22 +++++++++---------- .../selftests/kvm/include/x86/kvm_util_arch.h | 4 ++-- tools/testing/selftests/kvm/lib/kvm_util.c | 20 ++++++++--------- tools/testing/selftests/kvm/lib/memstress.c | 8 +++---- tools/testing/selftests/kvm/lib/test_util.c | 6 ++--- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/test= ing/selftests/kvm/dirty_log_perf_test.c index ef779fa91827..7c5abe1ae9e0 100644 --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c @@ -311,7 +311,7 @@ int main(int argc, char *argv[]) int opt; =20 /* Override the seed to be deterministic by default. */ - guest_random_seed =3D 1; + kvm_random_seed =3D 1; =20 dirty_log_manual_caps =3D kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2); @@ -357,7 +357,7 @@ int main(int argc, char *argv[]) p.phys_offset =3D strtoull(optarg, NULL, 0); break; case 'r': - guest_random_seed =3D atoi_positive("Random seed", optarg); + kvm_random_seed =3D atoi_positive("Random seed", optarg); break; case 's': p.backing_src =3D parse_backing_src_type(optarg); diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/s= elftests/kvm/dirty_log_test.c index 561b80064230..95d5f27a4093 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -121,7 +121,7 @@ static void guest_code(void) while (true) { while (!READ_ONCE(vcpu_stop)) { addr =3D guest_test_virt_mem; - addr +=3D (guest_random_u64(&guest_rng) % guest_num_pages) + addr +=3D (kvm_random_u64(&kvm_rng) % guest_num_pages) * guest_page_size; addr =3D align_down(addr, host_page_size); =20 diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index a56271c237ae..44c0104d60ac 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -108,30 +108,30 @@ struct timespec timespec_sub(struct timespec ts1, str= uct timespec ts2); struct timespec timespec_elapsed(struct timespec start); struct timespec timespec_div(struct timespec ts, int divisor); =20 -struct guest_random_state { +struct kvm_random_state { u32 seed; }; =20 -extern u32 guest_random_seed; -extern struct guest_random_state guest_rng; +extern u32 kvm_random_seed; +extern struct kvm_random_state kvm_rng; =20 -struct guest_random_state new_guest_random_state(u32 seed); -u32 guest_random_u32(struct guest_random_state *state); +struct kvm_random_state new_kvm_random_state(u32 seed); +u32 kvm_random_u32(struct kvm_random_state *state); =20 -static inline bool __guest_random_bool(struct guest_random_state *state, +static inline bool __kvm_random_bool(struct kvm_random_state *state, u8 percent) { - return (guest_random_u32(state) % 100) < percent; + return (kvm_random_u32(state) % 100) < percent; } =20 -static inline bool guest_random_bool(struct guest_random_state *state) +static inline bool kvm_random_bool(struct kvm_random_state *state) { - return __guest_random_bool(state, 50); + return __kvm_random_bool(state, 50); } =20 -static inline u64 guest_random_u64(struct guest_random_state *state) +static inline u64 kvm_random_u64(struct kvm_random_state *state) { - return ((u64)guest_random_u32(state) << 32) | guest_random_u32(state); + return ((u64)kvm_random_u32(state) << 32) | kvm_random_u32(state); } =20 enum vm_mem_backing_src_type { diff --git a/tools/testing/selftests/kvm/include/x86/kvm_util_arch.h b/tool= s/testing/selftests/kvm/include/x86/kvm_util_arch.h index c33ab6e04171..6904dbda79f9 100644 --- a/tools/testing/selftests/kvm/include/x86/kvm_util_arch.h +++ b/tools/testing/selftests/kvm/include/x86/kvm_util_arch.h @@ -55,9 +55,9 @@ static inline bool __vm_arch_has_protected_memory(struct = kvm_vm_arch *arch) do { \ const typeof(mem) val =3D (__val); \ \ - if (!is_forced_emulation_enabled || guest_random_bool(&guest_rng)) { \ + if (!is_forced_emulation_enabled || kvm_random_bool(&kvm_rng)) { \ (mem) =3D val; \ - } else if (guest_random_bool(&guest_rng)) { \ + } else if (kvm_random_bool(&kvm_rng)) { \ __asm__ __volatile__(KVM_FEP "mov %1, %0" \ : "+m" (mem) \ : "r" (val) : "memory"); \ diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index e08967ef7b7b..2d24d8db86b1 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -20,9 +20,9 @@ =20 #define KVM_UTIL_MIN_PFN 2 =20 -u32 guest_random_seed; -struct guest_random_state guest_rng; -static u32 last_guest_seed; +u32 kvm_random_seed; +struct kvm_random_state kvm_rng; +static u32 last_kvm_seed; =20 static size_t vcpu_mmap_sz(void); =20 @@ -515,12 +515,12 @@ struct kvm_vm *__vm_create(struct vm_shape shape, u32= nr_runnable_vcpus, slot0 =3D memslot2region(vm, 0); ucall_init(vm, slot0->region.guest_phys_addr + slot0->region.memory_size); =20 - if (guest_random_seed !=3D last_guest_seed) { - pr_info("Random seed: 0x%x\n", guest_random_seed); - last_guest_seed =3D guest_random_seed; + if (kvm_random_seed !=3D last_kvm_seed) { + pr_info("Random seed: 0x%x\n", kvm_random_seed); + last_kvm_seed =3D kvm_random_seed; } - guest_rng =3D new_guest_random_state(guest_random_seed); - sync_global_to_guest(vm, guest_rng); + kvm_rng =3D new_kvm_random_state(kvm_random_seed); + sync_global_to_guest(vm, kvm_rng); =20 kvm_arch_vm_post_create(vm, nr_runnable_vcpus); =20 @@ -2280,8 +2280,8 @@ void __attribute((constructor)) kvm_selftest_init(voi= d) sigaction(SIGILL, &sig_sa, NULL); sigaction(SIGFPE, &sig_sa, NULL); =20 - guest_random_seed =3D last_guest_seed =3D random(); - pr_info("Random seed: 0x%x\n", guest_random_seed); + kvm_random_seed =3D last_kvm_seed =3D random(); + pr_info("Random seed: 0x%x\n", kvm_random_seed); =20 kvm_selftest_arch_init(); } diff --git a/tools/testing/selftests/kvm/lib/memstress.c b/tools/testing/se= lftests/kvm/lib/memstress.c index 6dcd15910a06..3599b75d97c9 100644 --- a/tools/testing/selftests/kvm/lib/memstress.c +++ b/tools/testing/selftests/kvm/lib/memstress.c @@ -48,14 +48,14 @@ void memstress_guest_code(u32 vcpu_idx) { struct memstress_args *args =3D &memstress_args; struct memstress_vcpu_args *vcpu_args =3D &args->vcpu_args[vcpu_idx]; - struct guest_random_state rand_state; + struct kvm_random_state rand_state; gva_t gva; u64 pages; u64 addr; u64 page; int i; =20 - rand_state =3D new_guest_random_state(guest_random_seed + vcpu_idx); + rand_state =3D new_kvm_random_state(kvm_random_seed + vcpu_idx); =20 gva =3D vcpu_args->gva; pages =3D vcpu_args->pages; @@ -69,13 +69,13 @@ void memstress_guest_code(u32 vcpu_idx) =20 for (i =3D 0; i < pages; i++) { if (args->random_access) - page =3D guest_random_u32(&rand_state) % pages; + page =3D kvm_random_u32(&rand_state) % pages; else page =3D i; =20 addr =3D gva + (page * args->guest_page_size); =20 - if (__guest_random_bool(&rand_state, args->write_percent)) + if (__kvm_random_bool(&rand_state, args->write_percent)) *(u64 *)addr =3D 0x0123456789ABCDEF; else READ_ONCE(*(u64 *)addr); diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/se= lftests/kvm/lib/test_util.c index bab1bd2b775b..e98ca7ef439c 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -30,13 +30,13 @@ void __attribute__((used)) expect_sigbus_handler(int si= gnum) * Park-Miller LCG using standard constants. */ =20 -struct guest_random_state new_guest_random_state(u32 seed) +struct kvm_random_state new_kvm_random_state(u32 seed) { - struct guest_random_state s =3D {.seed =3D seed}; + struct kvm_random_state s =3D {.seed =3D seed}; return s; } =20 -u32 guest_random_u32(struct guest_random_state *state) +u32 kvm_random_u32(struct kvm_random_state *state) { state->seed =3D (u64)state->seed * 48271 % ((u32)(1 << 31) - 1); return state->seed; --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 33B5D2DF15C for ; Thu, 4 Jun 2026 02:02:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538557; cv=none; b=tNQc2vCDYcnZHAXpBnb9bGQNhlQsJvaeHARLxPwWoppNTAjHTtVlTfZ0J60sue7wiHhukMKT+FA1xd4SxkThLe2KskLCUElGiIY/HXRzSjs9xWfT9QSiLgOo5ODaMcwwB3bdApSSEX1avJBQBfrQFOne231mXK2D7PmjvqkevVw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538557; c=relaxed/simple; bh=nXMNFoJGxvgH700sR0v5qvFlNpxFTIuzOHnSgpSJ0jE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FcV2RV3EVQtSEU34UjdREV8op/PTfHX73vMx+Tq4FYm/8BgT0TIkhagI7fZsm7qFv9NXyxLxcX9lnlo2MMhSYrpPb2G9/h+4QGeivlBk31sc0TsCRBWNKhi786kAKxBP0Iqk8M6XpbLzkDsnpCulq6emB0iRaVLQZ67PjZ3G+SA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FGWT1MM0; arc=none smtp.client-ip=209.85.215.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FGWT1MM0" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c85a2f1d1e5so113179a12.3 for ; Wed, 03 Jun 2026 19:02:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538554; x=1781143354; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=NhsS4g2OlkS1/KJbrnXrgNUTVZ9kOb2Vmfr1lJZkXHU=; b=FGWT1MM0FW7qfgv/GgnAdPWtSMOKvgYQ7C7B2qsxBbA7RL94GyGWBLrLHFX8DUMPkD HKFZOP/67hK0HfSrn43LwYqjP9l4pbe2UW0Di+JWOsWVVOFKFk32dACbxEkswJ9YuFu+ 6TKjeuPpX6kWQsT9tpNDeMj2R5iaitxninlgCeQTgRsbBeh1lDQ8a5K2omDiTNSDrjLG qF7+vu7o0lllHSAG15adXuKpFAxjPYEbL+VwFJB9OORWKF/Dy8wEXoTN5Mp1SpAXDoFM 9/Urvy4RuYkqcSMzG1fHoxuxsYKgB9iY98wjGFmIL5puwV1wPVCuh/Lxsrk/2e2qo8k0 CsHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538554; x=1781143354; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=NhsS4g2OlkS1/KJbrnXrgNUTVZ9kOb2Vmfr1lJZkXHU=; b=i1zDgsg88/Jpa8ncJNHpxUGQN33V6RlM5OLGTnDq41ym0OyCwBVK9a+GO2Hpb/KRgH Cc6fNbGunzwa48H8dTWkiwZl/FcsOqr+MLMIUoclO57WQveWKzkgfAJ6era1FSYCARwA Mx7d05qFVEtZEiN0kke2U2+2R/vnYDuk3QxXo+0HUIXHUmhA6F1DICFss7aiPcVP8yUR kjcrBywEiJ6DxYx35yo1dwjsWj29MkthhiCO5k3LnLwQuPnp0R3+72f8GhOuaURvTXPv TWbZPRJL/HKXfihd+TOzJGxO9c3/bZbIi3h0+LRAgEY4MtDABryNZmUmZattWga0m1mn IfqQ== X-Forwarded-Encrypted: i=1; AFNElJ+LCn/H+DGVpw5oTFBq8BC5FbCpWg3lyQtmS1OlHIB/8U8Cvlid4jrsvbIfLtW2xnFvjhHaxir5kWevDLo=@vger.kernel.org X-Gm-Message-State: AOJu0YwHNGuNXerR32+6Q6ldXEAxL+uBVbpuB8B24fX0xHxudjouZEcU wiHx5bgwbEZ5m8Ie5ku7k4uzkiWee7oKaSy6rQ8MBmbzpl2cFKCrgjTWiAp2z/F3dfJtT6oWr/3 NEGU3sEOD X-Received: from pgc24.prod.google.com ([2002:a05:6a02:2f98:b0:c80:192c:51ff]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:228c:b0:3b3:62be:3584 with SMTP id adf61e73a8af0-3b4977ff27emr6352035637.11.1780538554256; Wed, 03 Jun 2026 19:02:34 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:26 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-5-jrhilke@google.com> Subject: [PATCH v5 04/21] KVM: selftests: Add helper to generate random u64 in range [min,max] From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce kvm_random_u64_in_range(state, min, max). This function returns a random u64 in the inclusive range of [min, max] using a struct kvm_random_state. Suggested-by: Sean Christopherson Signed-off-by: Josh Hilke --- .../testing/selftests/kvm/include/test_util.h | 3 +++ tools/testing/selftests/kvm/lib/test_util.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index 44c0104d60ac..d64c8a228207 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -134,6 +134,9 @@ static inline u64 kvm_random_u64(struct kvm_random_stat= e *state) return ((u64)kvm_random_u32(state) << 32) | kvm_random_u32(state); } =20 +u64 kvm_random_u64_in_range(struct kvm_random_state *state, u64 min, + u64 max); + enum vm_mem_backing_src_type { VM_MEM_SRC_ANONYMOUS, VM_MEM_SRC_ANONYMOUS_THP, diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/se= lftests/kvm/lib/test_util.c index e98ca7ef439c..e208a57f190c 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -42,6 +42,24 @@ u32 kvm_random_u32(struct kvm_random_state *state) return state->seed; } =20 +/* Returns a random u64 in the inclusive range [min, max] */ +u64 kvm_random_u64_in_range(struct kvm_random_state *state, u64 min, + u64 max) +{ + u64 value; + u64 range; + + TEST_ASSERT(min <=3D max, "PEBKAC, min =3D 0x%lx, max =3D 0x%lx", min, ma= x); + + value =3D kvm_random_u64(state); + + range =3D max - min; + if (range =3D=3D ULLONG_MAX) + return value; + + return min + (value % (range + 1)); +} + /* * Parses "[0-9]+[kmgt]?". */ --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 6B95E2E8B6B for ; Thu, 4 Jun 2026 02:02:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538559; cv=none; b=ttfdvQ6EU84c22lHxmQcyhsWKqnSDaYqCrPRd9vF0/KS6vMcBe5qpK5PjMdADJAj5lBW97Lf3xfgQ0Bq5rajT0+PUnW3Ivw4qaGXC9nlGfa0hMC6YbIL5NldVhmKFvw9DrYi6MKtqbA65tQycZ2kmpyCBfbq+cmcHKCVAsNQ6r0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538559; c=relaxed/simple; bh=P/6Oa6bCc2moG68o8GGr9AwgkKQdUS96ekeltgT4d24=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=saWMpuZ9NNGcFgy9zpEF8TKKvOUnyUeF4WASkFScZUvvkSvYY2MebuTHCyY0po2Fg6Vuax+Lj33r9dJcLol4/5MIEsjDzMHoZZiRzLcxS67vBbB0ENK29TFWcJa01KkNaefYcAFEB3uZPj97U167yWPpZRUcZ9bEt9Wm4GNkc/s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=dW18vjmo; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dW18vjmo" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c0b1bb53a8so1704175ad.0 for ; Wed, 03 Jun 2026 19:02:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538555; x=1781143355; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=pQgBRd3Ewi2bKAxe1ytwImVpDEDSkEWWH2AxFYnyA80=; b=dW18vjmoDlz3k77xBhh7QUz7K5eC2JL9TvXLVodq6tlfgx70eXw8rcuBEE5BRcsIel PWiP9Ya7RjtLnn/J1XWhHJoPLpIh+HY/z5d/ubBQrAk3HsHHOrMWon1qB+xmeWzhBer6 2QfjOiLnlm80zC6iRE3/o9sD3eVWC7j0Xb99gA7ypnUVx3GZgyfubBOxsrBZoRhlY7P1 LpVmegL2gMYtOxwjS7Nb3pwWma0Av6r5iZWJnmoTJ7efQz1YaIumpGF0m78Rz+DPcV+K AbHFLXn7/5ZT8kbEHk6KBXZZIZLaHoHRvt983mrJj6gBInNYDfNcvLzQjFXcjxRuQp34 5/7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538555; x=1781143355; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=pQgBRd3Ewi2bKAxe1ytwImVpDEDSkEWWH2AxFYnyA80=; b=CWh77owzmfnwOViRtql2leQM8fRDIjpC7Jc9yDtwI87vR6jXRRzmQDKRt8RipZ9HJS 48rfSmTrP+2/Fv+e73tyTYeUW+3FW8RlI35B4oUwC4uCEw2xqHlIfy9+DUJnUkfI/H1x dv9Tmzk8G0CvJkmFIm+CJ8arOLqmenok6Zhh6QOT4qd+n5fQjoZ/k/iK9IP/V83L/cga KjpTJf4POBUA+pPK4kG8+iDtMiQX4N1sWFF1h+G5b0suEAcMaEHtuc2wb6cJEN3fyCAh 9+FZMggCGhMdoOOb4mVe1Rm8e+sfJOz6P6xMC7GezJmSCrWdbKgksjcjhvOiGDEWDDf4 T5vA== X-Forwarded-Encrypted: i=1; AFNElJ+Eu4zqmrw1zRdY9UVx0LIsrC1Q7W+I0/l6KERoywNR21oRjMVAQP5JG7zvBEkCNRok/PUVLagtXGhPTXU=@vger.kernel.org X-Gm-Message-State: AOJu0YyWqtLpO8rJ6rjNKLim8ww+nsyQWhpHiVS1ItzV4rxoeQ3xyuFC nYmgBclYhSZbytFuhew0IRLxfTDl/FD3I0LCzLRiOFFvYJbJ3erdssS+AJSKQ4lZbKGM4XeUwwS rYf6PQYYd X-Received: from plbkz12.prod.google.com ([2002:a17:902:f9cc:b0:2b2:c88b:31b8]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:fc4c:b0:2be:1eb1:eaf3 with SMTP id d9443c01a7336-2c197e4a128mr15126185ad.11.1780538555044; Wed, 03 Jun 2026 19:02:35 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:27 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-6-jrhilke@google.com> Subject: [PATCH v5 05/21] KVM: selftests: Add IRQ injection test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add a new test, irq_test.c, which verifies that KVM correctly injects interrupts into a running guest when triggered via an eventfd bound to a GSI using the irqfd mechanism. This test is intentionally simple. Support for IRQ bypass, receiving interrupts from real devices, and other features will be added to this test in future changes. Suggested-by: Sean Christopherson Link: https://lore.kernel.org/kvm/20250404193923.1413163-68-seanjc@google.c= om/ Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/Makefile.kvm | 2 + tools/testing/selftests/kvm/irq_test.c | 174 +++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 tools/testing/selftests/kvm/irq_test.c diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 2da11e1f3d9a..b859098121c7 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -153,12 +153,14 @@ TEST_GEN_PROGS_x86 +=3D coalesced_io_test TEST_GEN_PROGS_x86 +=3D dirty_log_perf_test TEST_GEN_PROGS_x86 +=3D guest_memfd_test TEST_GEN_PROGS_x86 +=3D hardware_disable_test +TEST_GEN_PROGS_x86 +=3D irq_test TEST_GEN_PROGS_x86 +=3D mmu_stress_test TEST_GEN_PROGS_x86 +=3D rseq_test TEST_GEN_PROGS_x86 +=3D steal_time TEST_GEN_PROGS_x86 +=3D system_counter_offset_test TEST_GEN_PROGS_x86 +=3D pre_fault_memory_test =20 + # Compiled outputs used by test targets TEST_GEN_PROGS_EXTENDED_x86 +=3D x86/nx_huge_pages_test =20 diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c new file mode 100644 index 000000000000..d3fee51cf451 --- /dev/null +++ b/tools/testing/selftests/kvm/irq_test.c @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "kvm_util.h" +#include "test_util.h" +#include "apic.h" +#include "processor.h" + +#include +#include +#include +#include +#include + +static u64 timeout_ns =3D 2ULL * 1000 * 1000 * 1000; +static bool guest_ready_for_irqs[KVM_MAX_VCPUS]; +static bool guest_received_irq[KVM_MAX_VCPUS]; +static bool done; + +#define GUEST_RECEIVED_IRQ(__vcpu) \ + SYNC_FROM_GUEST_AND_READ((__vcpu)->vm, guest_received_irq[(__vcpu)->id]) + +static u32 guest_get_vcpu_id(void) +{ + return x2apic_read_reg(APIC_ID); +} + +static void guest_irq_handler(struct ex_regs *regs) +{ + WRITE_ONCE(guest_received_irq[guest_get_vcpu_id()], true); + + x2apic_write_reg(APIC_EOI, 0); +} + +static void guest_code(void) +{ + x2apic_enable(); + + sti_nop(); + + WRITE_ONCE(guest_ready_for_irqs[guest_get_vcpu_id()], true); + + while (!READ_ONCE(done)) + cpu_relax(); + + GUEST_DONE(); +} + +static void *vcpu_thread_main(void *arg) +{ + struct kvm_vcpu *vcpu =3D arg; + struct ucall uc; + + vcpu_run(vcpu); + TEST_ASSERT_EQ(UCALL_DONE, get_ucall(vcpu, &uc)); + + return NULL; +} + +static void kvm_route_msi(struct kvm_vm *vm, u32 gsi, struct kvm_vcpu *vcp= u, + u8 vector) +{ + struct { + struct kvm_irq_routing head; + struct kvm_irq_routing_entry entry; + } routing_data =3D {}; + + struct kvm_irq_routing *routes =3D &routing_data.head; + + routes->nr =3D 1; + routes->entries[0].gsi =3D gsi; + routes->entries[0].type =3D KVM_IRQ_ROUTING_MSI; + routes->entries[0].u.msi.address_lo =3D 0xFEE00000 | (vcpu->id << 12); + routes->entries[0].u.msi.data =3D vector; + + vm_ioctl(vm, KVM_SET_GSI_ROUTING, routes); +} + +static void help(const char *name) +{ + printf("Usage: %s [-h]\n", name); + printf("\n"); + printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); + printf("\n"); + exit(KSFT_FAIL); +} + +int main(int argc, char **argv) +{ + /* + * Pick a random vector and a random GSI to use for device IRQ. + * + * Pick an IRQ vector in range [32, UINT8_MAX]. Min value is 32 because + * Linux/x86 reserves vectors 0-31 for exceptions and architecture + * defined NMIs and interrupts. + * + * Pick a GSI in range [24, KVM_MAX_IRQ_ROUTES - 1]. The min value is 24 + * because KVM reserves GSIs 0-15 for legacy ISA IRQs and 16-23 only go + * to the IOAPIC. The max is KVM_MAX_IRQ_ROUTES - 1, because + * KVM_MAX_IRQ_ROUTES is exclusive. + */ + u32 gsi =3D kvm_random_u64_in_range(&kvm_rng, 24, KVM_MAX_IRQ_ROUTES - 1); + u8 vector =3D kvm_random_u64_in_range(&kvm_rng, 32, UINT8_MAX); + + struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; + pthread_t vcpu_threads[KVM_MAX_VCPUS]; + int nr_irqs =3D 1000, nr_vcpus =3D 1; + int i, j, c, eventfd; + struct kvm_vm *vm; + + while ((c =3D getopt(argc, argv, "h")) !=3D -1) { + switch (c) { + case 'h': + default: + help(argv[0]); + } + } + + TEST_REQUIRE(kvm_arch_has_default_irqchip()); + + vm =3D vm_create_with_vcpus(nr_vcpus, guest_code, vcpus); + vm_install_exception_handler(vm, vector, guest_irq_handler); + + eventfd =3D kvm_new_eventfd(); + + printf("Injecting interrupts for GSI %d (Vector 0x%x) %d times\n", + gsi, vector, nr_irqs); + + kvm_assign_irqfd(vm, gsi, eventfd); + + for (i =3D 0; i < nr_vcpus; i++) + pthread_create(&vcpu_threads[i], NULL, vcpu_thread_main, vcpus[i]); + + for (i =3D 0; i < nr_vcpus; i++) { + struct kvm_vcpu *vcpu =3D vcpus[i]; + + while (!SYNC_FROM_GUEST_AND_READ(vm, guest_ready_for_irqs[vcpu->id])) + continue; + } + + for (i =3D 0; i < nr_irqs; i++) { + struct kvm_vcpu *vcpu =3D vcpus[i % nr_vcpus]; + struct timespec start; + + kvm_route_msi(vm, gsi, vcpu, vector); + + for (j =3D 0; j < nr_vcpus; j++) + TEST_ASSERT(!GUEST_RECEIVED_IRQ(vcpus[j]), + "IRQ flag for vCPU %d not clear prior to test", + vcpus[j]->id); + + /* Trigger interrupt */ + eventfd_write(eventfd, 1); + + clock_gettime(CLOCK_MONOTONIC, &start); + for (;;) { + if (GUEST_RECEIVED_IRQ(vcpu)) + break; + + if (timespec_to_ns(timespec_elapsed(start)) > timeout_ns) + TEST_FAIL("vCPU %d timed out waiting for IRQ from GSI %d (Vector 0x%x)= !\n", + vcpu->id, gsi, vector); + } + + WRITE_AND_SYNC_TO_GUEST(vm, guest_received_irq[vcpu->id], false); + } + + WRITE_AND_SYNC_TO_GUEST(vm, done, true); + + for (i =3D 0; i < nr_vcpus; i++) + pthread_join(vcpu_threads[i], NULL); + + printf("Test passed!\n"); + + return 0; +} --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 048D82ECD3A for ; Thu, 4 Jun 2026 02:02:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538559; cv=none; b=pTJOR6DbMchAj89zXTKihtKrEO/biSwgNFD08kQrAgp2aL5prb0w4fZyC6qEKLKFxadrgnZSLkqoGHkq9NVdIP6aJ/+m55EnMe7CARtkfYVd0CGY1YB4WvSsRc+bbrQ42wyN4agR/nhqMquHj+evV97i9ru+0IcDFXx5nDVIjq4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538559; c=relaxed/simple; bh=IPGEt70vS4FiYPmd9MbalH+VmvWwbOgc68lRIPMypl4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=peJbSGFrEwOg7X2AEIVYd3jQdi5RMKjHwPQF7qmQZh+MMiH4Sj2eDs5ACC7eMHzUusNUZu3UjkUszmAr0VzLvYuTdXjyuPvQRDOsd61h+V+nYdYm9rWEpNVDppssZ0F3NK3P9oMRsgCi0q4dc7vjgkBnaEDP/5jkQZOIzVPHgnw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=CJ/K5KYz; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="CJ/K5KYz" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2bf0b7425bbso4338205ad.0 for ; Wed, 03 Jun 2026 19:02:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538556; x=1781143356; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=XXgfk9ZIydC5OjUB+yhLarQexw0ICCKfMTUcdnWHPEE=; b=CJ/K5KYzbdttgZcmEDDfYq8h951YVfoKcC0EDpDiwmwJT1LOdsPi1qG2C4d/6yvvC9 o3q/Dy0mdfQxum6zAac8oCL1XT7E3umGGpMhpppx3InfZi5WVREaypq5V9Qcc9e8dnO5 v1lifzxTYihFeX+uP7KWiXorGTLp9qnQOUyY9R5ljVxD9SlzT+ySaswv9AwTB7ChDyjF A849d55DFEABdFpZyisBO867oQ83+7DQvij2oYBfQYluZOf1c6kMCE1AbNdF0O1/o/mR deFXIz9PJbmOTcoP8TKYZtOa57YjuKYXMMlh4oaS9ByDQK1/F18Umw55Gv7KL+rry3kn bAyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538556; x=1781143356; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XXgfk9ZIydC5OjUB+yhLarQexw0ICCKfMTUcdnWHPEE=; b=hAa9mHYiKU94cqpXO6ykICqZKBvbMxzyuJvP1xegQx13iktcWXC16rqK+xnXjU7NDQ aqhuRabLJ+9YPh6/eJ6QmuOvCise4b7aX1RUqupxbF17HWQ8lYusBfPOXJWyYvkW9M+Y xJoj7VfR2KknyN8tWUXud3v5MMf/DEuZZPyDrJBNsFkByNIP+NJdYGj9ec+Cy747sliT p/hrTgOM5E3GE7klbbSnw2t7qhbG2YC7bpecrVNEnSFLQ8Gg+5k2H3c/MMk+J0fwIaco WyayV8jORbQGoV8NXLtRET35Qd5Y8dAJFIBSnnpMZO9lPN7JJss0VV4moSQWMpsaxr1R Bchw== X-Forwarded-Encrypted: i=1; AFNElJ8wW6hCTSLEaeNKgHtOezunn936Nqrqa5L4Yl3UAcOTrh/7GNkywdq/vXe4diaOt6FK0VXdoMbyPSOVI+U=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1b6lwWJHV7hldr2h8CAkpu1B2GySpyy5ixVPjTjH7nk7Yw1AB VJTvPHdBeV0qdvqQTr7NM4Ael4GFMmxLg0h+n9VYT5c/+KUWlRjAQlImnzRGmzjOAjVuMBgPmTy N0WbswDFp X-Received: from plbjz7.prod.google.com ([2002:a17:903:4307:b0:2b0:b410:3605]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ced1:b0:2bd:5ab:af95 with SMTP id d9443c01a7336-2c1634f9212mr58595075ad.0.1780538555986; Wed, 03 Jun 2026 19:02:35 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:28 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-7-jrhilke@google.com> Subject: [PATCH v5 06/21] KVM: selftests: Add helper to get host IRQ from device MSIX for IRQ bypass test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Introduce proc_util.c and proc_util.h to house utility functions for interacting with the proc filesystem. Add vfio_msix_to_host_irq(), which parses /proc/interrupts to map a VFIO device BDF and MSI-X vector to its corresponding host IRQ number. This helper will be used in a subsequent patch for debugging when implementing support for IRQ bypass in the KVM IRQ test. Suggested-by: Sean Christopherson Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../testing/selftests/kvm/include/proc_util.h | 9 +++++ tools/testing/selftests/kvm/lib/proc_util.c | 40 +++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 tools/testing/selftests/kvm/include/proc_util.h create mode 100644 tools/testing/selftests/kvm/lib/proc_util.c diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index b859098121c7..63355b56c42f 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -11,6 +11,7 @@ LIBKVM +=3D lib/kvm_util.c LIBKVM +=3D lib/lru_gen_util.c LIBKVM +=3D lib/memstress.c LIBKVM +=3D lib/guest_sprintf.c +LIBKVM +=3D lib/proc_util.c LIBKVM +=3D lib/rbtree.c LIBKVM +=3D lib/sparsebit.c LIBKVM +=3D lib/test_util.c diff --git a/tools/testing/selftests/kvm/include/proc_util.h b/tools/testin= g/selftests/kvm/include/proc_util.h new file mode 100644 index 000000000000..704839b6d7af --- /dev/null +++ b/tools/testing/selftests/kvm/include/proc_util.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef SELFTEST_KVM_PROC_UTIL_H +#define SELFTEST_KVM_PROC_UTIL_H + +#include + +unsigned int vfio_msix_to_host_irq(const char *vfio_device_bdf, int msix); + +#endif /* SELFTEST_KVM_PROC_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/proc_util.c b/tools/testing/se= lftests/kvm/lib/proc_util.c new file mode 100644 index 000000000000..84d30f055a0a --- /dev/null +++ b/tools/testing/selftests/kvm/lib/proc_util.c @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "kvm_util.h" +#include "test_util.h" +#include "proc_util.h" + +static FILE *open_proc_interrupts(void) +{ + FILE *fp; + + fp =3D fopen("/proc/interrupts", "r"); + TEST_ASSERT(fp, "fopen(/proc/interrupts) failed"); + + return fp; +} + +unsigned int vfio_msix_to_host_irq(const char *device_bdf, int msix) +{ + char search_string[64]; + char line[4096]; + int irq =3D -1; + FILE *fp; + + fp =3D open_proc_interrupts(); + + snprintf(search_string, sizeof(search_string), "vfio-msix[%d]", msix); + + while (fgets(line, sizeof(line), fp)) { + if (strstr(line, device_bdf) && strstr(line, search_string)) { + TEST_ASSERT_EQ(1, sscanf(line, "%d:", &irq)); + break; + } + } + + fclose(fp); + + TEST_ASSERT(irq !=3D -1, "Failed to locate IRQ for %s %s", device_bdf, + search_string); + return (unsigned int)irq; +} + --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 E04CB2F7F07 for ; Thu, 4 Jun 2026 02:02:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538560; cv=none; b=icOzUVMiBH25VHAzGNOaa+9s66FH5ihj01NV9guNhEgDSV1Ay6Zu2UVteWRK0xrYUyDz/1XfyrslOh8RgXyznsY1Cup3yf4bG/gkVhJ+RYQXHXfUFb0QZTDLTWceMns8jYMNXVoSmZ25KX+Av3SaI9NvG7eHYD1IuYmymYFqYs8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538560; c=relaxed/simple; bh=zrNl+JH8vjU7uSPg+JCRyB18yy5SlEyRLk6yM7c1Wvg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PA2i4wmGBcjuCERcnIsCgddyZhYk/WJkQrw8wOKLq68oprD86bjeKNylbzsoZCJAAUWBhlMeR+omv6bNvF0H1by9BGkqt+31y/ehL6hrDM+V9VlD1kAD5CpbBWrzVD3sJh109M43Q0fGX+P7wdPyAKc9X45Ad7S2Jli+qkzR+rU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=v/VxyUo2; arc=none smtp.client-ip=209.85.215.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="v/VxyUo2" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c856470fe9fso151164a12.2 for ; Wed, 03 Jun 2026 19:02:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538557; x=1781143357; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=IXCqa1BPoqbMNgkQEA2NIjwyLKz0tdvhhBmIxPnEIvI=; b=v/VxyUo29SSiq2zFFq/VsOunEQlKDLA6r763+TMMy3gqDmf1xgJE6eyyWvaY7SqdO0 KJjJSH6+vj2KlMjkZng2gnpYUoU6OI8d37xvre6T6SK60VL+Y/CQlEfmnsn28LK5aO2o 8XW+IKpLtt69w2/xrvqHcPR5vZdtwqnRiYf8k7c+lvOhdEwb0kk76FwVD/jqX2NTRK// 4FHSwiYey2QZhPHwwn5jm6OnlKIGvfpLMHTRAXRtMNtdTSiCS1vb/Bg3oVlQpedZhWXz Y6xvnU/sTIoqKUGYRYUDgun5dji8fvyri7qNYjEayYsR7cCpcMfEsOz2ski8wQ6W/pFU PYHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538557; x=1781143357; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=IXCqa1BPoqbMNgkQEA2NIjwyLKz0tdvhhBmIxPnEIvI=; b=R3KS+qGyXBsE3I1BjhipvsHy6vEFwqCRp7/w7J+1vsc10C/1wJIz+3Y9qwPFocqaYo L571vH4KHrGyaBByVF7TBR0RA2gRDUvFSa1szkpq0mKBiELZWQs5BLf+m1pXvXR7KBKi 20GIHlVaax2irNNt2Uu+p/dMZMAXRb7wv9rw0y07y8rWh5JFfNLnQX6JAYYTf+vKPEF5 34Tc2seIniULwzkZor5/aOGkFccdXh2sQ2XKCbHMjhXMFkNfxhUySnb/PKKavRxYYsuN cEOcJMp6Tpt61O95s1NXztZVNbgp5Q4TM+kPTh4j8+nU8ywEXewkoa2pC+8VI07UP1w/ GLNQ== X-Forwarded-Encrypted: i=1; AFNElJ9KiEEsL3Q70j83QEkkTm0rdAVsKAd/0crs6WXHNP8vfTSMJYY3wLZ3UIo1uJedFd4N8wzJ5HErW+kICX8=@vger.kernel.org X-Gm-Message-State: AOJu0YzANe9XV6+L4PL+6FuI0RB1JMRjhCaf4IOwZVWvhWwSq/AH/03L nhN8T9CT5/K9BNvYa+zrLmQgPf/opSCNviAulOVhUobCa5FmENxweTooHJYUagaOjQKJ0O3rAkh BpRB9MWSh X-Received: from pgar22.prod.google.com ([2002:a05:6a02:2e96:b0:c85:b75b:a85d]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:7314:b0:3a3:171f:6aff with SMTP id adf61e73a8af0-3b497348e84mr6333680637.2.1780538556829; Wed, 03 Jun 2026 19:02:36 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:29 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-8-jrhilke@google.com> Subject: [PATCH v5 07/21] KVM: selftests: Verify IRQ bypass works in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Trigger interrupts from a VFIO device instead of emulating interrupts using KVM eventfds. This verifies that guests receive interrupts via IRQ bypass. Add a '-d' argument to tools/testing/selftests/kvm/irq_test which takes the segment:bus:device.function number of a PCI device bound to VFIO which will trigger interrupts. The device must have a VFIO selftest driver in order to work with the test. Example: $ ./tools/testing/selftests/kvm/irq_test -d 0000:06:0a.1 Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 64 +++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index d3fee51cf451..5b42d8abd1ea 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -1,14 +1,17 @@ // SPDX-License-Identifier: GPL-2.0 #include "kvm_util.h" #include "test_util.h" +#include #include "apic.h" #include "processor.h" +#include "proc_util.h" =20 #include #include #include #include #include +#include =20 static u64 timeout_ns =3D 2ULL * 1000 * 1000 * 1000; static bool guest_ready_for_irqs[KVM_MAX_VCPUS]; @@ -55,6 +58,36 @@ static void *vcpu_thread_main(void *arg) return NULL; } =20 +static int vfio_setup_msi(struct vfio_pci_device *device) +{ + const int flags =3D MAP_SHARED | MAP_ANONYMOUS; + const int prot =3D PROT_READ | PROT_WRITE; + struct dma_region *region; + + /* A driver is required to generate an MSI. */ + TEST_REQUIRE(device->driver.ops); + + /* Set up a DMA-able region for the driver to use. */ + region =3D &device->driver.region; + region->iova =3D 0; + region->size =3D SZ_2M; + region->vaddr =3D kvm_mmap(region->size, prot, flags, -1); + TEST_ASSERT(region->vaddr !=3D MAP_FAILED, "mmap() failed\n"); + iommu_map(device->iommu, region); + + vfio_pci_driver_init(device); + return device->driver.msi; +} + +static void trigger_interrupt(struct vfio_pci_device *device, int eventfd) +{ + if (device) + vfio_pci_driver_send_msi(device); + else + eventfd_write(eventfd, 1); +} + + static void kvm_route_msi(struct kvm_vm *vm, u32 gsi, struct kvm_vcpu *vcp= u, u8 vector) { @@ -76,9 +109,10 @@ static void kvm_route_msi(struct kvm_vm *vm, u32 gsi, s= truct kvm_vcpu *vcpu, =20 static void help(const char *name) { - printf("Usage: %s [-h]\n", name); + printf("Usage: %s [-d ] [-h]\n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); + printf("-d Use a VFIO device to send MSI-X interrupts instead of using an= emulated eventfd\n"); printf("\n"); exit(KSFT_FAIL); } @@ -100,14 +134,21 @@ int main(int argc, char **argv) u32 gsi =3D kvm_random_u64_in_range(&kvm_rng, 24, KVM_MAX_IRQ_ROUTES - 1); u8 vector =3D kvm_random_u64_in_range(&kvm_rng, 32, UINT8_MAX); =20 - struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; pthread_t vcpu_threads[KVM_MAX_VCPUS]; + struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; + struct vfio_pci_device *device =3D NULL; int nr_irqs =3D 1000, nr_vcpus =3D 1; - int i, j, c, eventfd; + const char *device_bdf =3D NULL; + int i, j, c, msix, eventfd; + struct iommu *iommu; struct kvm_vm *vm; + unsigned int irq; =20 - while ((c =3D getopt(argc, argv, "h")) !=3D -1) { + while ((c =3D getopt(argc, argv, "d:h")) !=3D -1) { switch (c) { + case 'd': + device_bdf =3D optarg; + break; case 'h': default: help(argv[0]); @@ -119,7 +160,17 @@ int main(int argc, char **argv) vm =3D vm_create_with_vcpus(nr_vcpus, guest_code, vcpus); vm_install_exception_handler(vm, vector, guest_irq_handler); =20 - eventfd =3D kvm_new_eventfd(); + if (device_bdf) { + iommu =3D iommu_init(default_iommu_mode); + device =3D vfio_pci_device_init(device_bdf, iommu); + msix =3D vfio_setup_msi(device); + irq =3D vfio_msix_to_host_irq(device_bdf, msix); + eventfd =3D device->msi_eventfds[msix]; + printf("Using device %s MSI-X[%d] (IRQ-%u)\n", device_bdf, msix, + irq); + } else { + eventfd =3D kvm_new_eventfd(); + } =20 printf("Injecting interrupts for GSI %d (Vector 0x%x) %d times\n", gsi, vector, nr_irqs); @@ -147,8 +198,7 @@ int main(int argc, char **argv) "IRQ flag for vCPU %d not clear prior to test", vcpus[j]->id); =20 - /* Trigger interrupt */ - eventfd_write(eventfd, 1); + trigger_interrupt(device, eventfd); =20 clock_gettime(CLOCK_MONOTONIC, &start); for (;;) { --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 01EC42FD66D for ; Thu, 4 Jun 2026 02:02:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538561; cv=none; b=IeQDU6l3rt+k/z9n5OArTAnCVugH6RRrl0SNEy2ejbeWijl4QVYs7NkWYKemuoqOZRlAZT55LarJer+mEi4EeFJU52d2QQTLPexgUKsaViyPC7pnOBIkqmbZYy+GHmZqcFLc5WG/382AtpL0eJgYvXzn9c3X7hLwLrDVS/b8fhw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538561; c=relaxed/simple; bh=Akg7uDy8uCv9ylirquc/PbBEBGK/tcTZW1e4HinXOvA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uwEl18ctS9QWxOAzghyd0cNHHIbol7QHseRexkZa+gg4AgxIH7N1DLdn6PN9QSKSqP2fgjNIZsn/XvJBsVTfYU/NgODFhNiD1JaFhrcxSKvnfDHnzCysihtFMqh5LvkTnTE86cIpzn7y768JZppK1fLeXFKejdcIRC99vq849OI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Vdzp4pCK; arc=none smtp.client-ip=209.85.210.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Vdzp4pCK" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-84247fed609so103232b3a.0 for ; Wed, 03 Jun 2026 19:02:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538558; x=1781143358; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=zuauJPm4nQ0ZwfBb9tD3L8vaie4FQapEWd+GJSZqVZo=; b=Vdzp4pCKrDmGD/4sCNVxBWaerDYv5Ds94hJ09oFIKS4wfgTm/jvq0q2r2T4s9U74Mo fyZJFxKbkz1KHPpSrMiWsRP9YNS9H/1Kgj6kW+wUvbd+/yV9xhmQjxjoT7ELV7ZNMkIF lm9PV4E7no2zKUeR6cNekms8YDxlWkrAzzRh0GsHavvKhqqAiH0rnfBIklHf3miA5lpc 8BXSSoBM1zNEXWZc6IBbFRVwhDaqYUcMGKwnZePA/6D8JGrpyIVDwiBQ4zE2QtOmKd84 Xsp+sxsGVM/ZSFrFa2fL4KM7qvyFFK3EfftILM2qB5SnHk6Gtvp/IU7tW7hZiGUd7tYU vFhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538558; x=1781143358; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=zuauJPm4nQ0ZwfBb9tD3L8vaie4FQapEWd+GJSZqVZo=; b=Zv3xMhE1lAROriRXT6m/Aukw8QIa6AB4SOpKQ8ayIh6BN5YZtVF0UnvWGhiXll53+R T2NkUz91qL4A/LdjAbyPCl6+/vCd29SaDb1mGU/6nVgW9Uil1kkgc7czjMbAY+IbAcoY 18lT/a2S8gTJCnRSi/Y+H7fGPs5m2b8A1VfJa4ynOnp4s+9N1SXSTqqRVWhLn5fBIXxy WPpa2CLqznhs2TPwczfDBTpN8EuTukAmY8j4wS5LEFhCRQRU9BQEYfQAt2EtDfxl/0x5 +X6s5CY0VCPMPIXQaFpRQTzS1B7RsqaSmgfuL5T3rsY+iD24h9cyU+bkI4op9EIBpfNa 4M1g== X-Forwarded-Encrypted: i=1; AFNElJ/SNti4M13UV+WIPSTHUfNYvTUK8wCxoN0zUGf1zx6w2Wky1abY5RZhnT2RvWoJ1jR3vcmUAQRdXjEHwx0=@vger.kernel.org X-Gm-Message-State: AOJu0YzwrfGFy85KSe/JVQ184DgWwng2KkwkIKd5WHGs0WzlKz41PoTY d7cQZLkqCVCPLlcugNXdmdZds5wnQpH1ViaCekMdNYTRZ+iCVGGqYt43k2XAc5dcIcRcGE0UKr6 Aw5xvG/Mm X-Received: from pfbcz12.prod.google.com ([2002:aa7:930c:0:b0:82f:c134:e67c]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:14d0:b0:842:5b63:610f with SMTP id d2e1a72fcca58-84284db9952mr5753760b3a.4.1780538557745; Wed, 03 Jun 2026 19:02:37 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:30 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-9-jrhilke@google.com> Subject: [PATCH v5 08/21] KVM: selftests: Add helpers to write proc IRQ affinity for IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce utility functions to open and write IRQ affinity settings via the proc filesystem. Specifically, add: - open_proc_irq_smp_affinity_list() to open /proc/irq//smp_affinity_list for writing. - write_proc_irq_smp_affinity_list() to write a target CPU to the list. These will be used a subsequent patch to set IRQ affinity in the KVM IRQ test. Signed-off-by: Josh Hilke --- .../testing/selftests/kvm/include/proc_util.h | 2 ++ tools/testing/selftests/kvm/lib/proc_util.c | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/tools/testing/selftests/kvm/include/proc_util.h b/tools/testin= g/selftests/kvm/include/proc_util.h index 704839b6d7af..e381c7818275 100644 --- a/tools/testing/selftests/kvm/include/proc_util.h +++ b/tools/testing/selftests/kvm/include/proc_util.h @@ -6,4 +6,6 @@ =20 unsigned int vfio_msix_to_host_irq(const char *vfio_device_bdf, int msix); =20 +FILE *open_proc_irq_smp_affinity_list(unsigned int irq); +void write_proc_irq_smp_affinity_list(FILE *fp, unsigned int irq, int irq_= cpu); #endif /* SELFTEST_KVM_PROC_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/proc_util.c b/tools/testing/se= lftests/kvm/lib/proc_util.c index 84d30f055a0a..938c90d94f4d 100644 --- a/tools/testing/selftests/kvm/lib/proc_util.c +++ b/tools/testing/selftests/kvm/lib/proc_util.c @@ -38,3 +38,23 @@ unsigned int vfio_msix_to_host_irq(const char *device_bd= f, int msix) return (unsigned int)irq; } =20 +FILE *open_proc_irq_smp_affinity_list(unsigned int irq) +{ + char path[PATH_MAX]; + FILE *fp; + + snprintf(path, sizeof(path), "/proc/irq/%u/smp_affinity_list", irq); + fp =3D fopen(path, "w"); + TEST_ASSERT(fp, "fopen(%s) failed", path); + + return fp; +} + +void write_proc_irq_smp_affinity_list(FILE *fp, unsigned int irq, int irq_= cpu) +{ + int ret; + + ret =3D fprintf(fp, "%d\n", irq_cpu); + TEST_ASSERT(ret > 0, "Failed to affinitize IRQ-%u to CPU %d", irq, irq_cp= u); + fflush(fp); +} --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 C2E8C3009E1 for ; Thu, 4 Jun 2026 02:02:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538561; cv=none; b=ASRaz8R+ck5uy8UrVBollPen+35/QxzC0lSQAF8HybBpXBUXTJnyZ4Q7nD1UgGDYGEoks4BVGquazKK7dd5sGjVNXjEidr1Ho+5K41leCy5seGJGstApq4iXOML2mti3CYIJWjP6nCrIIzHJqEfeUd9MYeqnhSfhmTw8SLjcFcI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538561; c=relaxed/simple; bh=357VVeIrXR6dbg7uGxJiw0VSZk3D5cAAKZ5UNFn6RG0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IyRCe78seY5WG2OniQpT/qLZi+3O/YosgW9QAF1HydKhhm+RMRuoDCCLKMURkk4uY0rCaJBHeLDMHHz2N+nbeVPaoiIEA8lxzgYUQ9SqZg3v2YyaW0DnMF3W59dJ5r7KoSZK3PsSNah+fmSPy14RlaVoomNhHHj5pgw1NZP3H9I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nIWLJMmI; arc=none smtp.client-ip=209.85.214.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nIWLJMmI" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2bf11699875so1784285ad.1 for ; Wed, 03 Jun 2026 19:02:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538559; x=1781143359; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=VA79vH7fXggfPqq1ZwFhX0JPUzy2i6GiJJnFBzPgRwU=; b=nIWLJMmIC5tWUwSZIHIFaVYhlT/07084uDqeFSszWI+tbkr9Rsc0ghNySbZ5Fi0b7s F+dXWKJqXJFNVF5piV9FvEYXSi5i6koegBRlIzjyYUb+HO5+0cNNnNo7CseEFmgF90zf Yjx6lWgdwUlNI0cSTsITN3q2/mIek/kl5TLCaevFCcIj8xkeS+NdgCqQruMPgdQljv2y 4/Cclobhd9DpqerrHJXmdXkPRoCorpevT6npPDNPHqYkgeNM5+hvj5A2hlEoPxWh5Jxi Y03Nn8ry7ThPe6LcqcWSXKEz8sSnDTzVPKpEjIZB9DIRdSM8Iw0JRXPZMPE/Iw8HzPrU Ph7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538559; x=1781143359; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=VA79vH7fXggfPqq1ZwFhX0JPUzy2i6GiJJnFBzPgRwU=; b=WGtIZhcDtDFYefgEHzFxdlFGWJeJpUslxovCKXnOcHb3wHNjT6YU9Xn6rGtugqCZk+ YBTIqiiTBRTpeswm7uUaEOHLAbGV1grI6WCjcTJCmyz6pu1ZCglSQWsJglUwSRxTZVGd In5BSq6eGeKtRYMLWNq+skZt7TdshWNBNNeyN7ztZQ4PSI681EE7AZtv/Dp6pMrHTBhI rtZjOX+Et8+xHLSRaRsNYYgl8AD0HYjOO6XMLLgJ3LPGDO7nuXosr2t+OQLtM5AR4hsY s4wsoDYK0Rv23RTgXmPJRc+yxKPDIwSgh+SffiFPxPOAikeaJKdURz/qT73OoAwQki5A B4Gw== X-Forwarded-Encrypted: i=1; AFNElJ+DKHHCb0vaQDD7CRgjaaKPWnE1T2SOGtrIzNIHFIUeGf7uLG9Tf/glGwyZ+frysY9rJ0GZQQR1VQav+rM=@vger.kernel.org X-Gm-Message-State: AOJu0Yzr+s4oByduF+fGCCB91fTuQ6ob+IevkREouKk+z2clPMsVWfEV OK/NBJ7KKJj1W0edb69tMXXQtThvcbHBtl4FdJazxtUaWt0qmJhPE1YO0rUaCZOiC9lbR/SSg/H usd/IH/eq X-Received: from plbkp13.prod.google.com ([2002:a17:903:280d:b0:2b7:c361:c75c]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:820e:b0:2c0:a858:8128 with SMTP id d9443c01a7336-2c197b1805fmr9970625ad.1.1780538558643; Wed, 03 Jun 2026 19:02:38 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:31 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-10-jrhilke@google.com> Subject: [PATCH v5 09/21] KVM: selftests: Add helpers to print proc IRQ affinity for IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce utility functions to print IRQ affinity settings (smp_affinity and effective_affinity) via the proc filesystem. Specifically, add: - print_proc_irq_smp_affinity() and print_proc_irq_effective_affinity() to print the current affinity states. These helpers will be used in subsequent patches to print affinity settings for debugging in the KVM IRQ test when timeouts occur. Signed-off-by: Josh Hilke --- .../testing/selftests/kvm/include/proc_util.h | 4 +++ tools/testing/selftests/kvm/lib/proc_util.c | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tools/testing/selftests/kvm/include/proc_util.h b/tools/testin= g/selftests/kvm/include/proc_util.h index e381c7818275..e0e8f29c570c 100644 --- a/tools/testing/selftests/kvm/include/proc_util.h +++ b/tools/testing/selftests/kvm/include/proc_util.h @@ -8,4 +8,8 @@ unsigned int vfio_msix_to_host_irq(const char *vfio_device_= bdf, int msix); =20 FILE *open_proc_irq_smp_affinity_list(unsigned int irq); void write_proc_irq_smp_affinity_list(FILE *fp, unsigned int irq, int irq_= cpu); + +void print_proc_irq_smp_affinity(unsigned int irq); +void print_proc_irq_effective_affinity(unsigned int irq); + #endif /* SELFTEST_KVM_PROC_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/proc_util.c b/tools/testing/se= lftests/kvm/lib/proc_util.c index 938c90d94f4d..24a8de92e229 100644 --- a/tools/testing/selftests/kvm/lib/proc_util.c +++ b/tools/testing/selftests/kvm/lib/proc_util.c @@ -58,3 +58,33 @@ void write_proc_irq_smp_affinity_list(FILE *fp, unsigned= int irq, int irq_cpu) TEST_ASSERT(ret > 0, "Failed to affinitize IRQ-%u to CPU %d", irq, irq_cp= u); fflush(fp); } + +static void print_proc_irq_file(unsigned int irq, const char *file) +{ + char path[PATH_MAX]; + char buf[256]; + FILE *fp; + + snprintf(path, sizeof(path), "/proc/irq/%u/%s", irq, file); + fp =3D fopen(path, "r"); + if (!fp) { + printf(" Failed to open %s\n", path); + return; + } + + if (fgets(buf, sizeof(buf), fp)) { + buf[strcspn(buf, "\n")] =3D 0; + printf(" %s: %s\n", path, buf); + } + fclose(fp); +} + +void print_proc_irq_smp_affinity(unsigned int irq) +{ + print_proc_irq_file(irq, "smp_affinity"); +} + +void print_proc_irq_effective_affinity(unsigned int irq) +{ + print_proc_irq_file(irq, "effective_affinity"); +} --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 81B63305662 for ; Thu, 4 Jun 2026 02:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538562; cv=none; b=qxzub+tdN0q5/qaIqxyGK35ADRs+329Hgzj5d9WfDN2myWYfoyN9F064fAufQd7MF/MLyccIOJFIW4lyEp6fNdwrY5rgBNg6FVPvYsBRBjeHM6HZvcJcUx7evBMypf4ZLvN09HqDj3kZQGuUFJSErUBPQDqGgpoliGtSd1fXS1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538562; c=relaxed/simple; bh=dUckI3ACUlNVyG05qKIZGA7lEqMu1UN6inzd36IVR1s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=BD6LHUeBfZeGvu5SBMladD4OJWgYPJunvvRmkkry1313eDao5vSvNsSioHtW/GM8r2LiVJeV/iw1hQ7s0zynRx9VTNH0MY7hWEH+lnU3Tzw7cyaxeVPdi1b/DaGFC8mObDlMNpmurOzFfDLVJ7ODJ9B2EHrZw6S9i6ACg7lOnqE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fUwio3O1; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fUwio3O1" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c0c331eda3so2563145ad.2 for ; Wed, 03 Jun 2026 19:02:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538560; x=1781143360; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=aHBO3SD4MRwFGdf7qbVZzQxys78yaiEUcI+94zXfzD4=; b=fUwio3O1IcEO86R9TTkF0atiMhR7qq2BC/P8Im1uXSKeymAI73l2o7+PUOtUZiXb/h Xc2TKYG6Zk6J7JiK1XYQzXrs8BKEE2UfypyvKeOx8ZCRDzT+M6DlyqWn7TiSNHjYRuzf g+zmSJo0MVL1d2vlFUs8ldbKZA8Lnsl0jhDNEziuGjaBn/1nZlLAIAKmZCVHM2BRAaxd 5tfGrC4X1mYjxmCEAoGs9Xi3LAVlv7dC+dpKdSZbwel8NpQt4TDeHUpz35Mh+Ka/gapA BzvpAyLKgaB6rtzzLELkf34NOwQMbLQ+umiyqfi9Z3xMXQagioUg+BtEZxkmZm0b6ptO q44g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538560; x=1781143360; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=aHBO3SD4MRwFGdf7qbVZzQxys78yaiEUcI+94zXfzD4=; b=byrDCfUE+/76uP7SgZSL/UmOouQkaH4DBrBo/XPd5JQz0uFdqs3RCsDjGBvrMIoFhJ dw66C8i0JuiV/XmTIIlfGqhGrfyjJOpz0qnMJ5tGqD3hPQliDKbn5xExQ5BvtIqYt0IP pA0JLMCqELdHEcnb5yCiTHgxQmkHsLW9aWucOz0w/AN/A6mtixmLPxAMckYpcEhl7K8f BPGt7MFtRcq9B+dl9/8V/xEn6qGsHrg1DbSABTP6JFG35Micz+Ar8osbKYXFTaJMeiRk 9SkeTTx2TIg9/5D4laCN0coUNSV5Ijy5tMjUIyqjIp5VHiO8MetqXjDaGeqBnScq61NE 2lTQ== X-Forwarded-Encrypted: i=1; AFNElJ9TIjSEmbSMvqENXINNbaBuTGr+3IGnaOQq7nbVaISEevZAwlTm4kVrTJzR6yGnZiravw9un0sJlmJpxqI=@vger.kernel.org X-Gm-Message-State: AOJu0YwMm2EG67r/exZWp3ie88uxVwkPtGhpwEP9eI69p2PPTaB8E0Gj pJJ00qn+U+l1E+KIPsLY8a1ussm+4pJSAui4wxzY0BOmWXKNPpZD+Ll1KKP8A+ANXLfh7nBD/Xz RxQ3AqaDJ X-Received: from plav20.prod.google.com ([2002:a17:902:f0d4:b0:2bf:1a98:5111]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:11d0:b0:2b2:5515:661c with SMTP id d9443c01a7336-2c1644add6emr69532855ad.31.1780538559512; Wed, 03 Jun 2026 19:02:39 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:32 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-11-jrhilke@google.com> Subject: [PATCH v5 10/21] KVM: selftests: Verify interrupts are received when IRQ affinity changes in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add the '-a' flag to tools/testing/selftests/kvm/irq_test.c to randomly affinitize the device's host IRQ to different physical CPUs throughout the test. This stresses the kernel's ability to maintain correct interrupt routing and delivery even as the underlying hardware IRQ affinity is changed dynamically via /proc/irq/. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 41 ++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 5b42d8abd1ea..90cff165c351 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -11,11 +11,13 @@ #include #include #include +#include #include =20 static u64 timeout_ns =3D 2ULL * 1000 * 1000 * 1000; static bool guest_ready_for_irqs[KVM_MAX_VCPUS]; static bool guest_received_irq[KVM_MAX_VCPUS]; +static bool irq_affinity; static bool done; =20 #define GUEST_RECEIVED_IRQ(__vcpu) \ @@ -109,9 +111,10 @@ static void kvm_route_msi(struct kvm_vm *vm, u32 gsi, = struct kvm_vcpu *vcpu, =20 static void help(const char *name) { - printf("Usage: %s [-d ] [-h]\n", name); + printf("Usage: %s [-a] [-d ] [-h]\n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); + printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); printf("-d Use a VFIO device to send MSI-X interrupts instead of using an= emulated eventfd\n"); printf("\n"); exit(KSFT_FAIL); @@ -139,13 +142,18 @@ int main(int argc, char **argv) struct vfio_pci_device *device =3D NULL; int nr_irqs =3D 1000, nr_vcpus =3D 1; const char *device_bdf =3D NULL; + FILE *irq_affinity_fp =3D NULL; int i, j, c, msix, eventfd; struct iommu *iommu; struct kvm_vm *vm; unsigned int irq; + int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "d:h")) !=3D -1) { + while ((c =3D getopt(argc, argv, "ad:h")) !=3D -1) { switch (c) { + case 'a': + irq_affinity =3D true; + break; case 'd': device_bdf =3D optarg; break; @@ -168,7 +176,11 @@ int main(int argc, char **argv) eventfd =3D device->msi_eventfds[msix]; printf("Using device %s MSI-X[%d] (IRQ-%u)\n", device_bdf, msix, irq); + if (irq_affinity) + irq_affinity_fp =3D open_proc_irq_smp_affinity_list(irq); } else { + TEST_ASSERT(!irq_affinity, + "Setting IRQ affinity (-a) requires a backing device (-d)"); eventfd =3D kvm_new_eventfd(); } =20 @@ -187,12 +199,23 @@ int main(int argc, char **argv) continue; } =20 + /* + * Suppress a false positive maybe-uninitialized compiler warning due + * to conditional changes in IRQ affinity. + */ + irq_cpu =3D -1; + for (i =3D 0; i < nr_irqs; i++) { struct kvm_vcpu *vcpu =3D vcpus[i % nr_vcpus]; struct timespec start; =20 kvm_route_msi(vm, gsi, vcpu, vector); =20 + if (irq_affinity_fp) { + irq_cpu =3D kvm_random_u64(&kvm_rng) % get_nprocs(); + write_proc_irq_smp_affinity_list(irq_affinity_fp, irq, irq_cpu); + } + for (j =3D 0; j < nr_vcpus; j++) TEST_ASSERT(!GUEST_RECEIVED_IRQ(vcpus[j]), "IRQ flag for vCPU %d not clear prior to test", @@ -205,9 +228,18 @@ int main(int argc, char **argv) if (GUEST_RECEIVED_IRQ(vcpu)) break; =20 - if (timespec_to_ns(timespec_elapsed(start)) > timeout_ns) + if (timespec_to_ns(timespec_elapsed(start)) > timeout_ns) { + printf("Timeout waiting for interrupt!\n"); + printf(" vCPU: %d\n", vcpu->id); + if (irq_affinity_fp) { + printf(" irq_cpu: %d\n", irq_cpu); + print_proc_irq_smp_affinity(irq); + print_proc_irq_effective_affinity(irq); + } + TEST_FAIL("vCPU %d timed out waiting for IRQ from GSI %d (Vector 0x%x)= !\n", vcpu->id, gsi, vector); + } } =20 WRITE_AND_SYNC_TO_GUEST(vm, guest_received_irq[vcpu->id], false); @@ -218,6 +250,9 @@ int main(int argc, char **argv) for (i =3D 0; i < nr_vcpus; i++) pthread_join(vcpu_threads[i], NULL); =20 + if (irq_affinity_fp) + fclose(irq_affinity_fp); + printf("Test passed!\n"); =20 return 0; --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 5A1A93090F5 for ; Thu, 4 Jun 2026 02:02:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538563; cv=none; b=Y4kFFTwdLF7CVWIRHaNG4HU6NTAUVdYTeszKqheVYWdTyqHz6LD2gf9TIP4lbl4QVIs0u7n5Ufhsfl1RJrHEv52ZTwVNed+NIpg67H1Qyb0YQ/97PJA+6rjXaXpfZXHFrgH2Ut7jEH+BMZWCPwdmEiC38QSbwDBRLLhvL3E9VsE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538563; c=relaxed/simple; bh=Tb1R8hwuQeOGJxffwS4UIjMZE/aEURFAC4KNqncaAaQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Hrjcr0Lua+gIPLnPYrAV3iaMWsoFsx1HFuvCBkyRv1DaCg1s/9/YRpQwVwR08SvnbStJuHesWweEqfMcxFOid+9n+mOZ8ftJuZpP2CXHURUA9WZbm4k4bazH2SDTrlCACFfgV90UBI+ihjoGVD6PVk/Z+bqjcJS7p25/4kZDxCk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=wZLFauFo; arc=none smtp.client-ip=209.85.210.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="wZLFauFo" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-842208d5b0eso141186b3a.3 for ; Wed, 03 Jun 2026 19:02:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538560; x=1781143360; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=itG+D7AxupPQwpNksfcEcO1SGnYBQBG/etMeZBVU8Kw=; b=wZLFauForo+x25pWpCwmLdafpid+ULgvIPEVXGtRNFdQBjUKhJCzqqWxSJN/ZhU/i0 9NfeE2YqB4VUNqHfBJWySplqC4f4CypLwL9YZXhBRrTkRxWEo/hDEyheLLBH0bUKRLrf q6WYZ0VDsEuboCRPVE1cQNWpHHCNt0RxZOITRRAX56bzqpFNAXEe3cWUFSx4RubS5blQ NjKDsCfDr79BLFBf/9igfSEB+uxl13WUWb3cmFk8bR4XONc7Cj/AjyeLUGYtJ1b+xoW3 YmrKXG+pxj+12yv3cZW0O9HdwRZmtJCURoXxJHaLZh46wlQAfTybqoiAqWYRLhbQA70B E7qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538560; x=1781143360; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=itG+D7AxupPQwpNksfcEcO1SGnYBQBG/etMeZBVU8Kw=; b=GA7rbHrza8rcVLdrn2NUOCtd73I0tFmjKp5pDeSC77yQOQ7ePocduOdEf0H2nERHqg t1XPsGk7kqWJUC9Nv1LzavTzlwEE5rLpj3FSV/0xmWD0Lo1ey7166S3OIw7doXaWxPqq adLnv8cCjE1BNj2ZyLXyxMHiId+z8IVFyBkPd0ghHRGREfaikQbEBskHi8br0ApsQS3J h6hPDi3E6MbGehH/fb37H2/lUMX5QJMYQpH/iCGkilkxZhumIaskYohL8McFVFVZNHul kp/5OZ62jLmEeJb5szpar/WkKzhAw3EyMZs2NJ5CixLWc5c8Atjn4rp0R9yguyxinBSZ VXGw== X-Forwarded-Encrypted: i=1; AFNElJ9FCjD6aB/bKorCocBOu0ZpWpV0yxPIs9qutfZ6uw25XL8lgLMqPYD9gcfiCPq0+IgANTbRtSK3ktmFUdA=@vger.kernel.org X-Gm-Message-State: AOJu0YwpT3VfwYWRhJ79WPTnl+SS/+A7u1aik3ELTrtatv21v5BdUPiU t0DMxo8ZbPqK8UrjTHknUS7UYPo/bCNgeqq47ASB1IT9qkTcRu7Knw766Npp0Q0toW2uzqD9ZTg 6FLL080ov X-Received: from pfbgg3.prod.google.com ([2002:a05:6a00:6303:b0:83a:68c:e1c6]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:288c:b0:842:4b28:d941 with SMTP id d2e1a72fcca58-84284fac281mr5498115b3a.49.1780538560370; Wed, 03 Jun 2026 19:02:40 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:33 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-12-jrhilke@google.com> Subject: [PATCH v5 11/21] KVM: selftests: Verify IRQs wake up halted vCPUs in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add the '-b' flag to tools/testing/selftests/kvm/irq_test.c to verify that interrupts successfully wake up vCPUs that are in a halted state. By default, the guest code spins using cpu_relax() while waiting for interrupts. With the '-b' flag, the guest executes the HLT instruction instead. At the end of the test, the host explicitly routes and triggers a final interrupt for each vCPU. If the interrupt fails to wake the halted vCPU, the guest will never exit its loop, and the host's call to pthread_join() will hang, causing the test to time out and fail. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 32 ++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 90cff165c351..671338f0e612 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -18,6 +18,7 @@ static u64 timeout_ns =3D 2ULL * 1000 * 1000 * 1000; static bool guest_ready_for_irqs[KVM_MAX_VCPUS]; static bool guest_received_irq[KVM_MAX_VCPUS]; static bool irq_affinity; +static bool block_vcpus; static bool done; =20 #define GUEST_RECEIVED_IRQ(__vcpu) \ @@ -43,8 +44,12 @@ static void guest_code(void) =20 WRITE_ONCE(guest_ready_for_irqs[guest_get_vcpu_id()], true); =20 - while (!READ_ONCE(done)) - cpu_relax(); + while (!READ_ONCE(done)) { + if (block_vcpus) + hlt(); + else + cpu_relax(); + } =20 GUEST_DONE(); } @@ -111,10 +116,11 @@ static void kvm_route_msi(struct kvm_vm *vm, u32 gsi,= struct kvm_vcpu *vcpu, =20 static void help(const char *name) { - printf("Usage: %s [-a] [-d ] [-h]\n", name); + printf("Usage: %s [-a] [-b] [-d ] [-h]\n", n= ame); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); + printf("-b Block vCPUs (e.g. HLT) instead of spinning in guest-mode\n"); printf("-d Use a VFIO device to send MSI-X interrupts instead of using an= emulated eventfd\n"); printf("\n"); exit(KSFT_FAIL); @@ -149,11 +155,14 @@ int main(int argc, char **argv) unsigned int irq; int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "ad:h")) !=3D -1) { + while ((c =3D getopt(argc, argv, "abd:h")) !=3D -1) { switch (c) { case 'a': irq_affinity =3D true; break; + case 'b': + block_vcpus =3D true; + break; case 'd': device_bdf =3D optarg; break; @@ -189,6 +198,8 @@ int main(int argc, char **argv) =20 kvm_assign_irqfd(vm, gsi, eventfd); =20 + sync_global_to_guest(vm, block_vcpus); + for (i =3D 0; i < nr_vcpus; i++) pthread_create(&vcpu_threads[i], NULL, vcpu_thread_main, vcpus[i]); =20 @@ -247,8 +258,19 @@ int main(int argc, char **argv) =20 WRITE_AND_SYNC_TO_GUEST(vm, done, true); =20 - for (i =3D 0; i < nr_vcpus; i++) + for (i =3D 0; i < nr_vcpus; i++) { + /* + * Verify that sending an interrupt to a halted vCPU wakes it + * up. If the vCPU does not wake up, the call to pthread_join(), + * below, will hang. + */ + if (block_vcpus) { + kvm_route_msi(vm, gsi, vcpus[i], vector); + trigger_interrupt(device, eventfd); + } + pthread_join(vcpu_threads[i], NULL); + } =20 if (irq_affinity_fp) fclose(irq_affinity_fp); --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 4B54830E828 for ; Thu, 4 Jun 2026 02:02:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538564; cv=none; b=JB6Oe7DZzKC/N0VbJezm3wbp39D8Po0aAa0uF19M/tLxTH261SBKqsgOcHUBs3tq7f8TLpz097ileG+y5ykeMJBSBGMstwmVRF6exxjZgbCmNRyVMdwYbtyljMSXyZ3Mr+9gbeSi7egVbqqQl+KutKZgH2+xvAvyV7W84vjMaoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538564; c=relaxed/simple; bh=6pY+TjgfgssKaHsPAOt61oAMqoFK8eMNXVXJ63J4T+A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gV2mipIFneS1kzBIXFPvCzji8KNAfOF1AptEWogtNsexXjfCW4/XCmf0aR0aBeIJF8umZqavvYoL2M8y9JnOgWiEfqHbzr9WI84jInfzDCPaGTn9x9bAiij9NhRAmW4DmoE8spAS6fSub9KMGGwMHfmzXjBWxL1Q0muVeKKSs4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=L+kq6P/u; arc=none smtp.client-ip=209.85.210.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="L+kq6P/u" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-8422f987f2eso300444b3a.3 for ; Wed, 03 Jun 2026 19:02:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538561; x=1781143361; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=sb3P0p4SrvcVWMWS5X9HlHDW6xjjIovVXgKDqrW/UJ8=; b=L+kq6P/ul9t3/T1vEFDF1tC1db1NknDpmANfE5sEOENDrKMVC5tCp1ax2yhkk4H63T Mo9zOAnQ9EE5ZXfQ6flPRKoYKgj33brZy6R1GazM0wWttepp7CcI0UY0KamitexCi/Tp XbId1VUpEOb2ArJlQJlAuFLWCqm8zAAcUA329rZxqQCXNRCTL2YA7j/QGlRc6uUYuBx2 yZPHw2BcqeOX/M9YDP2bGPCixsNGZJhNOgap7hin5aYaLt2rfTcar3KVnYMjTanJgPTL kqxHmSnqdIfLNpu/3nJL0pPblrMLXDfYGV7VJUlJIOZwpzaiTy69RqnFoU/p2ycmgKtc rnPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538561; x=1781143361; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=sb3P0p4SrvcVWMWS5X9HlHDW6xjjIovVXgKDqrW/UJ8=; b=VBEmeRIXXFjr+X/zfX9V4pUgSXk1RWMCjYxunnvkVmy7ZUva/e1uiWISxpIjhdPAWL 1d9LNitj+dLUTa5ZqbZDwF4Fr22oOPN2+IZw9w2KQaleBiQPa/7G1rA51F+nWTuDJia4 YjV4E90YHW9FFza1yV7E+nb6IhQf7cVNhunjGnK95liGVMWK7CKrOHl29MsvvHwkCe+w n87IIOrb9Qid8tzlEzbEg4rGZfRuKeo0dSgdykG0lNzKBk2wb21KrwNR3GEFusGMphV4 EnHbN1OH9RF4drNGCm3/833LpzFbbpza8ojvTXLABRY9p0c6QPH2/Y6SDkDlBGlCpbXa VPRA== X-Forwarded-Encrypted: i=1; AFNElJ/fzsCySNWiecgxm4pVxvdM8lY/4vCl/nErK/OSZTrkwYQGxGAthRgIVbKN7FVd9LRDxd7vc4xfVahPpvY=@vger.kernel.org X-Gm-Message-State: AOJu0YzH7aXCUzuWs1ItoPQOL/rrFJpjoRvDeJthS22RKJY/AWaHVRUn dE3z/cOj25pBuSh4Cw3ByZ+pmYwX6TXBchTC9nDHGzYWtTb9sJ2SoBfbqKUBJr/4u7EN5xInKY5 Bop4diyTC X-Received: from pfaz8.prod.google.com ([2002:aa7:91c8:0:b0:842:4d1f:7750]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3288:b0:839:44c5:c321 with SMTP id d2e1a72fcca58-84284f128e3mr5571143b3a.44.1780538561215; Wed, 03 Jun 2026 19:02:41 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:34 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-13-jrhilke@google.com> Subject: [PATCH v5 12/21] KVM: selftests: Verify interrupts are received after modifying IRQ routes in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add the '-c' flag to tools/testing/selftests/kvm/irq_test.c to destroy and recreate KVM's GSI routing table between interrupts. This ensures that KVM correctly handles dynamic updates to the interrupt routing table while interrupts are actively being signaled by assigned devices. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 671338f0e612..b0c4547a7f14 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -114,13 +114,21 @@ static void kvm_route_msi(struct kvm_vm *vm, u32 gsi,= struct kvm_vcpu *vcpu, vm_ioctl(vm, KVM_SET_GSI_ROUTING, routes); } =20 +static void kvm_clear_gsi_routes(struct kvm_vm *vm) +{ + struct kvm_irq_routing routes =3D {}; + + vm_ioctl(vm, KVM_SET_GSI_ROUTING, &routes); +} + static void help(const char *name) { - printf("Usage: %s [-a] [-b] [-d ] [-h]\n", n= ame); + printf("Usage: %s [-a] [-b] [-c] [-d ] [-h]\= n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); printf("-b Block vCPUs (e.g. HLT) instead of spinning in guest-mode\n"); + printf("-c Destroy and recreate KVM's GSI routing table in between some i= nterrupts\n"); printf("-d Use a VFIO device to send MSI-X interrupts instead of using an= emulated eventfd\n"); printf("\n"); exit(KSFT_FAIL); @@ -150,12 +158,13 @@ int main(int argc, char **argv) const char *device_bdf =3D NULL; FILE *irq_affinity_fp =3D NULL; int i, j, c, msix, eventfd; + bool clear_routes =3D false; struct iommu *iommu; struct kvm_vm *vm; unsigned int irq; int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "abd:h")) !=3D -1) { + while ((c =3D getopt(argc, argv, "abcd:h")) !=3D -1) { switch (c) { case 'a': irq_affinity =3D true; @@ -166,6 +175,9 @@ int main(int argc, char **argv) case 'd': device_bdf =3D optarg; break; + case 'c': + clear_routes =3D true; + break; case 'h': default: help(argv[0]); @@ -217,9 +229,13 @@ int main(int argc, char **argv) irq_cpu =3D -1; =20 for (i =3D 0; i < nr_irqs; i++) { + const bool do_clear_routes =3D clear_routes && (i & BIT(3)); struct kvm_vcpu *vcpu =3D vcpus[i % nr_vcpus]; struct timespec start; =20 + if (do_clear_routes) + kvm_clear_gsi_routes(vm); + kvm_route_msi(vm, gsi, vcpu, vector); =20 if (irq_affinity_fp) { --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 D86A2315793 for ; Thu, 4 Jun 2026 02:02:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538564; cv=none; b=ea8XVs44me2a4HO40dzCTDER/ZXgE+2fwMdcnuDHn7BR2nXAkUf8iiTsdhRMMjukJ/lONhn//sF6rMVtqOr1njfWYz2d0+H8vf8B+h1qHFJGAYptL6kHKnggCmnPsbF9Uh6c5Yn+fCEghzO5JMcFZP/VPB2XvsWW/tBKys6jE9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538564; c=relaxed/simple; bh=dafLdLWgdXnx6V1IXIlCD6pLVM3B3uy7mgOFoWSI8Q0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HXlIn2u3BDaK/7TeHUn7CKcrN1zvVXVhXncBqzPShifrnepFDqJdmpNRoZ7eZKQem0iAuVmIR9Nvbp3D1t/8lO8MRftGV/DF+OvOdNozjKaXYq4+qYMUIRLYqM3tAcxsF0ZQKviiO1ZVa6UNt0KB565YZ4Jlwug2M3kRDTjghek= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=vm6oCVBm; arc=none smtp.client-ip=209.85.215.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="vm6oCVBm" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c8592a62f32so98523a12.0 for ; Wed, 03 Jun 2026 19:02:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538562; x=1781143362; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=nxNows63/pttd4Lw3zcWQn2ehHsMc8vxDlx8tQK6YAk=; b=vm6oCVBm0GQhlv8TrWXcG/OJUZQ6AYLIt+341topHvO3bLqK5zXpvbn5Cm9blVYL3w iC1qzWSH00kkgY1TOdeD7JvKiLefqBS9hDR7oJErDGmS7yIXhifkVRt3MbTbd6BqNkTH 1UGyISZiRQJRB2t91zH0W1GGESiBVkb9SLYtr+q3Qao2oT1s7DyKKT+JSUlaP0my/TYg Tbd/z+EEWRuQGpdhgFvB8XS5FC005h/PMwQc7HQB/jKbhEeavWnAsK8UBxLiPWA83Twd iQ+UzvzqegqfCGwhPPJ21+zS4Bp42cKydQkPUw4dCY29/9IKjEHxXJVuu35Bt+2Za5hC kGEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538562; x=1781143362; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=nxNows63/pttd4Lw3zcWQn2ehHsMc8vxDlx8tQK6YAk=; b=adEftmD9Xy+wnlabcG2n6H6UNbFZFGVfsGBVFk5x2cFXObWK9P4ODp8NzK8/by4jZs GdgrIgfBHXq0pYHpTrzR5B4g/qlhn8KSonS8yB0uvQBewpGCdXNRReGmVIJlWNTm2pK6 W81atp00fBcYEmxJOi14hRVbiGiWwI9m3bMkapb1qDDDeUpCV8goxLDZ5VEDZCBG/sUC Jdr+GlsBaZX7SFZq90f9hqq0+yegs6X32azQwUkiJqQ+x5DMP85nDXgjwieMK2zCFSoO 96mCu8pkXaIpgwzEEQaYxH/pKyQ8De9JEyFf5obyt+BCyEWfIWzqTP579sOqvD2sQWoK KtUA== X-Forwarded-Encrypted: i=1; AFNElJ8YGG4Cwig8AKP/emGBeuInfF9wmCT20vAnatfXveVsQ15sRNa1O+dz48tqs2lWpaM9KFyktNXkBiCt8X8=@vger.kernel.org X-Gm-Message-State: AOJu0YxMNEUewB2k8GYAALZy37sbOKhxiL8ZMDEveMqwTkNm/09zAgbS BszUVq1m1obGb1PgGtqz4rDcY5IpqceCvQHgbmaUVpYCwdSFSh2Rig2kbiVGht/NirUmYT+EZnz yQMC4UBG7 X-Received: from plbjy14.prod.google.com ([2002:a17:903:42ce:b0:2bf:3684:64d2]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3888:b0:2c0:ab82:6b9d with SMTP id d9443c01a7336-2c163fb26ebmr66553025ad.29.1780538562124; Wed, 03 Jun 2026 19:02:42 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:35 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-14-jrhilke@google.com> Subject: [PATCH v5 13/21] KVM: selftests: Make number of IRQs configurable in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add a '-i' flag to tools/testing/selftests/kvm/irq_test.c to allow users to specify the number of IRQs generated during a test run. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index b0c4547a7f14..de8c29baa2b0 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -123,13 +123,14 @@ static void kvm_clear_gsi_routes(struct kvm_vm *vm) =20 static void help(const char *name) { - printf("Usage: %s [-a] [-b] [-c] [-d ] [-h]\= n", name); + printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs]\n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); printf("-b Block vCPUs (e.g. HLT) instead of spinning in guest-mode\n"); printf("-c Destroy and recreate KVM's GSI routing table in between some i= nterrupts\n"); printf("-d Use a VFIO device to send MSI-X interrupts instead of using an= emulated eventfd\n"); + printf("-i The number of IRQs to generate during the test\n"); printf("\n"); exit(KSFT_FAIL); } @@ -164,7 +165,7 @@ int main(int argc, char **argv) unsigned int irq; int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "abcd:h")) !=3D -1) { + while ((c =3D getopt(argc, argv, "abcd:hi:")) !=3D -1) { switch (c) { case 'a': irq_affinity =3D true; @@ -178,6 +179,9 @@ int main(int argc, char **argv) case 'c': clear_routes =3D true; break; + case 'i': + nr_irqs =3D atoi_positive("Number of IRQs", optarg); + break; case 'h': default: help(argv[0]); --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 CEAEB3242BA for ; Thu, 4 Jun 2026 02:02:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538566; cv=none; b=LIl0rBbx/chweLs1zfbAG7/JvnnTIBJBoKc1rP2pvhy/DVqh6lgbzpD6iiOH+8hssruzuXHi+9IhOHCKF5q+2lZnSeS/fls8aJjduxyOpDCZdX2tabCA9Jvrqg6g4kU4AQ7H6n/CXoM/RzD8eXmE+4mzO1HkwED2Kq1KBOrfoaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538566; c=relaxed/simple; bh=GV6lQKBYkSyvEQ8lXXe8QR9yQGxvUrb+6BI3SEWa5k8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=j0Egq6fJsdG/eAYtK6PPpZorhUEKLrakJKgqsVRu+bGcoRi68RF95ho5/GRVVbhMpOiSSK0w/cBh11QABopd+Ce7x+rE+1l8NdFEPm5fSno6d70lrG/vtDXcW1xf75ZC4YuhCJsdMu/GWgpGS7Qjwj2nL5pykvsr9kJ9dUhw2DI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=pIHeE8wY; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="pIHeE8wY" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c0c272e532so2411025ad.1 for ; Wed, 03 Jun 2026 19:02:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538563; x=1781143363; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=4R2VRn9iysSlwMbRgPpgRS4TGcGh9zwYnFc5Li/5R+o=; b=pIHeE8wYVJt6E06MtKbfCkYG1S0uDLw1a5EYqjeSK3nPJuPa6Ryu7oTYPWUK/MI5aj MyUpaQjvTHAA1d/dX6ANB8bld6yNQMYq7g5oZ7odnOZnfGo47+novXtllqYbc95aDQ2k LHiuavw/BTNvSHauL6C5Xi8hFVCePfRBnjVDOxnSPUOpn6tyXv38cUuarFfZuKhwMeSF +BmYw+KSHi2+CMNMJ+mjI2RAb0NB8G6aM6RoiUxDSF4dWESNkW0ZITV+NcMZV950lYVZ 1eLvfqAciPEw8dhwfGGaV0A1mGPsmqfxQHijyYu6Wn0VTT5VjrMwtH4/J0g2IxjMmo+P wmAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538563; x=1781143363; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4R2VRn9iysSlwMbRgPpgRS4TGcGh9zwYnFc5Li/5R+o=; b=QRAuWHkScEnO5aQyVpHncpFPPX+8Mv1AGDb/NA6qnccoKIp17/uyvf+6m2vPfWlX9g pM2xYSJy/4htVVIqWQjvIKJ2VpXC+R5K6e3kfNS9/oWLjkUSOvoS6iwCP2GhtiWhMWFt srAS02PZfCp3Ryhb3XLy79K5hiakra1ESW13fULSoXIswyWbiEWBOkWfE8Gi/soK7b4f THWA1alvdeCjKPbeoR1te4kROg//dOpcSyugxciQVcTd+v243pDHlZJrJxajuhjUwiUx KnpKPpI1n6JCLzFp/HzAZKGHuFeyvxXSCiqj7/mJfbSlRU+nw70PSU2f17Ddwb4Rz48z RbUQ== X-Forwarded-Encrypted: i=1; AFNElJ9S4TP49mBgK3vnH/ggHjupSJxWL8gSFgVWmqqrbN574x8r7RJ6Nm2mrgk07zeZv7U3DTY+iOaZnUq39BY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6+6gYSc2129yYXn9bwy/7G/d5nJlACZw7lloRvcYXYVGhc5i/ Xp1I4pyVRXS7ceVCFDhUMZkJqsUjMfCX2ABnAha4eXfnkVNsPrKst1UcDb7nnRiUE7xawQZLwYJ 02yvks8VO X-Received: from plwg5.prod.google.com ([2002:a17:902:f745:b0:2bf:195a:2b9d]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e851:b0:2c0:d99a:2fc with SMTP id d9443c01a7336-2c1639eddffmr61018075ad.2.1780538562923; Wed, 03 Jun 2026 19:02:42 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:36 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-15-jrhilke@google.com> Subject: [PATCH v5 14/21] KVM: selftests: Verify non-postable IRQ remapping in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add the -n flag to tools/testing/selftests/kvm/irq_test.c to route a portion of device interrupts as NMIs (Non-Maskable Interrupts) into the guest using an alternating pattern of 4 NMIs followed by 4 regular interrupts. While this adds coverage for NMI injection, the primary goal is to validate KVM's handling of non-postable interrupt delivery. Specifically, the transitions between posted and remapped modes. NMIs are used for this purpose because they are a reliable, architectural way to force these code paths. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 44 ++++++++++++++++++++------ 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index de8c29baa2b0..ed48562318bf 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -17,12 +17,15 @@ static u64 timeout_ns =3D 2ULL * 1000 * 1000 * 1000; static bool guest_ready_for_irqs[KVM_MAX_VCPUS]; static bool guest_received_irq[KVM_MAX_VCPUS]; +static bool guest_received_nmi[KVM_MAX_VCPUS]; static bool irq_affinity; static bool block_vcpus; static bool done; =20 #define GUEST_RECEIVED_IRQ(__vcpu) \ SYNC_FROM_GUEST_AND_READ((__vcpu)->vm, guest_received_irq[(__vcpu)->id]) +#define GUEST_RECEIVED_NMI(__vcpu) \ + SYNC_FROM_GUEST_AND_READ((__vcpu)->vm, guest_received_nmi[(__vcpu)->id]) =20 static u32 guest_get_vcpu_id(void) { @@ -36,6 +39,11 @@ static void guest_irq_handler(struct ex_regs *regs) x2apic_write_reg(APIC_EOI, 0); } =20 +static void guest_nmi_handler(struct ex_regs *regs) +{ + WRITE_ONCE(guest_received_nmi[guest_get_vcpu_id()], true); +} + static void guest_code(void) { x2apic_enable(); @@ -96,7 +104,7 @@ static void trigger_interrupt(struct vfio_pci_device *de= vice, int eventfd) =20 =20 static void kvm_route_msi(struct kvm_vm *vm, u32 gsi, struct kvm_vcpu *vcp= u, - u8 vector) + u8 vector, bool use_nmi) { struct { struct kvm_irq_routing head; @@ -109,7 +117,7 @@ static void kvm_route_msi(struct kvm_vm *vm, u32 gsi, s= truct kvm_vcpu *vcpu, routes->entries[0].gsi =3D gsi; routes->entries[0].type =3D KVM_IRQ_ROUTING_MSI; routes->entries[0].u.msi.address_lo =3D 0xFEE00000 | (vcpu->id << 12); - routes->entries[0].u.msi.data =3D vector; + routes->entries[0].u.msi.data =3D use_nmi ? NMI_VECTOR | (4 << 8) : vecto= r; =20 vm_ioctl(vm, KVM_SET_GSI_ROUTING, routes); } @@ -123,7 +131,7 @@ static void kvm_clear_gsi_routes(struct kvm_vm *vm) =20 static void help(const char *name) { - printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs]\n", name); + printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs] [-n]\n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); @@ -131,6 +139,7 @@ static void help(const char *name) printf("-c Destroy and recreate KVM's GSI routing table in between some i= nterrupts\n"); printf("-d Use a VFIO device to send MSI-X interrupts instead of using an= emulated eventfd\n"); printf("-i The number of IRQs to generate during the test\n"); + printf("-n Deliver 50 percent of IRQs as non-maskable interrupts\n"); printf("\n"); exit(KSFT_FAIL); } @@ -160,12 +169,13 @@ int main(int argc, char **argv) FILE *irq_affinity_fp =3D NULL; int i, j, c, msix, eventfd; bool clear_routes =3D false; + bool use_nmi =3D false; struct iommu *iommu; struct kvm_vm *vm; unsigned int irq; int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "abcd:hi:")) !=3D -1) { + while ((c =3D getopt(argc, argv, "abcd:hi:n")) !=3D -1) { switch (c) { case 'a': irq_affinity =3D true; @@ -182,6 +192,9 @@ int main(int argc, char **argv) case 'i': nr_irqs =3D atoi_positive("Number of IRQs", optarg); break; + case 'n': + use_nmi =3D true; + break; case 'h': default: help(argv[0]); @@ -192,6 +205,7 @@ int main(int argc, char **argv) =20 vm =3D vm_create_with_vcpus(nr_vcpus, guest_code, vcpus); vm_install_exception_handler(vm, vector, guest_irq_handler); + vm_install_exception_handler(vm, NMI_VECTOR, guest_nmi_handler); =20 if (device_bdf) { iommu =3D iommu_init(default_iommu_mode); @@ -234,34 +248,43 @@ int main(int argc, char **argv) =20 for (i =3D 0; i < nr_irqs; i++) { const bool do_clear_routes =3D clear_routes && (i & BIT(3)); + const bool do_use_nmi =3D use_nmi && (i & BIT(2)); struct kvm_vcpu *vcpu =3D vcpus[i % nr_vcpus]; struct timespec start; =20 if (do_clear_routes) kvm_clear_gsi_routes(vm); =20 - kvm_route_msi(vm, gsi, vcpu, vector); + kvm_route_msi(vm, gsi, vcpu, vector, do_use_nmi); =20 if (irq_affinity_fp) { irq_cpu =3D kvm_random_u64(&kvm_rng) % get_nprocs(); write_proc_irq_smp_affinity_list(irq_affinity_fp, irq, irq_cpu); } =20 - for (j =3D 0; j < nr_vcpus; j++) + for (j =3D 0; j < nr_vcpus; j++) { TEST_ASSERT(!GUEST_RECEIVED_IRQ(vcpus[j]), "IRQ flag for vCPU %d not clear prior to test", vcpus[j]->id); + TEST_ASSERT(!GUEST_RECEIVED_NMI(vcpus[j]), + "NMI flag for vCPU %d not clear prior to test", + vcpus[j]->id); + } =20 trigger_interrupt(device, eventfd); =20 clock_gettime(CLOCK_MONOTONIC, &start); for (;;) { - if (GUEST_RECEIVED_IRQ(vcpu)) + if (!do_use_nmi && GUEST_RECEIVED_IRQ(vcpu)) + break; + + if (do_use_nmi && GUEST_RECEIVED_NMI(vcpu)) break; =20 if (timespec_to_ns(timespec_elapsed(start)) > timeout_ns) { printf("Timeout waiting for interrupt!\n"); printf(" vCPU: %d\n", vcpu->id); + printf(" is interrupt NMI: %s\n", do_use_nmi ? "true" : "false"); if (irq_affinity_fp) { printf(" irq_cpu: %d\n", irq_cpu); print_proc_irq_smp_affinity(irq); @@ -273,7 +296,10 @@ int main(int argc, char **argv) } } =20 - WRITE_AND_SYNC_TO_GUEST(vm, guest_received_irq[vcpu->id], false); + if (do_use_nmi) + WRITE_AND_SYNC_TO_GUEST(vm, guest_received_nmi[vcpu->id], false); + else + WRITE_AND_SYNC_TO_GUEST(vm, guest_received_irq[vcpu->id], false); } =20 WRITE_AND_SYNC_TO_GUEST(vm, done, true); @@ -285,7 +311,7 @@ int main(int argc, char **argv) * below, will hang. */ if (block_vcpus) { - kvm_route_msi(vm, gsi, vcpus[i], vector); + kvm_route_msi(vm, gsi, vcpus[i], vector, false); trigger_interrupt(device, eventfd); } =20 --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 AA0D3330668 for ; Thu, 4 Jun 2026 02:02:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538567; cv=none; b=Yul9IgglBRbP3YipT4VVJFjFNNPbZkdljZHS3P7d6OFSgpreVucQp9lgtkDktZjRGg2ikV8GZ5sRfLMObkyTj24Y+I+/ZLPIaMXA42RSyUvoath9tpmiv0BLa0tcTgUWJ3oATojwQN/B1UizsEtAgzUBiwYtkaQPoQ1/fpj+BQo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538567; c=relaxed/simple; bh=QhhAmSqoPpHT6Fc6XlKDIK5Xihuk7/jRSy7HRwPriB0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VB0R0VGxdjNFXuHCStfGV3neBYajbg89pPo0uPOtd9o/rQ1krBg+DTivNsmDMV9GDS2tJ8qcxTETWAMuZWWG4LPWQW6uP1CFtqfxGuamolLL+JFvJZacq4LdgdfdKu2pPzUVRtzVIXmho9SvwLKOWFT+kl9RAhlnzn2XFUU/XaI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=I9gi5ANP; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="I9gi5ANP" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2bd04e4fe3dso3451725ad.3 for ; Wed, 03 Jun 2026 19:02:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538564; x=1781143364; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=v4MH394H3rFgdkGclrrJ7AlM8yZjDGqTeBC6SyP9lSo=; b=I9gi5ANPj8xG2cdVV8azN2+cwnYtuubKSiouj3eF4ZPc7ovcmbv0zR+rJIXqF3xb2m +l6D+Ir3iJ0g94HRUrSv0HIpWNve/4ko+caajGCASzjrVRSosmZfiLWCmbWPNQuwfrrT L5GIU+opUpoYpejUm6JotNEJ6abdEfcR8uX3k3Z+bd1tTKEVrlyAzvITbng6eegpocPf QimCKRxyeHcZlRS9BojuU3QYyqRM29xuVPp2tVGQM0cLntHm25r5CkNwrzE0csa8yQWR 3XXMyU/OYg5B8a9yTK7mdcFfL3YKx3ekIy8m080+ErsLsl1P81VKeD79Bhul4ayoyza+ b+xw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538564; x=1781143364; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=v4MH394H3rFgdkGclrrJ7AlM8yZjDGqTeBC6SyP9lSo=; b=mZO/ZTKarksmZhEiLqZ4qAEUdBl4FUgKYRdE/M//GwFbvQ6wrlwlNwpe8dVW/+1M6P ibLRGnG5bPot/VDIg1y+pbLL+aIwHnV3oGH092OsO5J2qhaIwycXNIXA3i325ds3XPOu HJzjPzbznDnFZYnEz/HGfXzZKn7CqJQXnnZGs44cmpUOKnTask6Kcq1pCjFAmFKlaMWU 6/tWBE25onD0VQm7Dh9sGkoJF0CvYhDE52CgMaWafHfMODeen5qtv5we5PTx2VJGynkt LDfxhEEDdMYGMHsj4hFt8GevRYgWL406ogmnzyY/5bv504wRpFBK2XF0WzmQ7Ljcij4i YekQ== X-Forwarded-Encrypted: i=1; AFNElJ8JekZs5v3OS2IgHVhS35JqXaC9oUI3P4OVUCkSgPYXWc2e7KURMFGfrokogrfal+/4J70dbFel3KGAPII=@vger.kernel.org X-Gm-Message-State: AOJu0Yz+6AhmArj3Rnj1mfMHhTBNI3PYLk8mmkOuaqZ3e54G2jYQHc6i x0aSZROUIgAMSZsMgn7AID2ZS920hQuAutVOxB4lky+WBQMwwBFc6d3cq2+5Iqd8/xmTv1IMO2M fozpMXNCQ X-Received: from plblk13.prod.google.com ([2002:a17:903:8cd:b0:2bf:1cdf:9e4b]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1786:b0:2c0:c38d:9d37 with SMTP id d9443c01a7336-2c163d92f23mr60364875ad.25.1780538563812; Wed, 03 Jun 2026 19:02:43 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:37 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-16-jrhilke@google.com> Subject: [PATCH v5 15/21] KVM: selftests: Add kvm_gettid() wrapper and convert users From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a KVM wrapper for the gettid() syscall to avoid compilation errors in versions of Glibc that don't contain gettid(). Convert existing users of the syscall to use this new wrapper. This helper will be used in a future change in the KVM IRQ test to migrate vCPU threads. No functional changes intended. Suggested-by: Sean Christopherson Signed-off-by: Josh Hilke --- tools/testing/selftests/kvm/demand_paging_test.c | 2 +- tools/testing/selftests/kvm/include/kvm_syscalls.h | 5 +++++ tools/testing/selftests/kvm/lib/assert.c | 8 ++------ tools/testing/selftests/kvm/lib/test_util.c | 3 ++- tools/testing/selftests/kvm/rseq_test.c | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testi= ng/selftests/kvm/demand_paging_test.c index 302c4923d093..f8b3d0b68830 100644 --- a/tools/testing/selftests/kvm/demand_paging_test.c +++ b/tools/testing/selftests/kvm/demand_paging_test.c @@ -57,7 +57,7 @@ static void vcpu_worker(struct memstress_vcpu_args *vcpu_= args) static int handle_uffd_page_request(int uffd_mode, int uffd, struct uffd_msg *msg) { - pid_t tid =3D syscall(__NR_gettid); + pid_t tid =3D kvm_gettid(); u64 addr =3D msg->arg.pagefault.address; struct timespec start; struct timespec ts_diff; diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index 067a4c9cf452..e4731741373e 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -83,6 +83,11 @@ static inline int kvm_dup(int fd) return new_fd; } =20 +static inline pid_t kvm_gettid(void) +{ + return syscall(__NR_gettid); +} + __KVM_SYSCALL_DEFINE(munmap, 2, void *, mem, size_t, size); __KVM_SYSCALL_DEFINE(close, 1, int, fd); __KVM_SYSCALL_DEFINE(fallocate, 4, int, fd, int, mode, loff_t, offset, lof= f_t, len); diff --git a/tools/testing/selftests/kvm/lib/assert.c b/tools/testing/selft= ests/kvm/lib/assert.c index 8be0d09ecf0f..1d72dcdfce3b 100644 --- a/tools/testing/selftests/kvm/lib/assert.c +++ b/tools/testing/selftests/kvm/lib/assert.c @@ -10,6 +10,7 @@ #include =20 #include "kselftest.h" +#include "kvm_syscalls.h" =20 #ifdef __GLIBC__ #include @@ -64,11 +65,6 @@ static void test_dump_stack(void) static void test_dump_stack(void) {} #endif =20 -static pid_t _gettid(void) -{ - return syscall(SYS_gettid); -} - void __attribute__((noinline)) test_assert(bool exp, const char *exp_str, const char *file, unsigned int line, const char *fmt, ...) @@ -81,7 +77,7 @@ test_assert(bool exp, const char *exp_str, fprintf(stderr, "=3D=3D=3D=3D Test Assertion Failure =3D=3D=3D=3D\n" " %s:%u: %s\n" " pid=3D%d tid=3D%d errno=3D%d - %s\n", - file, line, exp_str, getpid(), _gettid(), + file, line, exp_str, getpid(), kvm_gettid(), errno, strerror(errno)); test_dump_stack(); if (fmt) { diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/se= lftests/kvm/lib/test_util.c index e208a57f190c..6b00ab11f3c0 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -17,6 +17,7 @@ #include "linux/kernel.h" =20 #include "test_util.h" +#include "kvm_syscalls.h" =20 sigjmp_buf expect_sigbus_jmpbuf; =20 @@ -395,7 +396,7 @@ long get_run_delay(void) long val[2]; FILE *fp; =20 - sprintf(path, "/proc/%ld/schedstat", syscall(SYS_gettid)); + sprintf(path, "/proc/%ld/schedstat", (long)kvm_gettid()); fp =3D fopen(path, "r"); /* Return MIN_RUN_DELAY_NS upon failure just to be safe */ if (fscanf(fp, "%ld %ld ", &val[0], &val[1]) < 2) diff --git a/tools/testing/selftests/kvm/rseq_test.c b/tools/testing/selfte= sts/kvm/rseq_test.c index f80ad6b47d16..6510fbfd64f1 100644 --- a/tools/testing/selftests/kvm/rseq_test.c +++ b/tools/testing/selftests/kvm/rseq_test.c @@ -244,7 +244,7 @@ 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)syscall(SYS_gettid)); + (void *)(unsigned long)kvm_gettid()); =20 if (latency >=3D 0) { /* --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 D58EC2E542C for ; Thu, 4 Jun 2026 02:02:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538567; cv=none; b=Ob+AbaWdmWDQ7MncwsN8/OXaID9deQSrsZ9W1ALI7ShsIbtHwq/PHQ0L0NthpCtcz98GIHLAQRCds1pgXqA6mQPWo3Ce5II0gohb17xPB8UgOOJzK+68gxio6HGJ+6qidJA1iLYD3Mfh5kSU0X14kn9215HdvMK5PCPDE0S/v7M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538567; c=relaxed/simple; bh=Tmq3ikjfX2IvEobDHt7oddZb9hop4sb5bX8l2Qsy2YU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=tDB1y3e8G1R0PNsVISdO/lrsBgWHGl4SRMo38iL+h1Q5GIeVHgvaroiQO2+ZnurbM7WQxdFtwNHQcX+n7Emma7fGg0WgDxZpYM3CbVl3439YiByWEu4vzIiI0Cjv8CgHi44BpauRu3szGmwtb6ukivad6EgE9uNn66eVVY1dnMo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=DpcJvbcB; arc=none smtp.client-ip=209.85.215.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DpcJvbcB" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c859d79c10eso252237a12.0 for ; Wed, 03 Jun 2026 19:02:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538565; x=1781143365; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=VAgDySiCq7cDdYA1GOoaBCXyUElvHMmMLGpEHQQY0Fw=; b=DpcJvbcBljEsoyKyNlHCyC7hdwWYriSI07QUWKgu98OIhhcrM4JgQ+IdlK1rA/wp5F 71H+Awg4bmEO8RYJtUs5aKa0Sm1mLxK34xCclyiPPpV20mLVaG8uzsrZXHcCGoHXWyCI ATbM2luuX5mnSbZqN8XyDjMb2sQsCtDF0S2sq3jqZoP8+DRTOP2xD3nlcIcTVts+SMv6 1hR3Rv/90KRt6+xQhFS7KaiXx4SAxqj7/KYmceRxhxCyMTxJzUTdthj+GZgmaSK/olAj x6K8rbvVMrKDRPp21Id0ZgUPvvpnAJt7aWEnU6+FXfnYDvYcworCsZ7VwHtdW+TTvV4p YFKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538565; x=1781143365; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=VAgDySiCq7cDdYA1GOoaBCXyUElvHMmMLGpEHQQY0Fw=; b=TpGZPMrQWaE5BfPlzwIRXQX3s7yWhGumIWXBXSNyZsbDY9+tyCNJ7X+dURXwTsP84H yI37uzt028Q5+UdawKcpx2rlGQe9Fy2OZTFNz+Pj1jp3U9Uhio3zx+Tf6EFiv3eGywKF iOjazD8CWZmr1rJHPzxQTTprbCR8vNYQhfYpXhdNP6TVou+hAX6XucFwg54i3GKBFYv/ RYbqP8Imqs/9/nIhwe3tXAl8O5n5HjRMJICzcCpe5OHDgdIENJ6yyMFM8CLbupGzVFVv PsuOZQnvAzWwfvMKFCVHbidyj1JUVfYbCX6yq63FOO0DTDe2rH63HVpyKDJ9jYIVQqXa No7w== X-Forwarded-Encrypted: i=1; AFNElJ9oenIi974XA1l4pSphf5KY69vwVKkHxkC5t3O0AJMivjI89GKBOyZF3m/Je9ZZVVVK5BRDo8jnlsEwJH4=@vger.kernel.org X-Gm-Message-State: AOJu0YwazVMZVplxho0eZ5hhMeMRThbgMxO6e7x6x/kjZzuNWkCS0YHa p8pZ9gizNG9YewgwALSm6emiANmElSdQup8DMu5NdR4/D1sdiwE+NRkIAJOgn8bc4yOfOtfRsZt UG8WByaiI X-Received: from pgc24.prod.google.com ([2002:a05:6a02:2f98:b0:c80:192c:51ff]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:50e:b0:3b4:736b:da61 with SMTP id adf61e73a8af0-3b49790c56cmr6485908637.35.1780538564662; Wed, 03 Jun 2026 19:02:44 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:38 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-17-jrhilke@google.com> Subject: [PATCH v5 16/21] KVM: selftests: Add kvm_sched_getaffinity() wrapper and convert users From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a KVM wrapper for the sched_getaffinity syscall named kvm_sched_getaffinity(). Convert existing users of sched_getaffinity to use the new wrapper. This helper will be used in a future change in the KVM IRQ test to migrate vCPU threads. No functional changes intended. Suggested-by: Sean Christopherson Signed-off-by: Josh Hilke --- tools/testing/selftests/kvm/arch_timer.c | 2 +- tools/testing/selftests/kvm/arm64/arch_timer_edge_cases.c | 2 +- tools/testing/selftests/kvm/include/kvm_syscalls.h | 2 ++ tools/testing/selftests/kvm/lib/kvm_util.c | 5 ++--- tools/testing/selftests/kvm/mmu_stress_test.c | 6 +----- tools/testing/selftests/kvm/rseq_test.c | 4 +--- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/kvm/arch_timer.c b/tools/testing/selft= ests/kvm/arch_timer.c index 90c475a61b22..f8b02597897b 100644 --- a/tools/testing/selftests/kvm/arch_timer.c +++ b/tools/testing/selftests/kvm/arch_timer.c @@ -85,7 +85,7 @@ static u32 test_get_pcpu(void) cpu_set_t online_cpuset; =20 nproc_conf =3D get_nprocs_conf(); - sched_getaffinity(0, sizeof(cpu_set_t), &online_cpuset); + kvm_sched_getaffinity(0, sizeof(cpu_set_t), &online_cpuset); =20 /* Randomly find an available pCPU to place a vCPU on */ do { diff --git a/tools/testing/selftests/kvm/arm64/arch_timer_edge_cases.c b/to= ols/testing/selftests/kvm/arm64/arch_timer_edge_cases.c index f7625eb711d6..d9c9377a6325 100644 --- a/tools/testing/selftests/kvm/arm64/arch_timer_edge_cases.c +++ b/tools/testing/selftests/kvm/arm64/arch_timer_edge_cases.c @@ -1039,7 +1039,7 @@ int main(int argc, char *argv[]) if (!parse_args(argc, argv)) exit(KSFT_SKIP); =20 - sched_getaffinity(0, sizeof(default_cpuset), &default_cpuset); + kvm_sched_getaffinity(0, sizeof(default_cpuset), &default_cpuset); set_counter_defaults(); =20 if (test_args.test_virtual) { diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index e4731741373e..b02a860b5680 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -10,6 +10,7 @@ #include =20 #include +#include #include =20 #include @@ -93,5 +94,6 @@ __KVM_SYSCALL_DEFINE(close, 1, int, fd); __KVM_SYSCALL_DEFINE(fallocate, 4, int, fd, int, mode, loff_t, offset, lof= f_t, len); __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); =20 #endif /* SELFTEST_KVM_SYSCALLS_H */ diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 2d24d8db86b1..0089d4543f5e 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -668,13 +668,12 @@ void kvm_parse_vcpu_pinning(const char *pcpus_string,= u32 vcpu_to_pcpu[], cpu_set_t allowed_mask; char *cpu, *cpu_list; char delim[2] =3D ","; - int i, r; + int i; =20 cpu_list =3D strdup(pcpus_string); TEST_ASSERT(cpu_list, "strdup() allocation failed."); =20 - r =3D sched_getaffinity(0, sizeof(allowed_mask), &allowed_mask); - TEST_ASSERT(!r, "sched_getaffinity() failed"); + kvm_sched_getaffinity(0, sizeof(allowed_mask), &allowed_mask); =20 cpu =3D strtok(cpu_list, delim); =20 diff --git a/tools/testing/selftests/kvm/mmu_stress_test.c b/tools/testing/= selftests/kvm/mmu_stress_test.c index 473ef4c0ea9f..3d5f33a63b2b 100644 --- a/tools/testing/selftests/kvm/mmu_stress_test.c +++ b/tools/testing/selftests/kvm/mmu_stress_test.c @@ -255,11 +255,7 @@ static void rendezvous_with_vcpus(struct timespec *tim= e, const char *name) static void calc_default_nr_vcpus(void) { cpu_set_t possible_mask; - int r; - - r =3D sched_getaffinity(0, sizeof(possible_mask), &possible_mask); - TEST_ASSERT(!r, "sched_getaffinity failed, errno =3D %d (%s)", - errno, strerror(errno)); + kvm_sched_getaffinity(0, sizeof(possible_mask), &possible_mask); =20 nr_vcpus =3D CPU_COUNT(&possible_mask); TEST_ASSERT(nr_vcpus > 0, "Uh, no CPUs?"); diff --git a/tools/testing/selftests/kvm/rseq_test.c b/tools/testing/selfte= sts/kvm/rseq_test.c index 6510fbfd64f1..557e393c223b 100644 --- a/tools/testing/selftests/kvm/rseq_test.c +++ b/tools/testing/selftests/kvm/rseq_test.c @@ -226,9 +226,7 @@ int main(int argc, char *argv[]) } } =20 - r =3D sched_getaffinity(0, sizeof(possible_mask), &possible_mask); - TEST_ASSERT(!r, "sched_getaffinity failed, errno =3D %d (%s)", errno, - strerror(errno)); + kvm_sched_getaffinity(0, sizeof(possible_mask), &possible_mask); =20 calc_min_max_cpu(); =20 --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 A95CF2E8B6B for ; Thu, 4 Jun 2026 02:02:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538568; cv=none; b=oGgAxwJcabKuu45EfE/dCEfq4A6cm5IzAuhPAfFrD0oVGHxWq3dPO3fQg0xFn3lxetVVOOUNr+U6gfsUQbJo9kUX89HTyTvx2Av3Qycl8dj9v/fkioxdFR/YLAX0c3CuivU6Vv4uIrOKMisJqqMx3EODJ50vWJpN/Mr1iqTtEwE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538568; c=relaxed/simple; bh=3t/DAyGvNL0/LW/JOD2fGCS4PNVrVIn6BhFfqveDG5Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OlvJwSaXoYaq+VXAYabOdSCc8hrVnsr6YzNxR0dWKA3LUSeeW7ceX68QkoCfQVZ7XW0tUNRy57W4EiuGrlNitKcanOURJLXZoxYGT/YuC8J10//aDbQwE3KgQUSbBV++45pQkBzWrPNOJ11D9DToZh2KXjszt898JE+7HplZ4ig= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=jWKVscqa; arc=none smtp.client-ip=209.85.214.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="jWKVscqa" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2beff6b6e74so2158105ad.1 for ; Wed, 03 Jun 2026 19:02:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538566; x=1781143366; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=cusk696wlOPTxoLpjL8sQnvno9DNsartad/zeYEHRE4=; b=jWKVscqarIpG57yRK8ideSo+LT/vaS4ohTXk9mEezWuqcZ3fMhkw7M3alDRqUh8H6A m0uGQe3TAmBPLTV6xFcrH8XssH6NZXyktGPqhCKcll1Cb8GoMFLPWF+DAHp0e+aVNhiL H7CH6k1DiKQ7n5bHaVx3+AbhetQu950/vspcGGql7t/4AXZNXx4n0dn5AyJz//ABEQBN aVUk5jtPYnbrh7tc80cefa3qP+/rwiUTDMo9ik2XKGc7TfAeTBup/35U7KbincJ0fg3N rfNt0pu+1vFQ6E1yusAxe6l3RVypnph2Xvqkuz2xok3I6DCAXW3KcD9QR5AWoQWQSJeF y7TQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538566; x=1781143366; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=cusk696wlOPTxoLpjL8sQnvno9DNsartad/zeYEHRE4=; b=LgMde9MA8T71geuM4bfKwiyUFCJR4zCsKbLLmdqQ8KpWx5E1LnuFbxSvj98Kuq2zTd m8v9vvzxr4ju47L6X2X+5f5szG+GreUSC+IWUwSypKLO6Jb58R/7Ti/n739uXr87viFZ xbqvTZ69vzbzYGs1fAEV/MKsPwarVdyM69yLRtVoxY/iGCuakRRht+ZcvXfhqWOxK5lM 2gC3w70GQgL5ve14sZOI9PxkhLdomjynKJR4Jzk6zur3q2OOilZKpKDwwYx3l6jU67aa zNQwHT8e6dd+JTTQdCHfqOg+srqX+Jv1N8C+yO1X/RLPEOm/v6DuJUm37h/Km+iYGMUF KNFw== X-Forwarded-Encrypted: i=1; AFNElJ/P6wOhDqAGOg1pB5//9JITg9l8gregUc3BKu5PHT+1xUR+HwtnWMnDUKWRJE55xwyBqtI/Y0huX1Mx4gk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywc2lfO6bYAu4NMMXgod4RcNF0DeqHgNYOkM518t3fVeVuSqmM3 /88Jy8qEhoByk6lpElE6pPtCIECRXDH8ladwp37jxPWfTelaCIH+pYGBqEOoTHpMhhvEOYCA7gD SyZd1b2sp X-Received: from pldb6.prod.google.com ([2002:a17:902:ed06:b0:2bd:52b9:305e]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1b28:b0:2c0:c625:4019 with SMTP id d9443c01a7336-2c163fadcdemr62034665ad.25.1780538565666; Wed, 03 Jun 2026 19:02:45 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:39 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-18-jrhilke@google.com> Subject: [PATCH v5 17/21] KVM: selftests: Add pin_task_to_random_cpu() helper function for IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a helper function pin_task_to_random_cpu() to randomly select a CPU from a given cpu_set_t and pin the specified task to it. This helper will be used in a future change in the KVM IRQ test to migrate vCPU threads. Suggested-by: Sean Christopherson Signed-off-by: Josh Hilke --- .../testing/selftests/kvm/include/kvm_util.h | 2 ++ tools/testing/selftests/kvm/lib/kvm_util.c | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 88211d696a11..5968d04a77ea 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1094,6 +1094,8 @@ 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); + static inline int pin_task_to_any_cpu(pthread_t task) { int cpu =3D sched_getcpu(); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 0089d4543f5e..e538e6147ec3 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -662,6 +662,27 @@ 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 target_idx; + int nr_cpus; + int cpu; + + nr_cpus =3D CPU_COUNT(possible_cpus); + TEST_ASSERT(nr_cpus > 0, "No CPUs available in possible_cpus"); + + target_idx =3D kvm_random_u64(&kvm_rng) % nr_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; + } + } + + TEST_FAIL("Failed to find random CPU in possible_cpus"); +} + void kvm_parse_vcpu_pinning(const char *pcpus_string, u32 vcpu_to_pcpu[], int nr_vcpus) { --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 5787A357CE8 for ; Thu, 4 Jun 2026 02:02:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538569; cv=none; b=pZspO1USnXmBcog71ubEDzO4fsF2VFh3qjiGrS2Mg0boiIDHAfXizchmhJPSwmuRSJCZVeLMPWXC7Kb6rKR9Ehf9HKFZCzCKbvriz9uol1gxPFEjtklEXRUfNX9IPDNb/vsvcudstFUvIQp/07IfLg4bXB03KXvWCzJ6zFhebyc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538569; c=relaxed/simple; bh=MUR6NE2vPYTJB/pmLIQ3jm48P+R2f4+6eIf6s3bO0T4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=R6DuC9sfZr6TBZs38M6r0thtRODaprCTgShpkvYHZDW4yApQ+wmhYwM6m4M7jAD70iUCmB06I6zb6TRPfcoNL0GC3NHA+hmq3fwCsdTGbwDl7qJ2q2pO68IRX0PW/YPquBUqlcW3I5G/cW0zQtbKymLrmRKmRgGEPJ+mW4kQ5ck= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=UzMTxNHx; arc=none smtp.client-ip=209.85.216.73 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="UzMTxNHx" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-36e09ec696aso345733a91.0 for ; Wed, 03 Jun 2026 19:02:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538567; x=1781143367; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=qCiJ8xzq+I/vxn4SzqtijIE4qOrazB6JANMHyalZPrg=; b=UzMTxNHxZRwd2/YACk5sr+CeszbMtj0pd33PSsf0gziu1ioxZDhv4l7/K203rkO9tg pVuMnXmQCnOpUBi2eAd92b0Tyba/B59IJxcMGY4FNYsMnxKjtWfIFp8AnLqjSbfuWaWR iyj4s8XhW2RskzWj7bMnRZt2FDOzByUVhGxWb00XF6iMYgGssMLuWOdCKWyk5G3fT38r jPlDhWFDk3izuYHcT5h+Y/kmf71D/nnpYUb2g0x0JjgfhJg9ObfKg40EoHuzoV9tVJsx Ljbb/7KWdh7Fbk0OdA1zFkZcucDBipLrpjeLxsnn9WN3Jp5mTLCUYLlojy9JmhXHwMV1 jNtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538567; x=1781143367; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=qCiJ8xzq+I/vxn4SzqtijIE4qOrazB6JANMHyalZPrg=; b=iMlO7xPCtcuv3TFZ+w1atnQNTaGE852Wjpj1Xz3GJQFItxAmyRYIeuG7LNik2boNPy abOTe0vxQ4QE6fw9LW6gMSzEmujZWSZTBsKrwVrRBjPRkGZ95j/gZI14gEZnoa/VeCS+ bvUQg5WlJCYyqz9CTnF0hb0+JHZ67ZkwO8p0GtDSxV5Y3WV595yiLjKZ32vZSoUXLaj5 VfPYuljZDNR9QzBvHf890AygImNZT7shjacxUbHf31QXDLj2U1S0ubjvAibOjNa0Apsb eFwl6b/0azF+5fKZiHkKM5IqN2WBSn6a36Hz3m+uH397Tzh6kh4UcsoxLITJfpNEH+ay EXig== X-Forwarded-Encrypted: i=1; AFNElJ/FVE0V5klffAMYPz5wpyTRIQX0oZQTDp4GhqVZO3ku49ywR5k/p1bLYhZgjhKDqtsyQjWEUXy3ea2jdfQ=@vger.kernel.org X-Gm-Message-State: AOJu0YywTmOmKp5dYXiUqziVJ8/NoYEpYV3buTmLkEAohXEppHlj2Sar 8beJ3L45KPQxhnBqm/qDe0jP7vMEFEtM1N2Zf8VQUQeUcXXxtHWYPxER1avZpW14RFNlxdVL2Uf oxwLzv6pJ X-Received: from pgmd38.prod.google.com ([2002:a63:1d66:0:b0:c79:39f0:12f2]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:db09:b0:3a0:adc5:52c1 with SMTP id adf61e73a8af0-3b497552575mr6539853637.11.1780538566504; Wed, 03 Jun 2026 19:02:46 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:40 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-19-jrhilke@google.com> Subject: [PATCH v5 18/21] KVM: selftests: Verify vCPU migration during IRQ delivery in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add the '-m' flag to tools/testing/selftests/kvm/irq_test.c to migrate vCPU threads across random physical CPUs during the test. This validates KVM's ability to handle vCPUs changing physical CPUs while interrupts are actively being injected. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 33 ++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index ed48562318bf..5f7df76005ec 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -18,6 +18,8 @@ static u64 timeout_ns =3D 2ULL * 1000 * 1000 * 1000; static bool guest_ready_for_irqs[KVM_MAX_VCPUS]; static bool guest_received_irq[KVM_MAX_VCPUS]; static bool guest_received_nmi[KVM_MAX_VCPUS]; +static pid_t vcpu_tids[KVM_MAX_VCPUS]; +static bool migrate_vcpus; static bool irq_affinity; static bool block_vcpus; static bool done; @@ -67,12 +69,23 @@ static void *vcpu_thread_main(void *arg) struct kvm_vcpu *vcpu =3D arg; struct ucall uc; =20 + WRITE_ONCE(vcpu_tids[vcpu->id], kvm_gettid()); + vcpu_run(vcpu); TEST_ASSERT_EQ(UCALL_DONE, get_ucall(vcpu, &uc)); =20 return NULL; } =20 +static void migrate_vcpu_threads(int nr_vcpus, pthread_t *vcpu_threads, + cpu_set_t *available_cpus) +{ + int i; + + for (i =3D 0; i < nr_vcpus; i++) + pin_task_to_random_cpu(vcpu_threads[i], available_cpus); +} + static int vfio_setup_msi(struct vfio_pci_device *device) { const int flags =3D MAP_SHARED | MAP_ANONYMOUS; @@ -131,7 +144,7 @@ static void kvm_clear_gsi_routes(struct kvm_vm *vm) =20 static void help(const char *name) { - printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs] [-n]\n", name); + printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs] [-m] [-n]\n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); @@ -139,6 +152,7 @@ static void help(const char *name) printf("-c Destroy and recreate KVM's GSI routing table in between some i= nterrupts\n"); printf("-d Use a VFIO device to send MSI-X interrupts instead of using an= emulated eventfd\n"); printf("-i The number of IRQs to generate during the test\n"); + printf("-m Pin vCPU threads to random physical CPUs throughout the test\n= "); printf("-n Deliver 50 percent of IRQs as non-maskable interrupts\n"); printf("\n"); exit(KSFT_FAIL); @@ -169,13 +183,14 @@ int main(int argc, char **argv) FILE *irq_affinity_fp =3D NULL; int i, j, c, msix, eventfd; bool clear_routes =3D false; + cpu_set_t available_cpus; bool use_nmi =3D false; struct iommu *iommu; struct kvm_vm *vm; unsigned int irq; int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "abcd:hi:n")) !=3D -1) { + while ((c =3D getopt(argc, argv, "abcd:hi:mn")) !=3D -1) { switch (c) { case 'a': irq_affinity =3D true; @@ -192,6 +207,9 @@ int main(int argc, char **argv) case 'i': nr_irqs =3D atoi_positive("Number of IRQs", optarg); break; + case 'm': + migrate_vcpus =3D true; + break; case 'n': use_nmi =3D true; break; @@ -246,6 +264,14 @@ int main(int argc, char **argv) */ irq_cpu =3D -1; =20 + if (migrate_vcpus) { + kvm_sched_getaffinity(vcpu_tids[0], sizeof(available_cpus), &available_c= pus); + + if (nr_vcpus > CPU_COUNT(&available_cpus)) { + printf("There are more vCPUs than pCPUs; refusing to migrate.\n"); + migrate_vcpus =3D false; + } + } for (i =3D 0; i < nr_irqs; i++) { const bool do_clear_routes =3D clear_routes && (i & BIT(3)); const bool do_use_nmi =3D use_nmi && (i & BIT(2)); @@ -262,6 +288,9 @@ int main(int argc, char **argv) write_proc_irq_smp_affinity_list(irq_affinity_fp, irq, irq_cpu); } =20 + if (migrate_vcpus && vcpu->id =3D=3D 0) + migrate_vcpu_threads(nr_vcpus, vcpu_threads, &available_cpus); + for (j =3D 0; j < nr_vcpus; j++) { TEST_ASSERT(!GUEST_RECEIVED_IRQ(vcpus[j]), "IRQ flag for vCPU %d not clear prior to test", --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 2F64436403C for ; Thu, 4 Jun 2026 02:02:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538570; cv=none; b=rAwvn5WP6b2fpp94K25a61J84DzmNyBGKraA9CwY79M6b6FMy8AxQ1IyCTtBmrL5vQspoDxiO2SbEkkSkArgFXJvsbeAu4sQg1Plifye+dlpg6PrSzOIDVu3O9eewNTMtuIO9XK32Y2vVjfqHz0P1/3pM/mwStcfoH0F+lL13jA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538570; c=relaxed/simple; bh=pL8YPf5lVlSz8x/nILJ4nyVQiNlnQ496QrJe69U0+Dw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=DPV4NpHTiHjnl/JIqOXCsZv2AWitosN/LnLAS8SJJO2iyZs/irB6OHGuXbqsNBqVM8GYPrpaHXwI6ciO1VHnnYxqBVbgkERv219us17gHNvkgxrHyzorapWt86MCzazsa6gjvTbtFQIQ7tBzs3FGG0UCrWwX7f5u8ITQo50wHRY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=avhKiL2q; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="avhKiL2q" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2c0532a6588so2118625ad.0 for ; Wed, 03 Jun 2026 19:02:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538567; x=1781143367; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=ZSxc/jK0Y5Zc8rsqIx/UM7MOPm6sv49R27dtlFb7iI4=; b=avhKiL2qecJ5wFcrGljSxGI3VidUNB2rR/f5VMo/FH188gK6tdWRi2MQOYapmRtIyw Xk6jd0zdxOnlX0322ewalu8nwy2L7UCnfXvaQHtyFOtiwYQpCyrJgrWSh80TOwWXybZX +zE6ZLR5jq579FYFrPVVlOCGPGIid7n3HoAU6ph6lDmPlV0OUdcFe2UvaVKSNw8bLllq RaFwkElFF7OT+9Fjd7CXRiM5qrAbP5AeBr94YLOJtr+rx9A0sr43O2nCAiBZfhZLIFa4 u7AoidfguLMBMV9VQoOMIYl1DsBRIhRqSO6XmDfzBcnmwCmgVeWkQXKwIaUwuHmaUjC0 LSKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538567; x=1781143367; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ZSxc/jK0Y5Zc8rsqIx/UM7MOPm6sv49R27dtlFb7iI4=; b=EHk5kmb7qlCjUyV8HVV3ymwgnVpPAhf9WeRiOrscVATBYBt1ugKZg8QToW4c6Tv/F5 KnigJ/uehEHxozYyaDLMhwPRBGGoVEQfFu/iKhbl7gpRBZkEdNY+jVVrSZGENhAbADqX 7W1ZC/AfTyxri1pYt3z9bjj5Kk9cT2EEPOn6hk6j/RFBqTON7WlnJg/nEpnaGTy7pc7E T2u1IshGQlLdIi1+EPqPgnREKuMPxFvVRJkHh84jX5oZXSbm+4LA5wsOwD2iIHkWs36/ GuYUJXY4vlRHF2rUMu+tHauaC6cPyAgWW3nnsiQV3acgR83AyKoY8zAjTqZ/RI/RjIP/ PT9g== X-Forwarded-Encrypted: i=1; AFNElJ/PWCWSlIiI6hXWuhu3ngC9jWv7yNQVKH3X/guFzcuthKPN/zMXBBzT67EjuBNoo2SpfNEH/hJMecsyi84=@vger.kernel.org X-Gm-Message-State: AOJu0YwgbTeshqtTqSgtARomXTi5Ntu7+cUpnY9n3yzxU0GQkTLFvztH 3MLomdhQYgAEALi2eajrM7Uhny8a5ml5N4tjvY9e5+OBt5YhccUkt8PwrDdRjdWfMaIXO4Okd1K s0VNd/EpI X-Received: from plgo6.prod.google.com ([2002:a17:902:d4c6:b0:2bd:55dc:a132]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:22c6:b0:2bd:a5e:4c66 with SMTP id d9443c01a7336-2c163a53619mr58703835ad.14.1780538567281; Wed, 03 Jun 2026 19:02:47 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:41 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-20-jrhilke@google.com> Subject: [PATCH v5 19/21] KVM: selftests: Print vCPU affinity on timeout during IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add kvm_print_vcpu_affinity() to lib/kvm_util.c to print the physical CPU affinity of a vCPU thread in a human-readable format. Use this new helper in tools/testing/selftests/kvm/irq_test.c to print the vCPU's affinity if it times out waiting for an interrupt while vCPU migration (-m) is enabled. This provides valuable context for debugging IRQ delivery timeouts when vCPUs are being actively migrated across physical CPUs. Signed-off-by: Josh Hilke --- .../testing/selftests/kvm/include/kvm_util.h | 1 + tools/testing/selftests/kvm/irq_test.c | 2 + tools/testing/selftests/kvm/lib/kvm_util.c | 49 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 5968d04a77ea..18b9e9713d78 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1117,6 +1117,7 @@ static inline int pin_self_to_any_cpu(void) void kvm_print_vcpu_pinning_help(void); void kvm_parse_vcpu_pinning(const char *pcpus_string, u32 vcpu_to_pcpu[], int nr_vcpus); +void kvm_print_vcpu_affinity(struct kvm_vcpu *vcpu, pid_t tid); =20 unsigned long vm_compute_max_gfn(struct kvm_vm *vm); unsigned int vm_calc_num_guest_pages(enum vm_guest_mode mode, size_t size); diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 5f7df76005ec..1d66293b6d0b 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -319,6 +319,8 @@ int main(int argc, char **argv) print_proc_irq_smp_affinity(irq); print_proc_irq_effective_affinity(irq); } + if (migrate_vcpus) + kvm_print_vcpu_affinity(vcpu, vcpu_tids[vcpu->id]); =20 TEST_FAIL("vCPU %d timed out waiting for IRQ from GSI %d (Vector 0x%x)= !\n", vcpu->id, gsi, vector); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index e538e6147ec3..7fc3aaf76379 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include =20 @@ -662,6 +663,54 @@ void kvm_print_vcpu_pinning_help(void) " (default: no pinning)\n", name, name); } =20 +void kvm_print_vcpu_affinity(struct kvm_vcpu *vcpu, pid_t tid) +{ + int nprocs =3D get_nprocs(); + bool first_range =3D true; + int i, start =3D -1; + cpu_set_t cpus; + + kvm_sched_getaffinity(tid, sizeof(cpus), &cpus); + + /* + * Output format examples: + * - Single CPU: "vCPU 0 (TID 1234) affined to pCPU(s): 2" + * - List: "vCPU 0 (TID 1234) affined to pCPU(s): 0,2,4" + * - Range: "vCPU 0 (TID 1234) affined to pCPU(s): 0-7" + * - Mixed: "vCPU 0 (TID 1234) affined to pCPU(s): 0-3,8,10-12" + */ + printf("vCPU %u (TID %d) affined to pCPU(s): ", vcpu->id, tid); + + for (i =3D 0; i <=3D nprocs; i++) { + /* + * Iterate to nprocs (inclusive) to ensure that if the last pCPU + * is part of a range, the 'else' block triggers one final time + * to flush that range to stdout. + */ + if (i < nprocs && CPU_ISSET(i, &cpus)) { + if (start =3D=3D -1) + start =3D i; + continue; + } + + if (start !=3D -1) { + int end =3D i - 1; + + if (!first_range) + printf(","); + + if (start =3D=3D end) + printf("%d", start); + else + printf("%d-%d", start, end); + + start =3D -1; + first_range =3D false; + } + } + printf("\n"); +} + void pin_task_to_random_cpu(pthread_t task, cpu_set_t *possible_cpus) { int target_idx; --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (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 0C3402F746D for ; Thu, 4 Jun 2026 02:02:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538571; cv=none; b=CT65+vkvVhRgIbU8hPaX6puWQfFjJn1Ntrk5XJCV9a32xDmbZOJmlRXSNKU6CbEIAtrKmZIRPey6uFlLVrqVm/V3x2NaQIS98Myj51+wM6FJc0iPvv0i2wbyR5xn4yBiQVjNDJxYo9ezEeePknQ2KqYiMi+28+2cvNrci8VwjD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538571; c=relaxed/simple; bh=crMle9j802BTtYp3MWSaBHqe2spiu/UwBKtPWyz8ZEk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hz1eFOYzJJeiimp+97Vm04QMfserYUw88qL6PhFnFPWnd5l1b9Gpal7VCNAGTMYDcMKuaZlM0Vf+Oei5xWyB2yv/LghWwqVE3HhqHNlo8OHHMvGElxbYEsbClL6WxKH3ZCtxgqqMox/lIq9Qa+0v4BvZDXrahSB21tbjlWTT8d4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=YaXO5t3h; arc=none smtp.client-ip=209.85.214.202 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="YaXO5t3h" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2bf004bf8beso2234375ad.3 for ; Wed, 03 Jun 2026 19:02:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538568; x=1781143368; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=G3j+8dIDJLDE9oCfttORZmcxZeBh/jFN2elFlpkhO2M=; b=YaXO5t3h8GCszjESfB1NapCEZzHOd9Xb07O3FWb5nQp5g9l8IWdm06MaEnHYWyEKgM TGCk0e+hTf7v1cVdisHHTSt7i8jQr44kkExpat20xr0DwBho1EZuz6cGPxSLMKqFvZc/ 1V+1GBhoAp1ZPFQWa1CqFHDiPk7WBIg+uREpS4+sy6mFTgMUycjxUfe2xVOYb4m16knu wuaw7Dv7bDE7uX4ChlnLLw+UX5E7TYtg+ApLaaE2DOfDF/36mHsNG5Hekp3U/tLqZGxG 7JlDJpClsJMO9OWhy/GBLIL1gKisZ6S19ci7T5GCFvCnEs8AatM+jrwWLn0pZSevuvFe Sgzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538568; x=1781143368; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=G3j+8dIDJLDE9oCfttORZmcxZeBh/jFN2elFlpkhO2M=; b=sdl2BEti8eNzrTLoXeHmKHtR4HnnFMvoGl/pkVFcF+PcEQBsW+2spHmys+PWJDtXxv JFJu7SWshfdVY9s8JRLQ5VEgC0fOXlKxzjKmOYDQy3cjb2DpSsBWakm4M442VDf5P+FM Mtx13HQ4wv6E3eXlw03/Ni4rF9/f6exquKPNnlARc8+mN/Okwcqa8MeMM6R5WGEVG3Fd VIMPtAIwhA0PGBVIVexUrTVlf3CXIzQrH4iJ/1muy2ptXnLaIZ24lgsjXvXFfAQ0zM1X eBLg91MXdxNNQT7UrwyBK3L6w/LATW3uIkkdkc0Now4HdO/AwMXhgGzw+aFd4t37MJ8x Vy/w== X-Forwarded-Encrypted: i=1; AFNElJ/BJ0hEIZ3NJQtK+wFllxeH4wtDNYSjP7cEB3gyMvJPudfL/2EdURy1Sm9CZEJZY1TaPs9FhZESag1WSN0=@vger.kernel.org X-Gm-Message-State: AOJu0YxFLHlYAeWKnfn2mK54GPG/4GZhj3aP5KNXtCpqHF0gzpbm0DYN UhmP8NLcHGpDRdVDX8mZXOKnAlZoqplp7OEjToRIWoDi/XprYDE4WRKUfBZ6t/0c3WRpn+/wW6J GFGEIo6Tk X-Received: from plbx13.prod.google.com ([2002:a17:902:ea8d:b0:2ba:3bc2:e980]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce87:b0:2c1:11b8:3c80 with SMTP id d9443c01a7336-2c1644add47mr59129495ad.30.1780538568115; Wed, 03 Jun 2026 19:02:48 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:42 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-21-jrhilke@google.com> Subject: [PATCH v5 20/21] KVM: selftests: Make number of vCPUs configurable in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add a '-v' flag to tools/testing/selftests/kvm/irq_test.c to allow users to configure the number of vCPUs to run in the test. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 1d66293b6d0b..41c50caa928e 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -144,7 +144,7 @@ static void kvm_clear_gsi_routes(struct kvm_vm *vm) =20 static void help(const char *name) { - printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs] [-m] [-n]\n", name); + printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs] [-m] [-n] [-v nr_vcpus]\n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); @@ -154,6 +154,7 @@ static void help(const char *name) printf("-i The number of IRQs to generate during the test\n"); printf("-m Pin vCPU threads to random physical CPUs throughout the test\n= "); printf("-n Deliver 50 percent of IRQs as non-maskable interrupts\n"); + printf("-v Number of vCPUS to run\n"); printf("\n"); exit(KSFT_FAIL); } @@ -190,7 +191,7 @@ int main(int argc, char **argv) unsigned int irq; int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "abcd:hi:mn")) !=3D -1) { + while ((c =3D getopt(argc, argv, "abcd:hi:mnv:")) !=3D -1) { switch (c) { case 'a': irq_affinity =3D true; @@ -213,6 +214,9 @@ int main(int argc, char **argv) case 'n': use_nmi =3D true; break; + case 'v': + nr_vcpus =3D atoi_positive("Number of vCPUS", optarg); + break; case 'h': default: help(argv[0]); --=20 2.54.0.1032.g2f8565e1d1-goog From nobody Mon Jun 8 09:48:38 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 04BA737418F for ; Thu, 4 Jun 2026 02:02:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538571; cv=none; b=I87a/QrOPzbqbrQ0Dmnf6pwGGumSjMZ02ORHMdhpadQvlL3LQIT2Xiey8ObbG8+mxL/Z8bRKf6uIXO6QHfxItKeNZB9Ha9p9qA6+epQ3ggNbJhyR6Wziirhtki7AQvXa1iD4ckyT2b/ebdjXhBvi+kk7PcCODcML1yNMgb6gsEs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780538571; c=relaxed/simple; bh=bx+kBbZmgI4IbtQmhvJB2xCtnwutiLWabYcYesx+0gg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=S+gb4APamTxx0DNohkh6omoFEF/awuNP0IdPncwiONOYcvY5Q3y1hJnT7FqihYZp6WLfFe4ESEd4Tg+hw5vWC7qghY3nRGAsdOrRusv8t5Ft5K/gc0RO3BNM/9RzdKEpGuJW5C0mdV9IPtOiJuhxSuIjW474DanJmZSDHyVAPvQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jrhilke.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=SHwsNVTk; arc=none smtp.client-ip=209.85.210.201 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--jrhilke.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SHwsNVTk" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-8422b544a4bso132792b3a.3 for ; Wed, 03 Jun 2026 19:02:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780538569; x=1781143369; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=nuFK0OxqqftqEBZb8lCNkFzmE67/Kll87MP7BwBya34=; b=SHwsNVTkZ5cgSKbiQacEzg8QFaPGwiLN6rRSO13IkbMJ3h8NGvyOZQMntl1DPugkEJ wYNpMNMjqPjvSuTJNTMR8D9NGxtVcU66ghMI7VbQxt3Pz1pfh+hzv0fPy2Hw5fb6Esdi ltqu1DH/r1p8OSFAFz0lsAFJKrkxnbm7Q5hZCODavBaHQPCxZk+4m1zsvLgnEn+qlzR6 Qlah8ywtx8zA5hzMELS+SnuKI7Ka1iK6GPSmwUk19ENgtXBjZFiJvpTnM5CT57HUqokI 342rc8J71p4soMshv01smMVBDvAOSsgRl/56mf/O4kPX20vKKsuJ7uFxyWOREW3J20uc 3K5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780538569; x=1781143369; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=nuFK0OxqqftqEBZb8lCNkFzmE67/Kll87MP7BwBya34=; b=RGEIwMWHFKdcac/MdNgwwo71D4flaOVO8838RIhg4EBuDvJgc7cNoqEGRLM9MTNTLA 0Oixud4ZP27YDiuEp5vS4cbsQUFcLNT6u4Y5WmD3NjBK+XQtVPhRJUW1WUPmUhYGdred etCdtehvRsGuaRq0/qlIuQ+M6I0th/YRIHL3IXoT+fV8Ze7Iy0Y8ZYq/6LWurOcu9l1I j+EBk7rTqDxxBFThKPvIrdWqn+XfcpPvK9jUhE3TwFfOdqKwKEMZAfAj4LEIyPenBYmA 7kOrGYi4Dbz3FBx2ZmEojgArOyElIChdjqQBh7CtZeZ1Re5eKVEe6+X9YtFOGt0MtWXk v1UA== X-Forwarded-Encrypted: i=1; AFNElJ+MpXTSmZvQTa+l0NS46RZ9ky/q06zggqeUCV5NpsZREYe6Pg/3QL1pODFK5JziHRjpHN25yX/z64IGqOQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yx3+LtkeEvXe5+kjqzkmb4zz6jQwQQ8vURQDEDN9oQrvU/hKttA gCS7YNANvax0tPfUfpkdViY6BdY1w6+guUGxx6D7SlcFDpJHWMC5YcoVtpK7DEq3PC/eL2xZRBu IGN2xhUTh X-Received: from pfob3.prod.google.com ([2002:aa7:8703:0:b0:842:1ca8:3c1]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1da3:b0:842:4b88:20ee with SMTP id d2e1a72fcca58-84284f77fecmr5591778b3a.44.1780538569061; Wed, 03 Jun 2026 19:02:49 -0700 (PDT) Date: Thu, 4 Jun 2026 02:01:43 +0000 In-Reply-To: <20260604020143.748245-1-jrhilke@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260604020143.748245-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.1032.g2f8565e1d1-goog Message-ID: <20260604020143.748245-22-jrhilke@google.com> Subject: [PATCH v5 21/21] KVM: selftests: Add xAPIC support in IRQ test From: Josh Hilke To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Matlack , Alex Williamson , Josh Hilke Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Matlack Add the '-x' flag to tools/testing/selftests/kvm/irq_test.c to configure the guest to use xAPIC mode instead of the default x2APIC mode. This expands test coverage to ensure that IRQ injection and routing work correctly when the guest uses the older xAPIC interface. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- tools/testing/selftests/kvm/irq_test.c | 28 +++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 41c50caa928e..7e421cb7bc69 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -20,6 +20,7 @@ static bool guest_received_irq[KVM_MAX_VCPUS]; static bool guest_received_nmi[KVM_MAX_VCPUS]; static pid_t vcpu_tids[KVM_MAX_VCPUS]; static bool migrate_vcpus; +static bool x2apic =3D true; static bool irq_affinity; static bool block_vcpus; static bool done; @@ -31,14 +32,20 @@ static bool done; =20 static u32 guest_get_vcpu_id(void) { - return x2apic_read_reg(APIC_ID); + if (x2apic) + return x2apic_read_reg(APIC_ID); + else + return xapic_read_reg(APIC_ID) >> 24; } =20 static void guest_irq_handler(struct ex_regs *regs) { WRITE_ONCE(guest_received_irq[guest_get_vcpu_id()], true); =20 - x2apic_write_reg(APIC_EOI, 0); + if (x2apic) + x2apic_write_reg(APIC_EOI, 0); + else + xapic_write_reg(APIC_EOI, 0); } =20 static void guest_nmi_handler(struct ex_regs *regs) @@ -48,7 +55,10 @@ static void guest_nmi_handler(struct ex_regs *regs) =20 static void guest_code(void) { - x2apic_enable(); + if (x2apic) + x2apic_enable(); + else + xapic_enable(); =20 sti_nop(); =20 @@ -144,7 +154,7 @@ static void kvm_clear_gsi_routes(struct kvm_vm *vm) =20 static void help(const char *name) { - printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs] [-m] [-n] [-v nr_vcpus]\n", name); + printf("Usage: %s [-a] [-b] [-c] [-d ] [-h] = [-i nr_irqs] [-m] [-n] [-v nr_vcpus] [-x]\n", name); printf("\n"); printf("Tests KVM IRQ injection via irqfd using an emulated eventfd.\n"); printf("-a Randomly affinitize the device's host IRQ to different physica= l CPUs throughout the test\n"); @@ -155,6 +165,7 @@ static void help(const char *name) printf("-m Pin vCPU threads to random physical CPUs throughout the test\n= "); printf("-n Deliver 50 percent of IRQs as non-maskable interrupts\n"); printf("-v Number of vCPUS to run\n"); + printf("-x Use xAPIC mode instead of x2APIC mode in the guest\n"); printf("\n"); exit(KSFT_FAIL); } @@ -191,7 +202,7 @@ int main(int argc, char **argv) unsigned int irq; int irq_cpu; =20 - while ((c =3D getopt(argc, argv, "abcd:hi:mnv:")) !=3D -1) { + while ((c =3D getopt(argc, argv, "abcd:hi:mnv:x")) !=3D -1) { switch (c) { case 'a': irq_affinity =3D true; @@ -217,6 +228,9 @@ int main(int argc, char **argv) case 'v': nr_vcpus =3D atoi_positive("Number of vCPUS", optarg); break; + case 'x': + x2apic =3D false; + break; case 'h': default: help(argv[0]); @@ -229,6 +243,9 @@ int main(int argc, char **argv) vm_install_exception_handler(vm, vector, guest_irq_handler); vm_install_exception_handler(vm, NMI_VECTOR, guest_nmi_handler); =20 + if (!x2apic) + virt_pg_map(vm, APIC_DEFAULT_GPA, APIC_DEFAULT_GPA); + if (device_bdf) { iommu =3D iommu_init(default_iommu_mode); device =3D vfio_pci_device_init(device_bdf, iommu); @@ -250,6 +267,7 @@ int main(int argc, char **argv) =20 kvm_assign_irqfd(vm, gsi, eventfd); =20 + sync_global_to_guest(vm, x2apic); sync_global_to_guest(vm, block_vcpus); =20 for (i =3D 0; i < nr_vcpus; i++) --=20 2.54.0.1032.g2f8565e1d1-goog