KVM: s390: count invalid yields
authorChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 15 Feb 2019 12:47:20 +0000 (13:47 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 10 Oct 2019 11:18:38 +0000 (13:18 +0200)
To analyze some performance issues with lock contention and scheduling
it is nice to know when diag9c did not result in any action or when
no action was tried.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/diag.c
arch/s390/kvm/kvm-s390.c

index abe6026..02f4c21 100644 (file)
@@ -392,6 +392,7 @@ struct kvm_vcpu_stat {
        u64 diagnose_10;
        u64 diagnose_44;
        u64 diagnose_9c;
+       u64 diagnose_9c_ignored;
        u64 diagnose_258;
        u64 diagnose_308;
        u64 diagnose_500;
index 45634b3..609c55d 100644 (file)
@@ -158,14 +158,24 @@ static int __diag_time_slice_end_directed(struct kvm_vcpu *vcpu)
 
        tid = vcpu->run->s.regs.gprs[(vcpu->arch.sie_block->ipa & 0xf0) >> 4];
        vcpu->stat.diagnose_9c++;
-       VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d", tid);
 
+       /* yield to self */
        if (tid == vcpu->vcpu_id)
-               return 0;
+               goto no_yield;
 
+       /* yield to invalid */
        tcpu = kvm_get_vcpu_by_id(vcpu->kvm, tid);
-       if (tcpu)
-               kvm_vcpu_yield_to(tcpu);
+       if (!tcpu)
+               goto no_yield;
+
+       if (kvm_vcpu_yield_to(tcpu) <= 0)
+               goto no_yield;
+
+       VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d: done", tid);
+       return 0;
+no_yield:
+       VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d: ignored", tid);
+       vcpu->stat.diagnose_9c_ignored++;
        return 0;
 }
 
index 40af442..3b5ebf4 100644 (file)
@@ -155,6 +155,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
        { "instruction_diag_10", VCPU_STAT(diagnose_10) },
        { "instruction_diag_44", VCPU_STAT(diagnose_44) },
        { "instruction_diag_9c", VCPU_STAT(diagnose_9c) },
+       { "diag_9c_ignored", VCPU_STAT(diagnose_9c_ignored) },
        { "instruction_diag_258", VCPU_STAT(diagnose_258) },
        { "instruction_diag_308", VCPU_STAT(diagnose_308) },
        { "instruction_diag_500", VCPU_STAT(diagnose_500) },