mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
- nested page table management performance counters
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEwGNS88vfc9+v45Yq41TmuOI4ufgFAmU/WREACgkQ41TmuOI4 ufgLuw/9HuVlJ4HLrnbFQ+d7DkATkxMwx+gCxMLw9Xw+wwKc03OMU5CJk7QyHCHY z6uYEcRQqQeAu9ux8ygtMPlEB3fwZnhsfA8AROCST25T7JN1xMFFOiq3QMMIQcGZ hmf050xF2GheW/AAPTSdQu1BwCTBqf4WtXf8C2GGwvTEgFEoCd/ZOxmGJw82X1pe Dhn7KV9D2q7if/dk5Rosp7zlXx4YDt9Q3zxsvWsnnOEQGghjCeG/ShkEZdwfBW/O /1b3OO24MqS3nnXdC6Ktw2lzPFDiCfeaxKrU9X9OLwxcTzOqQ1XT6bpVRrDzSP2q UyvoYh9JdyAdOdf1woXeepY/hubAHbXEx3EifgzujEtcjHIwXPd23FrLmR+UaFdw kOl/7JEVEkj+FZM3ZP3cHWV01CEgvUqyp6eSyo8Lr1NhF5VcENZiSDtLkoTUFUhx 6UFeGWnqlFPwI5sXBjGCn233j9hY5ZNpn+H82jzqLqsWcklBC9ZvWIpP9U9/mmh9 M4t3NA7WTuzxEGsxPh3JcrHpWGB4WgOvXGZA8JI2RIbliZXTwha2Y5d2Jc+gPovY ALcCLPiB8VeCcl8F0SptGACm7UesRDTyD2Cl8pTioIYPOdFOFnitGm/qgPOgN4mO y5K8GBWfcH++0gAQyHbeRF9uN1L03SyTZ8hT08mig5aDY6SiH78= =Ko6K -----END PGP SIGNATURE----- Merge tag 'kvm-s390-next-6.7-1' of https://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into HEAD - nested page table management performance counters
This commit is contained in:
commit
140139c5bd
@ -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 {
|
||||
|
@ -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;
|
||||
@ -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;
|
||||
@ -1450,6 +1452,7 @@ shadow_r2t:
|
||||
rc = gmap_shadow_r2t(sg, saddr, rfte.val, *fake);
|
||||
if (rc)
|
||||
return rc;
|
||||
kvm->stat.gmap_shadow_r1_entry++;
|
||||
}
|
||||
fallthrough;
|
||||
case ASCE_TYPE_REGION2: {
|
||||
@ -1478,6 +1481,7 @@ shadow_r3t:
|
||||
rc = gmap_shadow_r3t(sg, saddr, rste.val, *fake);
|
||||
if (rc)
|
||||
return rc;
|
||||
kvm->stat.gmap_shadow_r2_entry++;
|
||||
}
|
||||
fallthrough;
|
||||
case ASCE_TYPE_REGION3: {
|
||||
@ -1515,6 +1519,7 @@ shadow_sgt:
|
||||
rc = gmap_shadow_sgt(sg, saddr, rtte.val, *fake);
|
||||
if (rc)
|
||||
return rc;
|
||||
kvm->stat.gmap_shadow_r3_entry++;
|
||||
}
|
||||
fallthrough;
|
||||
case ASCE_TYPE_SEGMENT: {
|
||||
@ -1548,6 +1553,7 @@ shadow_pgt:
|
||||
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 */
|
||||
@ -1618,6 +1624,7 @@ shadow_page:
|
||||
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;
|
||||
|
@ -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 = {
|
||||
@ -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)
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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);
|
||||
@ -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…
Reference in New Issue
Block a user