Loading arch/s390/include/asm/kvm_host.h +7 −0 Original line number Diff line number Diff line Loading @@ -777,6 +777,13 @@ struct kvm_vm_stat { u64 inject_service_signal; u64 inject_virtio; u64 aen_forward; u64 gmap_shadow_create; u64 gmap_shadow_reuse; u64 gmap_shadow_r1_entry; u64 gmap_shadow_r2_entry; u64 gmap_shadow_r3_entry; u64 gmap_shadow_sg_entry; u64 gmap_shadow_pg_entry; }; struct kvm_arch_memory_slot { Loading arch/s390/kvm/gaccess.c +7 −0 Original line number Diff line number Diff line Loading @@ -1382,6 +1382,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, unsigned long *pgt, int *dat_protection, int *fake) { struct kvm *kvm; struct gmap *parent; union asce asce; union vaddress vaddr; Loading @@ -1390,6 +1391,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, *fake = 0; *dat_protection = 0; kvm = sg->private; parent = sg->parent; vaddr.addr = saddr; asce.val = sg->orig_asce; Loading Loading @@ -1450,6 +1452,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_r2t(sg, saddr, rfte.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_r1_entry++; } fallthrough; case ASCE_TYPE_REGION2: { Loading Loading @@ -1478,6 +1481,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_r3t(sg, saddr, rste.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_r2_entry++; } fallthrough; case ASCE_TYPE_REGION3: { Loading Loading @@ -1515,6 +1519,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_sgt(sg, saddr, rtte.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_r3_entry++; } fallthrough; case ASCE_TYPE_SEGMENT: { Loading Loading @@ -1548,6 +1553,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_pgt(sg, saddr, ste.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_sg_entry++; } } /* Return the parent address of the page table */ Loading Loading @@ -1618,6 +1624,7 @@ int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg, pte.p |= dat_protection; if (!rc) rc = gmap_shadow_page(sg, saddr, __pte(pte.val)); vcpu->kvm->stat.gmap_shadow_pg_entry++; ipte_unlock(vcpu->kvm); mmap_read_unlock(sg->mm); return rc; Loading arch/s390/kvm/kvm-s390.c +10 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,14 @@ const struct _kvm_stats_desc kvm_vm_stats_desc[] = { STATS_DESC_COUNTER(VM, inject_pfault_done), STATS_DESC_COUNTER(VM, inject_service_signal), STATS_DESC_COUNTER(VM, inject_virtio), STATS_DESC_COUNTER(VM, aen_forward) STATS_DESC_COUNTER(VM, aen_forward), STATS_DESC_COUNTER(VM, gmap_shadow_reuse), STATS_DESC_COUNTER(VM, gmap_shadow_create), STATS_DESC_COUNTER(VM, gmap_shadow_r1_entry), STATS_DESC_COUNTER(VM, gmap_shadow_r2_entry), STATS_DESC_COUNTER(VM, gmap_shadow_r3_entry), STATS_DESC_COUNTER(VM, gmap_shadow_sg_entry), STATS_DESC_COUNTER(VM, gmap_shadow_pg_entry), }; const struct kvm_stats_header kvm_vm_stats_header = { Loading Loading @@ -4053,6 +4060,8 @@ static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start, unsigned long prefix; unsigned long i; trace_kvm_s390_gmap_notifier(start, end, gmap_is_shadow(gmap)); if (gmap_is_shadow(gmap)) return; if (start >= 1UL << 31) Loading arch/s390/kvm/trace-s390.h +23 −0 Original line number Diff line number Diff line Loading @@ -333,6 +333,29 @@ TRACE_EVENT(kvm_s390_airq_suppressed, __entry->id, __entry->isc) ); /* * Trace point for gmap notifier calls. */ TRACE_EVENT(kvm_s390_gmap_notifier, TP_PROTO(unsigned long start, unsigned long end, unsigned int shadow), TP_ARGS(start, end, shadow), TP_STRUCT__entry( __field(unsigned long, start) __field(unsigned long, end) __field(unsigned int, shadow) ), TP_fast_assign( __entry->start = start; __entry->end = end; __entry->shadow = shadow; ), TP_printk("gmap notified (start:0x%lx end:0x%lx shadow:%d)", __entry->start, __entry->end, __entry->shadow) ); #endif /* _TRACE_KVMS390_H */ Loading arch/s390/kvm/vsie.c +4 −1 Original line number Diff line number Diff line Loading @@ -1214,8 +1214,10 @@ static int acquire_gmap_shadow(struct kvm_vcpu *vcpu, * we're holding has been unshadowed. If the gmap is still valid, * we can safely reuse it. */ if (vsie_page->gmap && gmap_shadow_valid(vsie_page->gmap, asce, edat)) if (vsie_page->gmap && gmap_shadow_valid(vsie_page->gmap, asce, edat)) { vcpu->kvm->stat.gmap_shadow_reuse++; return 0; } /* release the old shadow - if any, and mark the prefix as unmapped */ release_gmap_shadow(vsie_page); Loading @@ -1223,6 +1225,7 @@ static int acquire_gmap_shadow(struct kvm_vcpu *vcpu, if (IS_ERR(gmap)) return PTR_ERR(gmap); gmap->private = vcpu->kvm; vcpu->kvm->stat.gmap_shadow_create++; WRITE_ONCE(vsie_page->gmap, gmap); return 0; } Loading Loading
arch/s390/include/asm/kvm_host.h +7 −0 Original line number Diff line number Diff line Loading @@ -777,6 +777,13 @@ struct kvm_vm_stat { u64 inject_service_signal; u64 inject_virtio; u64 aen_forward; u64 gmap_shadow_create; u64 gmap_shadow_reuse; u64 gmap_shadow_r1_entry; u64 gmap_shadow_r2_entry; u64 gmap_shadow_r3_entry; u64 gmap_shadow_sg_entry; u64 gmap_shadow_pg_entry; }; struct kvm_arch_memory_slot { Loading
arch/s390/kvm/gaccess.c +7 −0 Original line number Diff line number Diff line Loading @@ -1382,6 +1382,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, unsigned long *pgt, int *dat_protection, int *fake) { struct kvm *kvm; struct gmap *parent; union asce asce; union vaddress vaddr; Loading @@ -1390,6 +1391,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, *fake = 0; *dat_protection = 0; kvm = sg->private; parent = sg->parent; vaddr.addr = saddr; asce.val = sg->orig_asce; Loading Loading @@ -1450,6 +1452,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_r2t(sg, saddr, rfte.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_r1_entry++; } fallthrough; case ASCE_TYPE_REGION2: { Loading Loading @@ -1478,6 +1481,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_r3t(sg, saddr, rste.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_r2_entry++; } fallthrough; case ASCE_TYPE_REGION3: { Loading Loading @@ -1515,6 +1519,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_sgt(sg, saddr, rtte.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_r3_entry++; } fallthrough; case ASCE_TYPE_SEGMENT: { Loading Loading @@ -1548,6 +1553,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, rc = gmap_shadow_pgt(sg, saddr, ste.val, *fake); if (rc) return rc; kvm->stat.gmap_shadow_sg_entry++; } } /* Return the parent address of the page table */ Loading Loading @@ -1618,6 +1624,7 @@ int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg, pte.p |= dat_protection; if (!rc) rc = gmap_shadow_page(sg, saddr, __pte(pte.val)); vcpu->kvm->stat.gmap_shadow_pg_entry++; ipte_unlock(vcpu->kvm); mmap_read_unlock(sg->mm); return rc; Loading
arch/s390/kvm/kvm-s390.c +10 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,14 @@ const struct _kvm_stats_desc kvm_vm_stats_desc[] = { STATS_DESC_COUNTER(VM, inject_pfault_done), STATS_DESC_COUNTER(VM, inject_service_signal), STATS_DESC_COUNTER(VM, inject_virtio), STATS_DESC_COUNTER(VM, aen_forward) STATS_DESC_COUNTER(VM, aen_forward), STATS_DESC_COUNTER(VM, gmap_shadow_reuse), STATS_DESC_COUNTER(VM, gmap_shadow_create), STATS_DESC_COUNTER(VM, gmap_shadow_r1_entry), STATS_DESC_COUNTER(VM, gmap_shadow_r2_entry), STATS_DESC_COUNTER(VM, gmap_shadow_r3_entry), STATS_DESC_COUNTER(VM, gmap_shadow_sg_entry), STATS_DESC_COUNTER(VM, gmap_shadow_pg_entry), }; const struct kvm_stats_header kvm_vm_stats_header = { Loading Loading @@ -4053,6 +4060,8 @@ static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start, unsigned long prefix; unsigned long i; trace_kvm_s390_gmap_notifier(start, end, gmap_is_shadow(gmap)); if (gmap_is_shadow(gmap)) return; if (start >= 1UL << 31) Loading
arch/s390/kvm/trace-s390.h +23 −0 Original line number Diff line number Diff line Loading @@ -333,6 +333,29 @@ TRACE_EVENT(kvm_s390_airq_suppressed, __entry->id, __entry->isc) ); /* * Trace point for gmap notifier calls. */ TRACE_EVENT(kvm_s390_gmap_notifier, TP_PROTO(unsigned long start, unsigned long end, unsigned int shadow), TP_ARGS(start, end, shadow), TP_STRUCT__entry( __field(unsigned long, start) __field(unsigned long, end) __field(unsigned int, shadow) ), TP_fast_assign( __entry->start = start; __entry->end = end; __entry->shadow = shadow; ), TP_printk("gmap notified (start:0x%lx end:0x%lx shadow:%d)", __entry->start, __entry->end, __entry->shadow) ); #endif /* _TRACE_KVMS390_H */ Loading
arch/s390/kvm/vsie.c +4 −1 Original line number Diff line number Diff line Loading @@ -1214,8 +1214,10 @@ static int acquire_gmap_shadow(struct kvm_vcpu *vcpu, * we're holding has been unshadowed. If the gmap is still valid, * we can safely reuse it. */ if (vsie_page->gmap && gmap_shadow_valid(vsie_page->gmap, asce, edat)) if (vsie_page->gmap && gmap_shadow_valid(vsie_page->gmap, asce, edat)) { vcpu->kvm->stat.gmap_shadow_reuse++; return 0; } /* release the old shadow - if any, and mark the prefix as unmapped */ release_gmap_shadow(vsie_page); Loading @@ -1223,6 +1225,7 @@ static int acquire_gmap_shadow(struct kvm_vcpu *vcpu, if (IS_ERR(gmap)) return PTR_ERR(gmap); gmap->private = vcpu->kvm; vcpu->kvm->stat.gmap_shadow_create++; WRITE_ONCE(vsie_page->gmap, gmap); return 0; } Loading