Commit 65e7026a authored by Suresh Warrier's avatar Suresh Warrier Committed by Paul Mackerras

KVM: PPC: Book3S HV: Counters for passthrough IRQ stats

Add VCPU stat counters to track affinity for passthrough
interrupts.

pthru_all: Counts all passthrough interrupts whose IRQ mappings are
           in the kvmppc_passthru_irq_map structure.
pthru_host: Counts all cached passthrough interrupts that were injected
	    from the host through kvm_set_irq (i.e. not handled in
	    real mode).
pthru_bad_aff: Counts how many cached passthrough interrupts have
               bad affinity (receiving CPU is not running VCPU that is
	       the target of the virtual interrupt in the guest).
Signed-off-by: default avatarSuresh Warrier <warrier@linux.vnet.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
parent 5d375199
...@@ -137,6 +137,9 @@ struct kvm_vcpu_stat { ...@@ -137,6 +137,9 @@ struct kvm_vcpu_stat {
u64 ld_slow; u64 ld_slow;
u64 st_slow; u64 st_slow;
#endif #endif
u64 pthru_all;
u64 pthru_host;
u64 pthru_bad_aff;
}; };
enum kvm_exit_types { enum kvm_exit_types {
......
...@@ -68,6 +68,9 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { ...@@ -68,6 +68,9 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
{ "ld_slow", VCPU_STAT(ld_slow) }, { "ld_slow", VCPU_STAT(ld_slow) },
{ "st", VCPU_STAT(st) }, { "st", VCPU_STAT(st) },
{ "st_slow", VCPU_STAT(st_slow) }, { "st_slow", VCPU_STAT(st_slow) },
{ "pthru_all", VCPU_STAT(pthru_all) },
{ "pthru_host", VCPU_STAT(pthru_host) },
{ "pthru_bad_aff", VCPU_STAT(pthru_bad_aff) },
{ NULL } { NULL }
}; };
......
...@@ -716,11 +716,19 @@ int kvmppc_rm_h_eoi(struct kvm_vcpu *vcpu, unsigned long xirr) ...@@ -716,11 +716,19 @@ int kvmppc_rm_h_eoi(struct kvm_vcpu *vcpu, unsigned long xirr)
icp->rm_eoied_irq = irq; icp->rm_eoied_irq = irq;
} }
if (state->host_irq && state->intr_cpu != -1) { if (state->host_irq) {
int pcpu = cpu_first_thread_sibling(raw_smp_processor_id()); ++vcpu->stat.pthru_all;
if (state->intr_cpu != pcpu) if (state->intr_cpu != -1) {
xics_opal_rm_set_server(state->host_irq, pcpu); int pcpu = raw_smp_processor_id();
state->intr_cpu = -1;
pcpu = cpu_first_thread_sibling(pcpu);
++vcpu->stat.pthru_host;
if (state->intr_cpu != pcpu) {
++vcpu->stat.pthru_bad_aff;
xics_opal_rm_set_server(state->host_irq, pcpu);
}
state->intr_cpu = -1;
}
} }
bail: bail:
return check_too_hard(xics, icp); return check_too_hard(xics, icp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment