Kernel KVM virtualization development
 help / color / mirror / Atom feed
From: Peng Hao <flyingpenghao@gmail.com>
To: pbonzini@redhat.com, seanjc@google.com
Cc: kvm@vger.kernel.org
Subject: [PATCH] KVM: Add Kconfig to compile out the halt-polling histograms
Date: Wed, 11 Nov 2026 09:54:46 +0800	[thread overview]
Message-ID: <20261111015446.20577-1-flyingpeng@tencent.com> (raw)

The halt_poll_success_hist, halt_poll_fail_hist and halt_wait_hist
histograms in struct kvm_vcpu_stat_generic take 768 bytes in every vCPU.
Add CONFIG_KVM_HALT_POLL_HISTOGRAMS (default y) so that they can be
compiled out.

With it disabled, this shrinks struct kvm_vcpu from 5776 to 5008 bytes,
struct vcpu_vmx from 8384 to 7616 bytes and struct vcpu_svm from 6728 to
5960 bytes.

Signed-off-by: Peng Hao <flyingpeng@tencent.com>
---
 arch/powerpc/kvm/book3s_hv.c | 20 ++++++++++----------
 include/linux/kvm_host.h     | 23 +++++++++++++++++------
 include/linux/kvm_types.h    |  2 ++
 virt/kvm/Kconfig             | 11 +++++++++++
 virt/kvm/kvm_main.c          |  8 ++++----
 5 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index f2d9f16c2e44..0e271e14a204 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -4684,18 +4684,18 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
 	if (do_sleep) {
 		vc->runner->stat.generic.halt_wait_ns +=
 			ktime_to_ns(cur) - ktime_to_ns(start_wait);
-		KVM_STATS_LOG_HIST_UPDATE(
-				vc->runner->stat.generic.halt_wait_hist,
-				ktime_to_ns(cur) - ktime_to_ns(start_wait));
+		KVM_STATS_HALT_HIST_UPDATE(&vc->runner->stat.generic,
+					   halt_wait_hist,
+					   ktime_to_ns(cur) - ktime_to_ns(start_wait));
 		/* Attribute failed poll time */
 		if (vc->halt_poll_ns) {
 			vc->runner->stat.generic.halt_poll_fail_ns +=
 				ktime_to_ns(start_wait) -
 				ktime_to_ns(start_poll);
-			KVM_STATS_LOG_HIST_UPDATE(
-				vc->runner->stat.generic.halt_poll_fail_hist,
-				ktime_to_ns(start_wait) -
-				ktime_to_ns(start_poll));
+			KVM_STATS_HALT_HIST_UPDATE(&vc->runner->stat.generic,
+						   halt_poll_fail_hist,
+						   ktime_to_ns(start_wait) -
+						   ktime_to_ns(start_poll));
 		}
 	} else {
 		/* Attribute successful poll time */
@@ -4703,9 +4703,9 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
 			vc->runner->stat.generic.halt_poll_success_ns +=
 				ktime_to_ns(cur) -
 				ktime_to_ns(start_poll);
-			KVM_STATS_LOG_HIST_UPDATE(
-				vc->runner->stat.generic.halt_poll_success_hist,
-				ktime_to_ns(cur) - ktime_to_ns(start_poll));
+			KVM_STATS_HALT_HIST_UPDATE(&vc->runner->stat.generic,
+						   halt_poll_success_hist,
+						   ktime_to_ns(cur) - ktime_to_ns(start_poll));
 		}
 	}
 
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index e7fc94e2910a..15a310eb7487 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -2088,6 +2088,13 @@ struct kvm_stat_data {
 	STATS_DESC_COUNTER(VM_GENERIC, remote_tlb_flush),		       \
 	STATS_DESC_COUNTER(VM_GENERIC, remote_tlb_flush_requests)
 
+#ifdef CONFIG_KVM_HALT_POLL_HISTOGRAMS
+#define STATS_DESC_HALT_POLL_HIST(name)					       \
+	STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, name, HALT_POLL_HIST_COUNT),
+#else
+#define STATS_DESC_HALT_POLL_HIST(name)
+#endif
+
 #define KVM_GENERIC_VCPU_STATS()					       \
 	STATS_DESC_COUNTER(VCPU_GENERIC, halt_successful_poll),		       \
 	STATS_DESC_COUNTER(VCPU_GENERIC, halt_attempted_poll),		       \
@@ -2096,12 +2103,9 @@ struct kvm_stat_data {
 	STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_poll_success_ns),	       \
 	STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_poll_fail_ns),		       \
 	STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_wait_ns),		       \
