Add new stat counters to VSIE shadowing to be able to verify and monitor the functionality. * vsie_shadow_scb shows the number of allocated SIE control block shadows. Should count upwards between 0 and the max number of active CPUs or configured value. * vsie_shadow_sca shows the number of allocated system control area shadows. Should count upwards between 0 and the max number of active CPUs or configured value. * vsie_shadow_scb_reuse shows the number of reused SIE control block shadows. * vsie_shadow_sca_reuse shows the number of reused system control area shadows. Signed-off-by: Christoph Schlameuss --- arch/s390/include/asm/kvm_host_s390.h | 4 ++++ arch/s390/kvm/s390/s390.c | 4 ++++ arch/s390/kvm/s390/vsie.c | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/kvm_host_s390.h index 9768c9dca27c..a19d3a5f550c 100644 --- a/arch/s390/include/asm/kvm_host_s390.h +++ b/arch/s390/include/asm/kvm_host_s390.h @@ -412,6 +412,10 @@ struct kvm_vm_stat { u64 gmap_shadow_r3_entry; u64 gmap_shadow_sg_entry; u64 gmap_shadow_pg_entry; + u64 vsie_shadow_scb; + u64 vsie_shadow_scb_reuse; + u64 vsie_shadow_sca; + u64 vsie_shadow_sca_reuse; }; struct kvm_arch_memory_slot { diff --git a/arch/s390/kvm/s390/s390.c b/arch/s390/kvm/s390/s390.c index ae0177d74b11..a1ce75be3955 100644 --- a/arch/s390/kvm/s390/s390.c +++ b/arch/s390/kvm/s390/s390.c @@ -87,6 +87,10 @@ const struct kvm_stats_desc kvm_vm_stats_desc[] = { STATS_DESC_COUNTER(VM, gmap_shadow_r3_entry), STATS_DESC_COUNTER(VM, gmap_shadow_sg_entry), STATS_DESC_COUNTER(VM, gmap_shadow_pg_entry), + STATS_DESC_COUNTER(VM, vsie_shadow_scb), + STATS_DESC_COUNTER(VM, vsie_shadow_scb_reuse), + STATS_DESC_COUNTER(VM, vsie_shadow_sca), + STATS_DESC_COUNTER(VM, vsie_shadow_sca_reuse), }; const struct kvm_stats_header kvm_vm_stats_header = { diff --git a/arch/s390/kvm/s390/vsie.c b/arch/s390/kvm/s390/vsie.c index fe94587511b0..335ed1a927aa 100644 --- a/arch/s390/kvm/s390/vsie.c +++ b/arch/s390/kvm/s390/vsie.c @@ -1133,6 +1133,7 @@ static struct vsie_sca *get_vsie_sca(struct kvm_vcpu *vcpu, struct kvm_s390_sie_ kvm->arch.vsie.scas[kvm->arch.vsie.sca_count] = vsie_sca; kvm->arch.vsie.sca_count++; atomic_set(&vsie_sca->ref_count, 1); + kvm->stat.vsie_shadow_sca++; } else { /* reuse previously created vsie_sca allocation for different osca */ vsie_sca = get_vsie_sca_unused(kvm); @@ -1154,6 +1155,7 @@ static struct vsie_sca *get_vsie_sca(struct kvm_vcpu *vcpu, struct kvm_s390_sie_ } unpin_sca(kvm, vsie_sca); clear_vsie_sca(vsie_sca); + kvm->stat.vsie_shadow_sca_reuse++; } if (sie_uses_esca(scb_o)) @@ -2006,6 +2008,7 @@ static struct vsie_page *get_vsie_page(struct kvm_vcpu *vcpu, unsigned long addr vsie_page_new = NULL; WRITE_ONCE(kvm->arch.vsie.pages[kvm->arch.vsie.page_count], vsie_page); kvm->arch.vsie.page_count++; + kvm->stat.vsie_shadow_scb++; } else { /* reuse an existing entry that belongs to nobody */ while (true) { @@ -2018,6 +2021,7 @@ static struct vsie_page *get_vsie_page(struct kvm_vcpu *vcpu, unsigned long addr } unpin_scb(kvm, vsie_page); + kvm->stat.vsie_shadow_scb_reuse++; } rc = init_vsie_page(vcpu, vsie_page, addr); @@ -2043,6 +2047,7 @@ static struct vsie_page *get_vsie_page_cpu_nr(struct kvm_vcpu *vcpu, struct vsie gpa_t scb_gpa, u16 cpu_nr) { struct vsie_page *vsie_page, *vsie_page_new = NULL; + bool vsie_page_is_new = true; int rc; vsie_page = vsie_sca->pages[cpu_nr]; @@ -2063,6 +2068,7 @@ static struct vsie_page *get_vsie_page_cpu_nr(struct kvm_vcpu *vcpu, struct vsie } } if (vsie_page != vsie_page_new) { + vsie_page_is_new = false; if (vsie_page_new) free_vsie_page(vsie_page_new); @@ -2076,6 +2082,10 @@ static struct vsie_page *get_vsie_page_cpu_nr(struct kvm_vcpu *vcpu, struct vsie unpin_scb(vcpu->kvm, vsie_page); rc = init_vsie_page(vcpu, vsie_page, scb_gpa); } + if (vsie_page_is_new) + vcpu->kvm->stat.vsie_shadow_scb++; + else + vcpu->kvm->stat.vsie_shadow_scb_reuse++; if (rc) { put_vsie_page(vsie_page); return ERR_PTR(rc); -- 2.55.0