From nobody Wed Jun 17 02:51:56 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 1783834405B for ; Tue, 21 Apr 2026 23:16:17 +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=1776813379; cv=none; b=WLHnY0LokF3lWLCPBEeiGwQeMuqlV0nxhmc9vKE3uXf2DCbf49KXqmBAFnQy3RQv7JDdmMSE/Mow3EefPWsBIUfafRDC1bGGFhOjxpx1Yq/1HImmLnPEdTpk6KMP3b6AO05QUE3LNpSLzxSSFoXR9bL5epFVMRohjp5it/1KoOE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813379; c=relaxed/simple; bh=ebk5ilefbIDTZI9sFE22OCVz4B0wFhUHMvdtjnuf530=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=M9Em8QXml31gdAsfrIMdFUwJped/E3QQfCLDCf2m0byOcNXacCH5eRkPscdk29imKnH9mFUDgpmST6MPgmXf+8YDX9sf2GZ68b4/dmyTU7anLd7Drh3f/n196lrNOs6JBZohXiul7TC4TLeHrr6yH1w0tNhS1TFRus/v8ZHnwrI= 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=At3/Nklz; 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="At3/Nklz" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c7976ded5c5so4869513a12.0 for ; Tue, 21 Apr 2026 16:16:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813377; x=1777418177; 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=tTdoZnVnH7POlnBUq53tWb2qcF6s7WDxtHhm+48XUXE=; b=At3/NklzDiidGNjBbp0QTGJJPHkbNMYExtQNAPehfZTJVNQlgoZCAbsCntfI9YO0aD VyZ0TjIxJZrd1Gkg0jfj++cP2/EblZBWLnCJk8hHqb8TX9XQbM2ikMkV0Z5vG/UcBYbQ 9XlxHIEN6yxBJjuDwKZFqXdTWBL1WZ6WR9rNvwR4cDvxrShbiGPEfUVTYxRGjjeHygwn YauliJJOkyfbcT7fW2Os1WDNUQmgPj/1oViq/e/SQVEaKIToi5t3KTkF6JSGswNOUaFY LOfOXV6TglQLoYUroCbWJOHMJrcw833UdQ4B7hYBc5ZLBGbf0RHiiB6S3EyoQx4OO14i kigQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813377; x=1777418177; 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=tTdoZnVnH7POlnBUq53tWb2qcF6s7WDxtHhm+48XUXE=; b=BGkaxyd2tjAGXdwMzK450goq4DmZr2AWExD965Y1iLJ7DyEyj9eqX4Z7UBDZmQcz8s xsvb40L8bPulbEpmZ+4qkS3FMl9yBcCw+midO35CPNCa/M5NTUiOZQFoK/g7xHqvjIfu u2gQ6OWvbbQnJsJ7YFyuRIaYfvRq6tSrUKuHml3zNZX/VmMGUHq+pVElxqHyGTdlpqa/ c1hyPIz8L4tHa9rGnrIyOVirM7tPrBFB0Uo7X0J/fgLa2ZGLksGSP8wPhK+Aq0IzxUhH qAa6VYEG/SDrqf2ZUVgxZ+FihnKNrj6quXzRrnwD7NYMHp9hfXygCQjoeFQ/d8WCFrUC nNdg== X-Forwarded-Encrypted: i=1; AFNElJ9pk86jZU4lRCHz7ZKGHNiR4mKNjfEXUMp7nLw+lcoSI9cQhoA79qj8byqhHWjzlYyTen613xYyqI1Dpr0=@vger.kernel.org X-Gm-Message-State: AOJu0YzcaF/7rmwYjYTtDNuSLabgaymayXYZU1J1mhFseR0K/1kdpI8t aJHICn9eK+sV0ajeWrK1rBbvrzsUwfIb+RPJskI9mcFilVX3yclPsrcOusr6nYUbg1sq9laoVAo snaqsnGUe X-Received: from pgal185.prod.google.com ([2002:a63:3ec2:0:b0:c79:8016:5127]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:e081:b0:3a2:ecb8:56f0 with SMTP id adf61e73a8af0-3a2ecb85faemr5276984637.33.1776813377212; Tue, 21 Apr 2026 16:16:17 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:42 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-2-jrhilke@google.com> Subject: [PATCH v3 01/16] KVM: selftests: Build and link sefltests/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. Note that KVM selftests build their own copy of sefltests/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 6471fa214a9f..b3e223f45575 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -252,6 +252,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/ @@ -306,7 +307,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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 50F7C35B646 for ; Tue, 21 Apr 2026 23:16:22 +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=1776813383; cv=none; b=YjtIN6jUwUaCMzDOTyxeL9no6p5N9Ddhsy+yiQo8lMdENzKhuPbnX5Ii+b8r+n3kjX7nhJLbvUtnSLMQd471x8AbIUa3rsTvZFljsM+JiOakh1AHH0LGz8N/uazBN0JGg9aKs6fGZAVBbpxRlAL/BshJ3xb2vsl37Cn6uJ7Q4BE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813383; c=relaxed/simple; bh=Fa5Z2b3AFmLW659rMLC6e+YsFIKYNkhhbhmajGAg4nY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=SMyFbzHZlmN0c6YxScOJHcBkjhmDuN4ceJ4ioT3KgTq3MAaFQDIt4bjXrwaNY9Am+oRWdKi9j2IqcLCruOf6OnubOholJeT9tvpYGQbwEFSy4EKSOWZvqpybvuUnPz3G0i6EqfLLZeWnXnBUWqH3Ft62AoYMLIKjscnu9Jw5iwM= 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=ZHYNlmGf; 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="ZHYNlmGf" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c7993b17335so814704a12.0 for ; Tue, 21 Apr 2026 16:16:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813381; x=1777418181; 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=rO/sEyq9fOmOK5M/bH4lLglok4DGILopTeBk6BkE89o=; b=ZHYNlmGfs1PK0moVxNWay4BoBLIqs8pBf05EnL5kLM4O9JZvToe7JtHXqEgxlVycTP FdIExshnNp6LH39qoUtSgEXx6dPZ+1Lc/ZiTDuZMeMBFiURsQCKQbLHfKFha4FGAFnzU g9CgTF9ntkUjCn2MQF8N9hEVsKSmgxv70+VQNEG955NX5EN68taOmsEDMP4DVOdGG84Q XppYKtdOPMus6yfqLQ6O90OgX0FlutuU/tFQF9MZSdkLipXB/lXd5nSzft7lqqydDHJm 4Jbuy2S7xoXJCPxYjAKmGAPsguUXDMToBq/szd5AG06u18rg7W+uENHKilqdjOirbsKP b89g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813381; x=1777418181; 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=rO/sEyq9fOmOK5M/bH4lLglok4DGILopTeBk6BkE89o=; b=iljZeD3I7XGRoF45JQjkBahqYQGQJXl7xJ+6OUlCRvNWmakmzwyv8b5uLGYsEQG6Tc kOJSqse2v4gJy57pRJvcCocsoQOPoeMMBuEZuUKMPyVBYF1NlTkPf8poYiGsR4eymqIt uVJAmyEXAs5367rUF5jRa68ZGfZ6cZIkxEaqra976pg9jQs9ZPouRKo2wQWdqbpLQADU EXrwDXJwyicNnzjFIV2dImZikxzYTYssb1zJIGBjFH3ZJ37+8nkfMqbmBvn4azYHiZa/ m/DIanhq+x7dAsilKldfDx/xPPqBBsJOigaVMLM+pTr3Tx+SODv0YJH84q8K6UWsp4wT f6Ig== X-Forwarded-Encrypted: i=1; AFNElJ9lgly9hzR8lwDrXLexNRhetOnw+m7HvJ+5Eohxatl388swtWcIiK8FngYLXqMvg7pgRpAbWYSB2jySP2A=@vger.kernel.org X-Gm-Message-State: AOJu0YxGrMHstP/+Vrv1Skgz4jyyBj8SRRHxUOEACpH3Y2pk87Q2dGa0 IcE2FVcCNX75C1yr4nxUYyoSUrhzoAHbPDG9qD/NuYqEb/wehaTvFqz0jwuDfT+dKQse2lmioeC e6ndUnGb4 X-Received: from pfkm16.prod.google.com ([2002:a05:6a00:810:b0:82f:acfe:350b]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1a0b:b0:82f:b519:a5cb with SMTP id d2e1a72fcca58-82fb519a73emr8945998b3a.37.1776813381347; Tue, 21 Apr 2026 16:16:21 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:43 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-3-jrhilke@google.com> Subject: [PATCH v3 02/16] KVM: selftests: Add /proc/interrupts parsing helpers 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 utility functions to parse /proc/interrupts and extract the host IRQ number for a given VFIO device and MSI vector. These helpers lay the groundwork for subsequent patches that will use real VFIO devices to trigger hardware interrupts. Specifically, they are needed to allow the test to log the exact IRQ number being used for better debugging. 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 | 42 +++++++++++++++++++ 3 files changed, 52 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 b3e223f45575..d944b81cad7d 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..7c465e8584e2 --- /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 + +int get_proc_vfio_irq_number(const char *vfio_device_bdf, int msi); + +#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..ad1c54a81869 --- /dev/null +++ b/tools/testing/selftests/kvm/lib/proc_util.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "kvm_util.h" +#include "test_util.h" +#include "proc_util.h" + +#include + +static FILE *open_proc_interrupts(void) +{ + FILE *fp; + + fp =3D fopen("/proc/interrupts", "r"); + TEST_ASSERT(fp, "fopen(/proc/interrupts) failed"); + + return fp; +} + +int get_proc_vfio_irq_number(const char *device_bdf, int msi) +{ + 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]", msi); + + 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 irq; +} + --=20 2.54.0.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 1560B376466 for ; Tue, 21 Apr 2026 23:16:24 +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=1776813387; cv=none; b=DqhqI7pAlvpmhd6Sy12HxSIdOTAfnJzdAG4IKRldcpIGFlWB04RFVVido+t07Ym0noQ8tDXuxDKV518HAOthVJ7b3QfL8iW8/aqVHQPZ8ifRBT88MuCt3cDoD0KT5AEJAGm8zULQFtB5aVkJXN/qttvct1Pqac9bKJEF0UtZE3M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813387; c=relaxed/simple; bh=teRtuSAZMi2WrLpwGlWDr79ldyhEAGld70T3XoZK5mA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=BrN39itMDuxKuzlG9McDZ2d8vFColbyA9c1UgRlqB5ppmZwvIWdh5SZUghQ755puLz4l+VLNpL0dk6A80ukwL5+e4Nvf38Bkux0JheGbrYxxC22jBYB+2xiXImFLYjOfUFKveuqvUwN4w8NMXahtBCFJq8IMja5A37HOorHUAQM= 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=E3JQeDMx; 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="E3JQeDMx" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82f6a5b4f88so6529780b3a.2 for ; Tue, 21 Apr 2026 16:16:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813384; x=1777418184; 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=FwatT0V+jKnF19uq58SkHbFVpF1HDKdkG1///6NKWgs=; b=E3JQeDMx+0XQR4GM+H2xSp+2e4O6of+9mlrtGlxfQ5YAVoPSpCMxw/30mzm703KC/U 7XoSdgD+dml1lZtCvU4mEFn+W+w1Do2oNFN7idMR4Oz47YfqoOErvGbPXjAisXqi9lo7 oRQtPnOiuUKGV7T3bWuRlgaK4oUICcoQ41V+uzPNcw+8ZEzfahJwqhyrXQxraewl+XP+ yicUVMJjQAZOL7bAJCxyzGICFPeAco6w9jw+pWL6YmXPygS1At21jcdwqkhBG2Yybejd m8U2SqWoYxJQe1M9gEluJQymkGpe9gvCuAKiamRtPcaGqYaLh/1cgjLVxkmUJRKShio+ 0LjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813384; x=1777418184; 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=FwatT0V+jKnF19uq58SkHbFVpF1HDKdkG1///6NKWgs=; b=TfGbWPPQ6h1+ftgWg35BHyLmiFFNJNjW3ix5L8M4EYQUmK1asxRnMHFyfGJx0zS/jW 00VQwdyUg2sSPD3yEIYsBkXIfcg4eJvNZ7WCfRcbSXujE5uAYvULffZ4SHXSSKvhVBgX WkngK92lXgaIbch/pYiWQL/+TLC22SZxUPGJthTLdkutoO58DPCNMAc9wS/xmgLZJ6nB 7CU+mBsY+U5pIUE1fcjscGRhurIKmrgE2V3wijonmNRrP//B07Q/17qbOFungO2kGef1 IWy9yXhKE7Uxthu/AnNSkSkfWLwZAjdfjNQ/52rR+mxv8pxBC+pvmDvPGL8p/8gcxepV StrA== X-Forwarded-Encrypted: i=1; AFNElJ8CvFpUj97CU67ig6GkzXVjim9Ik4GcAlwdhqfBE+1ZtuQNdBJ3IKlxPOY9szl2qzDrsm8hXgIDhp1GkZ8=@vger.kernel.org X-Gm-Message-State: AOJu0Ywu+JQ3ztIPzso/Vnhlv+PthvNniGJfY0lFr8QRoZRpopLJyFDB IBHrp7r2OUiEtnWLWNEPSqaSw0Ie/bc1lQdhAFDj4u2L/09Oq08znbRO1E+Zfjk1WMVJrQXDeni 6Yui/3fUy X-Received: from pfbha15.prod.google.com ([2002:a05:6a00:850f:b0:82f:a9ab:e28c]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:4ac9:b0:82c:217c:98ca with SMTP id d2e1a72fcca58-82f8c828d95mr20260813b3a.12.1776813384163; Tue, 21 Apr 2026 16:16:24 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:44 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-4-jrhilke@google.com> Subject: [PATCH v3 03/16] 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) 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 | 6 ++---- .../testing/selftests/kvm/include/kvm_util.h | 10 +++++++++ tools/testing/selftests/kvm/mmu_stress_test.c | 9 +++----- tools/testing/selftests/kvm/steal_time.c | 21 +++++++------------ 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/s= elftests/kvm/dirty_log_test.c index d58a641b0e6a..66c3d9554379 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -764,16 +764,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 8b39cb919f4f..499e695f1fc4 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1144,6 +1144,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 51c070556f3e..a9fac4bc02c2 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 7be8adfe5dd3..23380de79817 100644 --- a/tools/testing/selftests/kvm/steal_time.c +++ b/tools/testing/selftests/kvm/steal_time.c @@ -72,8 +72,7 @@ static void steal_time_init(struct kvm_vcpu *vcpu, uint32= _t i) int ret; =20 /* 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 * S= TEAL_TIME_SIZE)); =20 ret =3D _vcpu_set_msr(vcpu, MSR_KVM_STEAL_TIME, (ulong)st_gva[i] | KVM_STEAL_RESERVED_MASK); @@ -181,8 +180,7 @@ static void steal_time_init(struct kvm_vcpu *vcpu, uint= 32_t i) vcpu_ioctl(vcpu, KVM_HAS_DEVICE_ATTR, &dev); =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] | 1; ret =3D __vcpu_ioctl(vcpu, KVM_SET_DEVICE_ATTR, &dev); @@ -279,10 +277,8 @@ static bool is_steal_time_supported(struct kvm_vcpu *v= cpu) static void steal_time_init(struct kvm_vcpu *vcpu, uint32_t 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, (vm_vaddr_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, (vm_v= addr_t)st_gva[i])); } =20 static void steal_time_dump(struct kvm_vm *vm, uint32_t vcpu_idx) @@ -376,8 +372,7 @@ static void steal_time_init(struct kvm_vcpu *vcpu, uint= 32_t 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"); @@ -476,8 +471,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", @@ -497,8 +491,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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 96F0C37B033 for ; Tue, 21 Apr 2026 23:16:27 +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=1776813389; cv=none; b=YO8of0SSI+Mr1hM7GatwDdvknFCdpvfx9AEG1Fg2sVDPqeOfENB6jWUu9/fbtGKcwfwOudwcWVIBsiYATDM7xebtokRso9LG7rn2j4gAUfkadO85SvWqlrw8sxHcTA8NaTysYmMxFfQeD7KJuQQRExcfcXCaQFP+4nUYR7IrjA4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813389; c=relaxed/simple; bh=pUiysLbhE1QskLSCR/qZKId2KyMa3efWNFiLsI7YQ9Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eF24OqoUHq4ch2pgux/zF2RRQo1juDZbXopokNHtDeZP+9hDufU99ixLU5zgsodNWIRtgEGXH1qDnvE/ozQxWcxz//rdY839rU2vKuuWNVIGuOEC5i5DAjEPyxuQ6L6jKMlwMSJVO7vLyXIRQQzGx/s32WCS1tsVD51b/SFy+x8= 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=pNP39wm9; 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="pNP39wm9" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82f07078ff0so3236776b3a.1 for ; Tue, 21 Apr 2026 16:16:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813387; x=1777418187; 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=fVqjAXYLHT36qpXpxcY4PwaWwws6EH2+exlXg8xPOzI=; b=pNP39wm9UU2pHxBqFCkBz4PZp/3aF0j3Jx1z9IgVeWWVlnU+v0AY1DiwE9VXmBLaU8 uRWKus0yffA7Ja6v37S/f1D0at08cvg34A105LPpKK1CWUGK8jRbzpUyyDuNJvTskY5r rOFiOZWwtlQpTAkJ+6/Wedt+3xuIlPbd2kMPKZaH0W38xJNwlh1akFun/vEz2VK7hpZo ZEGUrayG2Prgcg7JDQhYOViEa2O1Wmr0iwo8wDdX5jMlgxVB6uMa08dFYh7DEegT4LRB 9iU8Ltj4Na18BrNRd4BmQjbarN7Bypno5eAxF2RXU6O+AzXqgUFdNPsQm88A515XVC5b RGOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813387; x=1777418187; 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=fVqjAXYLHT36qpXpxcY4PwaWwws6EH2+exlXg8xPOzI=; b=rN+WPpoehgsLDktfNpF78ENbPh/RYeXAFA9QCuCj9Nu2zEWjiZkmGCNHBbOm8y6FUv rK9rDotiITFf5xpzmkliMi+8qWIyJ8T5pXdU5AqlHEse0cx4EgZRzOHYTAxpERDmsd6/ 2CIj7UFfVGvgUmZBpb1t7BkiHEfkDLYjIvdqLonuCgQCGtaI61z01uwZOvaVRHKhcoFN HHsVsiqNOh/T1kismdMhrmKv/mWeyaiWxLeTaJcJLitxDiaqggStHk6B5Mxl2Gi4YyGX z0J12/wYfH3a9XwEhdfmLGdRTHWGrKP+72R3BU4t3k0nm5QM+zVTopZbzcHuK1OxjP0P jIeg== X-Forwarded-Encrypted: i=1; AFNElJ8UEC9ceW1sM+LoPqjOpiZWwTmufjVRvoU6PSOwhHkP9vF8mJCbH8vae19tntrkTWaZmJw4Yo5WwcLbO44=@vger.kernel.org X-Gm-Message-State: AOJu0YxcMcqu29o+SDcOBQwFaMGXvMHpPljkTyY5zceGZ6xEzfRBuwpQ +rpuMSeIc3aM/GsikY+79ZD02FRZQ6aXt5xtMgpc3h7uyQFTsLrC1+gLeEqq5W0dyj4TNfROcWw +MtL9whTy X-Received: from pfbg11.prod.google.com ([2002:a05:6a00:ae0b:b0:82b:928a:17cd]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2311:b0:82c:dd31:b83d with SMTP id d2e1a72fcca58-82f8c936e47mr21598996b3a.38.1776813386756; Tue, 21 Apr 2026 16:16:26 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:45 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-5-jrhilke@google.com> Subject: [PATCH v3 04/16] 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 0a1ea1d1e2d8..606abd858a12 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 66c3d9554379..cddf56400e6c 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 b4872ba8ed12..ae39c4293b9a 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -106,30 +106,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 { uint32_t seed; }; =20 -extern uint32_t guest_random_seed; -extern struct guest_random_state guest_rng; +extern uint32_t kvm_random_seed; +extern struct kvm_random_state kvm_rng; =20 -struct guest_random_state new_guest_random_state(uint32_t seed); -uint32_t guest_random_u32(struct guest_random_state *state); +struct kvm_random_state new_kvm_random_state(uint32_t seed); +uint32_t 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, uint8_t 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 uint64_t guest_random_u64(struct guest_random_state *state) +static inline uint64_t kvm_random_u64(struct kvm_random_state *state) { - return ((uint64_t)guest_random_u32(state) << 32) | guest_random_u32(state= ); + return ((uint64_t)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 be35d26bb320..63a12ef9008e 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 1959bf556e88..b247b2015b2a 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 -uint32_t guest_random_seed; -struct guest_random_state guest_rng; -static uint32_t last_guest_seed; +uint32_t kvm_random_seed; +struct kvm_random_state kvm_rng; +static uint32_t 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, uin= t32_t 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 @@ -2358,8 +2358,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 557c0a0a5658..c5df9c99102a 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(uint32_t 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; uint64_t gva; uint64_t pages; uint64_t addr; uint64_t 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(uint32_t 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)) *(uint64_t *)addr =3D 0x0123456789ABCDEF; else READ_ONCE(*(uint64_t *)addr); diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/se= lftests/kvm/lib/test_util.c index 8a1848586a85..e342d9fb4771 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(uint32_t seed) +struct kvm_random_state new_kvm_random_state(uint32_t seed) { - struct guest_random_state s =3D {.seed =3D seed}; + struct kvm_random_state s =3D {.seed =3D seed}; return s; } =20 -uint32_t guest_random_u32(struct guest_random_state *state) +uint32_t kvm_random_u32(struct kvm_random_state *state) { state->seed =3D (uint64_t)state->seed * 48271 % ((uint32_t)(1 << 31) - 1); return state->seed; --=20 2.54.0.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 EBA383A3E82 for ; Tue, 21 Apr 2026 23:16:29 +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=1776813391; cv=none; b=S0yStappk2pWErIr0nMWDZCc1gqQIFDURe22h+0Ht+SZ024Gi+l1yPLKPrJlS8NbgehkRfJ1z8seDZQCBiB6sGS6vIgGd1AK/zvILKJx26IFu1sX7VFnb0Y4NwqQFG13pXDdYDoq122O3dl3WwHbC+Fv6ihM/04A+8IGQGQkfMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813391; c=relaxed/simple; bh=voOvk06YWqRurywBuUK2hn9zgbNMkMhLMOTchW42D5I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=sOXv/eKnLYy7rJAO6YTUf0e19ebC29u5ltvTCP+uQI+nEeR31cIIGfR8U2C7hp1HMy74WMa94iHNdDmPZ2ThqExXG/fZK8jwmxcHzlsxUoqLIhBfbAsas1uheok6Eu0Y4KUgMB4VGn8n+jcQM0/Ycqv95aLSNDImDk4cZQ5DdB0= 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=NB0suDN+; 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="NB0suDN+" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2b2d83e7461so82942925ad.3 for ; Tue, 21 Apr 2026 16:16:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813389; x=1777418189; 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=mSSgscTMb2e4GTrJ8K0fxWTxtmJkv8VeQPDezgW5IvI=; b=NB0suDN+oiiMwqz9Ym4403qdGLplHrI1xszgH2YO3SSVzcPdBrx+/6Hb1C+VJFnlct oLq1HuZV7j4+Kv+E2d6PClnYqhPnvR7f9+xi4oYkk2ZTj6qp1QfoNAurGpTWN9A7xIst bRDDjZ135qmBZEjP7U5euuGzuIAwKCubl1e2dwj1qDkfgcYmqLPhsRDrugp8y9fiAFbJ T5s3SmImOX+iQ5+bwdp9GybrDDR8bsldHRB7xdixfbwfmV8eDZth0YGCJ8x58cd7pQea gGMDNWZj5epD0a+hiQvx5DKCV6/EANhrM66mCOv8JVES24Hw75xSKlEvuAu1Mm+xG3ij I/Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813389; x=1777418189; 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=mSSgscTMb2e4GTrJ8K0fxWTxtmJkv8VeQPDezgW5IvI=; b=bh8r89xkKxOK2PpqZ1zrntz70eiBwpApqd9kRKMAYCA6pSuZE/aEIru6Izgegbdb0b BnIDHu2ouj6w0aNtrPaCqC4+Q+o4jHHNaQmB3aazdZSzB628NFFFqh2zvzjKCoQ9ylgB iZvb+Z00rfkUQCv8prgZXh+DrT7cQPcliZkZQmPVJyf9341sEstd3dkU68RlWhIgMxUN OLprEDdBuiEkunk6a1RFZczSXbABPFLiKJ+Hst2g3UDsjlo3RCwnEGMkes1Wf4+Akf8L 9fOwaBqnHOcuGI3F3dT7pu1DfI5jHD++Fj0Y/bK0yH3aRGbVKTpjqlM8efuHqMoDNZNM MyzQ== X-Forwarded-Encrypted: i=1; AFNElJ/xd+FlEQT/An4lMbtdKNGeF3V6TVJYlLUooblVpR0KKVs7xnCc1LQgfjLS/7VItR+pg1S8tVxd9nHC/ME=@vger.kernel.org X-Gm-Message-State: AOJu0YybmE9vfQYcnikYH1uwWVVEjQvWeAfFNnFh8Kzsev3kLcMJ7ri1 VCL+FdaobOJqZOZz0oD38+PALft0gkoASzIu8Wqou+3Z36X0hI1yNYM3FSXf70vXoc1EGYjVKXw 56yb6N58J X-Received: from pfbjs41.prod.google.com ([2002:a05:6a00:91a9:b0:82f:6c9a:6139]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:918c:b0:3a2:d838:bfda with SMTP id adf61e73a8af0-3a2d8393bb6mr9832338637.46.1776813389169; Tue, 21 Apr 2026 16:16:29 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:46 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-6-jrhilke@google.com> Subject: [PATCH v3 05/16] 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 --- tools/testing/selftests/kvm/include/test_util.h | 4 ++++ tools/testing/selftests/kvm/lib/test_util.c | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index ae39c4293b9a..584a4ab43db5 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -132,6 +132,10 @@ static inline uint64_t kvm_random_u64(struct kvm_rando= m_state *state) return ((uint64_t)kvm_random_u32(state) << 32) | kvm_random_u32(state); } =20 +/* Returns a random u64 in the inclusive range [min, max] */ +uint64_t kvm_random_u64_in_range(struct kvm_random_state *state, uint64_t = min, + uint64_t 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 e342d9fb4771..23d543a9053e 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -42,6 +42,22 @@ uint32_t kvm_random_u32(struct kvm_random_state *state) return state->seed; } =20 +uint64_t kvm_random_u64_in_range(struct kvm_random_state *state, uint64_t = min, uint64_t max) +{ + uint64_t value; + uint64_t range; + + TEST_ASSERT(min <=3D max, "min (0x%lx) cannot be greater than max (0x%lx)= ", min, max); + + 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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 7A4D82C1788 for ; Tue, 21 Apr 2026 23:16:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813394; cv=none; b=XPskpFU8AN7TpyJzAnlr3F+5tZBlp3+wQeML420Ygi//D04CGDETQ8c/83Z1USt0HJbR7ch1kDK6NfvBmMXuuow1OEMhNrK8ISgQTBIyke/IHcslju6aSdmWfDHTcY2aB/xq6Fa4XetmWMwRU3+rYU6fncFfEk4kl9dRE+3bXKk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813394; c=relaxed/simple; bh=yuVZG5bnHVDFGkeTr7s59w77kNVoCAnWk2sY++DZRl8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eWUYe8Bvlgd9Wc1zV9uGhU2icSTiIeqUYa0VU9bkl8TnFqizuM46uVIoybQ5tQ2qJQU23ANMWXRAO3T9cSEupD114OL20gm/PtNf51C4OvExkx/mSgxvKjur+1+uifXASfr6+JtH8PB6qvTqpUoEBcGC+5Kh2GmZ9XIvem1drRM= 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=iwC+ayhB; arc=none smtp.client-ip=209.85.216.74 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="iwC+ayhB" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-35fbaada2f3so8777457a91.0 for ; Tue, 21 Apr 2026 16:16:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813392; x=1777418192; 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=zcMD+a+mUM9pTuq5mPlb/KFU2SXXC0lNH02gTQSKwJs=; b=iwC+ayhBRphAwxxyOa593a1QibG2J9z2E8w70u+Q+rA7fCVoCRsqkKhVkdBF5I6MBp 6WzdQksRg0LFyBGabd+Ia35Vs6vtqx6qwVMEVw9nDwJthFRMaNzizmPAPRAcFIoS2vIZ VZM+cOcMTDmJl7xoxk4B7COfuj7Z2dxlQQAv0X45x/B4M3U5wv4Azvym93o8AFIJBCf9 y7MZJDXk2KEbvqGTLnk49/e3yVAF++8XvYs3vPchlo05D0UWfdVfoF6zijPoMzJJB3Ds jcrNqnZHw2bzjgJVVoQot1iRs9Syi2iBQzrS2PKFHM9lpOlpwZlQ73wlNoQUyy5CjN1i X4ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813392; x=1777418192; 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=zcMD+a+mUM9pTuq5mPlb/KFU2SXXC0lNH02gTQSKwJs=; b=qm2pvvs60XlKN/mU32PRUTlrkWFWxLB2Yptf+Zy41sjlyMepBafAptSrWiQPCt1Adi ao70TAAwqDqqBudqHOEzuhS6rAFPnpQY4R8Lm8E7dJ1Ld0DVb26e/qRzDQDaSualf7V0 uj6IqZrwouzAa1dLWKbo9G/QBeDQCdW4W7YKvaR5qwoavSSBPahiFKSM9xjA+r9VA3z4 swaBxfReO2e9D2wPJpR+ntoUFxbRYV8f77xMyCFOshYxzaVTSXiovkgFSKWjplObKGL5 kqavDj1HtnVWQ3UKi2ZAxhV00aTwDUuI4Oz1Ffs7FGpERvIUl+0sViM00Q0902xROFfu F+Mg== X-Forwarded-Encrypted: i=1; AFNElJ9bBFBBLBHKHvkTO+hbpPzrL+WbqRbrjqUloOrSCo2LCeyp0hW+1BbowIf2EgaPo1iP8l8qhgehuF50NvE=@vger.kernel.org X-Gm-Message-State: AOJu0YzsZTh/j0iSS6CWM7otjNFLEyApbaQz7EsnAodUOCKptekeJP0E EPDaZaYVj1X+5VRCUsaWjEtfbGzAy2b3v/tXsXgQoJPW5PoXbp7EoTXwIm94OJGvXfDzxVyw0eJ ZZTxBlI1h X-Received: from pjbcq15.prod.google.com ([2002:a17:90a:f98f:b0:35e:b019:85e1]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1dc9:b0:35b:e551:e776 with SMTP id 98e67ed59e1d1-361404a6c39mr19138740a91.27.1776813391719; Tue, 21 Apr 2026 16:16:31 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:47 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-7-jrhilke@google.com> Subject: [PATCH v3 06/16] 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. 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 | 1 + tools/testing/selftests/kvm/irq_test.c | 173 +++++++++++++++++++++++ 2 files changed, 174 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 d944b81cad7d..693c03372a31 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -156,6 +156,7 @@ 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 +TEST_GEN_PROGS_x86 +=3D irq_test =20 # Compiled outputs used by test targets TEST_GEN_PROGS_EXTENDED_x86 +=3D x86/nx_huge_pages_test 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..317e04899df3 --- /dev/null +++ b/tools/testing/selftests/kvm/irq_test.c @@ -0,0 +1,173 @@ +// 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; + +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( + !SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpus[j]->id]), + "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 (SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpu->id])) + 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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 9F1EE3A5E64 for ; Tue, 21 Apr 2026 23:16:35 +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=1776813400; cv=none; b=PODjsHvow7fjPoaOssTTijvZ5UrkLMHvG6AGUH8F1D5RndIlkcgbC3JO57u75+zJMju97DG1so14T7jzHRnFfQ2n5wxxORIH/RvTP86DHVYqfvKn3lI+48bnOSBxfvAN54QC7BPtX7+d6yefAJo44+GhflWUjQQ62VxoxMi8Nfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813400; c=relaxed/simple; bh=Zagm7ot0pvac7A0w6F89lFrDv3pvnEw6X4kD3+zQuNs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mO3lfkdIsjr5hy8fdrQudMzIaACDFfHV7yVz9hZxIvZfhTWKLozF6K/RwHebd1LY/+uVLeIqsCjoJsToMeYlGHlfEsFml/rSyDgX9Oemj6yftE/AW2rkQhG+BqgvFlhQr45ule4OJzR5BqchKKmDvwILkSKUtLXVQW4coYXHQXQ= 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=IDZj8eYP; 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="IDZj8eYP" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82f71437218so3081139b3a.2 for ; Tue, 21 Apr 2026 16:16:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813395; x=1777418195; 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=ECgA6/sdKM2W357V0lC8UhEDIugczN8oX9UZAE2qr+s=; b=IDZj8eYPcLCHxxb5IuG/Sh/42Gd3ANkaEwNT0eA1bZMd9q7kV1ILOX8/3nf6i2QEsy XU3eNUPhTaSOvSv8xUa8DVaXy0hun6vYyeSAzIuu5CQGb1wmcFlwzXPOWeCSMVmqrHsI qbvqQoBwX21wdDRRwM/PyfLYmi7alt+roJ6nRNg1DFdrWhZgZo9xViUqBSXgxQnlVMf5 drQ/3ZQxHaqQBly7buk0JzetBAKFZqJ2aJ/G2AjOI+rwwBc4UetB1l5EhRr0N6frZ0to K2ceiMYYj7bb62TnQXB6uPaWDADWAST4Xm5Y7lkX5QEAjuLckuwmacVNJMKAtCtbDZKA ANCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813395; x=1777418195; 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=ECgA6/sdKM2W357V0lC8UhEDIugczN8oX9UZAE2qr+s=; b=IcgwC3Nz8iZmcUH2bX+jCOV7rVXSi9+y0WQEsROeqe4YOVMAQbfu2iajeNy2gdPYRJ ENMCmpb2oIag9kbxz/M5ONOn2JBirWFcBIoc4LlsyxtMiqCt15R13vnYs91qpEgQsnWO OgYeSdmCsyscRTrB13vzMLgcg2uf7nr29o9mWfCypEcXJiHSARZRg3DqevBiyKhKhpda s0NoCEYTGaMBnrscHtXRf3i4dVhyCIO+uum4mCbZy1VJJtMF2Ieaf64MQ+5XQ7e1Dt0n RuMyvs514AI/JQipsnGSGrzR3X/Wr4lvrx+u+6tpRlbAZhcjvIBmkixPqoQzykNDUs2S cIhA== X-Forwarded-Encrypted: i=1; AFNElJ8EuhhdHfk4T7MCB8a4ax0d0efBZQkPqlciNPbQWyqTLMqIcOtkS9nk/PUWBxuimyJ1JTP2jgDTp4ISMFM=@vger.kernel.org X-Gm-Message-State: AOJu0YxmAdjDE8KHKXMni9j+Gotj7o76f1x+QCe3QycuZeXjIenwbDHm knk5gyFNvacVF/TkshrClFvTMbmT/oT9yBYJ2YZeIY7Gu20QzVKuYKcA1qy5Konf3jn23lJtHke s/k3p9aFP X-Received: from pfmb3.prod.google.com ([2002:a05:6a00:1143:b0:82f:a75b:f7fa]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:92a7:b0:827:4bca:f1a2 with SMTP id d2e1a72fcca58-82f8c87e27fmr20134382b3a.10.1776813394911; Tue, 21 Apr 2026 16:16:34 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:48 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-8-jrhilke@google.com> Subject: [PATCH v3 07/16] KVM: selftests: Verify device IRQs are routed to vCPUs 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 real interrupts from a VFIO device instead of emulating interrupts using KVM eventfds. 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 | 61 +++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 317e04899df3..434dce7188cc 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]; @@ -52,6 +55,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) { @@ -73,9 +106,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); } @@ -99,12 +133,18 @@ int main(int argc, char **argv) =20 struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; pthread_t vcpu_threads[KVM_MAX_VCPUS]; + struct vfio_pci_device *device =3D NULL; int nr_irqs =3D 1000, nr_vcpus =3D 1; - int i, j, c, eventfd; + int i, j, c, msi, irq, eventfd; + const char *device_bdf =3D NULL; + struct iommu *iommu; struct kvm_vm *vm; =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]); @@ -116,7 +156,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); + msi =3D vfio_setup_msi(device); + irq =3D get_proc_vfio_irq_number(device_bdf, msi); + eventfd =3D device->msi_eventfds[msi]; + printf("Using device %s MSI-X[%d] (IRQ-%d)\n", device_bdf, msi, + irq); + } else { + eventfd =3D kvm_new_eventfd(); + } =20 printf("Injecting interrupts for GSI %d (Vector 0x%x) %d times\n", gsi, vector, nr_irqs); @@ -145,8 +195,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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 669E735B646 for ; Tue, 21 Apr 2026 23:16: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=1776813399; cv=none; b=jXaKLktFbhXcVCYbYAhgAC/CqMykzNTlBnStNpLOmmuAGQPT/LFW3JXJ2MXVAZlCwGa5/NDsNU6zVkKGod9xtCrEYDYcF/Z/M/hQ6+3olJ9JjxuJ0dSxhXPV9eVc0CZlF1uiUiBGA4tfF812NJmBcE4Y3fe5R8zO8Zb1zXnXPYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813399; c=relaxed/simple; bh=g/y5dHJeRIa1rtCrBVyHrEAWX57QUXQYjX729SgzpNk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eYOGQmU9DsDI/xEZdnn291F981zQen1m6TWe4jJRkN3YhiT087+klk1ZfX3ObcNApHWJJag7krRDfP3AU7vM65DOE7f5LT3cJlIOPIxxLQZ4FnWuaWi/VAkIVQAbtlY/pt6nOiTGsxCja6+qAVG3MxFM/3RVlBRIgs47qUUHzQU= 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=e2FWkvyj; 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="e2FWkvyj" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82fbceb0181so1889974b3a.3 for ; Tue, 21 Apr 2026 16:16:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813398; x=1777418198; 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=6oB4fHNMTwDjMTWMSwGo8dDsC6oRH1VqUz0hgU85i0Q=; b=e2FWkvyjxSQKFHU0kr9NPRF6jH4houfR6BSXshjj+vB6Tmw2zs3LgYm8VbCP1O16wy EOFO5Y/eSo9r096uvqgk3+O6tprDYYlYRTjQbDk9TctYoYr9Zveg33aDVBToQYLhUV4a N1E+LIpzM7fCoCXsaipL9thPzpzh6EYpi3Im/m7p0TzQBonWZ/P7uv+UEP0+ULet9Hsu WgMVL78F1qrxwczlG+wlaeWJaYStDRePfIRAsrN8Poy4c5rSEr9dJK+76toOur49dddf 91TNrEawEa4/nIcAjDVcQo6FMOxsdEHfycQMFOw2iFNTDc0EDhMN3Z1h25DOkJVYC7LL nshQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813398; x=1777418198; 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=6oB4fHNMTwDjMTWMSwGo8dDsC6oRH1VqUz0hgU85i0Q=; b=dxMrQhpnUxMC0/8kVNM46LKkmgsW3g4TzjPZsgY34nEyVNfpL4G8ICEXCYQ+2lh6Ss YyHjjN4yeyWsSmaJaDiZuivi94GmFvDa1eYcwRUUE1Wz5B/EL6fsUn0kEB/Y+vLH5Fch WsF2Tql0O5rZP8k4NESEcXkhNEtYGZFlnMA6OWgdkIghqQrZhuJVUsDlRGihgXIaGs8z Sw5nVE40wpSq0IBdYD9tz9sGLHxjFynJ8PIyW4BPg9NkDFPlMmOtDFDG5DZCus9MSY8R 4p1NsKRBd3Ag9nMeuGex2yu4OXndTpmRqSkD1cMKVlNwhlRzaVMwcUw5BdSJttRqFhlY Z2Lg== X-Forwarded-Encrypted: i=1; AFNElJ9lWjDZNJr6wqUxyqwdpIor4WtdoFIV3/DH8I0S3CZvZJInPL7bHR6aspBaVokoSn1pH7jHoPSPCKxQpo8=@vger.kernel.org X-Gm-Message-State: AOJu0YxxPnY2q/8uBQP+XvBnRPrUYoDKAf5yT4Qm48PkB6fEvgiGxZ3e 7ThYMdSr+jneYmd3o7gAM5+H+n5Q3pj6uSVYLJiEekJSJ+oilv7icss/C2fidhnQ3nqOOBdybKO JokLtHNkK X-Received: from pfad8.prod.google.com ([2002:a05:6a00:288:b0:82f:1e4a:bfb2]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1a0b:b0:82f:b519:a5cb with SMTP id d2e1a72fcca58-82fb519a73emr8946524b3a.37.1776813397604; Tue, 21 Apr 2026 16:16:37 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:49 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-9-jrhilke@google.com> Subject: [PATCH v3 08/16] KVM: selftests: Verify IRQ affinity changes 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 --- .../testing/selftests/kvm/include/proc_util.h | 19 ++++++++++ tools/testing/selftests/kvm/irq_test.c | 37 ++++++++++++++++--- tools/testing/selftests/kvm/lib/proc_util.c | 20 ++++++++++ 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/include/proc_util.h b/tools/testin= g/selftests/kvm/include/proc_util.h index 7c465e8584e2..2c8086158f68 100644 --- a/tools/testing/selftests/kvm/include/proc_util.h +++ b/tools/testing/selftests/kvm/include/proc_util.h @@ -6,4 +6,23 @@ =20 int get_proc_vfio_irq_number(const char *vfio_device_bdf, int msi); =20 +/* + * open_proc_irq_affinity - Open the smp_affinity_list file for a given IRQ + * @irq: The IRQ number + * + * Opens /proc/irq//smp_affinity_list for writing and returns the FILE + * pointer. + */ +FILE *open_proc_irq_affinity(int irq); + +/* + * write_proc_irq_affinity - Write a CPU number to the smp_affinity_list f= ile + * @fp: The FILE pointer for the smp_affinity_list file + * @irq: The IRQ number (for error reporting) + * @irq_cpu: The CPU number to write + * + * Writes the given CPU number to the provided FILE pointer. + */ +void write_proc_irq_affinity(FILE *fp, int irq, int irq_cpu); + #endif /* SELFTEST_KVM_PROC_UTIL_H */ diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 434dce7188cc..bb124028fb20 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 static u32 guest_get_vcpu_id(void) @@ -106,9 +108,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); @@ -131,17 +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 + int i, j, c, msi, irq, eventfd, irq_cpu; struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; pthread_t vcpu_threads[KVM_MAX_VCPUS]; struct vfio_pci_device *device =3D NULL; int nr_irqs =3D 1000, nr_vcpus =3D 1; - int i, j, c, msi, irq, eventfd; const char *device_bdf =3D NULL; + FILE *irq_affinity_fp =3D NULL; struct iommu *iommu; struct kvm_vm *vm; =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,6 +175,11 @@ int main(int argc, char **argv) eventfd =3D kvm_new_eventfd(); } =20 + if (irq_affinity) { + TEST_ASSERT(device_bdf, "-a requires -d"); + irq_affinity_fp =3D open_proc_irq_affinity(irq); + } + printf("Injecting interrupts for GSI %d (Vector 0x%x) %d times\n", gsi, vector, nr_irqs); =20 @@ -189,6 +201,11 @@ int main(int argc, char **argv) =20 kvm_route_msi(vm, gsi, vcpu, vector); =20 + if (irq_affinity && vcpu->id =3D=3D 0) { + irq_cpu =3D kvm_random_u64(&kvm_rng) % get_nprocs(); + write_proc_irq_affinity(irq_affinity_fp, irq, irq_cpu); + } + for (j =3D 0; j < nr_vcpus; j++) TEST_ASSERT( !SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpus[j]->id]), @@ -202,10 +219,15 @@ int main(int argc, char **argv) if (SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpu->id])) break; =20 - 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", + if (timespec_to_ns(timespec_elapsed(start)) > timeout_ns) { + printf("Timeout waiting for interrupt!\n"); + printf(" vCPU: %d\n", vcpu->id); + if (irq_affinity) + printf(" irq_cpu: %d\n", irq_cpu); + + 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); @@ -216,6 +238,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) + fclose(irq_affinity_fp); + printf("Test passed!\n"); =20 return 0; diff --git a/tools/testing/selftests/kvm/lib/proc_util.c b/tools/testing/se= lftests/kvm/lib/proc_util.c index ad1c54a81869..e5a4ee262f5e 100644 --- a/tools/testing/selftests/kvm/lib/proc_util.c +++ b/tools/testing/selftests/kvm/lib/proc_util.c @@ -40,3 +40,23 @@ int get_proc_vfio_irq_number(const char *device_bdf, int= msi) return irq; } =20 +FILE *open_proc_irq_affinity(int irq) +{ + char path[PATH_MAX]; + FILE *fp; + + snprintf(path, sizeof(path), "/proc/irq/%d/smp_affinity_list", irq); + fp =3D fopen(path, "w"); + TEST_ASSERT(fp, "fopen(%s) failed", path); + + return fp; +} + +void write_proc_irq_affinity(FILE *fp, int irq, int irq_cpu) +{ + int ret; + + ret =3D fprintf(fp, "%d\n", irq_cpu); + TEST_ASSERT(ret > 0, "Failed to affinitize IRQ-%d to CPU %d", irq, irq_cp= u); + fflush(fp); +} --=20 2.54.0.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 A80683A6B82 for ; Tue, 21 Apr 2026 23:16: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=1776813402; cv=none; b=cz9lFTxoRQHQ2Eg6Fwgm42iip6tIeO8KWq/mcOe39muycK/AhrH5fDKzZ7MXv+aeGUjDdFuc1Rhv0z9tGifYGVmVeYYXhU4iNV8Ce4rKvH3sy4twZsaaLz4bIwEhDlJyUFo4FQeML4SW5O2s9YWXRNoi3Pgts6rNSyw1RLGh7k0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813402; c=relaxed/simple; bh=MQS1JUvH6U/KfBbJD3iAMkPZWw2WDtinxQ7Bzhwkzyw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GCkyyLEalIZDP89LS4irR0JjGHKHJ1JWJ7IkpZNG/Ie2MmU0dB8plf2gdndVrzOtFN45mMOUEcTMd//AXnoL1brD1a39rKCs4OQT4IX62DtV3MD5rbTTTH9rTqfTgVBNus9ulOasGyhRCPDrAL3m1PfEb79TjwojXJePIvkxCwE= 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=m4OZP3WE; 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="m4OZP3WE" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-82f6b0a7164so6714961b3a.0 for ; Tue, 21 Apr 2026 16:16:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813401; x=1777418201; 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=iGoinIsRG7ss8NPXz1vUaYQuPD9BQ2TUWRBse6dyLbY=; b=m4OZP3WEc1xmXOO+xrG1VjOm7W7T9bzh/Yju0gq0sqHfoMBhw+d6CS9i4uOH0lYXdS l/xeq1DDpkYOybjP8FRiO4otzNuDF7/ZVCnQP+cL5rVESBDRX5MNkCOiqLVLwMAdAcSi YgHlAsANOsbwC64euPiJo72n7nfN7xrKoeoCG0K4bsvc/wKXGhlanEowd174Lw1+t/o0 VTV6CKVX1TQtbdbNbzYVULuOITPLKa1sKBA5dE2KDjkB09SO0uuGS1flRPGGxu0u23un jPBbxpMrCye2NGN55Fkb+Xq4XW8ANusQw2bwewyeyD8gTg3Qr5XcGtAyfG0Z4+aIzdwe w8rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813401; x=1777418201; 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=iGoinIsRG7ss8NPXz1vUaYQuPD9BQ2TUWRBse6dyLbY=; b=VRApuf9ERDCFgkomW5DzroIQUGV3iAHri+hmUKC5Ya21DO3Qrc05rqheSw/HuLKvaz pW92dtUOM3r/7UcS63acqJqfwD1Zn4BUYeePUStxPTD0b+2n18+NMXaQfM1dHCCFRn+5 kPBUgXFKiROh6WgV824IGbRrZgXemoSTx1ZKYwiaNnkl+6ognRubpU+Xo2RTuk4k7zan nqJY65YVJOcJ8ss8iyJvyaYG8J3ubaGVzxvIaVaNqlIcF8f5NaNgS34q6yFem9mwsQy8 hwqDtqlv0iG2TvGOnebi+S9FgUuoJBbERHu7QE9dZDaV1pirYEBc4KLekxFzMBeTINRZ /cdQ== X-Forwarded-Encrypted: i=1; AFNElJ9hycDC9BaIL+bOb1v9peWLBcJX22b38FL+Wny2uWl9rUWYgYrlVRCW8IUnvvFXtf11bfrzrtcYuAD1FkU=@vger.kernel.org X-Gm-Message-State: AOJu0YzfVZfu+jB0s8oB2DaUhXJc7wd8wucZStHrxncmAjeweIYHI3Cw kXrcfFoaY5upVqan6xOZMvQ6i5ee3dR7jRnnJn6PxdtEYoBSfQYrrRMn8US39T2ohVXPusVPxrc jLbjESJhy X-Received: from pfbhu53.prod.google.com ([2002:a05:6a00:69b5:b0:82f:a59c:f7d3]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:6595:b0:82f:964c:e3d0 with SMTP id d2e1a72fcca58-82f964d0ddemr13183537b3a.39.1776813401078; Tue, 21 Apr 2026 16:16:41 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:50 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-10-jrhilke@google.com> Subject: [PATCH v3 09/16] KVM: selftests: Verify IRQs wake up halted vCPUs 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 bb124028fb20..d0a48509b932 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 static u32 guest_get_vcpu_id(void) @@ -40,8 +41,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(); } @@ -108,10 +113,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); @@ -144,11 +150,14 @@ int main(int argc, char **argv) struct iommu *iommu; struct kvm_vm *vm; =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; @@ -185,6 +194,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 @@ -235,8 +246,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) fclose(irq_affinity_fp); --=20 2.54.0.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 EC8EF3A9DB3 for ; Tue, 21 Apr 2026 23:16: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=1776813406; cv=none; b=ctZ4TmTAbdZhTN+41CNmebVOXf2/QsENysUNZZN63hqIRJi+V4a8yNPB5TVEXM0Kj4yw3AGxHEQQw0RI+jWbry7sDEH3WdDj7Zp1iIX6RHwy2DBGxTG6c90Yfp1NwWAqL3JIgHbmRtlOd1g/0LoppT8T0ZOcYIgf0vjLlZ79ups= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813406; c=relaxed/simple; bh=OSpqNv7c7tsqvhzn/NKqgkf4ppV76rQ40rhqgF3pSLE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=S8LgREpODh3KW20dSt+RGpf8RrvoF4xsEwnk9v3RMrNI4YJDSTvMRAsn8Cw6aLDQKRtAweulL/7eOq/k8ae0heA6yWn592Fx5a6j78pEhJE3e06gOZz/5sxDEklsdCx4dVQ40DAa5/+RvHcoNM8rNExSblAJNfGDaZXxMfZTfJs= 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=L9kQWn4S; 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="L9kQWn4S" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2adc527eaf5so37811285ad.0 for ; Tue, 21 Apr 2026 16:16:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813404; x=1777418204; 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=3bJkLu+9wa+wbYHgaBNwCC3Sn5u5ygBBEN1BCKJ73vg=; b=L9kQWn4SAd8g1kPaTEfkB8QKez5Zrkwni/Ka+R1hC74y9I1HIkwmswfgHqgez3LF01 nCyAVzwHx3f0JnxuX07atA7jgqo3Gs9k2MZVWe0ed2xhObSMpIq8PY/Vaa2aIMYsO0ye hwegtOnkPYDWaMHUoC8eD/04Xczz5xfH8v25TZ3h+vt+9+h2EGpNU4djUSEj16odGYi2 eF2UM3GLSLggsw08gV+0qGFEdMdWElByUltUzpUOH2VpgkGkAuC4N0Y0xNBH7HYLAFRd t+NoKycM4xUVegZbGo2ZLTBt0n4REJs2V5Tal5L/I3JUvneNXRMB/tActQQN+kj+jNvH xSEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813404; x=1777418204; 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=3bJkLu+9wa+wbYHgaBNwCC3Sn5u5ygBBEN1BCKJ73vg=; b=cnL9OhB0IBgD3BQwS4HdcYpToOhigJUhyo6jthOcLu1VSFuPr0j5sAG7UZKVZk7op3 bqJkTYjEbZF08aaCM/Ymu8JfFSsGZssSzMdo8tVWce38wVPEAsMqvw32HEG10+b22isz ThahQ1WypEFu9uNYZYeSw6svGdTw9iDQvMVlIFxKrf3x+YQhRYL8gXkc26OYHPrf1g/k Ru2QGF7EQKIBGNcB5Sk7Br0Fkriephbytamiso47LvAYp3IdXpmT/KJNPbm2mSoN0bIV bxmU8rr2XUtqBNuNF4uXEB5OI3GjiHa9yWpji1NPHXPhy6enx4kY8EmzeHUgyaq9oK6+ lkLA== X-Forwarded-Encrypted: i=1; AFNElJ+DhsmoA2Xbl2Ac131AxGGCbljcMFi7rsCIOXtjVvrXoPsfwtdftcVq3huIh60VN6c/KE8fdcH1YmAmNRU=@vger.kernel.org X-Gm-Message-State: AOJu0YwqfdZNpNneRqLnT/h9m/iwNimXkZEdYyEDQ4NaXEY2FfUgjx6H 6X0WwQZ+xoLjFWudvvACu48TAtF2jt/e3OiPL4lsNWePs3k71ACIQBowIvCSKhap4IgzMTTuG4Z u/fdAIeQN X-Received: from pgab185.prod.google.com ([2002:a63:34c2:0:b0:c79:738f:74ef]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3298:b0:398:b8eb:6716 with SMTP id adf61e73a8af0-3a08d7ac303mr21933098637.23.1776813404041; Tue, 21 Apr 2026 16:16:44 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:51 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-11-jrhilke@google.com> Subject: [PATCH v3 10/16] KVM: selftests: Verify dynamic IRQ routing updates 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 d0a48509b932..3671f5ce4cc8 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -111,13 +111,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); @@ -147,10 +155,11 @@ int main(int argc, char **argv) int nr_irqs =3D 1000, nr_vcpus =3D 1; const char *device_bdf =3D NULL; FILE *irq_affinity_fp =3D NULL; + bool clear_routes =3D false; struct iommu *iommu; struct kvm_vm *vm; =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; @@ -161,6 +170,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]); @@ -207,9 +219,13 @@ 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)); 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 && vcpu->id =3D=3D 0) { --=20 2.54.0.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 C238A3AB283 for ; Tue, 21 Apr 2026 23:16:48 +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=1776813410; cv=none; b=Y6Igr+259Wa8GihGkFei7jFHq7GCZ2ZlW/biVQ9L/6Q8Hm1J0kXlu+TSoTUonQXw8oQx00TmIq4o/nFmUTZC6RoejmtJrrHL/uhikd6CWWK9im324yC2SqcBRwn2UGyoZCf11VgCVrQuq5TXEfNev5wIh5gRWxBmZxUgqEPw0co= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813410; c=relaxed/simple; bh=z4KA4UWM92jjfxtHQPN575snD6HXnmh/mKbX6lBYV2A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=oNoN7j3LY7TaYEoGkujQmmKObHIBonp/ybaJfu7DIg5bO4C7vyZDMyQTYoakF+3CECbJGUdJ7lGplj6I2dKhZuW4/qE1ywEPsAvUi5m22s7u25PTz8MhbOZJTi0Ou4QosTFVbbvFXX4X2F2rwWCmo2Wxx7Z97e+tKU+NOx0dl1c= 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=qBJpFOAT; 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="qBJpFOAT" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c7977177675so2289585a12.0 for ; Tue, 21 Apr 2026 16:16:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813408; x=1777418208; 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=8Rl3LVSl1i629teB1CXV9HY8yLMHHbg5TN8orqOqz/c=; b=qBJpFOATL8hHmLt6GiC3Zn7LRQrExtnFceIOkbGKYJJvrjNQ7YT0tvUkLHQUCLCGcz trBw6q6vLOvuMvPGakLjtjGfYCykuygn5WwuDkkl1EjF9dShRmGI6d4U4MhrAuwAwcZO DqX2QMveEz+oWLtFc3a3jAnfSmca2Mp5ElRlTKpYzar0EpVcOPnu5MGNOdq4g/MmJMMk CWMZ8aeYWeNI5meeud6+D67j4JmID5Eyf4+k0LvlnfHYjXJA2rt79BlHIZuMuUdw+lIm xDUqLz3rI1UFz2XBg6Riei36aXr3HGfw3DcgouVAiOi3Lqyytwl5N4aSLraPDJTii/Kl 9G8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813408; x=1777418208; 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=8Rl3LVSl1i629teB1CXV9HY8yLMHHbg5TN8orqOqz/c=; b=nDI07j9qMqdN8x8w636sa7T1e7j6NDqVmEuW750CdFuO7LU2wNuN/DucsRIpVtn98q nFX+MmpB9rHyF7G7g6Yc8vFjgLpRD+9Ky85vIQqBfVtWmCMN4e036fNM3ZtXHF8AdCu2 YC2VEQ+9uZu/xGUO2365RBHmYjVyjdxOHgBMC2wOwwMgSRq0223WQb3k/I5WFdBxUjzu Op0Fk+EKcXKlZPnZqIiLTncIP0ticLSlsBdzF9+L/hr9RCUayu2wRm1GzdBAJmyFX6wY T4Cs2lOIwkBsTSeplHX04YUzA/DI4gugnpRCjLTWjnzDFqTqaRNLzG1m7/Nz6e1xnDJ5 iJvA== X-Forwarded-Encrypted: i=1; AFNElJ9x1aW3Zr4NWkO0Rlcq/Q68LIidYbppwIL3OVt53rW2ueeloE1UhnZnayv+57rMTmMPeKENzX1Fz2uBvT8=@vger.kernel.org X-Gm-Message-State: AOJu0Yzp6Mw++hgTeJFfP306JCB2N/K5Zp4N1uJxhnegAp8FJInw9Ju6 SsmVWfqIpAYE3bFDF/BYe4lk0NcWxRnkVDqIbH5fGLfbOAfPr/WzyxU1Y7inmS77dwhSGLj712s QTVlnsKB4 X-Received: from pffx16.prod.google.com ([2002:aa7:93b0:0:b0:82f:af01:3a8e]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:158a:b0:39b:abdc:4215 with SMTP id adf61e73a8af0-3a08d68e0e4mr22152147637.10.1776813408030; Tue, 21 Apr 2026 16:16:48 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:52 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-12-jrhilke@google.com> Subject: [PATCH v3 11/16] KVM: selftests: Configure number of IRQs 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 3671f5ce4cc8..9efb7e655623 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -120,13 +120,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); } @@ -159,7 +160,7 @@ int main(int argc, char **argv) struct iommu *iommu; struct kvm_vm *vm; =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; @@ -173,6 +174,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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 F20203AC0D0 for ; Tue, 21 Apr 2026 23:16:50 +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=1776813412; cv=none; b=rCre0Y6UGe9/1DDIa/pmpIJukfNfTsZhir50+z1ftRsGRj0acg/VYLsHl+xPV2rFivBPv6WuVmozuIaVAIqoHlCPeOJNwo6OzWyolfDl8g7jDDYmHpJ56x2nT4xk73mfislOdfGcb52vFaGMn213beMpkHSNTPUNIogPgqA437Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813412; c=relaxed/simple; bh=tLPEzwopX6dton3/Ha6grXVi3X09hu5wNYrlOXU/WTU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fyo7ab/b1Bmks52ZPcdWh3VSOSu1t6Atjd7hn+djHTs212+lmIWOTZYQt8aJgDLLDKN+8MlExxbOv2gUe3DVtzS/vMpRCK1/wDoUR570NxvltiMoZDAqb6KaEr9vU+bsYpHMgdj/dqwSpPiQTAr7TeHx2Z01MgmwKuRXJcXP+Fc= 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=B6V5dsa8; 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="B6V5dsa8" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2b258636d16so48160425ad.2 for ; Tue, 21 Apr 2026 16:16:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813410; x=1777418210; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=gpu7DXILjAa0mygdthMzFuQN1CB0JLFZNOmeTcbZBKk=; b=B6V5dsa8zgPnd0hDePGKbDc+haRIEMznX/8HZYbvFZyNNywBhfxfMx8eVXEqtiXeKw rodiBVeOUPDsU1HVhjGEeVKS34ApbvrFkGbuxFhn+rQy5jG7xwcMbpNlDW3tlmvTlEq2 E3pdCMPPpPx8RLGS5fWbem1mCqUxuC5KwCtn3f9ncGP3tJiw9exQzd323gRxNhCwqCyj TbyJXqyQUJ2c59NLYSZqBlf5c6Xci8dacU0sqIdnI81arsrJC8QH2OD7wEc+Ro2hf3+v oFBesDZfsBTw1xXWSWxN5cmJ4S/FssGeivxET5MN3Iew3VdyuUdyS44BrMnByPIsAuOj ByXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813410; x=1777418210; h=content-transfer-encoding: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=gpu7DXILjAa0mygdthMzFuQN1CB0JLFZNOmeTcbZBKk=; b=X4Gb4Fm651PW0rM7EQmBQ6nuz62oCgKRwZZ+JAjPCJmiIB2C6xoEuhETTuFMQDGE7y zI3YTSW1ZnBUeB5stLKNWQxP/rjkZsnvWVZ9s5AGhzxNgR6r8oNTUN48kjBBTfKSamUn udTxgGX6UTHd+ZQ6EBCA4PP+VcX6j99gL0KhchRP+VOd4LN6D/d0VZhG1qvYzVdkz4Dr hQdgh1tz5ugA3aNsivVDbbqn3CukvdlsXCgQ9L/2xW5Y2jwfXul19chMSOFpZzsX2ATs zPM6zn9Vh+MqcK8nCOwfwUASQMrs2167UDabPkCULYL6DeSTisAhrqmUqKb/ekT/9Wbe BIAw== X-Forwarded-Encrypted: i=1; AFNElJ9ENa4gDRDTc4pEtWasWK17wQ5URFhWWRyKvwW0Lc7K3+XKCZycu4mzF3J8XHoVNaun3F7LZsHTcIcL+4w=@vger.kernel.org X-Gm-Message-State: AOJu0YxFMl5Yr9GYotnEVUEtHwnmKspphqGFT7ZW/a7IwVo+8OklwZiR fFQmIfPi4rBqhVAlw5S54RPtfru0+AaH9pTGGOsZSuhxXo3Zdn4rnb7xLLrnkf4PHJ2MUen6R6T Q+OlAe1SQ X-Received: from plrb10.prod.google.com ([2002:a17:902:a9ca:b0:2b2:50b1:329c]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:74c2:b0:2b0:6d33:e7c0 with SMTP id d9443c01a7336-2b5f9ecaea6mr160285015ad.1.1776813410270; Tue, 21 Apr 2026 16:16:50 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:53 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-13-jrhilke@google.com> Subject: [PATCH v3 12/16] KVM: selftests: Verify non-postable IRQ remapping 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=E2=80=94specific= ally 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, 34 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/kvm/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 9efb7e655623..03b88b7585b3 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -17,6 +17,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 guest_received_nmi[KVM_MAX_VCPUS]; static bool irq_affinity; static bool block_vcpus; static bool done; @@ -33,6 +34,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(); @@ -93,7 +99,7 @@ static void trigger_interrupt(struct vfio_pci_device *dev= ice, 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; @@ -106,7 +112,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); } @@ -120,7 +126,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"); @@ -128,6 +134,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); } @@ -149,6 +156,7 @@ 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 + bool clear_routes =3D false, use_nmi =3D false; int i, j, c, msi, irq, eventfd, irq_cpu; struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; pthread_t vcpu_threads[KVM_MAX_VCPUS]; @@ -156,11 +164,10 @@ int main(int argc, char **argv) int nr_irqs =3D 1000, nr_vcpus =3D 1; const char *device_bdf =3D NULL; FILE *irq_affinity_fp =3D NULL; - bool clear_routes =3D false; struct iommu *iommu; struct kvm_vm *vm; =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; @@ -177,6 +184,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]); @@ -187,6 +197,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); @@ -224,35 +235,45 @@ 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 && vcpu->id =3D=3D 0) { irq_cpu =3D kvm_random_u64(&kvm_rng) % get_nprocs(); write_proc_irq_affinity(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( !SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpus[j]->id]), "IRQ flag for vCPU %d not clear prior to test", vcpus[j]->id); + TEST_ASSERT( + !SYNC_FROM_GUEST_AND_READ(vm, guest_received_nmi[vcpus[j]->id]), + "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 (SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpu->id])) + if (!do_use_nmi && SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpu= ->id])) + break; + + if (do_use_nmi && SYNC_FROM_GUEST_AND_READ(vm, guest_received_nmi[vcpu-= >id])) 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) printf(" irq_cpu: %d\n", irq_cpu); =20 @@ -261,7 +282,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); @@ -273,7 +297,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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 32E783ACA6C for ; Tue, 21 Apr 2026 23:16:53 +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=1776813414; cv=none; b=Wh5W2+yG6kSK3+zyOc8YG5c/335ujxnSbgTOEbWwTdUiw69Dx1RGKeR8qgfcexBHSRTAgvtHQmFhQrojzWV85yRMXo5/q1Q9gmgpc5O7S4oUo/aeSyK7AUMsTlXIHZfj442uwTer+8URtqWI9mTwSFuJ3ugDt2Ujx+56t5Bg+xU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813414; c=relaxed/simple; bh=JF4s8v+mqbvTlk7yLB1wARmKdzRBmtKSxDXsUWd1F1Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dfzSn8JhqXVdeYQAvUHjzyL4HMaYb5a3E2yJ9yo/jKFN8w/8MO1wOvjZjGmb5ludSKGyV3lhXubUkkZMXC1VtvnLlXsmXkJtZTyIgyb6MLGmgLntZCVIjXkogD+KFS1Sg7Tf6Jwy1JDzQBMLFcEVN0zUOarthUfvU8XGB8OD+c0= 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=Ja4yiKn7; 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="Ja4yiKn7" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82fbceb0181so1890183b3a.3 for ; Tue, 21 Apr 2026 16:16:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813413; x=1777418213; 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=kUAmSXYQQnOg/tuWPXoEr0xuDCH8FDfuwMytI/W+gUU=; b=Ja4yiKn7yGKT78MqgKNQVqb/HUtXn989dY5owHw6sbtPDAPrSy/VhY5gsWi7AMCRhi /tnqRW3ykt/6WsE3jagh5mwkWppCLoauDpj1scR81tHzyIqsg5ugB2D2T9ngaowD/6HU np1SGE5GJqQqP3JPbMRymSIAxHpJCCSigXDSww0iTG4aY7TF+aaeqDZ/Y8ZkctRktlR/ ctLhZlem5IFpiP0XlLWFJKjxWFml7HLcORGDiwnamJPAlxwx7xiufRiIbmuDhUgz+/dT Ym8KCohtWN3WIiiS4Yfkp1zcv7m9hqDM7fjAselzyyonl7PzOgcgtP5joP3bS4vsA9Bp KxNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813413; x=1777418213; 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=kUAmSXYQQnOg/tuWPXoEr0xuDCH8FDfuwMytI/W+gUU=; b=NzgZe0hTGLaVXyNMeBdO12lwNsv5N/S7dRbwLxNmEVlge8UxfXi+LGZGRkjMM2Dmdu XveRZ8tYmGRJ15NUjs99EK/hjkxdb9Ahhw0zUMOXIFCxX6vcEXVb1GtCLdnyWkYvHOTU sbZuvt+4lW3vcARm3D+uffcZkFWRAwWnKVAWg7UGm1Tmsj3WLvV0CsgFZkg7PhvxHV5D SNKHw50ZAwwY3hjy0ws/sVq5jdHgE+EFKCRetCb53EMTSHYFnXZjaKKm5B4cisEjCjjS bs61uVDZv2QMA1NzyDfWgQyP4jpTaIcS7qdurLR+NuqVOuLTakzWaU4DhqwKMGxrVlW2 skSw== X-Forwarded-Encrypted: i=1; AFNElJ8ErCNnEHRCvqiOC0l3+8qXwe3xcdqncOZLvCEq1puwgYokn1EHByiAwItK61iW7WukIXsBl4y6auj+myk=@vger.kernel.org X-Gm-Message-State: AOJu0YybphX2FKSKSHVzSYxT9mpF/heJm/zXXCftNs+gacFbWCMmlRY9 yO1NRrJ7CjvoWDRvMOTdyxmz6qwphG7m5VVgji8oypHFlzmMfT0Umh+Y39nZIyGCsJSH35oRSIu +Nrnhoxm3 X-Received: from pfbkx31.prod.google.com ([2002:a05:6a00:6f1f:b0:82f:8956:e620]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3cc8:b0:82d:30f:b197 with SMTP id d2e1a72fcca58-82f8c8aec07mr21029033b3a.22.1776813412477; Tue, 21 Apr 2026 16:16:52 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:54 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-14-jrhilke@google.com> Subject: [PATCH v3 13/16] KVM: selftests: Verify vCPU migration during IRQ delivery 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 irq_test 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. To support this, add wrappers for gettid() and sched_getaffinity(), and introduce pin_task_to_random_cpu() in lib/kvm_util.c. Co-developed-by: Josh Hilke Signed-off-by: Josh Hilke Signed-off-by: David Matlack --- .../selftests/kvm/include/kvm_syscalls.h | 6 ++++ .../testing/selftests/kvm/include/kvm_util.h | 2 ++ tools/testing/selftests/kvm/irq_test.c | 34 +++++++++++++++++-- tools/testing/selftests/kvm/lib/kvm_util.c | 19 +++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_syscalls.h b/tools/tes= ting/selftests/kvm/include/kvm_syscalls.h index d4e613162bba..d73f45c5df92 100644 --- a/tools/testing/selftests/kvm/include/kvm_syscalls.h +++ b/tools/testing/selftests/kvm/include/kvm_syscalls.h @@ -73,9 +73,15 @@ static inline int kvm_dup(int fd) return new_fd; } =20 +static inline int 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); __KVM_SYSCALL_DEFINE(ftruncate, 2, unsigned int, fd, off_t, length); +__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/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 499e695f1fc4..f725ab0ed4f9 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1096,6 +1096,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/irq_test.c b/tools/testing/selftes= ts/kvm/irq_test.c index 03b88b7585b3..dd6a08d3bf4f 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; @@ -62,12 +64,23 @@ static void *vcpu_thread_main(void *arg) struct kvm_vcpu *vcpu =3D arg; struct ucall uc; =20 + WRITE_ONCE(vcpu_tids[vcpu->id], 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; @@ -126,7 +139,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"); @@ -134,6 +147,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); @@ -164,10 +178,11 @@ int main(int argc, char **argv) int nr_irqs =3D 1000, nr_vcpus =3D 1; const char *device_bdf =3D NULL; FILE *irq_affinity_fp =3D NULL; + cpu_set_t available_cpus; struct iommu *iommu; struct kvm_vm *vm; =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; @@ -184,6 +199,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; @@ -233,6 +251,15 @@ int main(int argc, char **argv) continue; } =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)); @@ -249,6 +276,9 @@ int main(int argc, char **argv) write_proc_irq_affinity(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( !SYNC_FROM_GUEST_AND_READ(vm, guest_received_irq[vcpus[j]->id]), diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index b247b2015b2a..83732c07dfda 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -662,6 +662,25 @@ 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 i =3D 0, nr_cpus =3D CPU_COUNT(possible_cpus); + int cpu, target_idx; + + target_idx =3D kvm_random_u64(&kvm_rng) % nr_cpus; + + for (cpu =3D 0; i < nr_cpus; cpu++) { + if (!CPU_ISSET(cpu, possible_cpus)) + continue; + + if (i =3D=3D target_idx) { + pin_task_to_cpu(task, cpu); + return; + } + i++; + } +} + void kvm_parse_vcpu_pinning(const char *pcpus_string, uint32_t vcpu_to_pcp= u[], int nr_vcpus) { --=20 2.54.0.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 922223AD506 for ; Tue, 21 Apr 2026 23:16:55 +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=1776813418; cv=none; b=oamoqR+bP0uV6JQIAApgM8LMZwXlFiSXV2hWlCSD6s633v+dr+uMXbg027di5ZiOeCuDcqbSLpvN0SsFgtYt3s2w0FEEVoGsoU79R15o4+L1cbtcUb1DGDgzH7ncOttu6zAoGNhleCEoK5dvcjHs9+ORQO4u5ZYbJvuSaKSXVcc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813418; c=relaxed/simple; bh=4cnVa9ZZt3+B2TMTEd7btulyUDHWdkJ6QXPrVFuZKTg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GCiDq5iaG8tD69UP8gg1QQr3XjKAvzXWR28vhd9+2TTBoDd4SloaqqS9I949TVCzHoj/2xZGgkfB6ReNxrvpgW+P33R8Q623qkploJzwSRdFCAuky9Znu3FUfkfL/Z55ApPTbuDOQ+aCTWG5QAqb9/dIAhx8k14Dzz3O950eXUk= 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=eEwrGwPR; 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="eEwrGwPR" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-82f07078ff0so3237314b3a.1 for ; Tue, 21 Apr 2026 16:16:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813415; x=1777418215; 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=1SWlI+Mb08LTFyPEjXaQ1cgftdkltHpsWIL9YhvjdCs=; b=eEwrGwPRLDeNf2eHvqjJYOrnDgD68BuZFu2/AO0H85uZ1ueAZIHsx7vaPBbL6/zSgf zbwHCqJcE1JcTg8FQF22bDmJiGGn1GgLZbejXIdSg5tlkUdlDNanOh4pJ/rRO0xMRnu8 u/Fi/pjzdiHL/ElXMnI0yY41O2ghBzzEyBLIKfIotFD2JrP+RP/7UWFNWsRzoqEUogrF iXMmmYRMJcSL9ANxfrOOBvuHDh7+YKg+jjJ1hIdJIvcVpiwmIeX1eicPvRxFbzfpx7d0 OE0mqJBxzlh/2eS8yvjEhMhlxQuZ2A7KK2GKUQtAMj1/Gtuzv1L3cYvGEF8ehKtACxn/ 43fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813415; x=1777418215; 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=1SWlI+Mb08LTFyPEjXaQ1cgftdkltHpsWIL9YhvjdCs=; b=m6AJlFvwP4D/2lHOccFDijq2Q1Kg6Qrd+QpRUin9GCO/8sAUIVYzg9OGc+bh1NYPIY dUUgppcbaQnEDTZ8Dminj8xBElH7YTg3jB/zQ8CssId4pkdQvap9xRUW6YwI9VFNTTNH GmZQ5K6XBymZpajZA4bVES6bt5GOSNx6+z4GwxKW8B+x5ZadX0adCtPjfTxYoM5X8TJv ogsVqVTFO3TMELmcCj/4hobL2sNyl5x+McFdcAdmYXVJyeh3IPCX03KKow+5269IGQNg DwGYN1NNyTE7MbNO10XUz2yK+cBK+GUjcTraxi3dovLeNDgsJXPAwxrRP0AmCIPtGdF/ HgDw== X-Forwarded-Encrypted: i=1; AFNElJ9fqyuWgHyGx6KKpTEgrXgmXcGo4d6acavGnJ9snRNnafMV+VZUlvIm9e49ntzjjYXfzg/YLG7Fvjjd0dw=@vger.kernel.org X-Gm-Message-State: AOJu0YzcD0HO8DH5r727vvUdIHk5FNmPmWOD987ig+zwbXLHwSfVTvgE Oje3/sR8R6RZaD9eqbvlrIxH4FIlTrTjHtyXJBOfAx7tUWfKsX0B39msww2TmcHXNbVr23nIGhY Ma08tSZ7w X-Received: from pfgs10.prod.google.com ([2002:a05:6a00:178a:b0:82f:c180:a882]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1f18:b0:82a:5e9a:922e with SMTP id d2e1a72fcca58-82f8c94279emr23429942b3a.42.1776813414907; Tue, 21 Apr 2026 16:16:54 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:55 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-15-jrhilke@google.com> Subject: [PATCH v3 14/16] KVM: selftests: Print vCPU affinity on timeout 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 f725ab0ed4f9..0ec82088bc43 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -1119,6 +1119,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, uint32_t vcpu_to_pcp= u[], 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 dd6a08d3bf4f..43338eb3ab41 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -306,6 +306,8 @@ int main(int argc, char **argv) printf(" is interrupt NMI: %s\n", do_use_nmi ? "true" : "false"); if (irq_affinity) printf(" irq_cpu: %d\n", irq_cpu); + 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 83732c07dfda..f85e061f47fb 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 i =3D 0, nr_cpus =3D CPU_COUNT(possible_cpus); --=20 2.54.0.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 152C23AD52A for ; Tue, 21 Apr 2026 23:16:57 +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=1776813419; cv=none; b=hdNdwdL7zhkMs079jMYE4tKKqrrmHXeAUL9C6N5yAigTxe6gK0r344jZINfs94T9Yc5qrG9m4mwA+UC9od/ha8qnfKyS4u+OK2yxmbTs4QI60SdSupGzBwb01hVY0noPF6tK2PkpZ6PmviZIxRa9hogJyly2tpo13HED4cx4F9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813419; c=relaxed/simple; bh=K4oblVxbLsa3ReDelDhoO6oidaGRvwz363e3TzmP1Sg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OocVw5m31pyextuVc9SOM+4QJDYJ/sG77lnDHeu9jJsF8c+BK5P5cn6/sGLceRmtUPbs6Z4vR7mJEt33hQVeVVF+AWT00mwwnrVD3ouLPSO07A5R4RII5FrpJ7yITqqZDGA9/yVnXduyw8qvEF4T2dYCcQXZambWUpxwvcseNEo= 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=EIkDv/06; 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="EIkDv/06" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2b249541063so42235505ad.3 for ; Tue, 21 Apr 2026 16:16:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813417; x=1777418217; 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=SQJuWQWeKvWQ1t9FOH2/ql11UsyDycLC+YlBZYKm6T4=; b=EIkDv/06T3w0FWGFfgXCxfH+p7YgmwVvGBZMLrT3GMHR+ORDO6QHTNqdQ3Gk87MdXT y8JC0WNwQHNpZF/kRbP8xDmkeYRifP6VC2tk4ByDZbWVGGHPhD7jRlTRR11B5rfRko/n 4eB5EmnYaMfBvAPxhoLokEQgegqN64wNCIsW2rzmPQqdTFKZqCZEsscnP7cSv67NYEfw M0niRWVZHbbbJmaEBJHiPEDBrYnV2ZjAoMhg0xBS3hs3ZEsXqLbQ9gyoY48c/iNx+wVZ foMfKE97ZwP+9IRuHhdQaZhPaacCYsl8DtGTJUNOozlSc0wMOW4ccBNswbPPQilKN+Td MYAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813417; x=1777418217; 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=SQJuWQWeKvWQ1t9FOH2/ql11UsyDycLC+YlBZYKm6T4=; b=geRzLPrkYWPRuseE2x/ud+GguY/aLfU3xH75xUkyMuRV10BAsJBn7TfGhQnserkwT4 nG/4510mhiVUp+1/Fxx+MRpJlp/mYmxFyYyfVHDBf46Ktj3zKr6L5/X/iZGqio+cUK6i T2V77B8C0IsAX0HlbKUKNiAZWii52+t+tv65+McbhidoDI1GUKFvupBvFnBbFqAjJF3E 408CuBoaWUkKFWdXTtpMov7MGgSR93xRytItAiuQntVktDiHl5keaNty0Vhz7XbIzUAI yK3NxraohWQlCDoqoNRIqYTYhYrXYRnnuYcN8GXbc8vSajuG74IVm258l2k5CnfDEaXy LBEA== X-Forwarded-Encrypted: i=1; AFNElJ8yd7C7RqDP76uzBF6ycMzZQSiGMOMigdVWnF9H4BaZw04boDV00HmyBwq4V7uVutm9B5MWsmOukFgQ+iI=@vger.kernel.org X-Gm-Message-State: AOJu0YzY2GdVK4QiIrv4RJ5bhbpZDYAbPhM4PWRRUZvWln9YugJWR2uy Vi0SmQOL8+Svgg9SYeAAS/gbBPwwn+FxrJiUvUJtW1nv07/FBmDxQR0hWlsTsANgJf57gztLBFE t5yEMDcu5 X-Received: from plbll16.prod.google.com ([2002:a17:903:910:b0:2b0:ba5a:1fe]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d30b:b0:2b0:673a:7c90 with SMTP id d9443c01a7336-2b5f9f50051mr144478315ad.28.1776813417298; Tue, 21 Apr 2026 16:16:57 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:56 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-16-jrhilke@google.com> Subject: [PATCH v3 15/16] KVM: selftests: Configure number of vCPUs 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 43338eb3ab41..6fd082d37f9a 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -139,7 +139,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"); @@ -149,6 +149,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); } @@ -182,7 +183,7 @@ int main(int argc, char **argv) struct iommu *iommu; struct kvm_vm *vm; =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; @@ -205,6 +206,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.rc2.533.g4f5dca5207-goog From nobody Wed Jun 17 02:51:56 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 9CEB73A875A for ; Tue, 21 Apr 2026 23:17:00 +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=1776813422; cv=none; b=b7WZ5ARluHa15pOO/8FDeTda5mWyTyU8+3yVah++/ZT/8DJ4Dy+/dbAB+GAcAYB7sXsPhF3qHKENoydegkom6NUTw2/tkYizMsSWaYGTzOfjr4p/PqD15dIsI2rBtBeboi3SjJVvIjCHIKPL0sX5GDwp5IAGMXiIXaDa47pyDiw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776813422; c=relaxed/simple; bh=fj7JUx1AwMGW7mIKH0BhadVvQ5Y5pYoHLkslfo3qCQw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=D60Kqed7Qnz0Z2PEUkn2qzEMoBUkK/XpCdxu85H1HFU4O05Z5Rl/XWMDk8/j2S+2/MHIARpeTrqnp+OWlwXK9oioarz48I8hGb/I3ajt2umZ61QYb4NBdazVLm3z+9ws4ErShOpEfrvCw58Rotba2AOH/WTil6fq6zlj5Qwg1M4= 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=Y28cWqv+; 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="Y28cWqv+" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2adef9d486bso43049285ad.2 for ; Tue, 21 Apr 2026 16:17:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1776813420; x=1777418220; 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=l9nBhlqR+0aAnoMpV5TVq1zZN0Z8CLajwssRZVTrrkI=; b=Y28cWqv+yKbtfsQFonSgzpNUixq9kRveNf6siv4WgN1BiaYvLPLabCudFvLi32y6LX k5ecpgvDC3pNWFQTvS59myDRnRVinaQ55/JOs5Rxw5agcb8P+9saXmVZPKpZn/QGvskC xAASMO4Uq9jNZCWSqHK4hVCvrJmNTDtWPfckyhwpHU/ApmnfFhOssdk6/pm6E24ZWxRk NiFo7kZ1Xu12uQ/bJ2vt++d18AnWcj0swxGmP/zoHPo/ngDvDSCUBavHalHmIXVMg9L5 T5As0fAYVahokL4Fk/eTzVlCNJiEfauY2/YZCKICcmrkXcSjNObTmCuu/uEyTbtZzf7R 2pRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776813420; x=1777418220; 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=l9nBhlqR+0aAnoMpV5TVq1zZN0Z8CLajwssRZVTrrkI=; b=iD1INaz+fDZdL2p8lZAKjViMMTMZ7X5J4Tq3cNDRoIUzqnWHl1W6Vwf/6Q2ZkgQkgu h+ldqLK1aGw4felkwZOxOS6uJ9FhQN7/RPyLEuJ+0ZWluJ1NXGxM6waVhbx6XGrZ9cLp GGzXFC+iQGPwIb6pTHxEZKpdk0yjmBCcsOYraKHMSQRjJpj8y2mpUM0S9GZqWQMLWMbl dvZHm0zO/viSAL2tfUnHoIT70SPNWUvb26psntx7xc1DBGJKTE8egKNS+HGk5sy3md09 NbjCnTg33GxDdnfgqKcBFXcRuH9wGJ7vlz74Z6i9e7uAAifAzAUt32nyNk1uwEQTrHVq 0h0A== X-Forwarded-Encrypted: i=1; AFNElJ/h3SWIlQP3dlcmCkRXpMPzm+yF1oa2Oav6hetl49ybc37ic05o5Hm5CpZyQpS4ZurPut+3SzcIyoqJDys=@vger.kernel.org X-Gm-Message-State: AOJu0YwhZTyFLNnosn+MQ3Kjma50pr5diBnAvUCZmPJhmaGR15Ilm7lO XxW1hRDen7PrVxExAdSvQggN2bPEjgDadsnuiTVacPCtTS7lI3B34FnhishxWdHsFmPqQScH78d Bp40J233m X-Received: from pgkk7.prod.google.com ([2002:a63:2407:0:b0:c74:42:8984]) (user=jrhilke job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:6a0c:b0:3a2:e59a:7a46 with SMTP id adf61e73a8af0-3a2e59a83femr6744428637.24.1776813419838; Tue, 21 Apr 2026 16:16:59 -0700 (PDT) Date: Tue, 21 Apr 2026 23:15:57 +0000 In-Reply-To: <20260421231557.1254270-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: <20260421231557.1254270-1-jrhilke@google.com> X-Mailer: git-send-email 2.54.0.rc2.533.g4f5dca5207-goog Message-ID: <20260421231557.1254270-17-jrhilke@google.com> Subject: [PATCH v3 16/16] KVM: selftests: Add xAPIC support 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 6fd082d37f9a..99698cf143fe 100644 --- a/tools/testing/selftests/kvm/irq_test.c +++ b/tools/testing/selftests/kvm/irq_test.c @@ -20,20 +20,27 @@ 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; =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) @@ -43,7 +50,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 @@ -139,7 +149,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"); @@ -150,6 +160,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); } @@ -183,7 +194,7 @@ int main(int argc, char **argv) struct iommu *iommu; struct kvm_vm *vm; =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; @@ -209,6 +220,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]); @@ -221,6 +235,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); @@ -243,6 +260,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.rc2.533.g4f5dca5207-goog