Skip to content

Commit 8c5b1d2

Browse files
committed
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git
2 parents eee94ea + 70fea30 commit 8c5b1d2

5 files changed

Lines changed: 51 additions & 2 deletions

File tree

arch/s390/include/asm/kvm_host.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,13 @@ struct kvm_vm_stat {
777777
u64 inject_service_signal;
778778
u64 inject_virtio;
779779
u64 aen_forward;
780+
u64 gmap_shadow_create;
781+
u64 gmap_shadow_reuse;
782+
u64 gmap_shadow_r1_entry;
783+
u64 gmap_shadow_r2_entry;
784+
u64 gmap_shadow_r3_entry;
785+
u64 gmap_shadow_sg_entry;
786+
u64 gmap_shadow_pg_entry;
780787
};
781788

782789
struct kvm_arch_memory_slot {

arch/s390/kvm/gaccess.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,6 +1365,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
13651365
unsigned long *pgt, int *dat_protection,
13661366
int *fake)
13671367
{
1368+
struct kvm *kvm;
13681369
struct gmap *parent;
13691370
union asce asce;
13701371
union vaddress vaddr;
@@ -1373,6 +1374,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
13731374

13741375
*fake = 0;
13751376
*dat_protection = 0;
1377+
kvm = sg->private;
13761378
parent = sg->parent;
13771379
vaddr.addr = saddr;
13781380
asce.val = sg->orig_asce;
@@ -1433,6 +1435,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
14331435
rc = gmap_shadow_r2t(sg, saddr, rfte.val, *fake);
14341436
if (rc)
14351437
return rc;
1438+
kvm->stat.gmap_shadow_r1_entry++;
14361439
}
14371440
fallthrough;
14381441
case ASCE_TYPE_REGION2: {
@@ -1461,6 +1464,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
14611464
rc = gmap_shadow_r3t(sg, saddr, rste.val, *fake);
14621465
if (rc)
14631466
return rc;
1467+
kvm->stat.gmap_shadow_r2_entry++;
14641468
}
14651469
fallthrough;
14661470
case ASCE_TYPE_REGION3: {
@@ -1498,6 +1502,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
14981502
rc = gmap_shadow_sgt(sg, saddr, rtte.val, *fake);
14991503
if (rc)
15001504
return rc;
1505+
kvm->stat.gmap_shadow_r3_entry++;
15011506
}
15021507
fallthrough;
15031508
case ASCE_TYPE_SEGMENT: {
@@ -1531,6 +1536,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
15311536
rc = gmap_shadow_pgt(sg, saddr, ste.val, *fake);
15321537
if (rc)
15331538
return rc;
1539+
kvm->stat.gmap_shadow_sg_entry++;
15341540
}
15351541
}
15361542
/* Return the parent address of the page table */
@@ -1601,6 +1607,7 @@ int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg,
16011607
pte.p |= dat_protection;
16021608
if (!rc)
16031609
rc = gmap_shadow_page(sg, saddr, __pte(pte.val));
1610+
vcpu->kvm->stat.gmap_shadow_pg_entry++;
16041611
ipte_unlock(vcpu->kvm);
16051612
mmap_read_unlock(sg->mm);
16061613
return rc;

arch/s390/kvm/kvm-s390.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,14 @@ const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
6666
STATS_DESC_COUNTER(VM, inject_pfault_done),
6767
STATS_DESC_COUNTER(VM, inject_service_signal),
6868
STATS_DESC_COUNTER(VM, inject_virtio),
69-
STATS_DESC_COUNTER(VM, aen_forward)
69+
STATS_DESC_COUNTER(VM, aen_forward),
70+
STATS_DESC_COUNTER(VM, gmap_shadow_reuse),
71+
STATS_DESC_COUNTER(VM, gmap_shadow_create),
72+
STATS_DESC_COUNTER(VM, gmap_shadow_r1_entry),
73+
STATS_DESC_COUNTER(VM, gmap_shadow_r2_entry),
74+
STATS_DESC_COUNTER(VM, gmap_shadow_r3_entry),
75+
STATS_DESC_COUNTER(VM, gmap_shadow_sg_entry),
76+
STATS_DESC_COUNTER(VM, gmap_shadow_pg_entry),
7077
};
7178

7279
const struct kvm_stats_header kvm_vm_stats_header = {
@@ -4053,6 +4060,8 @@ static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start,
40534060
unsigned long prefix;
40544061
unsigned long i;
40554062

4063+
trace_kvm_s390_gmap_notifier(start, end, gmap_is_shadow(gmap));
4064+
40564065
if (gmap_is_shadow(gmap))
40574066
return;
40584067
if (start >= 1UL << 31)

arch/s390/kvm/trace-s390.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,29 @@ TRACE_EVENT(kvm_s390_airq_suppressed,
333333
__entry->id, __entry->isc)
334334
);
335335

336+
/*
337+
* Trace point for gmap notifier calls.
338+
*/
339+
TRACE_EVENT(kvm_s390_gmap_notifier,
340+
TP_PROTO(unsigned long start, unsigned long end, unsigned int shadow),
341+
TP_ARGS(start, end, shadow),
342+
343+
TP_STRUCT__entry(
344+
__field(unsigned long, start)
345+
__field(unsigned long, end)
346+
__field(unsigned int, shadow)
347+
),
348+
349+
TP_fast_assign(
350+
__entry->start = start;
351+
__entry->end = end;
352+
__entry->shadow = shadow;
353+
),
354+
355+
TP_printk("gmap notified (start:0x%lx end:0x%lx shadow:%d)",
356+
__entry->start, __entry->end, __entry->shadow)
357+
);
358+
336359

337360
#endif /* _TRACE_KVMS390_H */
338361

arch/s390/kvm/vsie.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1214,15 +1214,18 @@ static int acquire_gmap_shadow(struct kvm_vcpu *vcpu,
12141214
* we're holding has been unshadowed. If the gmap is still valid,
12151215
* we can safely reuse it.
12161216
*/
1217-
if (vsie_page->gmap && gmap_shadow_valid(vsie_page->gmap, asce, edat))
1217+
if (vsie_page->gmap && gmap_shadow_valid(vsie_page->gmap, asce, edat)) {
1218+
vcpu->kvm->stat.gmap_shadow_reuse++;
12181219
return 0;
1220+
}
12191221

12201222
/* release the old shadow - if any, and mark the prefix as unmapped */
12211223
release_gmap_shadow(vsie_page);
12221224
gmap = gmap_shadow(vcpu->arch.gmap, asce, edat);
12231225
if (IS_ERR(gmap))
12241226
return PTR_ERR(gmap);
12251227
gmap->private = vcpu->kvm;
1228+
vcpu->kvm->stat.gmap_shadow_create++;
12261229
WRITE_ONCE(vsie_page->gmap, gmap);
12271230
return 0;
12281231
}

0 commit comments

Comments
 (0)