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 3a839154fdfe..f8dff6846fb3 100644 --- a/arch/s390/kvm/s390/vsie.c +++ b/arch/s390/kvm/s390/vsie.c @@ -1134,6 +1134,7 @@ static int get_vsie_sca(struct kvm_vcpu *vcpu, struct kvm_s390_sie_block *scb_o, 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); @@ -1156,6 +1157,7 @@ static int get_vsie_sca(struct kvm_vcpu *vcpu, struct kvm_s390_sie_block *scb_o, } unpin_sca(kvm, vsie_sca); clear_vsie_sca(vsie_sca); + kvm->stat.vsie_shadow_sca_reuse++; } if (sie_uses_esca(scb_o)) @@ -2014,6 +2016,7 @@ static int 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) { @@ -2031,6 +2034,7 @@ static int get_vsie_page(struct kvm_vcpu *vcpu, unsigned long addr, vsie_page->scb_gpa = ULONG_MAX; unpin_scb(kvm, vsie_page); + kvm->stat.vsie_shadow_scb_reuse++; } rc = init_vsie_page(vcpu, vsie_page, addr); @@ -2060,6 +2064,7 @@ static int get_vsie_page_cpu_nr(struct kvm_vcpu *vcpu, struct vsie_sca *vsie_sca u16 cpu_nr, struct vsie_page **vsie_page_out) { struct vsie_page *vsie_page, *vsie_page_new = NULL; + bool vsie_page_is_new = true; int rc; vsie_page = vsie_sca->pages[cpu_nr]; @@ -2080,6 +2085,7 @@ static int get_vsie_page_cpu_nr(struct kvm_vcpu *vcpu, struct vsie_sca *vsie_sca } } if (vsie_page != vsie_page_new) { + vsie_page_is_new = false; if (vsie_page_new) free_vsie_page(vsie_page_new); @@ -2093,6 +2099,10 @@ static int get_vsie_page_cpu_nr(struct kvm_vcpu *vcpu, struct vsie_sca *vsie_sca 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 rc; -- 2.55.0