Skip to content

Commit e65faf7

Browse files
committed
KVM: selftests: Add struct and helpers to wrap binary stats cache
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. Link: https://lore.kernel.org/r/20250111005049.1247555-6-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent b0c3f5d commit e65faf7

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

tools/testing/selftests/kvm/include/kvm_util.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ struct userspace_mem_region {
4646
struct hlist_node slot_node;
4747
};
4848

49+
struct kvm_binary_stats {
50+
int fd;
51+
struct kvm_stats_header header;
52+
struct kvm_stats_desc *desc;
53+
};
54+
4955
struct kvm_vcpu {
5056
struct list_head list;
5157
uint32_t id;
@@ -99,10 +105,7 @@ struct kvm_vm {
99105

100106
struct kvm_vm_arch arch;
101107

102-
/* Cache of information for binary stats interface */
103-
int stats_fd;
104-
struct kvm_stats_header stats_header;
105-
struct kvm_stats_desc *stats_desc;
108+
struct kvm_binary_stats stats;
106109

107110
/*
108111
* KVM region slots. These are the default memslots used by page

tools/testing/selftests/kvm/lib/kvm_util.c

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,20 @@ userspace_mem_region_find(struct kvm_vm *vm, uint64_t start, uint64_t end)
657657
return NULL;
658658
}
659659

660+
static void kvm_stats_release(struct kvm_binary_stats *stats)
661+
{
662+
int ret;
663+
664+
if (!stats->desc)
665+
return;
666+
667+
free(stats->desc);
668+
stats->desc = NULL;
669+
670+
ret = close(stats->fd);
671+
TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret));
672+
}
673+
660674
__weak void vcpu_arch_free(struct kvm_vcpu *vcpu)
661675
{
662676

@@ -711,13 +725,7 @@ void kvm_vm_release(struct kvm_vm *vmp)
711725
TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret));
712726

713727
/* Free cached stats metadata and close FD */
714-
if (vmp->stats_desc) {
715-
free(vmp->stats_desc);
716-
vmp->stats_desc = NULL;
717-
718-
ret = close(vmp->stats_fd);
719-
TEST_ASSERT(!ret, __KVM_SYSCALL_ERROR("close()", ret));
720-
}
728+
kvm_stats_release(&vmp->stats);
721729
}
722730

723731
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,
22142222
*
22152223
* Read the data values of a specified stat from the binary stats interface.
22162224
*/
2217-
void __vm_get_stat(struct kvm_vm *vm, const char *stat_name, uint64_t *data,
2225+
void __vm_get_stat(struct kvm_vm *vm, const char *name, uint64_t *data,
22182226
size_t max_elements)
22192227
{
2228+
struct kvm_binary_stats *stats = &vm->stats;
22202229
struct kvm_stats_desc *desc;
22212230
size_t size_desc;
22222231
int i;
22232232

2224-
if (!vm->stats_desc) {
2225-
vm->stats_fd = vm_get_stats_fd(vm);
2226-
read_stats_header(vm->stats_fd, &vm->stats_header);
2227-
vm->stats_desc = read_stats_descriptors(vm->stats_fd,
2228-
&vm->stats_header);
2233+
if (!stats->desc) {
2234+
stats->fd = vm_get_stats_fd(vm);
2235+
read_stats_header(stats->fd, &stats->header);
2236+
stats->desc = read_stats_descriptors(stats->fd, &stats->header);
22292237
}
22302238

2231-
size_desc = get_stats_descriptor_size(&vm->stats_header);
2239+
size_desc = get_stats_descriptor_size(&stats->header);
22322240

2233-
for (i = 0; i < vm->stats_header.num_desc; ++i) {
2234-
desc = (void *)vm->stats_desc + (i * size_desc);
2241+
for (i = 0; i < stats->header.num_desc; ++i) {
2242+
desc = (void *)stats->desc + (i * size_desc);
22352243

2236-
if (strcmp(desc->name, stat_name))
2244+
if (strcmp(desc->name, name))
22372245
continue;
22382246

2239-
read_stat_data(vm->stats_fd, &vm->stats_header, desc,
2240-
data, max_elements);
2247+
read_stat_data(stats->fd, &stats->header, desc, data, max_elements);
22412248
return;
22422249
}
22432250

2244-
TEST_FAIL("Unable to find stat '%s'", stat_name);
2251+
TEST_FAIL("Unable to find stat '%s'", name);
22452252
}
22462253

22472254
__weak void kvm_arch_vm_post_create(struct kvm_vm *vm)

0 commit comments

Comments
 (0)