From nobody Sat Sep 26 08:48:17 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86855230BDB for ; Thu, 3 Sep 2026 00:16:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394589; cv=none; b=tOnJmxBzSP4pUvwtKy1iEL2jiN5UiFrCJ+p8nUPG6CXPq0upihZQgnJBMlxrfPm82IbQ+2ByCDuRm5IsJxJ+ARlRpFz8Ciy3Ve1w8CSJ6edSrzEqceveuqV1AX+BgXyvXs1i+0kctyjiv1GQjFr3T/1IvA9OFrpeWpkeZMMPXEI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394589; c=relaxed/simple; bh=GwUAO3/qh3jBnPvjL539kUpRgMJEXtQNJH9ROB0FcAQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RAW94uc1oRpMKY6IdL3EOppZwRCIE3a2Idt8i9hdfRN+1X1lDR57Bb+KcxRab9Wa/me4dreGvTgauHtbjsdVyPVS7n43XlU+8I9Fx0LFPLIcZSa42m4D4gXOjqLrKw2Q/hjLMUTaKhbvc7X5I3dp9ADlJgWfKATEk/pStZZLxQQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=GtMb4gRv; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="GtMb4gRv" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d6df0a1e18so30418285ad.1 for ; Wed, 02 Sep 2026 17:16:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788394588; x=1788999388; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=tjeJ2nAAXDrhJbonGdD2NMDMFjcyQiwI3v/yLE7aS0g=; b=GtMb4gRvQ40yFxcDce2xXnerxAVfFgmir3T9O77Vin9FGGsiId/T3jFNVuuqmOMZrT q5hhVDoHicNPvGfMQttvgcInngbg1r46HPr+/+mLJkeEF+jJlVoVBku0vOC9lua2xQmh mRMBJ9hGhmPB9UaJw0sNuRdxYdIjJnjzhTflFZm6mszx/OEaRa68x+M48NFwZrRSSiCw dJsgIqtsY2vb/RbrxwFBT05VuUfIDwT+dTLlxljHJoabK2CUH2WufIDXKRcyns7paZhB ZMeHsbPI8PrRK7D9ooiNkvVjeTx9ITUo+NbZCdKYzcSf0hjYuVIfL5dnlfy2WdhAG0zU wvCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788394588; x=1788999388; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=tjeJ2nAAXDrhJbonGdD2NMDMFjcyQiwI3v/yLE7aS0g=; b=GW5G+THSAOE+RVpwyQzpd1I5+is2vo/CWa/QDQqUN0mwv7bInNQW+sjbA57V4ZdXUx nk+CGfIxKSv0KoMFPIrlLGyTejIRKonxMfhT17bb90SLaeTpIKVUYZxe65H6cuarhir/ EQ0wPMCSiA+9HP4GZVlh0S7T6DXmIcE0VGj4/KjN4MTYTJ3JVfJlFKvs7lXV+RoRvOqp rfI9RBczRytcVTiKiy9dza+INKdh9UBMKej1U/3/DcUSjR39gJiSneSnjWYR8jVC7qJA I5O/3+rNBZW/KfKPk6J4aFROdP4SUL49rSfBm70CY+tkLvofbP+DS1LQjbasF79FiZtc bszQ== X-Forwarded-Encrypted: i=1; AKwUvBzacvM9Tp4KfXtJXzwcgHa8IP/N1XDTnO2QqDD2TkQRit4bL5dBp3VpMYxB9hmUQxM1VqR9SDEBMKXGVuY=@vger.kernel.org X-Gm-Message-State: AFuF++nDYfFyenc+N2cs8aHpSdHwEN9qPWNZIFC0Tvb87hCZ67l6Qknn hop55HbP5Vka86IUD5f35Y2qjoBTPSQuS/bIHtzGGeP6CIviaFbXQuAC24BTotscs4NHJrGxaDx BmG/RDw== X-Received: from plbmb8.prod.google.com ([2002:a17:903:988:b0:2ca:ddbd:a19c]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e749:b0:2d8:de9f:9a44 with SMTP id d9443c01a7336-2daec732f99mr105045205ad.19.1788394587684; Wed, 02 Sep 2026 17:16:27 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 2 Sep 2026 17:16:19 -0700 In-Reply-To: <20260903001625.2792367-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903001625.2792367-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260903001625.2792367-2-seanjc@google.com> Subject: [PATCH 1/7] KVM: selftests: Account for kernel's off-by-one bug in NUMA node syscalls From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Shivank Garg Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add and use MAXNODE_FOR_MASK() to compute the "correct" maxnode value that is passed to various NUMA-related syscalls, e.g. get_mempolicy(), mbind(), migrate_pages(), etc. In quotes, because the kernel has an undocumented, longstanding off-by-one bug that requires userspace to specify the number of bits plus one, i.e. the max node plus two. The kernel bug has been known since 2007[*]: : And this is I think the reason why we can't change this now. I assume : numactl allocates 1024 bits (0 to 1023) and passes 1025 to make sure all : 1024 bits are processed. If we change it now, kernel will process 1025 : bits (0 to 1024) and overflow the allocated bitmask. If it happens to be : at the border of mmaped vma, it's a segfault... But unfortunately the manpages haven't yet been updated, e.g. : The maxnode argument is the maximum node number in the bit mask plus one Link: https://lore.kernel.org/all/63ccc890-fd57-118b-5997-e0259f507d28@suse= .cz[*] Signed-off-by: Sean Christopherson Reviewed-by: Shivank Garg --- tools/testing/selftests/kvm/guest_memfd_test.c | 2 +- tools/testing/selftests/kvm/include/numaif.h | 11 +++++++++++ tools/testing/selftests/kvm/x86/xapic_ipi_test.c | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 2233d871a38f..cd5df88bc642 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -80,7 +80,7 @@ static void test_mbind(int fd, size_t total_size) { const unsigned long nodemask_0 =3D 1; /* nid: 0 */ unsigned long nodemask =3D 0; - unsigned long maxnode =3D BITS_PER_TYPE(nodemask); + unsigned long maxnode =3D MAXNODE_FOR_MASK(nodemask); int policy; char *mem; int ret; diff --git a/tools/testing/selftests/kvm/include/numaif.h b/tools/testing/s= elftests/kvm/include/numaif.h index 29572a6d789c..71f261eafc90 100644 --- a/tools/testing/selftests/kvm/include/numaif.h +++ b/tools/testing/selftests/kvm/include/numaif.h @@ -6,6 +6,7 @@ =20 #include =20 +#include #include =20 #include "kvm_syscalls.h" @@ -30,6 +31,16 @@ KVM_SYSCALL_DEFINE(mbind, 6, void *, addr, unsigned long= , size, int, mode, const unsigned long *, nodemask, unsigned long, maxnode, unsigned int, flags); =20 +/* + * Calculate the @maxnode param for the above syscalls given the mask that= will + * be passed to the kernel, to account for a longstanding off-by-one bug i= n the + * kernel that isn't properly documented in the manpages. The manpages say + * that @maxnode is "the maximum node ID plus one", but the kernel's actual + * behavior is "the number of bits in the mask plus one", i.e. "the maximum + * node ID plus two". + */ +#define MAXNODE_FOR_MASK(mask) (BITS_PER_TYPE(mask) + 1) + static inline int get_max_numa_node(void) { struct dirent *de; diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 469e3ab16460..1ddcf95d7fe4 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -248,7 +248,7 @@ void do_migrations(struct test_data_page *data, int run= _secs, int delay_usecs, delay_usecs); =20 /* Get set of first 64 numa nodes available */ - kvm_get_mempolicy(NULL, &nodemask, sizeof(nodemask) * 8, + kvm_get_mempolicy(NULL, &nodemask, MAXNODE_FOR_MASK(nodemask), 0, MPOL_F_MEMS_ALLOWED); =20 fprintf(stderr, "Numa nodes found amongst first %lu possible nodes " --=20 2.55.0.970.g62bdec98f9-goog From nobody Sat Sep 26 08:48:17 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0E2F2673B0 for ; Thu, 3 Sep 2026 00:16:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394591; cv=none; b=ZrDH3yMgBWey6p825vd5EG86Xe782ido2XI0N4U1Ef3hxrVq3a5109xCCdmaZYsBo+IC/ITgL5Xro5P2Ine+4/owgcZXKMMEgS+K+MGkpP5c08Evvqt2Bs16sfGRZ1LEljJz4ptB2jeLLbQJAt2c7Pfzf3+nPMkBygmze3to3nw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394591; c=relaxed/simple; bh=hrCUfZiWrw9ZwLGPWRegXU7yNm5oMyEYfmcKkafasI4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GhhUYa0Bs3Mqjs6wJuLXF8wO+t7B5WAFWAY0OkibkGVxHWXBPKpo+GJuskO7PM6u1yI0dfEufuAaj1PTUHpeSVZEhCzvI/ER15eWb9X3jok0qJULk9PZESOYp7dmkR3LfjMc3NgtgwKzLoYCJG92+LKQzx7jc2o9/tE6HXzvrTc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=TN4RKXPZ; arc=none smtp.client-ip=209.85.214.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="TN4RKXPZ" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d63bad3d09so28988315ad.3 for ; Wed, 02 Sep 2026 17:16:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788394589; x=1788999389; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=sf4kQQtnclBVJ8kleYvL+id2aL4kDG4DntUcaSprvaY=; b=TN4RKXPZHzssHKAHHDQtnGFrx5dn69Zh+6uygQHUKc0Qnlqth9M+O9Gwg9jWFgpXa8 AMGF0mzn8Vw3OLwP/75D/GXfOHhcuDlZn1Lbxawn4/irDsLs0lxyDLI5ShQP5YIn0f8w ZeVlajdE36+EX6Mq2Fx+3723eGnypHskqMUoXJt01ci9nD5z3B2lD7VGNOGWNPuz/hM7 yDpFsS9PTueAbYBI5kcnE7Qfi35PvHt4nTTdqWX/IixZcUmQVJKifO6X0L0+zXPIUvEG VevmsnWaz7PCPwAnJ6sRWlGdh0VglBJQH+cNFX5t2UCTxkYFlYshslHaegrnrY/G5I91 hiPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788394589; x=1788999389; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=sf4kQQtnclBVJ8kleYvL+id2aL4kDG4DntUcaSprvaY=; b=TlPPHWoRnt+tm+AcNv5Tqq+/6VCb9YGPqntZieTJQfiAAv0jM2Bf2vgZW6QXtkBwqg xLvROnhPySGR4ycB3HObBYzmIXat8hQXJaZoJKPIpuQPPbi2al7Fuh6/g6ZOpONAxSce yTfat7ckoyYitTvVMVIeeTKumFdF+RhaNWEy4XidiZyo0zwJnzVIwxvQbdIGdWemwz65 DalHylfD7dCfeIgjRNMgEdTM4eK5ywa5iKcnK6dsBt2uHnN2ffYpI3MCZ6YqgdNEizl7 hwZF3n33Pha+QKOA8vRzWODil8evGOMUL7SsMm8ORJb2/QkxUSwDfhyLGSXsTLN3feZz k4eQ== X-Forwarded-Encrypted: i=1; AKwUvBy2v2FgBpkxdGvCP+NFXOMhr0YXBI++tEu3PiK8/Pdd3TaA/LX8DfIkoDienA+ap0BmrPODwV5QVL6Awpk=@vger.kernel.org X-Gm-Message-State: AFuF++mCyqGOrfA9Hmk+WGor0I4tw9Vy91LjL20/WYKkZLbLZRlr2c95 wPn7xJi+63HXj39GKsW/GG3ZEgYdrlMnWq2FFTStlKlSAlDMbcgttgoo5svfl4DRrciT9s29tRP z2GkbCg== X-Received: from plpw20.prod.google.com ([2002:a17:902:9a94:b0:2cf:1f9d:da12]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:19e6:b0:2d9:2069:a286 with SMTP id d9443c01a7336-2daec62416cmr113756255ad.9.1788394588841; Wed, 02 Sep 2026 17:16:28 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 2 Sep 2026 17:16:20 -0700 In-Reply-To: <20260903001625.2792367-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903001625.2792367-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260903001625.2792367-3-seanjc@google.com> Subject: [PATCH 2/7] KVM: selftests: Fix maxnode argument to migrate_pages() in xapic_ipi_test From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Shivank Garg Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shivank Garg Use MAXNODE_FOR_MASK() to compute the @maxnode argument when migrating pages in the xAPIC IPI test, as the current code incorrectly passes the number of bytes, not the number of bits, in the mask, and also fails to account for the kernel's off-by-one bug. I.e. the test sets maxnode to 8, and so the kernel only checks node IDs 0-6 even though the nodemask covers node IDs 0-63. Fixes: 678e90a349a4 ("KVM: selftests: Test IPI to halted vCPU in xAPIC whil= e backing page moves") Signed-off-by: Shivank Garg [sean: use MAXNODE_FOR_MASK(), rewrite changelog] Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/x86/xapic_ipi_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 1ddcf95d7fe4..6be11c1c725c 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -291,7 +291,7 @@ void do_migrations(struct test_data_page *data, int run= _secs, int delay_usecs, * KVM_CREATE_VCPU ioctl. If that assumption ever changes this * test may break or give a false positive signal. */ - pages_not_moved =3D migrate_pages(0, sizeof(nodemasks[from]), + pages_not_moved =3D migrate_pages(0, MAXNODE_FOR_MASK(nodemasks[from]), &nodemasks[from], &nodemasks[to]); if (pages_not_moved < 0) --=20 2.55.0.970.g62bdec98f9-goog From nobody Sat Sep 26 08:48:17 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D4A89286D5E for ; Thu, 3 Sep 2026 00:16:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394592; cv=none; b=d6gi6afJW1cLCJy8CNG1uWchYnPaqS2fQ8ltIecCjhcEuVqL9gBwolHHqkAExN/brKTgIzC3kL+r88SgpSYpIRBsMt52b6HvanmodGj/ROAKJs1AfnYlxKxbGf/2If1rXttL1CJ4pHvWtqDsQs8XObSruIsezJiu00f2GzM5GWc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394592; c=relaxed/simple; bh=lynxvI4BWDKfkW0dl139eAVcbrc95dm3ZZJq8SSTU2Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rN9/GER8A1/nY7eBLmtIIxreQXuFwTBnPWq9LGioaJ+A2s7NcV6SR4r4gpnu6g1l5enxW3akTGO7Gp6G30YxmWZ1XBfirvGA9xh0gG/MGlqfDscEoQVPyBogOxFRD+q+Mj00waV3ycPOilXDWj998CjsGjnOvPENS51MePuHgUY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=OrN9QL11; arc=none smtp.client-ip=209.85.214.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="OrN9QL11" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cf7dd9fd91so16971825ad.1 for ; Wed, 02 Sep 2026 17:16:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788394590; x=1788999390; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=zlSRSsSlpokdtKbgl+ElzoriroijVL7fsph+TXQV+Eg=; b=OrN9QL116CC8PrLGFMRw8J7rOiL815y21AzYbrqTRmh9wipyBbE3u/zTgnTyX9+Wtj W4cIhI62WSc4sdc7HJX6kAPMFx1IaNYyGDsMs6sQCZqXK1bXOskGDfFkXGMHQxxWYVrg sZT7qanMHs7mkVfwGWUgW1x5kepHNEuvCCGg7XIt3hphpooH7Id66Zlm/9svmbcc6pL1 qatbgx7vNebFSm9wG+J5NIxKyjtlXWCMj32UgmxSbQ1UOpBI2roRRf1znUhv/GxCksJI bTPqWT4DlQCWiPhpfQbufSpEYjbi/Ah4CGVYcOpaXj0bzFJV9mQEMAykzUj7A/WYf5c5 eHxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788394590; x=1788999390; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=zlSRSsSlpokdtKbgl+ElzoriroijVL7fsph+TXQV+Eg=; b=EjHIv/OpRYD+ewzXR/xuJO1Rnnl8F5WSQFyyFCIZphuOblc1+BmK/hCY8pUcj1WjU0 a3wkAOrumhFZRKdJ8YB7FKCDzTeBSGkjE5Cp1f2Tu4zPqFkLd7UcajFHI/266sR3mKYl FjH4qIBBADqFvllOSj1b+RqZlK68XQjXw+2z3GDQpO4b6Rr+tF9XFh9EsXfp790HyYBK NEQ2blmI6pVNGpSJ92WW6OkWu6fq6hEvIDw9dbKyCJhunxkggq1UqR12E0O7RZ9MllmO GoHyC1JHUHS0hqMyNAo5m5XHZeAasIGJbilYGw/pLousd+A4q9zsJEgpLajoDJPnUg/x oq1Q== X-Forwarded-Encrypted: i=1; AKwUvBxMgFYyI1cGqkHNdQOwwEH+TpD9qQhKXHhoQdN45xIaYb2j/sN5i5fJqwRxNprIxC2R/G5ZCk/+VG80VMI=@vger.kernel.org X-Gm-Message-State: AFuF++mXyzMRAJjuBss+lrYejG6hN2i0IYuaBVoM+3GMs3v7tf5aSBOP xt6J/rJr7O8+JQsO27g2SAFwszLVn/QSy5kdMeND8z7ctyp1Xaz0a3pdYQvS24LPwjBuv23IayV bSUng/Q== X-Received: from pgfd10-n1.prod.google.com ([2002:a05:6a02:654a:10b0:cc1:be9e:35ee]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3c04:b0:398:d6e8:f84e with SMTP id 98e67ed59e1d1-39aedf5571fmr14120881a91.9.1788394590039; Wed, 02 Sep 2026 17:16:30 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 2 Sep 2026 17:16:21 -0700 In-Reply-To: <20260903001625.2792367-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903001625.2792367-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260903001625.2792367-4-seanjc@google.com> Subject: [PATCH 3/7] KVM: selftests: use BITS_PER_TYPE() for NUMA masks From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Shivank Garg Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shivank Garg Replace the open-coded sizeof() * 8 calculations in do_migrations() with BITS_PER_TYPE(). No functional change intended. Signed-off-by: Shivank Garg Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/x86/xapic_ipi_test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 6be11c1c725c..9d1dfad4efa6 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -233,7 +233,7 @@ void do_migrations(struct test_data_page *data, int run= _secs, int delay_usecs, { long pages_not_moved; unsigned long nodemask =3D 0; - unsigned long nodemasks[sizeof(nodemask) * 8]; + unsigned long nodemasks[BITS_PER_TYPE(nodemask)]; int nodes =3D 0; time_t start_time, last_update, now; time_t interval_secs =3D 1; @@ -253,13 +253,13 @@ void do_migrations(struct test_data_page *data, int r= un_secs, int delay_usecs, =20 fprintf(stderr, "Numa nodes found amongst first %lu possible nodes " "(each 1-bit indicates node is present): %#lx\n", - sizeof(nodemask) * 8, nodemask); + BITS_PER_TYPE(nodemask), nodemask); =20 /* Init array of masks containing a single-bit in each, one for each * available node. migrate_pages called below requires specifying nodes * as bit masks. */ - for (i =3D 0, bit =3D 1; i < sizeof(nodemask) * 8; i++, bit <<=3D 1) { + for (i =3D 0, bit =3D 1; i < BITS_PER_TYPE(nodemask); i++, bit <<=3D 1) { if (nodemask & bit) { nodemasks[nodes] =3D nodemask & bit; nodes++; --=20 2.55.0.970.g62bdec98f9-goog From nobody Sat Sep 26 08:48:17 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EE8C263F5D for ; Thu, 3 Sep 2026 00:16:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394593; cv=none; b=m5botQQMuh455r67+Oo+gfWhaMVcIQcLxxKkozmsqg1k6BrcFoaq5c/zKfyUxNybO0Gd3t6Sz+raYl6mdzw9d1qgLaFDWLdFzB6uD9hb1pVVRF/sX5zgp6Iik7In4uLvGVRpTc6An2dlO6ZOFIQSQfIs8TxuSUIXmovkQFFdgII= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394593; c=relaxed/simple; bh=iUmp+/UA5hUtnNLM3FihhYzYfvUWjnvesBtph3YUifk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=i4TI0E4O61ZScIXx4giDsLWGQF1ViwY1BDnXRFD5gc9CwpvPp0TqgmCUGH4LEIY9xrI5uMU50lFb1ieh9WusnaDDR052lWH+ZPJeyXO3K3MBjuKQX9UGviTeFiAV1x5/nkSc1AlPY7/y6dtMawtraTvRK83/AdP1ltB67boWUo0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=A1W42tn3; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="A1W42tn3" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cfc52ddc55so28400695ad.3 for ; Wed, 02 Sep 2026 17:16:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788394592; x=1788999392; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=3r1gABvmp5s+7YEMEgw6S8SuGm7W8C45xWpPRUFRpOA=; b=A1W42tn3qzsA0VnWRxVnEbTzEQK3TDy9/kbn3J08a3Zn2+VQ/lPZqIG9V6rIRw57ga vWdn/Ijmo7AEua3TJ7ClOL4SxzquwSLmBqZOzwh4Q/Ak0PRuV+HGYYAFTei6R4smGDkq cbA+WY7i6+II5Cr5mBv3Oa3IiblUtJtyZhwte0Ek+xR/evdew/IW1UW7QucuxlNfm/vZ 1BdhklTzrg8hOdNNL1pVX6yRl4wqU3pspi4fNRKTUMDV55bwyt+hOChSnKyBzxH7YvQb fTlJMziSXZC8jK94T4wUZKZEmoQXuK9z1piHvmE7SCoa5d4oeWMNMY0RJbK4qvmth+mi ryBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788394592; x=1788999392; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=3r1gABvmp5s+7YEMEgw6S8SuGm7W8C45xWpPRUFRpOA=; b=bPTLtR7lKOzfn0yq1+9DBzH8NXN3bHx28ZaNsoQVkUApFJu1py5r7wWAIX/ri9KAKF dUV7QoBS2Lg3GmMg/WLiqfaFH+j1x4HLpBRCc/JcvU43NxRP+yAA50qpf7BcjvUFOj9v j5o0GS3mzvGV5iu5gH13yt0AkSlLaqaiWWue0UzrC3LRTJuheqnju0eg/I+COderbkym oxgg2pSFPrwhPv378zoDOJ3MLf6ZN31U07kSUW734M4AyMwPHLOnjTfqdUaX3UdyIG7P aIezn+dXtFaThdkxHFMj7VyVHZxjGcsaVluSjvJX29lNiDXDdveO8EN5twPEaJlHnwcq xk6g== X-Forwarded-Encrypted: i=1; AKwUvBz0qYlc18IME25VfkalXIW98LMciXeT8A8Q2WFDI6ftpbSPV0aIh9cF3F+MGqZUaTU1fohi2rshwy84yKk=@vger.kernel.org X-Gm-Message-State: AFuF++kmeKLyEvq/b8ceaOz7q5SsBbL7UJGsO4sGd3rpDDA7W9ViLaEH pvKqsa9+jNUTfcIrooZmT71Sxrf5SeXs/yQfH9qwhIqmyoJN5mB8XkBbtpVcqzF3l+XIArABHLA QOg3DmQ== X-Received: from pjbmv3.prod.google.com ([2002:a17:90b:1983:b0:398:e46e:7003]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e7cc:b0:396:b98b:a3c2 with SMTP id 98e67ed59e1d1-39aedf1b1ecmr11504144a91.8.1788394591528; Wed, 02 Sep 2026 17:16:31 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 2 Sep 2026 17:16:22 -0700 In-Reply-To: <20260903001625.2792367-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903001625.2792367-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260903001625.2792367-5-seanjc@google.com> Subject: [PATCH 4/7] KVM: selftests: Compute node masks on-demand in xAPIC IPI test From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Shivank Garg Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Compute the node masks for the source (from) and destination (to) NUMA nodes in the xAPIC IPI test instead of pre-filling an array of masks with node per mask. Computing the mask on-demand is technically slower, but doesn't require a large-ish on-stack array, and more importantly allows the test to use a generic "get next NUMA node" API without having to commit all of KVM selftests to using a large array of single-bit nodemasks. Implement said API as a common KVM NUMA API so that it can be used by other tests, e.g. in guest_memfd tests. Deliberately make @from "exclusive" as the anticipated usage in KVM selftests is to select the next, *different* node, i.e. so that users don't have to copy+paste code to assert that the found node is different than the starting node. The obvious downside is that implementing the exclusive logic forces callers to pass -1 instead of 0 when the goal is to find the first node in the mask, but that arguably yields more intuitive code anyways. From an overall test functionality/coverage perspective, no functional change intended (the walking pattern of node migration should be unchanged). Signed-off-by: Sean Christopherson Reviewed-by: Shivank Garg --- tools/testing/selftests/kvm/include/numaif.h | 21 +++++++++++- .../selftests/kvm/x86/xapic_ipi_test.c | 32 ++++++------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/tools/testing/selftests/kvm/include/numaif.h b/tools/testing/s= elftests/kvm/include/numaif.h index 71f261eafc90..299dddff2729 100644 --- a/tools/testing/selftests/kvm/include/numaif.h +++ b/tools/testing/selftests/kvm/include/numaif.h @@ -6,7 +6,7 @@ =20 #include =20 -#include +#include #include =20 #include "kvm_syscalls.h" @@ -41,6 +41,25 @@ KVM_SYSCALL_DEFINE(mbind, 6, void *, addr, unsigned long= , size, int, mode, */ #define MAXNODE_FOR_MASK(mask) (BITS_PER_TYPE(mask) + 1) =20 +/* + * Return the node ID of the next NUMA node in the mask, starting at @from= +1. + * Guarantees a node is found, and that the found node is not @from. Pass= -1 + * to find the first node in the mask. + */ +static inline int kvm_get_next_numa_node(unsigned long nodemask, int from) +{ + const unsigned long nr_bits =3D BITS_PER_TYPE(nodemask); + int to; + + to =3D find_next_bit(&nodemask, nr_bits, from + 1); + if (to =3D=3D nr_bits) + to =3D find_next_bit(&nodemask, nr_bits, 0); + + TEST_ASSERT(to !=3D nr_bits && to !=3D from, + "Unabled to find second NUMA node (from =3D %d, to =3D %d)", from, t= o); + return to; +} + static inline int get_max_numa_node(void) { struct dirent *de; diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 9d1dfad4efa6..7144ad833ae0 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -233,13 +233,10 @@ void do_migrations(struct test_data_page *data, int r= un_secs, int delay_usecs, { long pages_not_moved; unsigned long nodemask =3D 0; - unsigned long nodemasks[BITS_PER_TYPE(nodemask)]; int nodes =3D 0; time_t start_time, last_update, now; time_t interval_secs =3D 1; - int i; int from, to; - unsigned long bit; u64 hlt_count; u64 wake_count; u64 ipis_sent; @@ -255,24 +252,15 @@ void do_migrations(struct test_data_page *data, int r= un_secs, int delay_usecs, "(each 1-bit indicates node is present): %#lx\n", BITS_PER_TYPE(nodemask), nodemask); =20 - /* Init array of masks containing a single-bit in each, one for each - * available node. migrate_pages called below requires specifying nodes - * as bit masks. - */ - for (i =3D 0, bit =3D 1; i < BITS_PER_TYPE(nodemask); i++, bit <<=3D 1) { - if (nodemask & bit) { - nodemasks[nodes] =3D nodemask & bit; - nodes++; - } - } - + nodes =3D __builtin_popcountl(nodemask); TEST_ASSERT(nodes > 1, "Did not find at least 2 numa nodes. Can't do migration"); =20 fprintf(stderr, "Migrating amongst %d nodes found\n", nodes); =20 - from =3D 0; - to =3D 1; + from =3D kvm_get_next_numa_node(nodemask, -1); + to =3D kvm_get_next_numa_node(nodemask, from); + start_time =3D time(NULL); last_update =3D start_time; =20 @@ -281,6 +269,9 @@ void do_migrations(struct test_data_page *data, int run= _secs, int delay_usecs, wake_count =3D data->wake_count; =20 while ((int)(time(NULL) - start_time) < run_secs) { + unsigned long from_mask =3D BIT(from); + unsigned long to_mask =3D BIT(to); + data->migrations_attempted++; =20 /* @@ -291,9 +282,8 @@ void do_migrations(struct test_data_page *data, int run= _secs, int delay_usecs, * KVM_CREATE_VCPU ioctl. If that assumption ever changes this * test may break or give a false positive signal. */ - pages_not_moved =3D migrate_pages(0, MAXNODE_FOR_MASK(nodemasks[from]), - &nodemasks[from], - &nodemasks[to]); + pages_not_moved =3D migrate_pages(0, MAXNODE_FOR_MASK(from_mask), + &from_mask, &to_mask); if (pages_not_moved < 0) fprintf(stderr, "migrate_pages failed, errno=3D%d\n", errno); @@ -305,9 +295,7 @@ void do_migrations(struct test_data_page *data, int run= _secs, int delay_usecs, data->migrations_completed++; =20 from =3D to; - to++; - if (to =3D=3D nodes) - to =3D 0; + to =3D kvm_get_next_numa_node(nodemask, from); =20 now =3D time(NULL); if (((now - start_time) % interval_secs =3D=3D 0) && --=20 2.55.0.970.g62bdec98f9-goog From nobody Sat Sep 26 08:48:17 2026 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) (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 ADB5B2F7F00 for ; Thu, 3 Sep 2026 00:16:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394596; cv=none; b=b7felWnaDBMAsD56fuxJXrwX5AZOm9F+Ymq57ya+rYlVdbWSXm4ORgc6TSp45/BA5+uML4STMOrxv/NtTqmhp38yq6Gv3QXRuwduLzZKtKr3L+XeGi4QULuis5z9gTNtiATkmBsRWTvNX4nW7AIfxqdBCP1LQE+daCxUYRhEu40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394596; c=relaxed/simple; bh=ssdScvJwn5AX7Y88QustQ3OVZF+afaC11Oyf90jlOBE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CPoJe7zfWzr4n02TTLiBoZMchg3OflHQGLzgNpAe5Gy3TSFt9V24393fUEbJuTvCPsWDRL7CAraKL9h4xno01MTR2Jwm99PJGofsnMacvIiwEb4FdkPcAT2wYpPm9C9EKrHw2NsEaLkkF4yJxC0iwfXtDvIixA1osWhw1wYs1ww= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=BDbmsilK; arc=none smtp.client-ip=209.85.215.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="BDbmsilK" Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cbb20f82a0eso1193980a12.0 for ; Wed, 02 Sep 2026 17:16:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788394594; x=1788999394; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=WnK/zCAKpIyvcdimwe1n+ftd6xW82ILk7//FjCqRzyg=; b=BDbmsilKR4P94Sl047Kvc0nQitmLNywJ/XkW3h6SYoDx2vw2lLE5GkyCjVl9MB+zSj ZNPsI9Nf4oM9XME9lDEyrSebjdvDzl8wUA4nwa3ZPdF8sh1qSbm/puRYvHEHyp8gb6cu fs6ppPLpbTtNZbHZTz2MyPFWjzIvdjnG8n7J1WTIM21TDrbtvIlDz7AZsEspmYJIk46Y RzDdEVIFburvdk1q/bNkFj9EoIr0reYPMXz8iLGfHQMhltjFRa7u67hqQ6Jql0SRmkKu gjSo2wUUmROI5HRMoWz4jDPMgV25Dn9dj7++LszE1IlcXkAyUNPO7GmSuEvZXUNo8Ik9 g5/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788394594; x=1788999394; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=WnK/zCAKpIyvcdimwe1n+ftd6xW82ILk7//FjCqRzyg=; b=ns20YrPZrVoVgdce+/9NjzQgqwoyUc27Ec5Id9djW6cPIj1/moWlzgFuNa2UJWQgqc PbZ7R0/IAGnDvttNwZ5i/fj5h9JNnRk6XAYqzilDfywa4Z37kApHSh2j6bPBD3ugspkj 0rTEDxa5NvwnNKGVTtHNPFzJqPbumbtsfTrmGXXfDgTGhzIyPBFWKc2LM3QRegtXKWXg Dtk7GKy3DitDaIOmIbThgjMMP4FkEYpg1rxY8V8W6XcInREI0DlIDqXhBIhs5GSz/ZtJ vt6jFRIcX/jYbeYl9x0D3cJ/yfP0+y0OIMAqlQ3okPx0olUaCK6RrDqa3wHac3Yrk0yc X4Yw== X-Forwarded-Encrypted: i=1; AKwUvByD9ODvopd5S+2Y74viWBzLx/uj2PdWJS02KJbLO2SFC1TX4K5p75FmzAEjXLyE+t6501OnGz8Tdv2BhYc=@vger.kernel.org X-Gm-Message-State: AFuF++kwf0qe28o4WvhzhyI2h+4jd/v5gKLnEZmcY9c1e1woW3I7hF3F a9a7/t3w5jhttRx8Go2p3xXuA6Zt71zEe24W3ZJD+3nLR3cWaTl7bafG61zpSIkoJAvSly8rF7S zSzYdGg== X-Received: from pjll16.prod.google.com ([2002:a17:90a:710:b0:398:e613:7ab3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5606:b0:398:9be6:f996 with SMTP id 98e67ed59e1d1-39aee1115e0mr13498197a91.21.1788394593790; Wed, 02 Sep 2026 17:16:33 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 2 Sep 2026 17:16:23 -0700 In-Reply-To: <20260903001625.2792367-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903001625.2792367-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260903001625.2792367-6-seanjc@google.com> Subject: [PATCH 5/7] KVM: selftests: Add common helper to get mask+number of usable memory NUMA nodes From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Shivank Garg Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extract and slightly adopt the xAPIC IPI test's logic for getting the mask and number of usable memory NUMA nodes into a common helper. To allow for friendlier behavior when the underlying kernel doesn't support NUMA, or the test was run without sufficient permissions, zero out the mask and return "zero nodes" if get_mempolicy() fails with ENOSYS or EPERM respectively. I.e. allow tests to skip (sub)tests instead of throwing an assert. Suggested-by: Shivank Garg Signed-off-by: Sean Christopherson Reviewed-by: Shivank Garg --- tools/testing/selftests/kvm/include/numaif.h | 13 +++++++++++++ tools/testing/selftests/kvm/x86/xapic_ipi_test.c | 5 +---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/include/numaif.h b/tools/testing/s= elftests/kvm/include/numaif.h index 299dddff2729..0945500c6322 100644 --- a/tools/testing/selftests/kvm/include/numaif.h +++ b/tools/testing/selftests/kvm/include/numaif.h @@ -41,6 +41,19 @@ KVM_SYSCALL_DEFINE(mbind, 6, void *, addr, unsigned long= , size, int, mode, */ #define MAXNODE_FOR_MASK(mask) (BITS_PER_TYPE(mask) + 1) =20 +static inline int kvm_get_numa_memory_nodes(unsigned long *nodemask) +{ + int r; + + *nodemask =3D 0; + + r =3D get_mempolicy(NULL, nodemask, MAXNODE_FOR_MASK(*nodemask), 0, + MPOL_F_MEMS_ALLOWED); + TEST_ASSERT(!r || errno =3D=3D ENOSYS || errno =3D=3D EPERM, + "Unexpected get_mempolicy() failure"); + return __builtin_popcountl(*nodemask); +} + /* * Return the node ID of the next NUMA node in the mask, starting at @from= +1. * Guarantees a node is found, and that the found node is not @from. Pass= -1 diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 7144ad833ae0..42c601617f5a 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -244,15 +244,12 @@ void do_migrations(struct test_data_page *data, int r= un_secs, int delay_usecs, fprintf(stderr, "Calling migrate_pages every %d microseconds\n", delay_usecs); =20 - /* Get set of first 64 numa nodes available */ - kvm_get_mempolicy(NULL, &nodemask, MAXNODE_FOR_MASK(nodemask), - 0, MPOL_F_MEMS_ALLOWED); + nodes =3D kvm_get_numa_memory_nodes(&nodemask); =20 fprintf(stderr, "Numa nodes found amongst first %lu possible nodes " "(each 1-bit indicates node is present): %#lx\n", BITS_PER_TYPE(nodemask), nodemask); =20 - nodes =3D __builtin_popcountl(nodemask); TEST_ASSERT(nodes > 1, "Did not find at least 2 numa nodes. Can't do migration"); =20 --=20 2.55.0.970.g62bdec98f9-goog From nobody Sat Sep 26 08:48:17 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB2DB2F8E90 for ; Thu, 3 Sep 2026 00:16:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394597; cv=none; b=uBljF1AplM7L3oodkrHa2Er+7Ai7O+hz6hNI1xc7GvmNRSxf4aV28+yZfwBsni/glqebSwI4G5Z8fQcqnBWpnOz5vPswjYFDd+KEfJMgNxOcaTfdTAwaumesxGUItKEMrfHE2qBte9P+UMUUV7Eb62XTATy/woRWgUTbEsntG4I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394597; c=relaxed/simple; bh=2wdycaWyTr3wHjL46Oi7oUlErQKHgg3C2UWG7nXhvBU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=i29N+lumLB0YdKqnQkOOUUqHCTQGw0ln/S7R0sbK8pd973fvG9e6fThdKpEyTEHeXFvNBuSDfL68IXw3DXBQLjJPmZBInlAop1r8WUdV3sLOxPlp3kFVXDq5UckHsP/44VzcQv3UXynIxlfUIx61IKxJ9hLVXjZId82Y9hV09uM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Sdv6u0ly; arc=none smtp.client-ip=209.85.215.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Sdv6u0ly" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cc42a07d04aso1309016a12.1 for ; Wed, 02 Sep 2026 17:16:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788394595; x=1788999395; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=en9sy2X7KNJ42ALulbCcGpogsZZzDqcq6AiqI0KX/uU=; b=Sdv6u0lyuMlDJdqei9v0UlsqAwJJ/ttVCKQAzL+ullg8pQNkvFrcITscBmgTsXu1Sy aeXbgwUWnDBzQpfLxh9xjIhaEBEraUsF1IWXbQ4p4t5a8PvlbSwHeRRA168bEzRzLR3y bmTs3zSJU0VZSdB+vOpaxoS9kTxzlwe8gzNDB1gS0RudJEXqj1aqlWFdxcCcFKtrJXRi CIIKNOthZ3DGD21gqlkfgkz/e/QwRl5efuYGK0njOpuzeCkNvfX6HDnE0hXpkS1FKpkA M5uBQb8Mn3flexMNdRXTIpgthFFQztxKzn7dQzucyWU76DFfIx8FOkY3ew5NxiSfjEuf LlNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788394595; x=1788999395; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=en9sy2X7KNJ42ALulbCcGpogsZZzDqcq6AiqI0KX/uU=; b=l8WukI6OEg7JI7dqr5YKxG+8WP1NEzcXfUDFknbg0B31vZBHXbfvmhs6yHwxR5mzvL amhnpLPsgF7xd8IeNQ1v/XY1yuZ/LIWzYu11UHKwWIjWBdhvMeHBOZKSX4KyxjrbHxQI s3iKa9J+ZlDgq6dCUQpe9SnKs8UIEfU+gmKLlLAtFNMxj13dnykx8y1zJi5uvbKdWL25 0sTtqQZNkIDKSmg1lRuC2/w8mpmQCKqgBU4eZijsk3a/ZglqgGuS9QjddLu0uuxO4Cpi HP3xA/hyzrVk5V5o7k36tHsT4Y7sVQ+vxyKrDnv7LZEMiogPhXBzu1Rwyjtv5tTyvEba Sh6Q== X-Forwarded-Encrypted: i=1; AKwUvBx5cmKrBZxwisKPortRrlQwqqaknADd35VKyHWGZCR6WAIQdGeQlYiFXW/0SzT1dnJcdlcBVGNqAoeqGME=@vger.kernel.org X-Gm-Message-State: AFuF++nBBXbdqxVwNxzTnj3qYPDiv45pt1KuENWe28f9ka+Xk7R4JCTE om1d5pYNae9NS1SlgoFTg1TzpZ9OgUQRJd/EUV0Lhdw9erm0U6rMap3TJQxAooH5r+FuO0xBdjp LWgJTJg== X-Received: from pjqd9.prod.google.com ([2002:a17:90a:a689:b0:398:d766:b8e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3b8d:b0:398:c292:ac80 with SMTP id 98e67ed59e1d1-39aedf55732mr11951831a91.10.1788394594927; Wed, 02 Sep 2026 17:16:34 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 2 Sep 2026 17:16:24 -0700 In-Reply-To: <20260903001625.2792367-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903001625.2792367-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260903001625.2792367-7-seanjc@google.com> Subject: [PATCH 6/7] KVM: selftests: Automatically run xAPIC IPI migration test when possible From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Shivank Garg Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework the interface to the xAPIC IPI test to automatically run the migration testcase if at least two NUMA nodes are found. The test exists specifically to validate KVM's handling of migration of the APIC backing page, i.e. forcing end users to opt-in to running the test in migration mode largely defeats the purpose of the test. Run both the "sleeping" and "migration" testcases by default, e.g. so that the more basic testcase will fail if KVM completely breaks IPI delivery. Keep the -m / migration parameter so that infrastructure that wants to specifically test the migration case can do so and not get false passes. Signed-off-by: Sean Christopherson Reviewed-by: Shivank Garg --- .../selftests/kvm/x86/xapic_ipi_test.c | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index 42c601617f5a..c5b506eb5e7f 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -245,14 +245,13 @@ void do_migrations(struct test_data_page *data, int r= un_secs, int delay_usecs, delay_usecs); =20 nodes =3D kvm_get_numa_memory_nodes(&nodemask); + TEST_ASSERT(nodes > 1, + "NUMA nodes disappeared? nodemask =3D 0x%lx", nodemask); =20 fprintf(stderr, "Numa nodes found amongst first %lu possible nodes " "(each 1-bit indicates node is present): %#lx\n", BITS_PER_TYPE(nodemask), nodemask); =20 - TEST_ASSERT(nodes > 1, - "Did not find at least 2 numa nodes. Can't do migration"); - fprintf(stderr, "Migrating amongst %d nodes found\n", nodes); =20 from =3D kvm_get_next_numa_node(nodemask, -1); @@ -351,26 +350,17 @@ void get_cmdline_args(int argc, char *argv[], int *ru= n_secs, } } =20 -int main(int argc, char *argv[]) +static void test_xapic_ipi(int run_secs, int delay_usecs, bool migrate) { int wait_secs; const int max_halter_wait =3D 10; - int run_secs =3D 0; - int delay_usecs =3D 0; struct test_data_page *data; gva_t test_data_page_gva; - bool migrate =3D false; pthread_t threads[2]; struct thread_params params[2]; struct kvm_vm *vm; u64 *pipis_rcvd; =20 - get_cmdline_args(argc, argv, &run_secs, &migrate, &delay_usecs); - if (run_secs <=3D 0) - run_secs =3D DEFAULT_RUN_SECS; - if (delay_usecs <=3D 0) - delay_usecs =3D DEFAULT_DELAY_USECS; - vm =3D vm_create_with_one_vcpu(¶ms[0].vcpu, halter_guest_code); =20 vm_install_exception_handler(vm, IPI_VECTOR, guest_ipi_handler); @@ -458,5 +448,29 @@ int main(int argc, char *argv[]) =20 kvm_vm_free(vm); =20 +} + +int main(int argc, char *argv[]) +{ + bool force_migrate =3D false; + unsigned long nodemask; + int run_secs =3D 0; + int delay_usecs =3D 0; + + get_cmdline_args(argc, argv, &run_secs, &force_migrate, &delay_usecs); + if (run_secs <=3D 0) + run_secs =3D DEFAULT_RUN_SECS; + if (delay_usecs <=3D 0) + delay_usecs =3D DEFAULT_DELAY_USECS; + + if (!force_migrate) + test_xapic_ipi(run_secs, delay_usecs, false); + + if (kvm_get_numa_memory_nodes(&nodemask) > 1) + test_xapic_ipi(run_secs, delay_usecs, true); + else + TEST_ASSERT(!force_migrate, + "Did not find at least 2 numa nodes. Can't do migration"); + return 0; } --=20 2.55.0.970.g62bdec98f9-goog From nobody Sat Sep 26 08:48:17 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 297A4305680 for ; Thu, 3 Sep 2026 00:16:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394598; cv=none; b=RktIf0A1OiWfjWmSdHAXGN8g36iNtQc25Sc2Z/Je0jI/K7HIDV2J0Ttrlf20mg19Tfnjs67OBKpW/EYcvD29EOXpzrMiWIxy8oSoqIzkgPsDVdDeeqTaeVFaraW1BJg8N/1O76zNAKWAYxkfgaJCidjpibgLsvzqNn+kwR2YjJs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788394598; c=relaxed/simple; bh=VNMxHfCF57rf4sPCMaN9jxnJIYNyIk4cK2dPfuDaUq4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=u4Z6NpReiSW1cMPTXPL/sMtuoFUPTB7Cff8R2egOn4rGndJ7KzI7jr601Wd5RTxnVJb/xQF07b3fQ4NoscHQ4EExnFbg2UDmz0nZPB2bRYc3C5wwtfP8XoU5cEsQpi6JV/Vblxq6EmmMPr9BXN+UgKoH7p76oZs0Z0Va5WawkR4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=uMTUihBa; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="uMTUihBa" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cf1c86963bso4317925ad.0 for ; Wed, 02 Sep 2026 17:16:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788394596; x=1788999396; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=qVz8wagzKyX46SkkmDSLmjOUaaJbINqolgjBf3c/QvM=; b=uMTUihBah3GRyzOAU9EZIXHtUGM72Xf48JaoS7QJyLVFQ7X2EBAyWAN1kXxHu0JqRi vHWQPMJvSnfU/R0lJBFqAsx01c5htp2XpJfEZRN2fv73RA6rHyQMlEkei8QkuYC8/QZD DL4zJQgKn3HSxKQ6mwTJP2cW+nGFqYwuKAaR1EM1dLochnZmvMZDNLYsAkLsuCjnR+KF bmopTVkPCj0GG2xlph5lYnT1ObUWroMpwIQejuh77arodZ6XUAhQn6CRwoukonSSCs3P ze4FhqyVPhRMGD+Xe3w6fRuac+Th2WQQiEj/BbgNNUsR7wRyBf4+/GkK0RwjUCiL9b8n 0a7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788394596; x=1788999396; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=qVz8wagzKyX46SkkmDSLmjOUaaJbINqolgjBf3c/QvM=; b=YfN3M25WhZo6/DOtWW+Ie2+48EVcaCQVz8vRel04Mp/V6KLtx4UGv0RMXS4bwoPyP7 cYypOtqvzK8DjOk5osImtrTLVe1taYYTtBuqLhgcTnw6oCTWXUEM49NA1yh8HSatOMN/ kFN/GXa7GAXcXdGao8iwoctN6SzlUpfijzZ1VbCM4UKMjOUUQF6XRG5SIp+XG+SHKky3 5LKguYMjLpqtpFLe905XlkftRN5DHK1Wjw5iK+ikZCm1k7ppXBzGXEoyijKMQSBbzqQi kaD2JbJbVCmmSsaiYXfZwDAOuNY/h1AFnP+UlptgdZrp9EJ301TF0mlMviOFHyi9jSqa L+8w== X-Forwarded-Encrypted: i=1; AKwUvBzJLtmuRKmi+slPerw41lorAkxlMoqh63TvqUrmhu9P84x5fuxS/mb4cjk8Udd8spH30jJYPZ+sRukQjEI=@vger.kernel.org X-Gm-Message-State: AFuF++kBAbwOSbbZ3q+hiGz1mAZTJlDVzlBXWMFnm1hQTPDR7YrHMcdk wivHWVCGwoXRb5cPSSWwLmL43H3mhy+FmB7tJqKu9rM0OQaSA2E11Kxwj0ZaCNaS3qlrrTt6G6c FfMSdkA== X-Received: from plbli14.prod.google.com ([2002:a17:903:294e:b0:2c8:903:9ae7]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce8e:b0:2d8:d4d2:d138 with SMTP id d9443c01a7336-2dafb136d0emr20975865ad.20.1788394596052; Wed, 02 Sep 2026 17:16:36 -0700 (PDT) Reply-To: Sean Christopherson Date: Wed, 2 Sep 2026 17:16:25 -0700 In-Reply-To: <20260903001625.2792367-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260903001625.2792367-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.970.g62bdec98f9-goog Message-ID: <20260903001625.2792367-8-seanjc@google.com> Subject: [PATCH 7/7] KVM: selftests: Skip xAPIC IPI migration test when forced but unsupported From: Sean Christopherson To: Paolo Bonzini , Sean Christopherson Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Shivank Garg Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Skip the xAPIC IPI migration test instead of failing outright if migration is forced by the user, but is unsupported due to lack of NUMA support. Failing the test is arguably "fine" for opt-in behavior, but in practice doesn't allow running the test in forced-migration mode in any kind of automated test environment. Signed-off-by: Sean Christopherson Reviewed-by: Shivank Garg --- tools/testing/selftests/kvm/x86/xapic_ipi_test.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index c5b506eb5e7f..2362bf272e80 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -469,8 +469,9 @@ int main(int argc, char *argv[]) if (kvm_get_numa_memory_nodes(&nodemask) > 1) test_xapic_ipi(run_secs, delay_usecs, true); else - TEST_ASSERT(!force_migrate, - "Did not find at least 2 numa nodes. Can't do migration"); + __TEST_REQUIRE(!force_migrate, + "Need at least 2 NUMA nodes to do migration (nodemask =3D 0x%lx)= ", + nodemask); =20 return 0; } --=20 2.55.0.970.g62bdec98f9-goog