From nobody Sat Feb 7 17:49:01 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 314299450 for ; Sat, 11 Jan 2025 00:50:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556655; cv=none; b=Pcaz5LWG5crnRrpNEIrssbxhXmrrPqlD4hvPVeZWGw33bRiul4KtY+0dE0zGOn3pX/qV7yfLLUEAUEDW1f4cfESFDt7LLwKMbXG8ncuESBtzKgsQs/zbdfEZjKT4feY1HclQ5ytYxitBBmHat40NK0aHWZ8hOhe3i+QSrc8bfco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556655; c=relaxed/simple; bh=vUAkr3IX2LE4GH/mlPkbcxzVyqeoUOtvVrlhcSINMSY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WhJkAMTMsgcnpSZ5KZqDOx0UCmLTfhILxU/fyIhq7Vphc3cZ4EIE9lP4Ms+e3fg05+EAgBaYrd+4K2wZ1pVRiOMt9C+pGSx/ZIfXcW/8AOv0dV9BhSl6j7/rD8OamPXR97ii09zgYMmVyrfwaZh9F4YJ3nncizMyP1PvXshmHpo= 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=UIiFzzAn; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="UIiFzzAn" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ee5668e09bso4754424a91.3 for ; Fri, 10 Jan 2025 16:50:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556653; x=1737161453; 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=UIiFzzAnCLF8pwfdsKDOa9+RSh4J7REE14bMqZgBrTey+t8lAiB3w2/nxkSCyuPKkB aGelRZy74X3UyNNcOfYshpOZItYeA3YrG6dGaNzYp74UEhbO6ohR5K97DPnCwyMvHDDB Yhz1rO2/RAMLdPIbRCxWeVQyaQpIYNcqXIw3q/lQRrizTYTcNvk46vooHxVMlI3cOsoV XkeVBxB0PglxuKAu3Jf+bkT6EGX7YtTj6QVN/4C/WKwJkzsN0HD8iyEkac//7R++li+7 q45qU8LvNJRVeIczRfeojYouvaEqRBTDHiWlNK3GaJqAFtjqW+l0CiGgwnPux4E9B0Gc mlnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556653; x=1737161453; 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=oc57yqyWr7VX74NG6bKItUdbwx1gYwGgVpqdkpUiRmYJiaD7GQJ5yZJuS35RByNIC6 NcL4xEwHODoPBZmcgjfcg4tPW0ggP5/o4K4Obyldj7vpYqjVbKwey8eNzKPqgvA6P3f2 ayP7lsiG+nVfyL4NHUwDQgaEfbPg8WEMpYs6xytvacFgjOHb5t2uG2yF+Wp9LMHJAYfr VhINK5vby3DcWktCJ2Kgkrxx8wYiL2o3vUWOSHfDs883ot0SCjQOKy4IU+3EgCbN+mzY RDLvQFToCyUxb0y/b9ozMCD0+3g0vz/QNyB0nr+v3aLNHP60KIUTyj9VX8YnmzYXPKwD 9Mkw== X-Forwarded-Encrypted: i=1; AJvYcCWOwvr5NjMh6BwDJyBJs3XZvZyN+X+wQ0HUrJh2nF4cwZldHFkgZKd0mcxcamGUPW52JLkaIHCXoyHLq5c=@vger.kernel.org X-Gm-Message-State: AOJu0YyGWI8TxyOUrlVJQG5Z2stQ0wzgON7ox9x+rfJPwyANzlyDVHgD HfBdXwDCGxtZOh5sCuPFujkWiRdb2faTzQNlIhttqNGwGhO0p8Eoa+vyQq23zuk+hQkUszvMBfo aew== X-Google-Smtp-Source: AGHT+IHC7L4dio3zRElUKJK6ZXLcnIeUcETaJFiIoDB9K4Jc3JVwsDgdf+5YQVS28IyDhPWQi08akvDOKi0= X-Received: from pjbqi14.prod.google.com ([2002:a17:90b:274e:b0:2ef:d283:5089]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2f0e:b0:2f4:49d8:e718 with SMTP id 98e67ed59e1d1-2f548eac0bfmr19303629a91.9.1736556653508; Fri, 10 Jan 2025 16:50:53 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:41 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-2-seanjc@google.com> Subject: [PATCH v2 1/9] 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 Sat Feb 7 17:49:01 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CADD217BCA for ; Sat, 11 Jan 2025 00:50:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556657; cv=none; b=SLQiPc8bqJQWkxCUhp2naelreNrbvJqq2ZncswCN2nXapDlvnQ+v7wr+Qj6DOGBdToznae4YCWOzX9esNGPE34yinfiP5VaAE6deklgFyzcsNdwZJ5qjC0MVAoE6KUh6Gdk1mRlMkINpHFulMIDnw/Ds8ELJo/m1wY9T3Vsruvo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556657; c=relaxed/simple; bh=x+G/SKe65zYqmcjfUDWiwO99pE05MNdhz6X9PomzPYg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=DtpOpG8JAdAiLnNoDotGeXHzRK6UHtkhDSvKOeefwgMzbgMrzaBmIqL8SFNDkdvP865SJBN14s21WSRzzStfPwjUv6STlnrwXc0a9vVi15l5Lo+Ursla03yhEG7BqN9j7Q5vrSNvGgmxAlvYQe4IPa4T1HWoUroMk79cTiZqKNU= 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=3k1/kE34; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="3k1/kE34" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2eebfd6d065so6693919a91.3 for ; Fri, 10 Jan 2025 16:50:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556655; x=1737161455; 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=3k1/kE34fc+PrW5E4NTe8JafA8gN6Vse0DJzI2TKOsBcrE/9J90BLF2zet+cczTUbJ yVJdGC/sHkjDlx5kOX4VMPgDHTPcoFF8LBjWir6avgwe9Bdy2qWZdkePQ8Tblm6b4Qgq w74ERK+HkrbU8tzjaJgSkY/gBDtD5xdkwM4urfQHUKKYo/QPfnXJJ2jiFyluZhub8ohN 0/by6JyfIktB4s39spATY2bD4d7pgyaahgpNJJ1S1cj6uTDc9tPWJxD1GBu99AJh31UQ 3Jz0XPRCyB6J4HmLijsO69xefnklH9BsijwAGFJq1Ekvuy9SGHIecWR/2HvPotxVt9d4 eO4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556655; x=1737161455; 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=Eu+oX2KovX1xecFmaiHica0u4I2XYUnTczqgQQqBuzrM793r61fQhuHdHLqqnBhRr7 WUASwgCQRkAHHek7tBON7jghOrZikGGdJqu3r9BowAl/G4tTKYZVATnTyWFNzz8oN9a9 no4/C/qjAJam5nIiwz/aawPn6S2gscjWPn/pEkRi1Waq1ZHLOo8dENxwFy5I/ySJpZak FJwt8WvaOHbOdD8X2exo0fviube3D/2JucKbpkdjda+5NRgBmz7Pm0NeQRdEoc3XqgFN VeyuliUJU4raYaAwHjUK5qY15cgQfXI7AiBDcluNRT7ZGsFs2J7nn+8cwxmNoDCiItbJ ydWg== X-Forwarded-Encrypted: i=1; AJvYcCX412oXusXAThPh5rcRwiw41MqhOu8PkrYHY7zpnu8dtMVrs5fx6Fh6mBHYeiar94la+Qj3LjnpIdOsCr0=@vger.kernel.org X-Gm-Message-State: AOJu0Yxs5kJCW4Wl3l1pBTKNrAQsKiAgnYntw+uCK5I+wy30aYJaUxn2 IzLS0bLbDCn8D63PLR6Acq5Yx26ZqYJ/TwpE35zROL9ATUkGWNqx+jUtwN1PhPv+9o0v1zx+0I5 STw== X-Google-Smtp-Source: AGHT+IFaIgnmyMwcv0JpFmACh/zvowyMAMYrlakJCH8pPaULUTBzt/qI/JqGqmGqNNZlkEWD/D5dHaJ9LLc= X-Received: from pjbqd16.prod.google.com ([2002:a17:90b:3cd0:b0:2f4:47fc:7f17]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2c83:b0:2ee:fa0c:cebc with SMTP id 98e67ed59e1d1-2f548ececc3mr18761170a91.20.1736556655284; Fri, 10 Jan 2025 16:50:55 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:42 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-3-seanjc@google.com> Subject: [PATCH v2 2/9] 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 Sat Feb 7 17:49:01 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 760F147A73 for ; Sat, 11 Jan 2025 00:50:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556658; cv=none; b=aGdgc59RKyzh6vf7Qm7jwd66WvUEEgZNGIcVKPCgn5LmnGHcBP95t92792RaoxWpiseeN5druNHFd4efaVYdAr8dykLh2SPuagH7NJAmqiXaGHkgcusLWSFhPRWWPlTtr0jxpkVIcHwXYecdOGRFkT21ebiX1NrU7yRQ6lKhn6Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556658; c=relaxed/simple; bh=nrdiuySPKeqHKMTcasOrezgYsu9kEOPLrcUW0My/0sA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hvssQ8gqVKQVDmVqAB8K8OxV/2z5SBP78+WYvNpivzoqHh9HDihIVnJG0/fTNIqULKq3Lz9ZYI9BxbpyQrZEopNyeSlnV8Vi104JQ1OVDauYtI/tjwhUkkSrjH5hYS0tcH/qGbAJFCk8Ns2JknKGYFSQdFq4LoygaqaMkIjR8AQ= 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=c3vTU0BZ; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="c3vTU0BZ" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ef91d5c863so4756950a91.2 for ; Fri, 10 Jan 2025 16:50:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556657; x=1737161457; 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=fmZxaHK89gYqxCqQ02UIn+br/dW4oBYWdpIBYGTzQvU=; b=c3vTU0BZmiilfNpcDBWixRMyuCSNHR3qGeZoFH82SoCHlrcNA9wck8QcjALikSXMgu L4slKuYpfNrnQV0NUwI2R/fASevloq3Twbg7PTHeTdG2u25gcKOwyQ+ofQdNDdtqd8/h nc217+FmzA3mJc9W5UUMuQGdAkfC210hsliG21eQqggP+4PhEgF5A9rZC1/mQZi5eaES QiifwpNwOdsVkoE3Dhqj10BH9BohWDzKkDihCqQhYne4CQIYoltzXH4sFtk8NOSA3sy/ 8P68hCzKo64A3PF9yV9Lmitom+2N1UYj5f+UhNwDfitmkCiL07Hk4zRaeK/oSmTfTCAr /ClQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556657; x=1737161457; 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=fmZxaHK89gYqxCqQ02UIn+br/dW4oBYWdpIBYGTzQvU=; b=JCGw01z4nM5dWKiL3+ay5FySv3HD23Y5yjxsaei916L4N2W5E0y9lNdxTmVdZpFYjU 3F+z6131f7kFBS+chFyYSgeD+Pf5Yx1EHO61XCuNQCvy+fBRnlDJOjeMeE7xbagKWCWM VDIbQ2fN4wYXtz4/LITHRkA8ZFOqyRVt0DD0kUwFMl+1eVphDgaUxeJDlWy1P3ylzZTy +Hm/B4Ehd9vHhEwFzh4VtdqPJEBWYlz3virNR/iPZOnXfcWDw7wo5/A1YmBxpZ9I5Mve tKbe9DgFNshYGFkbQFl6KECSVWPWwPbBDbmWJgG1inrdM7fGDoqAl0a73AyohriNdU4e ML9Q== X-Forwarded-Encrypted: i=1; AJvYcCXtIQvRWhfzCd1omXzvD1L67Gl21IDB7zbNcru8G9cEA5NvtypkWCvJAoYb5B9MDMjuoZWsp4MNwTPYsJA=@vger.kernel.org X-Gm-Message-State: AOJu0YzWhFpDCjU3kZ+J+L8+ChYzc0s3FTp7WFUnVfaC0dPgHikaLQs7 RpzspkMgc2OqoBAjVk3b6i6GamW3lHKj2d1TOmSjVXYSdSsfQCMLajAt4YUSm52Ezc2q3DWfOil NwA== X-Google-Smtp-Source: AGHT+IEiPYhZFrxECLTpeRyhrniySkHxs86k154WoHT+4SPRvFRx2z0MZkxZdNLfF3LCv7K79vdra9fQLrE= X-Received: from pjz13.prod.google.com ([2002:a17:90b:56cd:b0:2ef:7af4:5e8e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2cc5:b0:2ee:c91a:ad05 with SMTP id 98e67ed59e1d1-2f548e984abmr17519047a91.3.1736556656714; Fri, 10 Jan 2025 16:50:56 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:43 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-4-seanjc@google.com> Subject: [PATCH v2 3/9] 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 (hooray, strings), 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 Sat Feb 7 17:49:01 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 1BED8137C35 for ; Sat, 11 Jan 2025 00:50:58 +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=1736556660; cv=none; b=tZM0yD1ozwoXmOKuw9cHV/A4926/riAk0tFwtGHPAhFAOZ3dAnFJvx21giJBlDqb6CU7CwXCN0VafpAVQbbwrFGBIwakwQ5wJ1giLNATMqvNyYgvtl8D2NWYcAP9JuAAP6Jgi8iDeGz768xr1ygWU9NNhourrt8Ya4wi2v6jgwI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556660; c=relaxed/simple; bh=cdYoQmC1gHgaq22PDsiZGCRoGD7RLzRK9PeAtDWgW1s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YtcnrQMRavAUt6h2X/S6asd8RIcj+4gqjAX7Kv82SSMvQJNg4EmdKPWZptEI2P5mFpnKeQC3hSa3CIlB9DfnQ6JDGENxnkJDrCQjuG/Ksh5b1IKeRg4InXKG6DXMdXMcKLnZbdeglvQGcNxBwes4m6UonrjSFD/qMeEJtjo0ADo= 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=M/2tOqie; 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="M/2tOqie" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2167141e00eso44277235ad.2 for ; Fri, 10 Jan 2025 16:50:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556658; x=1737161458; 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=M/2tOqieyewvDcvF/7h4VIbprC04HVlZpZVS0Y42BX3wB//yocBD1i7/97sKnHrPHb K0mGlsoXLiTRvSo1sxwTvtBI2IA/aNbUkO/uACjnZXaEhqTDKy9hltRE9M3k1Dh14n0+ /6ThSEPYp28+cKFKtV71pm6ZTXRKRRkXDWH0T0LuhoOCrUAmQ4BclU1fT3nmwGUmeqB8 B+EgatRx4mr14R/LETzRfGYfcvtnThGRs+2zaRGYZGecrst3PE8fp59CVqGZnXl/ICj9 SSqY0GOFwZ50SD7chkkLCOoD2XBVB9ZBRGbdNNOPYt+triymYk0gSXfE00FBF8qVxel7 jEnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556658; x=1737161458; 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=aTcoVf+YIr1s6PQB5eS1fUqOsrpKFEFJyXGhE3KLyXygmfMT7pd/mbklhhczTXBFhe I+rmJ5cxzLpBbGHIGdlTXPF+QY4XMVWW64BywE17J0DcdZFujqE4sLxthHNqJjHIHY9u ZBVQxlihOW64lKPQgpgEVjjEQY1MjlEDUP1heeP5mr5J6hMQ/4N89eQYdKD3ovEj2Pvh 1r6CWR8nAkwb0puxguw3Q8oL4tKRyBoqd5YmswbM701ZcT5OmSJVt0+XM4nU1g51paKV R3/5dm4x/WwAdn58S8ji9YYW6tzjKNdbsb/rL1I67ZrZ029PUgTAthLydGKVroRhnzSf RYHw== X-Forwarded-Encrypted: i=1; AJvYcCXk8WKdf8cppT0o59Isarv9zd4noG632XqgwgIiyMKkGaWYXTlOJyEnS9tB9Vas1/QyzYC+TLTMx6oxAVE=@vger.kernel.org X-Gm-Message-State: AOJu0YzAJ9suYQKCuL1juK42o4Nix1OH6EQFw7iuwmXOG9DI5alMfBwZ k50xay4edIASACna1WJTYM2ERGNAiZPv/rHwCi+P1I61PSxm8F8y/5L1PUDKG4U0CXhPhnJuwEy XSg== X-Google-Smtp-Source: AGHT+IHw+facaWQOVSZ1pCK120eQYAoo8aTdmYyBocQEoqyBkRp7UviUm/cm4T86jySXDaDXKVoax9zRB1k= X-Received: from pgqb5.prod.google.com ([2002:a65:41c5:0:b0:9a1:7139:ff84]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:339b:b0:1e0:bf98:42dc with SMTP id adf61e73a8af0-1e88d0bfa04mr21140343637.28.1736556658420; Fri, 10 Jan 2025 16:50:58 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:44 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-5-seanjc@google.com> Subject: [PATCH v2 4/9] 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 Sat Feb 7 17:49:01 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 C4D781487D1 for ; Sat, 11 Jan 2025 00:51:00 +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=1736556662; cv=none; b=PwrfW9y07B17BZhNyoxajALoRbMwWAp4Lcfkt6EFOYA/nY8EwY8p0yz+CY/wCtHbnXvo5LkNCvF3ryW1v8j/kap7XWpQJROz+JBTwmH13O/HzCWcUPxqdT8wrn6xbs9+vohEo9DMqP7gt7adGekRsO3nLUSo6AD+Xt8csSGBP3U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556662; c=relaxed/simple; bh=eeF/zKkticJHl5FU2ydo7jdEXM5cm9h9vTJoDSn8JMo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=AjSSqh+flF67/mlGrS6zY2cN94ekBFN1Setx3/u3aDLmnzF+vqr5Gjv6YLk7D8h+r6XByYIGbqK0ULr3oRlSwGvbc1b5co+wGkUYvdbAbMeUg/IXrmr8x73UFS099U9g97zt/CkEAsliwS3nj3znp4EMjRpqdULbC0gmORFY3M4= 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=DCHytbGt; 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="DCHytbGt" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2efa0eb9dacso4827702a91.1 for ; Fri, 10 Jan 2025 16:51:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556660; x=1737161460; 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=DCHytbGtIm8nYIwCQSd144BIs6PoBRV3V4F2VQnJC+2Sgi44aJsWEZSjitAcAdAQE6 WuT0+RmZDS1ZmtoW4kORn5DPbGA9MCmr8XdrMD9j+IV8mHCS+DHCiWG+88vvYkV0ysEi pozXJ2sR+PSGWDT7VKODnyxois0PQpvjEEe2oHnGFhdxgxx2Cmdwg6dJLZKFDMn2jmE1 8lNrqyBxacq2ezW/hE0C0Rl0lLOuU4DyxLVvDNIb+ihle78ym7vLHXH5AUqmQ5YeyTy7 I/kkqkWS0+E+YHMnbSxAptZNx63ND5FsrvBiDM7376DY6NL0FED95X9tRhauwYKI4hXW x8WA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556660; x=1737161460; 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=TgJSfeszjJpNNFR6ozvwq0VNXgNZIn5EU/i7dNLZMCN90x4VGi2nLbxSBEWCmBNyqr P/4J+4xB81eflftfHNy+BIB7H3vmhE0PUwRfxvFRLY2qqV97fJDOT5QDvWkio6tr2j6g +49+n880tsLV34WRVIwkyydpgXESWB6/h9p52ikzqjf6Myv10M99KmLKkXl/14Kku1w6 WDmWOcwz19+t790itjVmM9ENPsUAMgUtSRxf9BcUgaQaDYQFw0xwupIzrwT9Oqd4V5ut dx870ZFtAHIzRV+H68j2pAHmL9UVpF0yjtjM+fL1AY/Cmvmm/ejgmtpfkK5T6iuYoFIz zPdw== X-Forwarded-Encrypted: i=1; AJvYcCW+wc7VYjyP2BGgpye+zOpxhBzNbGnRCUbqRPcEFLeHSlZ6SzU61wMQ8l55PLoBC8OyQxUs/OPaBsWC9SE=@vger.kernel.org X-Gm-Message-State: AOJu0YzsP6Hxg2dbXSGy4GnX1b5PgfWHAIYbM1ROJz813XdLQt8Iz7xE Jqc+NEoLr5njj2jCBvHJ3c6jixLs6gOmOcQNjqXn9WWePVE18Zj3FtDcjxd1DTw4VoILa5p544d xAw== X-Google-Smtp-Source: AGHT+IFkTOLXQinvGI8s6GviRk7XKu9XJa8etcXjW5yAd+8/VTBQJ+NHE0WBibUOfLnKYqGfPAkdUeiGwEY= X-Received: from pjbqd11.prod.google.com ([2002:a17:90b:3ccb:b0:2e5:8726:a956]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:dfcc:b0:2ee:ad18:b30d with SMTP id 98e67ed59e1d1-2f548e98f31mr17356212a91.6.1736556660239; Fri, 10 Jan 2025 16:51:00 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:45 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-6-seanjc@google.com> Subject: [PATCH v2 5/9] 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 Sat Feb 7 17:49:01 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7CB3915098F for ; Sat, 11 Jan 2025 00:51:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556664; cv=none; b=HKgbmrec+wXnZt5PcDp357tG2iJC1Uug1FzP5AZ5F+vTwEQaz39JO10kSaDLnuJoM3owng3X930SAksA8Oe+TmaTfEapDVQGxxgkZ4/IcdZ/7IHAAVAWT48VE3QkFAb9TqNENAwg2ACTzmk4j7NcBraIZS5R5xlFX3ADb+MtGSM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556664; c=relaxed/simple; bh=9wCSd3rSLA4oI57Um3yrK2ezfr59o98xEdgio1tOA1k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=bTBZV8s/BIl3L3BbGDkSN5bu3yN/252Kw0odBucaZ2gcw5+AbKcopEMJOh7SaXhZPHw2c7Ow1YSziqxXyxRLESxNpgTIL4En9gz8+lQrEYHFQ8Bav4yEYPekGZ5eLhzMTpShnVOoiOXA7qYrZ0GyY/HzVos0PU9u6PujZ3Ib8lw= 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=H8cNZlc6; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="H8cNZlc6" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2f2a9743093so4764418a91.3 for ; Fri, 10 Jan 2025 16:51:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556662; x=1737161462; 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=H8cNZlc6tDTrxCDUjw05dZs8eqIrZRwhHA7BCspiemMfAw56X3j8rskLOJVHIcONCP iKqGyFYQeLBsWDQgIfcc1chpB8rGX3iXOfc0VvFSzCfHQf/Zz2Ow6f0vyTcVPKD4J4ID +QHYR8e1o9K0crzSFF5kZG6X+IcoHOSHNSWM0S7NWDNi6lg7zyBhwMdVKGcLLslMcgsy h5EeTm6tNtyuUHF3oTR7YRC5htZKJjNqydix3bipSTZeDc0ws8olZJM/dw6/WF4BMzHR sIWGw3mH3qANH+bLechbhGpQ05EX453F87iMvvtcMKIxpTzcyUDbIfF6bDgQCfpBl9Cp Mesg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556662; x=1737161462; 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=EnXTZKy8tan1e9Qe/HMgZhin0GV3lERCAXxWpcjY59NUxleVrjCFlbFuIzPlTo8nU7 ChIXYu8zL8EE6gv30Pg9Kz5VsuJzEYk6KddhKaSL7lz4iDivIoulAgt/5KflZR6d5NWE cDZXZLyn+pLqpgp8BACQABxZDzPMgKSP2h2po06dTdZ9fUMZ23WnXqCbIJdxf+6b1yV8 ntXHiGIc0FJ6dl8S00/teKqeRt0ISpkR5sPxsH3rNJi4anqpS+dqMIMS9dnv3Xm7KA5A b/XdSCScMAdS91l38kAQgfxmxmKotDjtHjNbNliH7w88cMofa9uqAgHwyUP4XKTDjyZd vM+g== X-Forwarded-Encrypted: i=1; AJvYcCXGmPO96B/M2DZQfrnRacq8xuRPcIKdlGQkTjzTXbwtwRIIBFpUompac8VNix//r6PU1Cb/IHoUCUUD61Y=@vger.kernel.org X-Gm-Message-State: AOJu0YykVm9bcALgRhPfV30xDnlszAxZFf3ibSgB+EESbNtPn1x9Utgd 7vxUY8eA8bsu55+gn9A84Xb/9DT9j1aJg1B8tIDO6Zt+ewsByMRrw0+0ER5npG33eqfOgqX19US eIQ== X-Google-Smtp-Source: AGHT+IGlLX0aEPqXGbQsPjSqI3Z9q/GgP2EA9enACEq8PUpXduEFLRvRbXw1OHEj1+uEtI1vezl+E8v1zzM= X-Received: from pjbnw2.prod.google.com ([2002:a17:90b:2542:b0:2f4:4222:ebba]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:51c5:b0:2f4:423a:8fb2 with SMTP id 98e67ed59e1d1-2f548eca27emr18806754a91.20.1736556661971; Fri, 10 Jan 2025 16:51:01 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:46 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-7-seanjc@google.com> Subject: [PATCH v2 6/9] 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 Sat Feb 7 17:49:01 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CF4315539D for ; Sat, 11 Jan 2025 00:51:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556665; cv=none; b=ZWDY3O97uTsAdhk6dNgwTTVDYmr84rkDDMJY+koW84NmkULBzGYMb5EZ/l4Lt8YXM1FLdKfVeksegKtlirttNSZWWdcF9cyilgDog6y2MoKvLCAdSZZazlkqRvKLDKYxAkeOhAKsISTNiyHVip+zqdTsYI/3X5cQb/wFcdOHZOE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556665; c=relaxed/simple; bh=P1tpMNzbS5Njgz1DwTNPeyi/z6xYk/XJDEeQ78FSaJY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JBFo6kbPsJZbGl6cZlsji1x/r7quyscaYeEMZLMIlXl8ahFHB+vVwqlB3aHGJE78Q61mFKIFhBfOaS8gvJFCUfLvlZb8uU0Nw/TQTZpX6JsF2vdH/FyScyAvgFJtk3Eyv6g7eKJAS3JXtUrG1/TYOEavNxh0mQFJJbASpfJIhVQ= 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=B8H4vmx5; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="B8H4vmx5" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ee86953aeaso4615110a91.2 for ; Fri, 10 Jan 2025 16:51:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556663; x=1737161463; 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=wbJUIEbFpcT4LmqIjAYiV2s86GObQLOrAwx+1Pf2g7A=; b=B8H4vmx5U5R2RNRHEr+LTZQ00c6LwpNWanyQ11c3mRiFGK7Nx4S0FnbWAdMVq/g1I6 QtFiaCkKbWcfpOZeNBb+qVMp2yDZTQQu/oUq3AD2Jvj7Wz/9buxOYgybffw30aNGWf0f EBzcZY7u8oAyASjsypleFdL11d+JKr75RdkagQeYxIoeNDmqLYRmZ7VSMoP8Zo+8IjLB z9PI66uCznYT4ffv8tde5hbk6HFCHEQY2l8muJd6C2dHzjYEEf6Q0SInMBb4hZdm58uL 6Gsb4Y5Vbyd6sXIOqGF90uKfHaqtD0XHLjy4OoVJ+YiWM6yG3H06RvhFfIzay0rxulHM CYpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556663; x=1737161463; 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=wbJUIEbFpcT4LmqIjAYiV2s86GObQLOrAwx+1Pf2g7A=; b=BVqoonwhSMiaxFlCwUVUzrFdTuJZI/Bwoc8ShGGmQz4j1OEM9wpnDk+0L4UeeERsx4 0FS7OnkqDkl8uRivPZbGaPBmAxO+Y4czT5l8m956ECjG2nkopZ5qXGQhsIfViUfW/GE1 a3tMUJwiBiz/vVDPd2U4HAbuMYOWdICjD1WAj0Xbr2K62C9cKufO4nfT16lhjCLpUjF8 x3wFEMpQ3JD+5wByN2V5c4y0jmH/485ap8TMc1Fc8g2UdRKfHAdTBaX4qw1G61CRS9k7 Gbeo11tpSsacl34zgkKHanylG16Q1DHiTSk4SCoY6Z42soEKwBnZStIk9T6EhF4JpW9S P6hg== X-Forwarded-Encrypted: i=1; AJvYcCWJ5IrOgXr/xpEHBkviEBmJQ9/wi/MqC2zqB1KHXy0jeEm1Y20U5JJhN2UTk57Wj7J1M/j2EFkK5HNzxpg=@vger.kernel.org X-Gm-Message-State: AOJu0Yww/SOTuychiUmxp/tRc5+vxVPjNcjHEcs/BbdKMEXNVpffkdbj GdwdeTCH4M781vNafG+Pa9hSSmddcf1EdGOI0K+f+N1wOHbmh5aVU21iinQ3OZeD1GNhgOUlkN+ 92A== X-Google-Smtp-Source: AGHT+IGH6342S92kOvdYD94+ymoteQzN/cfHIZ0hJZS0WFG0jyjicN3k4eAbOT3Lbu+t8kUVV+/QXmvVvSI= X-Received: from pjboi12.prod.google.com ([2002:a17:90b:3a0c:b0:2eb:12c1:bf8f]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:270c:b0:2ee:6e22:bfd0 with SMTP id 98e67ed59e1d1-2f548ee48demr16948021a91.21.1736556663692; Fri, 10 Jan 2025 16:51:03 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:47 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-8-seanjc@google.com> Subject: [PATCH v2 7/9] KVM: selftests: Adjust number of files rlimit for all "standard" VMs 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" Move the max vCPUs test's RLIMIT_NOFILE adjustments to common code, and use the new helper to adjust the resource limit for non-barebones VMs by default. x86's recalc_apic_map_test creates 512 vCPUs, and a future change will open the binary stats fd for all vCPUs, which will put the recalc APIC test above some distros' default limit of 1024. Signed-off-by: Sean Christopherson --- .../testing/selftests/kvm/include/kvm_util.h | 2 ++ .../selftests/kvm/kvm_create_max_vcpus.c | 28 +-------------- tools/testing/selftests/kvm/lib/kvm_util.c | 34 +++++++++++++++++++ 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 9a64bab42f89..d4670b5962ab 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -966,6 +966,8 @@ static inline struct kvm_vm *vm_create_shape_with_one_v= cpu(struct vm_shape shape =20 struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm); =20 +void kvm_set_files_rlimit(uint32_t nr_vcpus); + void kvm_pin_this_task_to_pcpu(uint32_t pcpu); void kvm_print_vcpu_pinning_help(void); void kvm_parse_vcpu_pinning(const char *pcpus_string, uint32_t vcpu_to_pcp= u[], diff --git a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c b/tools/tes= ting/selftests/kvm/kvm_create_max_vcpus.c index c78f34699f73..c5310736ed06 100644 --- a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c +++ b/tools/testing/selftests/kvm/kvm_create_max_vcpus.c @@ -10,7 +10,6 @@ #include #include #include -#include =20 #include "test_util.h" =20 @@ -39,36 +38,11 @@ int main(int argc, char *argv[]) { int kvm_max_vcpu_id =3D kvm_check_cap(KVM_CAP_MAX_VCPU_ID); int kvm_max_vcpus =3D kvm_check_cap(KVM_CAP_MAX_VCPUS); - /* - * Number of file descriptors reqired, KVM_CAP_MAX_VCPUS for vCPU fds + - * an arbitrary number for everything else. - */ - int nr_fds_wanted =3D kvm_max_vcpus + 100; - struct rlimit rl; =20 pr_info("KVM_CAP_MAX_VCPU_ID: %d\n", kvm_max_vcpu_id); pr_info("KVM_CAP_MAX_VCPUS: %d\n", kvm_max_vcpus); =20 - /* - * Check that we're allowed to open nr_fds_wanted file descriptors and - * try raising the limits if needed. - */ - TEST_ASSERT(!getrlimit(RLIMIT_NOFILE, &rl), "getrlimit() failed!"); - - if (rl.rlim_cur < nr_fds_wanted) { - rl.rlim_cur =3D nr_fds_wanted; - if (rl.rlim_max < nr_fds_wanted) { - int old_rlim_max =3D rl.rlim_max; - rl.rlim_max =3D nr_fds_wanted; - - int r =3D setrlimit(RLIMIT_NOFILE, &rl); - __TEST_REQUIRE(r >=3D 0, - "RLIMIT_NOFILE hard limit is too low (%d, wanted %d)", - old_rlim_max, nr_fds_wanted); - } else { - TEST_ASSERT(!setrlimit(RLIMIT_NOFILE, &rl), "setrlimit() failed!"); - } - } + kvm_set_files_rlimit(kvm_max_vcpus); =20 /* * Upstream KVM prior to 4.8 does not support KVM_CAP_MAX_VCPU_ID. diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 16ee03e76d66..f49bb504fa72 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -411,6 +412,37 @@ static uint64_t vm_nr_pages_required(enum vm_guest_mod= e mode, return vm_adjust_num_guest_pages(mode, nr_pages); } =20 +void kvm_set_files_rlimit(uint32_t nr_vcpus) +{ + /* + * Number of file descriptors required, nr_vpucs vCPU fds + an arbitrary + * number for everything else. + */ + int nr_fds_wanted =3D nr_vcpus + 100; + struct rlimit rl; + + /* + * Check that we're allowed to open nr_fds_wanted file descriptors and + * try raising the limits if needed. + */ + TEST_ASSERT(!getrlimit(RLIMIT_NOFILE, &rl), "getrlimit() failed!"); + + if (rl.rlim_cur < nr_fds_wanted) { + rl.rlim_cur =3D nr_fds_wanted; + if (rl.rlim_max < nr_fds_wanted) { + int old_rlim_max =3D rl.rlim_max; + + rl.rlim_max =3D nr_fds_wanted; + __TEST_REQUIRE(setrlimit(RLIMIT_NOFILE, &rl) >=3D 0, + "RLIMIT_NOFILE hard limit is too low (%d, wanted %d)", + old_rlim_max, nr_fds_wanted); + } else { + TEST_ASSERT(!setrlimit(RLIMIT_NOFILE, &rl), "setrlimit() failed!"); + } + } + +} + struct kvm_vm *__vm_create(struct vm_shape shape, uint32_t nr_runnable_vcp= us, uint64_t nr_extra_pages) { @@ -420,6 +452,8 @@ struct kvm_vm *__vm_create(struct vm_shape shape, uint3= 2_t nr_runnable_vcpus, struct kvm_vm *vm; int i; =20 + kvm_set_files_rlimit(nr_runnable_vcpus); + pr_debug("%s: mode=3D'%s' type=3D'%d', pages=3D'%ld'\n", __func__, vm_guest_mode_string(shape.mode), shape.type, nr_pages); =20 --=20 2.47.1.613.gc27f4b7a9f-goog From nobody Sat Feb 7 17:49:01 2026 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E599B16D9AA for ; Sat, 11 Jan 2025 00:51:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556667; cv=none; b=sESVMYvFtO2lGcavSr0u6S6gyxRnDQpkiCtdBupOPz74F1Fi2TCmMpF72ousPeoLsZVxLEJD5Iw9NHXOlPGoSHnbz9WDKaShhDOfjY+YsNjMKpfFx+9kE6yHVa+dxg8BkD5h72J4jvdBpMgWFmZ3GH+Yt0S9+xMtrFobrn4nNHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556667; c=relaxed/simple; bh=icJ/SksT713q+MIz2dX20BPrbRU3ISPR44l7a9C713I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GFJY12gznqDPuu/iMLIR8zMsdG7KErmlFpDIga/+00cEN98m8ORwyRb39U+J0IGiNH0JCtahaEfvt/BElKlKWdN954Gx06BcxUXz56hjvbrUK7Vo74eD1QSkN8FD2udf4sAcIvzqItvWxiO6sW0vWgu4/M4mvgu8ht4+pJn/064= 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=CL4GneyD; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--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="CL4GneyD" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ee5616e986so6637173a91.2 for ; Fri, 10 Jan 2025 16:51:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556665; x=1737161465; 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=jTPjKFoWnkMFK18trrM7yX38QagKVQtox0CY8pTl0Bc=; b=CL4GneyDPu/q9YXz07J1h1D92k6IGZXthw/Sf7/4E8Qxv+nnz6O9bMRDDc7aZRHE80 0RlIwURKkQSsjD0eglqZhudloQgJ1fhiIKGeZGyGH6hQaloz354K7FZrhUwyu7FiEzlf uvyv9fRd/2OqSGksNjbxz8mVh7DPa8J6cWJyTDewpQisjVSPVqCEU0gKEJKa2/lf8Yge qihn1T6r5wf28se6882mG1rAr8cW0bdC3GdjFAjel8nGkKYcdcK7RbJoiROrTc7EWtiz omxy1Oo5B28FjJWj/Bp8N6ng1GvRBeAEBVcEQFd1DE4ugMnNIn6NhHBqc367RAIjNVq7 +8CQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556665; x=1737161465; 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=jTPjKFoWnkMFK18trrM7yX38QagKVQtox0CY8pTl0Bc=; b=CTQnSgC1I+5W6JbF+V8rzoAlm2LwlNmciw86pDUOSjhprxEeQOCv0Vsns90XjbqGvC AY7g9HysJUk6x+UXcHgYkJRYfwX60nbFaV/3BbhTFhE04xRdIb+RxSb2/vmlp+qsLZZa PA1IUhGjC0HTM71PTnRgFcRHG2xOzPKpxO7XUuVxaEJzmfWfSxxdddU4YmPTKuN1kj2q AJiy+3IxlSSXW+PBQNYMlV6lkt55294TF/i1lt7MxNN8/lYIDO13kTpzO7sZwUOBWDDr 1ZGMpPs9r9eGh++uBLA/IAnk77XcYKhyqXB4dK6mhGla+Q1XGolw2Kn//FQCJ8SNZfND jCmw== X-Forwarded-Encrypted: i=1; AJvYcCV/w7dDNlDlvmIjnnGjAU1nqejtC/g1qGTVqd5PA/LTA6QqN/xUKvtEERvQv/Ttjq5YHfX39hDUsuZ/ON0=@vger.kernel.org X-Gm-Message-State: AOJu0YwkIo2U9J3qk35D8ITeUrGyAEIaZr1Y87silOkhzVsljQdAQkrK 07rgVJVJkZuNAnNOA0c7UYWyGnjkC9o0qBjDrynQNpk5gLszjmt237v1hKGglZDRknQL4ghIIEA sSA== X-Google-Smtp-Source: AGHT+IFOLE/1SSJYHsGdzvK8LKxhrHPTw3kVbRGTeeJk8BpZZB2Ck9vGEUtjLxLwAqw4e0hK1JN9nSs0EVE= X-Received: from pjbsg5.prod.google.com ([2002:a17:90b:5205:b0:2ee:3cc1:793d]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2c84:b0:2ea:a25d:3baa with SMTP id 98e67ed59e1d1-2f548f17351mr17744741a91.5.1736556665395; Fri, 10 Jan 2025 16:51:05 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:48 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-9-seanjc@google.com> Subject: [PATCH v2 8/9] 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. Account for the extra per-vCPU file descriptor in kvm_set_files_rlimit(), so that tests that create large VMs don't run afoul of resource limits. 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 Tested-by: Manali Shukla --- .../testing/selftests/kvm/include/kvm_util.h | 20 +++++++----- tools/testing/selftests/kvm/lib/kvm_util.c | 32 ++++++++----------- .../selftests/kvm/x86/xapic_ipi_test.c | 2 ++ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index d4670b5962ab..373912464fb4 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 f49bb504fa72..b1c3c7260902 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -415,10 +415,11 @@ static uint64_t vm_nr_pages_required(enum vm_guest_mo= de mode, void kvm_set_files_rlimit(uint32_t nr_vcpus) { /* - * Number of file descriptors required, nr_vpucs vCPU fds + an arbitrary - * number for everything else. + * Each vCPU will open two file descriptors: the vCPU itself and the + * vCPU's binary stats file descriptor. Add an arbitrary amount of + * buffer for all other files a test may open. */ - int nr_fds_wanted =3D nr_vcpus + 100; + int nr_fds_wanted =3D nr_vcpus * 2 + 100; struct rlimit rl; =20 /* @@ -746,6 +747,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); @@ -1339,6 +1342,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 @@ -2251,23 +2259,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 Sat Feb 7 17:49:01 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 A3A3F17CA17 for ; Sat, 11 Jan 2025 00:51:07 +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=1736556669; cv=none; b=Mk9/2REzsS2HqClfyBpHOiVZYu+wDWRv+ZmzXN4xGiMqgEtbXw4aBS1IGbddClXzi/phC8aaBaPsz8UISX3ha3rMheJ8rSbkGFtbcQ+Y7YG31d5x2DTJFghQ6PlYQJahMOHVOQLUbwXlJ/Ei/sFRO/+Ak+YlxO0JeVxIvAwMAB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736556669; c=relaxed/simple; bh=WTSPSxJ9acPV9cYjYBvN8akkgrsAOJkvqpDny9WUy0U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rwdJ4vjggR4GyHOeicSA3aCszqifo3ufcnMvhFoO61RJZa2CdO5Xu5yORdUH0AE5Jz7iHmJuBY42BxMmhhqZFuOcmpdZFNsdC7saD0DA4PgJzat3ZdfsYc6DsHehQhSjli6DlX01M0j9C+bMX4HDwCnfzJq7+DkOD9UtCuQ1fhs= 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=ST0edF3d; 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="ST0edF3d" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ef909597d9so7404570a91.3 for ; Fri, 10 Jan 2025 16:51:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736556667; x=1737161467; 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=+d9N3KJHkNXRjOZutdW8pQt5lh1Ed4rA4mypMg2qOMY=; b=ST0edF3dlKET614rM6Va4oI3x5dwib5BeSTnRgfmzJ6kvL9GR1tgOm296EWUmlUtI1 DdrtLStFeUs5jaK6hiHc1tOvvIXLLwBHw4QK5ksYN35QQjXjwntnZT1VAr4frbNZo+k2 vWlVSsI2x6Tzawr6cDSTScm7agt6csvf1/3VynHZ5nD575F3m50FYPT3B8JqTy8RmVV7 jsA/uW69x16Ln3zXuwGMH9nXE3M4qITEqACZCxBqJAMesT+p3ypcXn94kePTqVlnT/9k ytIEGphxH7ImdghJT1flacJEJE+ixMJ9aGodMCwa1GM7ywhcqMy+8atDsftAulLUV6N+ tiXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736556667; x=1737161467; 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=+d9N3KJHkNXRjOZutdW8pQt5lh1Ed4rA4mypMg2qOMY=; b=KiCXulxZ8DbtoEimDDSNpjo3sPWNZxab1pJP+Ba2DimZkF6C59nUNxecu/JhWWJ0HQ uSSESYjybP52iDW4IJH3UcVDUbQGmksMSA8mhuZbZhTRoWdDLFwQkge08wNdjzCgad3X /t8PYxMGIdTv3Pzt4GA1hQ9HHxCzqXNkFJxx7kxSrVd7B0szwMN8MyeMKPxfpPLt66sY IJuzHna0rBZBrZeNualSb7u9qx/adZFLr8b4ql85S9lxwxdNFiKNo6Hk5/hKK1wwGJAJ CD9pfW+bKRzvWIfWh2Tgma4zrSWFYX/z0ggrjXa84gnJMS+Cr7d2C6TIYPbqhQ0WmLBG qCqQ== X-Forwarded-Encrypted: i=1; AJvYcCUZ3BDZ+1+6qzUGbUWOQysQSu9kjmJEc7SOcKUwtZkJELfub/ZUneTDto/csRMCHYu3ORKQMYN7/Y60c7k=@vger.kernel.org X-Gm-Message-State: AOJu0YxQbAQd1njyYUS+Zfh9I2lKEBX3c591QytQAH0JDudCv1xSMFIH uKGjh2Z5MHNCvBVRZbCCovKmyGiW1T1vFVfhLffu30vKCqdTRQt8q4JChBd08Rs6Ih1mVcepNiG Uuw== X-Google-Smtp-Source: AGHT+IG4ZDxN55fz763KYhU4ygCt6fNKcRVhx7HviNi6kdOkpJz+b/vIZA/QjwyAghwU09pB3HIzfMoXqiw= X-Received: from pjbee12.prod.google.com ([2002:a17:90a:fc4c:b0:2e5:5ffc:1c36]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2b8f:b0:2ef:2d9f:8e58 with SMTP id 98e67ed59e1d1-2f5490dbe3fmr16185263a91.34.1736556667051; Fri, 10 Jan 2025 16:51:07 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:50:49 -0800 In-Reply-To: <20250111005049.1247555-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: <20250111005049.1247555-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111005049.1247555-10-seanjc@google.com> Subject: [PATCH v2 9/9] 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 373912464fb4..de2dfbb07071 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