Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -137,6 +137,9 @@ struct kvm_vcpu_stat {
	u64 ld_slow;
	u64 st_slow;
#endif
	u64 pthru_all;
	u64 pthru_host;
	u64 pthru_bad_aff;
};

enum kvm_exit_types {
+3 −0
Original line number Diff line number Diff line
@@ -68,6 +68,9 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
	{ "ld_slow",     VCPU_STAT(ld_slow) },
	{ "st",          VCPU_STAT(st) },
	{ "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 }
};

+13 −5
Original line number Diff line number Diff line
@@ -716,12 +716,20 @@ int kvmppc_rm_h_eoi(struct kvm_vcpu *vcpu, unsigned long xirr)
		icp->rm_eoied_irq = irq;
	}

	if (state->host_irq && state->intr_cpu != -1) {
		int pcpu = cpu_first_thread_sibling(raw_smp_processor_id());
		if (state->intr_cpu != pcpu)
	if (state->host_irq) {
		++vcpu->stat.pthru_all;
		if (state->intr_cpu != -1) {
			int pcpu = raw_smp_processor_id();

			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:
	return check_too_hard(xics, icp);
}