From nobody Mon Feb 9 08:28:51 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