From nobody Sun Feb 8 09:12:55 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 00A25259497 for ; Fri, 20 Dec 2024 01:39:10 +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=1734658752; cv=none; b=D8zLkuqfaZizvgj9uYS1lYRIjr9eYTaKaqH+OmHKoVf3mtJdqoVt3YouK16MK8YlAZA7545XjBUMKw7y8jLR0pF+CSk6r7GaQPsiTomGJKk4TGQCL7pg8k4TzUNFjcb9gRR0Jv6/Q9x0lhWoolhMVfTooALsxT7lw7pKs/FmjuU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658752; c=relaxed/simple; bh=vUAkr3IX2LE4GH/mlPkbcxzVyqeoUOtvVrlhcSINMSY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dQ3osmzosFrz4jDvaFDVuYQnVL9FXj+WBb9CNvmbB/Z6CgMqJ+V2Vq3LVgqJ+/qSIFEZM7IzsYPuk1qRtFLT8SYnZt78EqLecwf9nmB1F5Q2jN4F19CWQW90JQsp8D+ZNNJxJ56zrJP+xvO+0AE/01aRA45PRDW/5FZjMb3AKuQ= 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=Cg9ARUip; 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--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="Cg9ARUip" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-7f712829f05so883566a12.0 for ; Thu, 19 Dec 2024 17:39:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658750; x=1735263550; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=OYKvlAfMuP2ktBfEDhDytfcvSdR/S4IqDZKQdTsYjuw=; b=Cg9ARUipzj+8HUO5coEyze9E5jPY0yiPMCRfSBVxS71MrLP8NEMYVYkiIy+Ufm1/hM TIzx3/DFVt+IFZ446W0z9lnHIGWpDqjmtY5TuenifpJOAMQoqztmfk61MV6wBSuXYWsN Ru56Gk6HOo+FHKP8I4qiOx8Mvx0PovvW/GKRAS/JYvgEMV3g+koLHzLCCgbLHpNQaFab MP+JqOBEchaCE9KBn/ddVBGK5z7iscaAmbavLRrOu+RPSJ4mg48m/OVKMK2scDlQT+gy CLsHGOMXBy2Rcb5MUJyD4QJfxRd3ZPiWOdFdrJEzrGYduFAJJdkWCHgkGeYCgOkQfOi5 O+uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658750; x=1735263550; h=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; bh=OYKvlAfMuP2ktBfEDhDytfcvSdR/S4IqDZKQdTsYjuw=; b=RZJx6ztdNvZX8gDN51W5ogu7SE17uSqLwv6J0482jSOt+B4VR+rZleIorxdp4d3ouc JklXajjJlOFf9xJrjrPP3Yt6D2nrP5bBjhgReiWWfi6kU3pj9eMKK64PqxYBRMoC0mQJ M+PcFbMqzT/gmZ4+BH6msNz2kF3EyIdkrOy+LFstUK+doSxo12kmoqwcKmhIuveAkJcl bfGv8ilkXfT9MGBYTjFBoy2Y3iVcv8DF5ic2VrZJNik3xup5Y3Aym1VkMU1mQOft9dvP L0Z6YrmpPAD3fiEY0ebcVsAJn4ChNJoNsboNAKSjVKG6dnCiHNiqT0iM98Fs+cfF05X7 l+AQ== X-Forwarded-Encrypted: i=1; AJvYcCUg1fSuo9T+zwSJoffeCx6DafBI0AuTWgiVHIWf1UmX/BIhIje6bPRnOleVCAWeZwOVklCbXKsI/D2opJY=@vger.kernel.org X-Gm-Message-State: AOJu0YwJddkKPLVGYAedBom8bEAUEGy3i50gCICdQqk1MutwWtLZkc9R FJ0Ihg5kJaC6QDLpOG49XOdLSPx/eK+DwXVnUaCJ9OPKSJTEzn29Yb88f0HLQVD76m2LOr5AwF/ plQ== X-Google-Smtp-Source: AGHT+IGntiLPaNNzeAfuu6/TEmKwPAvoTiJFX2SO6583j9CN5As5xvpXTmf/fSQgTUKQrOus8R97PMQPQe4= X-Received: from pfbch14.prod.google.com ([2002:a05:6a00:288e:b0:727:3a40:52cd]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3a85:b0:1e1:c8f5:19ee with SMTP id adf61e73a8af0-1e5e04945e8mr2117339637.25.1734658750347; Thu, 19 Dec 2024 17:39:10 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:38:59 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-2-seanjc@google.com> Subject: [PATCH 1/8] KVM: selftests: Fix mostly theoretical leak of VM's binary stats FD From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When allocating and freeing a VM's cached binary stats info, check for a NULL descriptor, not a '0' file descriptor, as '0' is a legal FD. E.g. in the unlikely scenario the kernel installs the stats FD at entry '0', selftests would reallocate on the next __vm_get_stat() and/or fail to free the stats in kvm_vm_free(). Fixes: 83f6e109f562 ("KVM: selftests: Cache binary stats metadata for durat= ion of test") Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/lib/kvm_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 33fefeb3ca44..91d295ef5d02 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -749,7 +749,7 @@ void kvm_vm_free(struct kvm_vm *vmp) return; =20 /* Free cached stats metadata and close FD */ - if (vmp->stats_fd) { + if (vmp->stats_desc) { free(vmp->stats_desc); close(vmp->stats_fd); } @@ -2218,7 +2218,7 @@ void __vm_get_stat(struct kvm_vm *vm, const char *sta= t_name, uint64_t *data, size_t size_desc; int i; =20 - if (!vm->stats_fd) { + if (!vm->stats_desc) { vm->stats_fd =3D vm_get_stats_fd(vm); read_stats_header(vm->stats_fd, &vm->stats_header); vm->stats_desc =3D read_stats_descriptors(vm->stats_fd, --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sun Feb 8 09:12:55 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 97D711CF96 for ; Fri, 20 Dec 2024 01:39:12 +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=1734658754; cv=none; b=OpLTKFZV/8kO5AGkXuyXCJA/SkDCWoNgFJMrnjEhdkkvrCkDzDDG2UlB2gHWikdcgGrb+u2KhhtGcMOrdthDbddjKebUlXm8ZV+s429cAAVn/RKS2T4KqHWxy1ql3vmdmfNQJnsgb50z+fhJmzZirMRrLZDXTX5X8Td7G/lzIsk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658754; c=relaxed/simple; bh=x+G/SKe65zYqmcjfUDWiwO99pE05MNdhz6X9PomzPYg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jPynmLQSpecoNVLLj8MSQZWXB8OXuZrY+Lj2wJIGhm4hEMDD+SSodGa0fxph4z3vg0U0+g9+jjJdWnK68eesrVcBGwbQ+NNOcdFQ5F/g5LLsXYLHBb4ibjG4ZSNz7y4JIzAoZXPI2Bt+cv0KNIps4ds4+HqWNgrt/oGC3Hs0qJ0= 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=Gy1sOYJ/; 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--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="Gy1sOYJ/" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-21655569152so12654755ad.2 for ; Thu, 19 Dec 2024 17:39:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658752; x=1735263552; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=VJst1sRt7o765YHKTsyCLHu+qBA9pewJkWtnndgMLN0=; b=Gy1sOYJ/9dNZiwp6AIpFu5aEI/7NnphKHg0vq0utlmoJw0iAG+yjGkYoeZ7HfFfSAA ZZBox9PpDLPhsQPOBoSiD7+ujZaWvJOK4MC8E9+Re8czgvInh4QrmQW7e/034Q1MrPna 0HSVUhFnWoWERjNYXIzAJS2Ouv0oDkpqTkZNzYJyUFpwjQWbVFSyX+lBgThwAi/zYUt9 jCjuSyJWzyQCf49Jw7tLuy8DOvsru5t7LdI02U6mwHDaXnIV1NesprwWMXIW0ccKu6S1 0cdOmOHqydF8XjdQJWsfxr3IgqB0BlfmFXW4JvYTdAvF5AfixJ+IVJNZWgXZMqF04KtP n3jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658752; x=1735263552; h=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; bh=VJst1sRt7o765YHKTsyCLHu+qBA9pewJkWtnndgMLN0=; b=e6uoMN/rAyUEEHgDr3cqZuR/l9YrAfPv562Xnr2JUlssvvqkoc+GtFytb+FBmiTLRg EVaR2ZqsW+a6jTXTl4TE4LtDLLcMrg3zIqT7CCS3DH7chNQYDi/y/lyoLDtQ+IN3hR9y /MDSSQU+n/CXKufcht4VCMoXuNcQwNiU+PeQ1l0rxvSPg11SrMAuePhAdGbNPLb+he/j dMvVp8ky4dY+3tNvaJrzDsmcUtBZfUgmA8CjMoQF9tOQZckralYudYpK/LJyd6b8RHyd X4dfVbpdeP+q95zQd5IE2PeWZb9vIUzG+ijGv/pqT63VPVNj2hLvdkJEQVK7Ly/d4Faj ZOSw== X-Forwarded-Encrypted: i=1; AJvYcCW81vq+30yE3sdwL6yqdJwaZJpRoXvjQDd4m6a8BPdsevCgOCkCTvgbIG4uVxdij6UMYgu6anyz8XzU+Uo=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3iVsTyhStE+nBjxmv8FuQjXHleDB8UvgWUT8XphltZzyMoRLL Zpk1aD65nnn9csXh7F8P/VpCFBTu+8w3R7/MCrbLAHkgQsk5RBXC3c+lfJemTyqhxxniyC/V5Ez 8cQ== X-Google-Smtp-Source: AGHT+IGsWQbkvzY4Nq8NW+TxgBWjNbfzrSia5xRKbrBdsJJ8VjsmNkZOW2nxKqNkxRXVufnLriMmB7/RPeQ= X-Received: from plbkw12.prod.google.com ([2002:a17:902:f90c:b0:216:3e9d:6bc4]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:c406:b0:215:854c:a71a with SMTP id d9443c01a7336-219e6ebb68dmr11030635ad.34.1734658751894; Thu, 19 Dec 2024 17:39:11 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:39:00 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-3-seanjc@google.com> Subject: [PATCH 2/8] KVM: selftests: Close VM's binary stats FD when releasing VM From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Close/free a VM's binary stats cache when the VM is released, not when the VM is fully freed. When a VM is re-created, e.g. for state save/restore tests, the stats FD and descriptor points at the old, defunct VM. The FD is still valid, in that the underlying stats file won't be freed until the FD is closed, but reading stats will always pull information from the old VM. Note, this is a benign bug in the current code base as none of the tests that recreate VMs use binary stats. Fixes: 83f6e109f562 ("KVM: selftests: Cache binary stats metadata for durat= ion of test") Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/lib/kvm_util.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 91d295ef5d02..9138801ecb60 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -709,6 +709,15 @@ void kvm_vm_release(struct kvm_vm *vmp) =20 ret =3D close(vmp->kvm_fd); TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); + + /* Free cached stats metadata and close FD */ + if (vmp->stats_desc) { + free(vmp->stats_desc); + vmp->stats_desc =3D NULL; + + ret =3D close(vmp->stats_fd); + TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); + } } =20 static void __vm_mem_region_delete(struct kvm_vm *vm, @@ -748,12 +757,6 @@ void kvm_vm_free(struct kvm_vm *vmp) if (vmp =3D=3D NULL) return; =20 - /* Free cached stats metadata and close FD */ - if (vmp->stats_desc) { - free(vmp->stats_desc); - close(vmp->stats_fd); - } - /* Free userspace_mem_regions. */ hash_for_each_safe(vmp->regions.slot_hash, ctr, node, region, slot_node) __vm_mem_region_delete(vmp, region); --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sun Feb 8 09:12:55 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 4F6453A8CB for ; Fri, 20 Dec 2024 01:39:14 +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=1734658755; cv=none; b=HL/QKRgs6JQSNFHluyJDiey0C05hAlRDHz08XdoV0BqB7PZyD7CMrSIYSdMZbXhZ2IyYVC7wECTZ3XMOrYeXBUq+J47ZpJ1pfUrP3gwsc1nXfTzBRv/6cD8sLEwSPSvTSQerWRf7wSEetpgR+20ukWaH1ZtKcj2D1vNDSfK0HL8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658755; c=relaxed/simple; bh=ngrqdUdgvu+/gBHMswn/cnVSO5lL2tVEodHB9BBNKEM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Qggdfu4g5G4v7bjRfICz2paLpwosNsLbPhwtKYoWRyDPy+L6tCpJ3dwkKf1GRcbXVRAMfu5leeYe2dt+6IpsTn1Yb/ckRRmSfs3nfTj6kfZYgxx3aNg6FBPO7IdYCKnqiXFFyBsu8zAhWqZlOly3tgdyESxyEMnBeIDKgxUDdLk= 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=J3fCUG0+; 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--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="J3fCUG0+" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-728e4e30163so1079542b3a.1 for ; Thu, 19 Dec 2024 17:39:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658754; x=1735263554; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=C0bgCVLlKE2bsIas/97mE7OWeLqD3b90q0/zRCnz1gQ=; b=J3fCUG0+qjA9k190tJaAswaik3zjNOL4+2Sw7CgMQ9H061WzAk0dozVjK7kw2GWCDI UuO91ZW+4mu6WqaiSHbV88h/suLD3ewC05NMdSMhoxma1MMc/FDcEtKBswMC7JiS6o+5 E9ODXmmjk41SSRbO2Kejy475eirN2GcjPwLS6eTYphaQyjmfKDNf0N4J/gXgUeEuZ7oL YOwqDValvINzFs7E9F9XUG97JBZyW1WNVu1q9OjIlkTvqN0BZiZ2POWqEOhmW2JPGU+6 eepQvVpdIEz+VL+pcIzUVYdZlczml3pdY9Upoe2Qo/xWCqQpyMO/sUFrNZU90sLGrV0S gv+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658754; x=1735263554; h=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; bh=C0bgCVLlKE2bsIas/97mE7OWeLqD3b90q0/zRCnz1gQ=; b=V2CJoHyYRta3gMPhrLVhd2upUIhHeBryRglqokc/ZOwh2HuhT0jZGua1PVlqsnfvan +Xbht5vQ6ZzExsqGVxRNO+0krdIamvz4uQaGMXhBqSJayyU+g6zDLaJ7un6kuvbUFfew ee1hPo7hWrlI0x70hUxYqezjnIyyKXi3IjB5ucmKdpv9rznyto0e2JWZQJhmng13WJgy MPgZfE3yyX9sAEQAWwHoKj0Bf591yKvBIahjVYnMFinPkOUs0dCS4u2dVpiO4gEn2PmI CSmqd5Nur4MLCzJalrnFO8mvcBg0Z7d9hEC6OoVhBwxsxlKdJ9gWBlQ6sS+7BIajWi0x vBYg== X-Forwarded-Encrypted: i=1; AJvYcCW2FKrIIa/t5A8XXEuZmRmHRjAo/0L3nwvqZZivELXHiF54IL9wZ5eJuOvKbGhGu8EiG4Osqm6wDqR/xzk=@vger.kernel.org X-Gm-Message-State: AOJu0Yzlm6pIJwqC196voREtlPLRHcNyWwFLWk/tU8ZIGh3vdewOzPHu L98YiuUjjbz3LvxwRa6Vmj7a1BLw0wWOueG+KnK82pzekk+WVEQ6m77dvmMLw4Vdhr3th1Yi8Kc kzQ== X-Google-Smtp-Source: AGHT+IEnCf3mHfBvLfwshZ15Q9EpX1HZcjdF08kZ2lrJwSlTx89Hx0AQSr2Fy6V/QWuDYbh+JhZtgEK5cgY= X-Received: from pfbbd38.prod.google.com ([2002:a05:6a00:27a6:b0:725:ccfc:fd85]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1942:b0:725:cfa3:bc6b with SMTP id d2e1a72fcca58-72abde404b0mr1283201b3a.3.1734658753719; Thu, 19 Dec 2024 17:39:13 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:39:01 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-4-seanjc@google.com> Subject: [PATCH 3/8] KVM: selftests: Assert that __vm_get_stat() actually finds a stat From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Fail the test if it attempts to read a stat that doesn't exist, e.g. due to a typo, or because the test tried to get a stat for the wrong scope. As is, there's no indiciation of failure and @data is left untouched, e.g. holds '0' or random stack data in most cases. Fixes: 8448ec5993be ("KVM: selftests: Add NX huge pages test") Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/lib/kvm_util.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 9138801ecb60..21b5a6261106 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -2238,9 +2238,10 @@ void __vm_get_stat(struct kvm_vm *vm, const char *st= at_name, uint64_t *data, =20 read_stat_data(vm->stats_fd, &vm->stats_header, desc, data, max_elements); - - break; + return; } + + TEST_FAIL("Unabled to find stat '%s'", stat_name); } =20 __weak void kvm_arch_vm_post_create(struct kvm_vm *vm) --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sun Feb 8 09:12:55 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 3ECAD74059 for ; Fri, 20 Dec 2024 01:39:16 +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=1734658757; cv=none; b=rSgL9hEpayU9aiFSbhqzUidQwcG4gxvbBaOCAlbbckvnnhyhDyaN/SgIqk1wToT70YrXn3MOWMEn5Gt67oyn8BvRh4kxXY7u4CdNJCcc3+WdKm1fj1LwKf1olL1g7ywI/sJVNhM7bEFcALrjLXaoJGd2YzwfAckN/urSu7+iFB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658757; c=relaxed/simple; bh=cdYoQmC1gHgaq22PDsiZGCRoGD7RLzRK9PeAtDWgW1s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Jb4kEYNeRV8mGXmz0CNoEF0LcIyiIRDMc2C74PmaHkVK5H2f7uPj/NlB6JRV0dmVY4iRDHbcdLC4cEGtxI4jJV3o/5bOvBNZi/DrBO6lEOlPJWZe4UfeMlLU1erGT7HWKrNC7bsqaTAUEV19gfYnvKZyPeRVumATkcC/xRK4OBE= 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=Xrb47Avc; 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--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="Xrb47Avc" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-7fd4dd6c506so778241a12.1 for ; Thu, 19 Dec 2024 17:39:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658755; x=1735263555; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=FOB7JN0OSt2j8FiVppNC5qzgljC2YrzarOO3DmltLC8=; b=Xrb47AvcWGXho1oJMLU7+rUDiTU4pz0Zlc4qK/+wdhWg3mQoU+RUexLsNYkOdS/+Jr 92anryNYkKe199xlAT8gOgVkdSfZ3LxW5cAijWTIVD+TfLNUjKwFIW4hFieMphNHd1Pg J3iSGT4t3dQcMO+PNl6P/JnYO0YKaUpC6CAn7tcRF/OdrLWEk1QItf1P3qFtXFsf4bri VM0lcYrBzXaLgIrEYu4ce4H2uKX4XLDM9vXTFMXsY3hmR7T+Wo7VbTNLlNO2rrZNHvtI eyPMCRoeS/Mng/KSq3mAeZE77+ROaV7jb+2XoKQAXMXAawC2Oa+U8YlREnxynhq/6x61 HkVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658755; x=1735263555; h=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; bh=FOB7JN0OSt2j8FiVppNC5qzgljC2YrzarOO3DmltLC8=; b=Xx/ubAQr8PG5Po7ldXf4d72NQj3/p34ZMgW7cnXTAd1gKsu76dEx4emrTF4S3bcHdZ D3JFmqVwzuOdodItOYqKxE9jqykgu2jnw0HKG2oU9oPBsyDkoJmX80fu14PspV++Vz/g /zhEHMam6/SDPMFYC+S5+Y+eeXRGohvTmXTRC5DTMcK8FD6Bu6SmYWuBKJeFN6WDj0Kr cnExoO1Xm5N94h1upYusKlRt1HRphjtexuzy/xE255DHwQ/VkrL4fojZFvSr1CJkS75z gJAu+aaCozBd02OTp7CTop/qK+Y5aa55bIxCBo1VdWfxpqkQXn8FNsI5hVnaKyQurZKa rZAA== X-Forwarded-Encrypted: i=1; AJvYcCXEZ3AXUn4hvl4hQIpJ1+spUYD6i1LknEUzWOWn6lS1N3zHh80jF4dIZrOFquQ+VjjMTq41rON+1nfsfRM=@vger.kernel.org X-Gm-Message-State: AOJu0Yyn8eP8jwLkjHHVQJIAprKWCh7Wfkd/zBJy05cr4/teRjQxGTmR CKlF7g9SVnBJmiEJX1XMel31Zo5ekwp5F1mAIrojIb4vNQI2EmxFYql9Q44veg7Zzd5C/Z+YnN7 GPQ== X-Google-Smtp-Source: AGHT+IGgztxRUxTUpaMUvL86uRz7hYZyu/zAmCoVzo4yvg4Q5SlFHbLBFYN3ktm59BGI0bTCiW14R+y2ITQ= X-Received: from pfbkt9.prod.google.com ([2002:a05:6a00:4ba9:b0:72a:bc54:8507]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:33a6:b0:1e5:c43f:f36d with SMTP id adf61e73a8af0-1e5e046189cmr1878060637.18.1734658755535; Thu, 19 Dec 2024 17:39:15 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:39:02 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-5-seanjc@google.com> Subject: [PATCH 4/8] KVM: selftests: Macrofy vm_get_stat() to auto-generate stat name string From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Turn vm_get_stat() into a macro that generates a string for the stat name, as opposed to taking a string. This will allow hardening stat usage in the future to generate errors on unknown stats at compile time. No functional change intended. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_util.h | 14 +++++++------- .../kvm/x86/dirty_log_page_splitting_test.c | 6 +++--- .../testing/selftests/kvm/x86/nx_huge_pages_test.c | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 4c4e5a847f67..044c2231431e 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -534,13 +534,13 @@ void read_stat_data(int stats_fd, struct kvm_stats_he= ader *header, void __vm_get_stat(struct kvm_vm *vm, const char *stat_name, uint64_t *dat= a, size_t max_elements); =20 -static inline uint64_t vm_get_stat(struct kvm_vm *vm, const char *stat_nam= e) -{ - uint64_t data; - - __vm_get_stat(vm, stat_name, &data, 1); - return data; -} +#define vm_get_stat(vm, stat) \ +({ \ + uint64_t data; \ + \ + __vm_get_stat(vm, #stat, &data, 1); \ + data; \ +}) =20 void vm_create_irqchip(struct kvm_vm *vm); =20 diff --git a/tools/testing/selftests/kvm/x86/dirty_log_page_splitting_test.= c b/tools/testing/selftests/kvm/x86/dirty_log_page_splitting_test.c index 2929c067c207..b0d2b04a7ff2 100644 --- a/tools/testing/selftests/kvm/x86/dirty_log_page_splitting_test.c +++ b/tools/testing/selftests/kvm/x86/dirty_log_page_splitting_test.c @@ -41,9 +41,9 @@ struct kvm_page_stats { =20 static void get_page_stats(struct kvm_vm *vm, struct kvm_page_stats *stats= , const char *stage) { - stats->pages_4k =3D vm_get_stat(vm, "pages_4k"); - stats->pages_2m =3D vm_get_stat(vm, "pages_2m"); - stats->pages_1g =3D vm_get_stat(vm, "pages_1g"); + stats->pages_4k =3D vm_get_stat(vm, pages_4k); + stats->pages_2m =3D vm_get_stat(vm, pages_2m); + stats->pages_1g =3D vm_get_stat(vm, pages_1g); stats->hugepages =3D stats->pages_2m + stats->pages_1g; =20 pr_debug("\nPage stats after %s: 4K: %ld 2M: %ld 1G: %ld huge: %ld\n", diff --git a/tools/testing/selftests/kvm/x86/nx_huge_pages_test.c b/tools/t= esting/selftests/kvm/x86/nx_huge_pages_test.c index e7efb2b35f8b..c0d84827f736 100644 --- a/tools/testing/selftests/kvm/x86/nx_huge_pages_test.c +++ b/tools/testing/selftests/kvm/x86/nx_huge_pages_test.c @@ -73,7 +73,7 @@ static void check_2m_page_count(struct kvm_vm *vm, int ex= pected_pages_2m) { int actual_pages_2m; =20 - actual_pages_2m =3D vm_get_stat(vm, "pages_2m"); + actual_pages_2m =3D vm_get_stat(vm, pages_2m); =20 TEST_ASSERT(actual_pages_2m =3D=3D expected_pages_2m, "Unexpected 2m page count. Expected %d, got %d", @@ -84,7 +84,7 @@ static void check_split_count(struct kvm_vm *vm, int expe= cted_splits) { int actual_splits; =20 - actual_splits =3D vm_get_stat(vm, "nx_lpage_splits"); + actual_splits =3D vm_get_stat(vm, nx_lpage_splits); =20 TEST_ASSERT(actual_splits =3D=3D expected_splits, "Unexpected NX huge page split count. Expected %d, got %d", --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sun Feb 8 09:12:55 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 0427013AA2D for ; Fri, 20 Dec 2024 01:39:17 +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=1734658759; cv=none; b=AhQcPySxjQozBCk/N8l0jlVZdDdqbvz5g+Duv5hRewKzOC/6LF5ijiP+p+8lAKTEgk9v0CDOI57ROjQ1OiRWokai9AFAA3GoVeJ4+c3CcQZRyMEyU7NR9UKxCnRND6bVuuKgEaDR2UZKMcAq6wwNUD0JgzliVsQmqSpfQljicZs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658759; c=relaxed/simple; bh=eeF/zKkticJHl5FU2ydo7jdEXM5cm9h9vTJoDSn8JMo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fJ04J+v8vNilSBVOU4gTd8ElyqMFh4ORWdl3k9EuESyU1kJdEIhZdSjR/01Q1UjDB2gwCUT7cm3VDPQxbOQO9unv3BbAOy7a/qq9uPJK3csiSJDLWZ9LC3WOo581Y8PgKUTNSVEZkjWO9fy+s/lrbrYrirctaMS1aMacGZWsF5U= 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=Rv9gcxLG; 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--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="Rv9gcxLG" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-8019f05c629so1485975a12.2 for ; Thu, 19 Dec 2024 17:39:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658757; x=1735263557; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=lQGXs4fRzhUjC9h6471rkcBzWgIFKg5z0MpBCPWHmMU=; b=Rv9gcxLGjoh1H6qINvmeWbMrOsPPYUnz9QHnoTc8YJBDEHXZ8yw3INwCMWG5gPMKLF qH4/ClaEAGx7fMkxmQOZdkUezeVW1x+lpCVEutgt5zb3yzJWMsi5cIDXK0MuefwLEhNV O7rldiQIcB+NZDKgW1sGjfy9FWaZPMjkKy1zesMLYL6kfJs1atpoS+VdTLEIVk6ZgMbO GIDRYoC9mAZbTpyoI4+Rs+9gnPPGwSS/CefwJD3hp0jTKmGGbqmO278l9mv6dWWN3Ad3 EGSWxTSydM3abhVXoK1tESznXf2b4iinwqMhdfNVPW7GUiGATAAKvcOmWofbdHu4yKKf osKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658757; x=1735263557; h=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; bh=lQGXs4fRzhUjC9h6471rkcBzWgIFKg5z0MpBCPWHmMU=; b=X6U43PgFJ+ZitAQ9IH3jnvrtGiQCSNmgZB16RjoyXab4aeJxl2T/ZDB307hzmJnIks YpFfEnX61TMEwCorUJekPyqqbvjZY3INKWteZ12s453nfUpDaOkWPR6oWv/JnIAYpMlq NzKGNEzMZeMyPXI5yFDT5JGQnOb9TTVzJU+wzzXKFhU7pKVPX170JUTjR7HHKP8DVrYJ d/UJHPsM2HaN9hQJGyiIaAO/4sslyamRk6qsugc6osvVogLJxys439pd0BDK6Q2W/kQ1 TGA3T1EGasaYJQIcmauYpzSTI0iLodrUxiZkeCpi8TypXadJ3/VRlh8deayHBgWJ0+4C BdAQ== X-Forwarded-Encrypted: i=1; AJvYcCXSRU/LKDiCwr1VwpC2ksrRXh86VnotpZNSJ9Lyex4fIeURTfrIcgrbp5RYkZ5Fk4pq/90uFLwvCowhdso=@vger.kernel.org X-Gm-Message-State: AOJu0YxiOfmIZguKdV7jrGwsswLNkwpPQocjgOv08I7rvmd5+Kjri84v zjVbv3KAR0TKMiqtipepYBWmbu9ZUVpMCG5CR0oeJLGCNK4ABMzGoW5/Phm05MrucwMu27SQSjY WHw== X-Google-Smtp-Source: AGHT+IGUByijU78nvHemXzOEaAQQDSmObXI7NYnb4v2toowk5S9287aNHUtx84WY5rqumwN+j1k67ZUHOWo= X-Received: from pfd7.prod.google.com ([2002:a05:6a00:a807:b0:727:2d74:d385]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:2d1f:b0:1e1:b1e4:e750 with SMTP id adf61e73a8af0-1e5e04717a2mr2014875637.18.1734658757426; Thu, 19 Dec 2024 17:39:17 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:39:03 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-6-seanjc@google.com> Subject: [PATCH 5/8] KVM: selftests: Add struct and helpers to wrap binary stats cache From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a struct and helpers to manage the binary stats cache, which is currently used only for VM-scoped stats. This will allow expanding the selftests infrastructure to provide support for vCPU-scoped binary stats, which, except for the ioctl to get the stats FD are identical to VM-scoped stats. Defer converting __vm_get_stat() to a scope-agnostic helper to a future patch, as getting the stats FD from KVM needs to be moved elsewhere before it can be made completely scope-agnostic. Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/include/kvm_util.h | 11 +++-- tools/testing/selftests/kvm/lib/kvm_util.c | 47 +++++++++++-------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 044c2231431e..9a64bab42f89 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -46,6 +46,12 @@ struct userspace_mem_region { struct hlist_node slot_node; }; =20 +struct kvm_binary_stats { + int fd; + struct kvm_stats_header header; + struct kvm_stats_desc *desc; +}; + struct kvm_vcpu { struct list_head list; uint32_t id; @@ -99,10 +105,7 @@ struct kvm_vm { =20 struct kvm_vm_arch arch; =20 - /* Cache of information for binary stats interface */ - int stats_fd; - struct kvm_stats_header stats_header; - struct kvm_stats_desc *stats_desc; + struct kvm_binary_stats stats; =20 /* * KVM region slots. These are the default memslots used by page diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 21b5a6261106..c88f5e7871f7 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -657,6 +657,20 @@ userspace_mem_region_find(struct kvm_vm *vm, uint64_t = start, uint64_t end) return NULL; } =20 +static void kvm_stats_release(struct kvm_binary_stats *stats) +{ + int ret; + + if (!stats->desc) + return; + + free(stats->desc); + stats->desc =3D NULL; + + ret =3D close(stats->fd); + TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); +} + __weak void vcpu_arch_free(struct kvm_vcpu *vcpu) { =20 @@ -711,13 +725,7 @@ void kvm_vm_release(struct kvm_vm *vmp) TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); =20 /* Free cached stats metadata and close FD */ - if (vmp->stats_desc) { - free(vmp->stats_desc); - vmp->stats_desc =3D NULL; - - ret =3D close(vmp->stats_fd); - TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); - } + kvm_stats_release(&vmp->stats); } =20 static void __vm_mem_region_delete(struct kvm_vm *vm, @@ -2214,34 +2222,33 @@ void read_stat_data(int stats_fd, struct kvm_stats_= header *header, * * Read the data values of a specified stat from the binary stats interfac= e. */ -void __vm_get_stat(struct kvm_vm *vm, const char *stat_name, uint64_t *dat= a, +void __vm_get_stat(struct kvm_vm *vm, const char *name, uint64_t *data, size_t max_elements) { + struct kvm_binary_stats *stats =3D &vm->stats; struct kvm_stats_desc *desc; size_t size_desc; int i; =20 - if (!vm->stats_desc) { - vm->stats_fd =3D vm_get_stats_fd(vm); - read_stats_header(vm->stats_fd, &vm->stats_header); - vm->stats_desc =3D read_stats_descriptors(vm->stats_fd, - &vm->stats_header); + if (!stats->desc) { + stats->fd =3D vm_get_stats_fd(vm); + read_stats_header(stats->fd, &stats->header); + stats->desc =3D read_stats_descriptors(stats->fd, &stats->header); } =20 - size_desc =3D get_stats_descriptor_size(&vm->stats_header); + size_desc =3D get_stats_descriptor_size(&stats->header); =20 - for (i =3D 0; i < vm->stats_header.num_desc; ++i) { - desc =3D (void *)vm->stats_desc + (i * size_desc); + for (i =3D 0; i < stats->header.num_desc; ++i) { + desc =3D (void *)stats->desc + (i * size_desc); =20 - if (strcmp(desc->name, stat_name)) + if (strcmp(desc->name, name)) continue; =20 - read_stat_data(vm->stats_fd, &vm->stats_header, desc, - data, max_elements); + read_stat_data(stats->fd, &stats->header, desc, data, max_elements); return; } =20 - TEST_FAIL("Unabled to find stat '%s'", stat_name); + TEST_FAIL("Unabled to find stat '%s'", name); } =20 __weak void kvm_arch_vm_post_create(struct kvm_vm *vm) --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sun Feb 8 09:12:55 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 AF6D315FA7B for ; Fri, 20 Dec 2024 01:39:19 +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=1734658761; cv=none; b=kzrqtXirkIxwqI97RBEfMvIEJvO0FJWAGMBKei5+u8B4EnHaI50YMy3lauophhpXjJ60JfuHEN5I9rOdpIgNwt2PDBDSGjNrSIP0sTWRAGYzzk6nzI/xlTgJbDCoH8mwLieKIekQdGw9GHgQgi/VDFqKecjq7dTOsS1Quxvh1Tw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658761; c=relaxed/simple; bh=9wCSd3rSLA4oI57Um3yrK2ezfr59o98xEdgio1tOA1k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=kByipB3s6pY36MvbRUY0TqXR88bx0PfiHRA3t7fxlqlIAJ74PKv7uhEPijSjfdgMQeOrGz62tDdYdI+lRr6WhXHG4JJV4/TUkNQpAAZtaLaXiO7yI38ziylW7wqNjKkvNHuvdVgSNLvLNN7aN4XFkIEug1EXgCw+W/BZ5CRNKvA= 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=erNjRo9o; 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--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="erNjRo9o" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-72739b83336so2029159b3a.1 for ; Thu, 19 Dec 2024 17:39:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658759; x=1735263559; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=9d0sb2aXj7DAHSi3NyOXr17347erebt+0rHoY2hViJM=; b=erNjRo9o5pMkDoGgzTfCqC3ihalDYxXLpQQu7fK50HkzRzUy6HV8VejFh8pZD+R/o3 O+LZQa5rHCxMQkwIJolmjFqyBusck02/RccF329IvONeNV2/FIxjMe+M5F+Hv2z9kIgz Ejh31getAyQ7CFIF80pkcWhxpa7xidrAMOqsH9l4muf3dwtQZGq0FxT0klsodL8JV3Oc +FNd8VhqZiDLoovRMsDN1WtwyXlQXLd3LOVQ2okjE4d87Z8wCJrO7NIZPMmiEvtBfSmi O3pxfJ0RYt2miyMNbAOgvP1ZTeq07MvnX6Xu361af83an/prpLCSIF3Q+1jRj029nkKi YlZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658759; x=1735263559; h=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; bh=9d0sb2aXj7DAHSi3NyOXr17347erebt+0rHoY2hViJM=; b=UT6S1hYVjQPh2QhvRGkwVfr0km05kTQFYz39PejHx4n7j/tQzR4F8VxHPkEqbCfycS P7L3EUxUZZwpX3orr5QBRqs4ryjCEKuw8nHX5xL8uSRJtx/ZjpmE+JCv+L8LLyKeCajZ Dl20IjPatHGXm3Gr/vYsj0sZsnyohtIGkYLVlQtYtD+93XihlPZIyLLuLX6KZf/MdmGF AkOM+BFneXyL12kDNuThTpb6+yrSB/He+xIb01Y65OQ6fmhWD09YvZu1H+L4wv1KgLwV ZE0lDK6HA9d9lGrYU3rZRlj5Yqm1+33gwEJabyskrrwJp9kXUF0nb96lqBhfLYlKkvic TMtQ== X-Forwarded-Encrypted: i=1; AJvYcCWeds3JMN2ohlh/3dCV+I0Ihbh9qOBPT3WQn7QYlFdfJYf4I/+DVwrU3ehXusM2xXv6BSFBpKhJ+P/geh4=@vger.kernel.org X-Gm-Message-State: AOJu0YzFpTWU1QURRlevOvGevfgg1quE0hTeSdoZEyU1r6ixSigosaBj 7bMrDBkCSec71CXUx6QxRcHNzjDD/MLtUGteJTsYDcSDtbLAKQSk9M+uskAsr5cWvKEQcX1Q1oy AMw== X-Google-Smtp-Source: AGHT+IFCVSOEBNw3Lv/7iuAoV97N3pDi0VWzw4l+AQLpoLja8FzKhTyc8mSa5fPmEkzN6L6pcIM/EKjTQ3o= X-Received: from pfbby5.prod.google.com ([2002:a05:6a00:4005:b0:725:e39e:1055]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3cc2:b0:71e:4cff:2654 with SMTP id d2e1a72fcca58-72abdd6eb8cmr1219933b3a.6.1734658759224; Thu, 19 Dec 2024 17:39:19 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:39:04 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-7-seanjc@google.com> Subject: [PATCH 6/8] KVM: selftests: Get VM's binary stats FD when opening VM From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Get and cache a VM's binary stats FD when the VM is opened, as opposed to waiting until the stats are first used. Opening the stats FD outside of __vm_get_stat() will allow converting it to a scope-agnostic helper. Note, this doesn't interfere with kvm_binary_stats_test's testcase that verifies a stats FD can be used after its own VM's FD is closed, as the cached FD is also closed during kvm_vm_free(). Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/lib/kvm_util.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index c88f5e7871f7..16ee03e76d66 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -196,6 +196,11 @@ static void vm_open(struct kvm_vm *vm) =20 vm->fd =3D __kvm_ioctl(vm->kvm_fd, KVM_CREATE_VM, (void *)vm->type); TEST_ASSERT(vm->fd >=3D 0, KVM_IOCTL_ERROR(KVM_CREATE_VM, vm->fd)); + + if (kvm_has_cap(KVM_CAP_BINARY_STATS_FD)) + vm->stats.fd =3D vm_get_stats_fd(vm); + else + vm->stats.fd =3D -1; } =20 const char *vm_guest_mode_string(uint32_t i) @@ -661,14 +666,17 @@ static void kvm_stats_release(struct kvm_binary_stats= *stats) { int ret; =20 - if (!stats->desc) + if (stats->fd < 0) return; =20 - free(stats->desc); - stats->desc =3D NULL; + if (stats->desc) { + free(stats->desc); + stats->desc =3D NULL; + } =20 ret =3D close(stats->fd); TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); + stats->fd =3D -1; } =20 __weak void vcpu_arch_free(struct kvm_vcpu *vcpu) @@ -2231,7 +2239,6 @@ void __vm_get_stat(struct kvm_vm *vm, const char *nam= e, uint64_t *data, int i; =20 if (!stats->desc) { - stats->fd =3D vm_get_stats_fd(vm); read_stats_header(stats->fd, &stats->header); stats->desc =3D read_stats_descriptors(stats->fd, &stats->header); } --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sun Feb 8 09:12:55 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A0D79189BB3 for ; Fri, 20 Dec 2024 01:39:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658763; cv=none; b=CrHSjrLwmD8HGoDyrcdb28kKo4oPlAocIJL9VIS1Hcfa1LoDwMNZU9yqneaLQU/68R5XXS+HWx6TLSyWeWjvi8ylmcXmwbc8yWMmi6INlULuORqPJU0HAHKE83SOXFwa6FiLla0ZxZbTyolSVrXpnQoN9mC0TLY1vcdjI+fkZMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658763; c=relaxed/simple; bh=B+RJp0TYVNSYdkENveDWwDdnsH059YtVcZm9zws4alI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=KFllteyVk8tqZpOYPsuFTNaZ1SHx3KCHTE1q0AzdHEZFpQhywDCuokN+t7kyOmWoKRJZuEEd46XmxNRePAC5xuIuLHp/t+RAd+7zcWQI35Hegi5d+ugLOA8vtzIWbg5vOMtuUS3xk7DM/gBDYGrBf1mcmfVM6dyacqLp7/dpBuo= 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=Al7Oj66y; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="Al7Oj66y" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ef9da03117so1749214a91.1 for ; Thu, 19 Dec 2024 17:39:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658761; x=1735263561; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=dH5y8/UE39Fu2msLM/JJYa9i5LZG9N1ZOJAUvzMfFnk=; b=Al7Oj66ydz8dPcNCKh4q0gXlV+MOOD7aAQQss8of06t7hMxi8z628f6gqgD31Gt4e3 xFGXY1rp5/2MnBm+nuwk2tU+sP6i9nFCt1dOV1CfDpy20vbNF6//WJIoCiYmNjHgy5lG 4m1hr2EgYoec88H0VzD5XRBtf400nA7y9esYkYd/WnJic/x1UUD5enbSaSxknGgBF/8x 143vgHGBG7Ylv4jDXWJbVYq+JHXTcPvbNdG8Ezk6JOQWy6pqPUfLAjkp4U5ORG5cyPtl HhkI0P/zruV+JrU//Cg18PW9Zn7V9gYubXSdcHWf6RJyo+jRu/RxiQIMcaOBrOc2D7TX ThxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658761; x=1735263561; h=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; bh=dH5y8/UE39Fu2msLM/JJYa9i5LZG9N1ZOJAUvzMfFnk=; b=soZzTFTtgTHTCv9Hy/3j/wE0GutAcOeuPaGTEs/BPzTrVoltKOuzEl9bojrDcKxESg R6OWUSFcs0IDLDw+3lrtHK53zRVfxRf2KVoCMoMtJy0a18PgmkitvX9fTn8K+NO9YIey Wna1fE2xB/QbWi7sr/DSs6+EONYHb2nB1/ZANTwHNhLCnL+boDyi7g/n5u+qvoFZ8t22 w1gUrdafOZQXTlL8Gvbqzv+85VwEWV39uVc/EeSnKjPLXEjwOwDlxTaw2KJznZFMX2Ku W103WT58+NfHwuiqwg+jaOK/3AD2RaMQL/JDAw6TlOpx3kTjwMRO2cp+34HmnsHKBexQ 27UA== X-Forwarded-Encrypted: i=1; AJvYcCUhmak7vVl6nTtu67aDxqdw9E2I+pcNvdd8rkY64dliQh2muNU9kUpeRmI8aRI5KHjOE07SRpmDZzXRWR8=@vger.kernel.org X-Gm-Message-State: AOJu0YzJ+O++4Img7jU0Ab0QIOly4z3meN/BcwCGGcF4aSmT1VhLasib 0FqvoCFcwHwMJ7qsj/ZOPQtq91S5XboYvLaQsVZEJgpNnXIZ1iRxabeIFMSfK3wwzfwlRVP7TfQ XBQ== X-Google-Smtp-Source: AGHT+IEWDX/fMBQN37LNDm8pwZAbb4nPz2A12lsLKXmgW0NfsvdhBH23GcxtGNe29UPGQ7kGMBybcOA6PXg= X-Received: from pjbqn15.prod.google.com ([2002:a17:90b:3d4f:b0:2ef:8612:dd6b]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:e18b:b0:2ee:9902:18b4 with SMTP id 98e67ed59e1d1-2f452ee838bmr1687135a91.27.1734658760980; Thu, 19 Dec 2024 17:39:20 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:39:05 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-8-seanjc@google.com> Subject: [PATCH 7/8] KVM: selftests: Add infrastructure for getting vCPU binary stats From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that the binary stats cache infrastructure is largely scope agnostic, add support for vCPU-scoped stats. Like VM stats, open and cache the stats FD when the vCPU is created so that it's guaranteed to be valid when vcpu_get_stats() is invoked. To sanity check that the infrastructure actually works, and to get a bit of bonus coverage, add an assert in x86's xapic_ipi_test to verify that the number of HLTs executed by the test matches the number of HLT exits observed by KVM. Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/include/kvm_util.h | 20 +++++++++------ tools/testing/selftests/kvm/lib/kvm_util.c | 25 +++++++------------ .../selftests/kvm/x86/xapic_ipi_test.c | 2 ++ 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 9a64bab42f89..e0d23873158e 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -61,6 +61,7 @@ struct kvm_vcpu { #ifdef __x86_64__ struct kvm_cpuid2 *cpuid; #endif + struct kvm_binary_stats stats; struct kvm_dirty_gfn *dirty_gfns; uint32_t fetch_index; uint32_t dirty_gfns_count; @@ -534,17 +535,20 @@ void read_stat_data(int stats_fd, struct kvm_stats_he= ader *header, struct kvm_stats_desc *desc, uint64_t *data, size_t max_elements); =20 -void __vm_get_stat(struct kvm_vm *vm, const char *stat_name, uint64_t *dat= a, - size_t max_elements); +void kvm_get_stat(struct kvm_binary_stats *stats, const char *name, + uint64_t *data, size_t max_elements); =20 -#define vm_get_stat(vm, stat) \ -({ \ - uint64_t data; \ - \ - __vm_get_stat(vm, #stat, &data, 1); \ - data; \ +#define __get_stat(stats, stat) \ +({ \ + uint64_t data; \ + \ + kvm_get_stat(stats, #stat, &data, 1); \ + data; \ }) =20 +#define vm_get_stat(vm, stat) __get_stat(&(vm)->stats, stat) +#define vcpu_get_stat(vcpu, stat) __get_stat(&(vcpu)->stats, stat) + void vm_create_irqchip(struct kvm_vm *vm); =20 static inline int __vm_create_guest_memfd(struct kvm_vm *vm, uint64_t size, diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 16ee03e76d66..99fe8bcd2346 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -712,6 +712,8 @@ static void vm_vcpu_rm(struct kvm_vm *vm, struct kvm_vc= pu *vcpu) ret =3D close(vcpu->fd); TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret)); =20 + kvm_stats_release(&vcpu->stats); + list_del(&vcpu->list); =20 vcpu_arch_free(vcpu); @@ -1305,6 +1307,11 @@ struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, ui= nt32_t vcpu_id) TEST_ASSERT(vcpu->run !=3D MAP_FAILED, __KVM_SYSCALL_ERROR("mmap()", (int)(unsigned long)MAP_FAILED)); =20 + if (kvm_has_cap(KVM_CAP_BINARY_STATS_FD)) + vcpu->stats.fd =3D vcpu_get_stats_fd(vcpu); + else + vcpu->stats.fd =3D -1; + /* Add to linked-list of VCPUs. */ list_add(&vcpu->list, &vm->vcpus); =20 @@ -2217,23 +2224,9 @@ void read_stat_data(int stats_fd, struct kvm_stats_h= eader *header, desc->name, size, ret); } =20 -/* - * Read the data of the named stat - * - * Input Args: - * vm - the VM for which the stat should be read - * stat_name - the name of the stat to read - * max_elements - the maximum number of 8-byte values to read into data - * - * Output Args: - * data - the buffer into which stat data should be read - * - * Read the data values of a specified stat from the binary stats interfac= e. - */ -void __vm_get_stat(struct kvm_vm *vm, const char *name, uint64_t *data, - size_t max_elements) +void kvm_get_stat(struct kvm_binary_stats *stats, const char *name, + uint64_t *data, size_t max_elements) { - struct kvm_binary_stats *stats =3D &vm->stats; struct kvm_stats_desc *desc; size_t size_desc; int i; diff --git a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c b/tools/testi= ng/selftests/kvm/x86/xapic_ipi_test.c index a76078a08ff8..574a944763b7 100644 --- a/tools/testing/selftests/kvm/x86/xapic_ipi_test.c +++ b/tools/testing/selftests/kvm/x86/xapic_ipi_test.c @@ -465,6 +465,8 @@ int main(int argc, char *argv[]) cancel_join_vcpu_thread(threads[0], params[0].vcpu); cancel_join_vcpu_thread(threads[1], params[1].vcpu); =20 + TEST_ASSERT_EQ(data->hlt_count, vcpu_get_stat(params[0].vcpu, halt_exits)= ); + fprintf(stderr, "Test successful after running for %d seconds.\n" "Sending vCPU sent %lu IPIs to halting vCPU\n" --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sun Feb 8 09:12:55 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 51C7C19D88B for ; Fri, 20 Dec 2024 01:39:23 +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=1734658765; cv=none; b=Kpcm5h7AKA9NVMdNM7xmcVtiK8FCgAR1xTErwiIrh/L+nXkKtpP77zF8cW1MIr7zMmMk9CRbFtl4pAm13vpkXFvAmahSFkxsgVH7BYhxQPdzaHV//HrSEYDiX4ADd5nHq/FlIgRJAxBvRGe4g4js6iPs+aDcH4a0oNW18X90irw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734658765; c=relaxed/simple; bh=nqQDxG063aqcSsWGMdpx+mWnh2VxAOb7f/HB5PC3v8Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ohMZ985iVjscAXWYf401rrYmwphJSFx7EwTVKIhqZ7lrJ4X7uyCxJAr8t/vbe+lT1jEj4iosNeiDlI6GvvWr7dYwn3W5GG+M5SNVzJCHLY8znK8ftfkn+PmFNnbqSijDi4L64Fn4UtEPoD4F6tlRCjOwC9Ua1v6oOhKKvCaBzrU= 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=bjZ/xlqw; 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--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="bjZ/xlqw" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-725cf06e7bcso1186750b3a.3 for ; Thu, 19 Dec 2024 17:39:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1734658763; x=1735263563; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:reply-to:from:to:cc:subject:date :message-id:reply-to; bh=Dg8fmjMM2o4ZdUzcCM3IsD7JuuynFC9AcsVyNRsKeBU=; b=bjZ/xlqwRmoxBE/vxJFgUGhcEVlDo+va4m2bMBPe7GlHf08EYB8FSiICdAVe2VKHXT 9LLBYmwdDoJoOe2rPHXHDzkowrhk58oTjJYlPZqV+DqHxPjREXa7pLmG/9OtA9IxOHRQ WtTr0BcBOx+y6jNDjSoLfhE23nPbLMMT52FB7E4Ng6xwqDVrvVGNn2WytV5jOlR7Lv8v bXrDEOpl7TL6plsRh7q2ullbM7XOinXycZNTM44pGhuxC7ovNW5wLeYka6i2kYlG/ti0 IXbCO49QIZGS5cucbUAknPk3Aire8+Qg1knqUXuQKn2iHsVkLfMjftuTh3IsPIVKf0IB 1+Ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734658763; x=1735263563; h=content-transfer-encoding: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; bh=Dg8fmjMM2o4ZdUzcCM3IsD7JuuynFC9AcsVyNRsKeBU=; b=mgCP4GIxepdIz9qeO2i+bpqZYQTq7LiCbSZAJ4wLfVauSBwwQtnLBny+2Jv+9VigEk ZDFVYEl48nJAzILoHNk0X6fpoARNjZtluXhIdWArhMBo4OJju1ipIT5WJHK6ATHsqYPr w/SOS6IRwmSk0ZXoOmhU/SqimTyfwV/vw9KlGSF94XtsKwqHuQEfvDFZjPbViFzXuXyy aqmSqejdOSboksmi7wfCZcQLcYu7fVBmv0Dg0UqntgCbf0ENQHQgiRd8a0pgiYN8aBsy CRwSWhvLm2Hzq2l2rffpvmY8/qP6QnB/vMgaFUSRTVg2osjVaCzNGQB3MKbV47az+Uyn exDw== X-Forwarded-Encrypted: i=1; AJvYcCWjlID0kgJSbFe/SpxvYRIbOP8XaC7w1IBrkKIid7ikjEaWaHoCgv082dPAaAtmuPHI3q0XUcefTfp4r88=@vger.kernel.org X-Gm-Message-State: AOJu0YzDeURtzpzy7Onjl9YhYDJBsm6dx9EFxr+Loj4bPiyi6bb27+mN Ff8beyKLig47Tg+5MYiqaOdjpu6AzwXL2rGIfC6JuN/MAJ34F6TCARnkMMRTw2t8bWxr8BIDGhJ vdA== X-Google-Smtp-Source: AGHT+IE6EA1Soh2HbsBhs8mA4Cxp5/kcHpg0QYYkszskXT1G6lUfvmxNE+q8q9njljny5qS/JMm3vKiIjQ4= X-Received: from pgbbw29.prod.google.com ([2002:a05:6a02:49d:b0:801:d768:c174]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:6681:b0:1e0:c6c0:1e1f with SMTP id adf61e73a8af0-1e5e07f8a98mr2122068637.36.1734658762701; Thu, 19 Dec 2024 17:39:22 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 19 Dec 2024 17:39:06 -0800 In-Reply-To: <20241220013906.3518334-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: <20241220013906.3518334-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20241220013906.3518334-9-seanjc@google.com> Subject: [PATCH 8/8] KVM: selftests: Add compile-time assertions to guard against stats typos From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson , Paolo Bonzini Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add compile-time assertions to the main binary stats accessor to verify the stat is a known KVM stat of the appropriate scope, and "add" all known stats for all architectures. To build the set of known stats, define enums for each stat, with a completely arbitrary magic value to specify the scope of the stat. With the assert in place, misuse of stat (or usage of a new stat) generates error like so: In file included from include/x86/kvm_util_arch.h:8, from include/kvm_util.h:23, from x86/dirty_log_page_splitting_test.c:16: x86/dirty_log_page_splitting_test.c: In function =E2=80=98get_page_stats= =E2=80=99: include/kvm_util.h:563:42: error: =E2=80=98VM_STAT_pages_4m=E2=80=99 unde= clared (first use in this function); did you mean =E2=80=98VM_STAT_pages_2m=E2= =80=99? 563 | #define vm_get_stat(vm, stat) __get_stat(VM, &(vm)->stats, stat) | ^~ ... x86/dirty_log_page_splitting_test.c:45:27: note: in expansion of macro = =E2=80=98vm_get_stat=E2=80=99 45 | stats->pages_2m =3D vm_get_stat(vm, pages_4m); | ^~~~~~~~~~~ Using pre-defined lists of stats doesn't completely eliminate human error, e.g. it's obviously possible to make a typo when adding a state. And while there is also a non-zero cost to maintaining the set of stats, adding stats in KVM is relatively uncommon, and removing stats is extremely rare. On the flip side, providing a list of known stats should make it easier to use stats in test, at which point detecting goofs at compile-time will also be more valuable. Signed-off-by: Sean Christopherson --- .../kvm/include/arm64/kvm_util_arch.h | 12 ++ .../testing/selftests/kvm/include/kvm_util.h | 24 +++- .../selftests/kvm/include/kvm_util_types.h | 6 + .../kvm/include/riscv/kvm_util_arch.h | 14 +++ .../kvm/include/s390/kvm_util_arch.h | 113 ++++++++++++++++++ .../selftests/kvm/include/x86/kvm_util_arch.h | 52 ++++++++ 6 files changed, 218 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/include/arm64/kvm_util_arch.h b/to= ols/testing/selftests/kvm/include/arm64/kvm_util_arch.h index e43a57d99b56..12097262f585 100644 --- a/tools/testing/selftests/kvm/include/arm64/kvm_util_arch.h +++ b/tools/testing/selftests/kvm/include/arm64/kvm_util_arch.h @@ -2,6 +2,18 @@ #ifndef SELFTEST_KVM_UTIL_ARCH_H #define SELFTEST_KVM_UTIL_ARCH_H =20 +#include "kvm_util_types.h" + struct kvm_vm_arch {}; =20 +enum kvm_arm64_stats { + VCPU_STAT(hvc_exit_stat), + VCPU_STAT(wfe_exit_stat), + VCPU_STAT(wfi_exit_stat), + VCPU_STAT(mmio_exit_user), + VCPU_STAT(mmio_exit_kernel), + VCPU_STAT(signal_exits), + VCPU_STAT(exits), +}; + #endif // SELFTEST_KVM_UTIL_ARCH_H diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index e0d23873158e..f4f0e27cea27 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -535,19 +535,37 @@ void read_stat_data(int stats_fd, struct kvm_stats_he= ader *header, struct kvm_stats_desc *desc, uint64_t *data, size_t max_elements); =20 +enum kvm_common_stats { + VM_STAT(remote_tlb_flush), + VM_STAT(remote_tlb_flush_requests), + + VCPU_STAT(halt_successfull_poll), + VCPU_STAT(halt_attempted_poll), + VCPU_STAT(halt_poll_invalid), + VCPU_STAT(halt_wakeup), + VCPU_STAT(halt_poll_success_ns), + VCPU_STAT(halt_poll_fail_ns), + VCPU_STAT(halt_wait_ns), + VCPU_STAT(halt_poll_success_hist), + VCPU_STAT(halt_poll_fail_hist), + VCPU_STAT(halt_wait_hist), + VCPU_STAT(blocking), +}; + void kvm_get_stat(struct kvm_binary_stats *stats, const char *name, uint64_t *data, size_t max_elements); =20 -#define __get_stat(stats, stat) \ +#define __get_stat(type, stats, stat) \ ({ \ uint64_t data; \ \ + kvm_static_assert(type##_STAT_##stat =3D=3D type##_STAT_MAGIC_NUMBER); \ kvm_get_stat(stats, #stat, &data, 1); \ data; \ }) =20 -#define vm_get_stat(vm, stat) __get_stat(&(vm)->stats, stat) -#define vcpu_get_stat(vcpu, stat) __get_stat(&(vcpu)->stats, stat) +#define vm_get_stat(vm, stat) __get_stat(VM, &(vm)->stats, stat) +#define vcpu_get_stat(vcpu, stat) __get_stat(VCPU, &(vcpu)->stats, stat) =20 void vm_create_irqchip(struct kvm_vm *vm); =20 diff --git a/tools/testing/selftests/kvm/include/kvm_util_types.h b/tools/t= esting/selftests/kvm/include/kvm_util_types.h index ec787b97cf18..20e6717a0d24 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_types.h +++ b/tools/testing/selftests/kvm/include/kvm_util_types.h @@ -17,4 +17,10 @@ typedef uint64_t vm_paddr_t; /* Virtual Machine (Guest) physical address */ typedef uint64_t vm_vaddr_t; /* Virtual Machine (Guest) virtual address */ =20 +#define VM_STAT_MAGIC_NUMBER 1 +#define VM_STAT(stat) VM_STAT_##stat =3D VM_STAT_MAGIC_NUMBER + +#define VCPU_STAT_MAGIC_NUMBER 2 +#define VCPU_STAT(stat) VCPU_STAT_##stat =3D VCPU_STAT_MAGIC_NUMBER + #endif /* SELFTEST_KVM_UTIL_TYPES_H */ diff --git a/tools/testing/selftests/kvm/include/riscv/kvm_util_arch.h b/to= ols/testing/selftests/kvm/include/riscv/kvm_util_arch.h index e43a57d99b56..ea53d6aeb693 100644 --- a/tools/testing/selftests/kvm/include/riscv/kvm_util_arch.h +++ b/tools/testing/selftests/kvm/include/riscv/kvm_util_arch.h @@ -2,6 +2,20 @@ #ifndef SELFTEST_KVM_UTIL_ARCH_H #define SELFTEST_KVM_UTIL_ARCH_H =20 +#include "kvm_util_types.h" + struct kvm_vm_arch {}; =20 +enum kvm_riscv_stats { + VCPU_STAT(ecall_exit_stat), + VCPU_STAT(wfi_exit_stat), + VCPU_STAT(wrs_exit_stat), + VCPU_STAT(mmio_exit_user), + VCPU_STAT(mmio_exit_kernel), + VCPU_STAT(csr_exit_user), + VCPU_STAT(csr_exit_kernel), + VCPU_STAT(signal_exits), + VCPU_STAT(exits), +}; + #endif // SELFTEST_KVM_UTIL_ARCH_H diff --git a/tools/testing/selftests/kvm/include/s390/kvm_util_arch.h b/too= ls/testing/selftests/kvm/include/s390/kvm_util_arch.h index e43a57d99b56..64d4de333e09 100644 --- a/tools/testing/selftests/kvm/include/s390/kvm_util_arch.h +++ b/tools/testing/selftests/kvm/include/s390/kvm_util_arch.h @@ -2,6 +2,119 @@ #ifndef SELFTEST_KVM_UTIL_ARCH_H #define SELFTEST_KVM_UTIL_ARCH_H =20 +#include "kvm_util_types.h" + struct kvm_vm_arch {}; =20 +enum kvm_s390_stats { + VM_STAT(inject_io), + VM_STAT(inject_float_mchk), + VM_STAT(inject_pfault_done), + VM_STAT(inject_service_signal), + VM_STAT(inject_virtio), + VM_STAT(aen_forward), + VM_STAT(gmap_shadow_reuse), + VM_STAT(gmap_shadow_create), + VM_STAT(gmap_shadow_r1_entry), + VM_STAT(gmap_shadow_r2_entry), + VM_STAT(gmap_shadow_r3_entry), + VM_STAT(gmap_shadow_sg_entry), + VM_STAT(gmap_shadow_pg_entry), + + VCPU_STAT(exit_userspace), + VCPU_STAT(exit_null), + VCPU_STAT(exit_external_request), + VCPU_STAT(exit_io_request), + VCPU_STAT(exit_external_interrupt), + VCPU_STAT(exit_stop_request), + VCPU_STAT(exit_validity), + VCPU_STAT(exit_instruction), + VCPU_STAT(exit_pei), + VCPU_STAT(halt_no_poll_steal), + VCPU_STAT(instruction_lctl), + VCPU_STAT(instruction_lctlg), + VCPU_STAT(instruction_stctl), + VCPU_STAT(instruction_stctg), + VCPU_STAT(exit_program_interruption), + VCPU_STAT(exit_instr_and_program), + VCPU_STAT(exit_operation_exception), + VCPU_STAT(deliver_ckc), + VCPU_STAT(deliver_cputm), + VCPU_STAT(deliver_external_call), + VCPU_STAT(deliver_emergency_signal), + VCPU_STAT(deliver_service_signal), + VCPU_STAT(deliver_virtio), + VCPU_STAT(deliver_stop_signal), + VCPU_STAT(deliver_prefix_signal), + VCPU_STAT(deliver_restart_signal), + VCPU_STAT(deliver_program), + VCPU_STAT(deliver_io), + VCPU_STAT(deliver_machine_check), + VCPU_STAT(exit_wait_state), + VCPU_STAT(inject_ckc), + VCPU_STAT(inject_cputm), + VCPU_STAT(inject_external_call), + VCPU_STAT(inject_emergency_signal), + VCPU_STAT(inject_mchk), + VCPU_STAT(inject_pfault_init), + VCPU_STAT(inject_program), + VCPU_STAT(inject_restart), + VCPU_STAT(inject_set_prefix), + VCPU_STAT(inject_stop_signal), + VCPU_STAT(instruction_epsw), + VCPU_STAT(instruction_gs), + VCPU_STAT(instruction_io_other), + VCPU_STAT(instruction_lpsw), + VCPU_STAT(instruction_lpswe), + VCPU_STAT(instruction_lpswey), + VCPU_STAT(instruction_pfmf), + VCPU_STAT(instruction_ptff), + VCPU_STAT(instruction_sck), + VCPU_STAT(instruction_sckpf), + VCPU_STAT(instruction_stidp), + VCPU_STAT(instruction_spx), + VCPU_STAT(instruction_stpx), + VCPU_STAT(instruction_stap), + VCPU_STAT(instruction_iske), + VCPU_STAT(instruction_ri), + VCPU_STAT(instruction_rrbe), + VCPU_STAT(instruction_sske), + VCPU_STAT(instruction_ipte_interlock), + VCPU_STAT(instruction_stsi), + VCPU_STAT(instruction_stfl), + VCPU_STAT(instruction_tb), + VCPU_STAT(instruction_tpi), + VCPU_STAT(instruction_tprot), + VCPU_STAT(instruction_tsch), + VCPU_STAT(instruction_sie), + VCPU_STAT(instruction_essa), + VCPU_STAT(instruction_sthyi), + VCPU_STAT(instruction_sigp_sense), + VCPU_STAT(instruction_sigp_sense_running), + VCPU_STAT(instruction_sigp_external_call), + VCPU_STAT(instruction_sigp_emergency), + VCPU_STAT(instruction_sigp_cond_emergency), + VCPU_STAT(instruction_sigp_start), + VCPU_STAT(instruction_sigp_stop), + VCPU_STAT(instruction_sigp_stop_store_status), + VCPU_STAT(instruction_sigp_store_status), + VCPU_STAT(instruction_sigp_store_adtl_status), + VCPU_STAT(instruction_sigp_arch), + VCPU_STAT(instruction_sigp_prefix), + VCPU_STAT(instruction_sigp_restart), + VCPU_STAT(instruction_sigp_init_cpu_reset), + VCPU_STAT(instruction_sigp_cpu_reset), + VCPU_STAT(instruction_sigp_unknown), + VCPU_STAT(instruction_diagnose_10), + VCPU_STAT(instruction_diagnose_44), + VCPU_STAT(instruction_diagnose_9c), + VCPU_STAT(diag_9c_ignored), + VCPU_STAT(diag_9c_forward), + VCPU_STAT(instruction_diagnose_258), + VCPU_STAT(instruction_diagnose_308), + VCPU_STAT(instruction_diagnose_500), + VCPU_STAT(instruction_diagnose_other), + VCPU_STAT(pfault_sync), +}; + #endif // SELFTEST_KVM_UTIL_ARCH_H 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 972bb1c4ab4c..f9c4aedddbd0 100644 --- a/tools/testing/selftests/kvm/include/x86/kvm_util_arch.h +++ b/tools/testing/selftests/kvm/include/x86/kvm_util_arch.h @@ -48,4 +48,56 @@ do { \ } \ } while (0) =20 +enum kvm_x86_stats { + VM_STAT(mmu_shadow_zapped), + VM_STAT(mmu_pte_write), + VM_STAT(mmu_pde_zapped), + VM_STAT(mmu_flooded), + VM_STAT(mmu_recycled), + VM_STAT(mmu_cache_miss), + VM_STAT(mmu_unsync), + VM_STAT(pages_4k), + VM_STAT(pages_2m), + VM_STAT(pages_1g), + VM_STAT(pages), + VM_STAT(nx_lpage_splits), + VM_STAT(max_mmu_page_hash_collisions), + VM_STAT(max_mmu_rmap_size), + + VCPU_STAT(pf_taken), + VCPU_STAT(pf_fixed), + VCPU_STAT(pf_emulate), + VCPU_STAT(pf_spurious), + VCPU_STAT(pf_fast), + VCPU_STAT(pf_mmio_spte_created), + VCPU_STAT(pf_guest), + VCPU_STAT(tlb_flush), + VCPU_STAT(invlpg), + VCPU_STAT(exits), + VCPU_STAT(io_exits), + VCPU_STAT(mmio_exits), + VCPU_STAT(signal_exits), + VCPU_STAT(irq_window_exits), + VCPU_STAT(nmi_window_exits), + VCPU_STAT(l1d_flush), + VCPU_STAT(halt_exits), + VCPU_STAT(request_irq_exits), + VCPU_STAT(irq_exits), + VCPU_STAT(host_state_reload), + VCPU_STAT(fpu_reload), + VCPU_STAT(insn_emulation), + VCPU_STAT(insn_emulation_fail), + VCPU_STAT(hypercalls), + VCPU_STAT(irq_injections), + VCPU_STAT(nmi_injections), + VCPU_STAT(req_event), + VCPU_STAT(nested_run), + VCPU_STAT(directed_yield_attempted), + VCPU_STAT(directed_yield_successful), + VCPU_STAT(preemption_reported), + VCPU_STAT(preemption_other), + VCPU_STAT(guest_mode), + VCPU_STAT(notify_window_exits), +}; + #endif // SELFTEST_KVM_UTIL_ARCH_H --=20 2.47.1.613.gc27f4b7a9f-goog