-	STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_poll_success_hist,     \
-			HALT_POLL_HIST_COUNT),				       \
-	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),				       \
+	STATS_DESC_HALT_POLL_HIST(halt_poll_success_hist)		       \
+	STATS_DESC_HALT_POLL_HIST(halt_poll_fail_hist)			       \
+	STATS_DESC_HALT_POLL_HIST(halt_wait_hist)			       \
 	STATS_DESC_IBOOLEAN(VCPU_GENERIC, blocking)
 
 ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
@@ -2148,6 +2152,13 @@ static inline void kvm_stats_log_hist_update(u64 *data, size_t size, u64 value)
 #define KVM_STATS_LOG_HIST_UPDATE(array, value)				       \
 	kvm_stats_log_hist_update(array, ARRAY_SIZE(array), value)
 
+#ifdef CONFIG_KVM_HALT_POLL_HISTOGRAMS
+#define KVM_STATS_HALT_HIST_UPDATE(stats, hist, value)			       \
+	KVM_STATS_LOG_HIST_UPDATE((stats)->hist, value)
+#else
+#define KVM_STATS_HALT_HIST_UPDATE(stats, hist, value)
+#endif
+
 
 extern const struct kvm_stats_header kvm_vm_stats_header;
 extern const struct kvm_stats_desc kvm_vm_stats_desc[];
diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h
index a568d8e6f4e8..d79ef87e22c4 100644
--- a/include/linux/kvm_types.h
+++ b/include/linux/kvm_types.h
@@ -133,9 +133,11 @@ struct kvm_vcpu_stat_generic {
 	u64 halt_poll_success_ns;
 	u64 halt_poll_fail_ns;
 	u64 halt_wait_ns;
+#ifdef CONFIG_KVM_HALT_POLL_HISTOGRAMS
 	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];
+#endif
 	u64 blocking;
 };
 
diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig
index 99c9969e77a4..2be6530d9b4b 100644
--- a/virt/kvm/Kconfig
+++ b/virt/kvm/Kconfig
@@ -40,6 +40,17 @@ config NEED_KVM_DIRTY_RING_WITH_BITMAP
 	bool
 	depends on HAVE_KVM_DIRTY_RING
 
+config KVM_HALT_POLL_HISTOGRAMS
+       bool "Halt-polling histograms in vCPU statistics" if EXPERT
+       depends on KVM_COMMON
+       default y
+       help
+         Provide the halt_poll_success_hist, halt_poll_fail_hist and
+         halt_wait_hist logarithmic histograms in the per-vCPU binary
+         statistics.  The histograms take 768 bytes in every vCPU.
+
+         If unsure, say Y.
+
 config KVM_ASYNC_PF
        bool
 
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index cf4cb586f140..e8f5ee422493 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -3788,10 +3788,10 @@ static inline void update_halt_poll_stats(struct kvm_vcpu *vcpu, ktime_t start,
 			++vcpu->stat.generic.halt_poll_invalid;
 
 		stats->halt_poll_success_ns += poll_ns;
-		KVM_STATS_LOG_HIST_UPDATE(stats->halt_poll_success_hist, poll_ns);
+		KVM_STATS_HALT_HIST_UPDATE(stats, halt_poll_success_hist, poll_ns);
 	} else {
 		stats->halt_poll_fail_ns += poll_ns;
-		KVM_STATS_LOG_HIST_UPDATE(stats->halt_poll_fail_hist, poll_ns);
+		KVM_STATS_HALT_HIST_UPDATE(stats, halt_poll_fail_hist, poll_ns);
 	}
 }
 
@@ -3851,8 +3851,8 @@ void kvm_vcpu_halt(struct kvm_vcpu *vcpu)
 	if (waited) {
 		vcpu->stat.generic.halt_wait_ns +=
 			ktime_to_ns(cur) - ktime_to_ns(poll_end);
-		KVM_STATS_LOG_HIST_UPDATE(vcpu->stat.generic.halt_wait_hist,
-				ktime_to_ns(cur) - ktime_to_ns(poll_end));
+		KVM_STATS_HALT_HIST_UPDATE(&vcpu->stat.generic, halt_wait_hist,
+					   ktime_to_ns(cur) - ktime_to_ns(poll_end));
 	}
 out:
 	/* The total time the vCPU was "halted", including polling time. */
-- 
2.43.7


             reply	other threads:[~2026-11-11  1:54 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-11  1:54 Peng Hao [this message]
2026-11-11 16:13 ` [PATCH] KVM: Add Kconfig to compile out the halt-polling histograms Sean Christopherson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261111015446.20577-1-flyingpeng@tencent.com \
    --to=flyingpenghao@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox