Commit c3858335 authored by Jing Zhang's avatar Jing Zhang Committed by Paolo Bonzini
Browse files

KVM: stats: Add stat to detect if vcpu is currently blocking



Add a "blocking" stat that userspace can use to detect the case where a
vCPU is not being run because of an vCPU/guest action, e.g. HLT or WFS on
x86, WFI on arm64, etc...  Current guest/host/halt stats don't show this
well, e.g. if a guest halts for a long period of time then the vCPU could
could appear pathologically blocked due to a host condition, when in
reality the vCPU has been put into a not-runnable state by the guest.

Originally-by: default avatarCannon Matthews <cannonmatthews@google.com>
Suggested-by: default avatarSean Christopherson <seanjc@google.com>
Reviewed-by: default avatarDavid Matlack <dmatlack@google.com>
Signed-off-by: default avatarJing Zhang <jingzhangos@google.com>
[sean: renamed stat to "blocking", massaged changelog]
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Message-Id: <20211009021236.4122790-16-seanjc@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent fac42688
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1587,7 +1587,8 @@ struct _kvm_stats_desc {
	STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_poll_fail_hist,	       \
			HALT_POLL_HIST_COUNT),				       \
	STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_wait_hist,	       \
			HALT_POLL_HIST_COUNT)
			HALT_POLL_HIST_COUNT),				       \
	STATS_DESC_ICOUNTER(VCPU_GENERIC, blocking)

extern struct dentry *kvm_debugfs_dir;

+1 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ struct kvm_vcpu_stat_generic {
	u64 halt_poll_success_hist[HALT_POLL_HIST_COUNT];
	u64 halt_poll_fail_hist[HALT_POLL_HIST_COUNT];
	u64 halt_wait_hist[HALT_POLL_HIST_COUNT];
	u64 blocking;
};

#define KVM_STATS_NAME_SIZE	48
+4 −0
Original line number Diff line number Diff line
@@ -3282,6 +3282,8 @@ bool kvm_vcpu_block(struct kvm_vcpu *vcpu)
	struct rcuwait *wait = kvm_arch_vcpu_get_wait(vcpu);
	bool waited = false;

	vcpu->stat.generic.blocking = 1;

	kvm_arch_vcpu_blocking(vcpu);

	prepare_to_rcuwait(wait);
@@ -3298,6 +3300,8 @@ bool kvm_vcpu_block(struct kvm_vcpu *vcpu)

	kvm_arch_vcpu_unblocking(vcpu);

	vcpu->stat.generic.blocking = 0;

	return waited;
}