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
next 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