* [PATCH] KVM: SVM: Add __read_mostly to frequently read module parameters
@ 2026-01-30 20:44 lirongqing
2026-01-30 20:57 ` Sean Christopherson
0 siblings, 1 reply; 3+ messages in thread
From: lirongqing @ 2026-01-30 20:44 UTC (permalink / raw)
To: Sean Christopherson, Paolo Bonzini, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin, kvm
Cc: Li RongQing
From: Li RongQing <lirongqing@baidu.com>
Mark static global variables that are primarily read-only with
__read_mostly to optimize cache utilization and performance.
The modified variables are module parameters and configuration
flags that are:
- Initialized at boot time
- Rarely modified during runtime
- Frequently accessed by multiple CPUs
By grouping these frequently read variables together, we reduce
cache line bouncing in SMP systems and improve overall performance
of the SVM module.
Signed-off-by: Li RongQing <lirongqing@baidu.com>
---
arch/x86/kvm/svm/avic.c | 4 ++--
arch/x86/kvm/svm/sev.c | 12 ++++++------
arch/x86/kvm/svm/svm.c | 34 +++++++++++++++++-----------------
3 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c
index 6b77b20..af440f4 100644
--- a/arch/x86/kvm/svm/avic.c
+++ b/arch/x86/kvm/svm/avic.c
@@ -86,13 +86,13 @@ static const struct kernel_param_ops avic_ops = {
* Enable / disable AVIC. In "auto" mode (default behavior), AVIC is enabled
* for Zen4+ CPUs with x2AVIC (and all other criteria for enablement are met).
*/
-static int avic = AVIC_AUTO_MODE;
+static int __read_mostly avic = AVIC_AUTO_MODE;
module_param_cb(avic, &avic_ops, &avic, 0444);
__MODULE_PARM_TYPE(avic, "bool");
module_param(enable_ipiv, bool, 0444);
-static bool force_avic;
+static bool __read_mostly force_avic;
module_param_unsafe(force_avic, bool, 0444);
/* Note:
diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
index f59c65a..a33edc8 100644
--- a/arch/x86/kvm/svm/sev.c
+++ b/arch/x86/kvm/svm/sev.c
@@ -42,23 +42,23 @@
#define GHCB_HV_FT_SUPPORTED (GHCB_HV_FT_SNP | GHCB_HV_FT_SNP_AP_CREATION)
/* enable/disable SEV support */
-static bool sev_enabled = true;
+static bool __read_mostly sev_enabled = true;
module_param_named(sev, sev_enabled, bool, 0444);
/* enable/disable SEV-ES support */
-static bool sev_es_enabled = true;
+static bool __read_mostly sev_es_enabled = true;
module_param_named(sev_es, sev_es_enabled, bool, 0444);
/* enable/disable SEV-SNP support */
-static bool sev_snp_enabled = true;
+static bool __read_mostly sev_snp_enabled = true;
module_param_named(sev_snp, sev_snp_enabled, bool, 0444);
/* enable/disable SEV-ES DebugSwap support */
-static bool sev_es_debug_swap_enabled = true;
+static bool __read_mostly sev_es_debug_swap_enabled = true;
module_param_named(debug_swap, sev_es_debug_swap_enabled, bool, 0444);
-static u64 sev_supported_vmsa_features;
+static u64 __read_mostly sev_supported_vmsa_features;
-static unsigned int nr_ciphertext_hiding_asids;
+static unsigned int __read_mostly nr_ciphertext_hiding_asids;
module_param_named(ciphertext_hiding_asids, nr_ciphertext_hiding_asids, uint, 0444);
#define AP_RESET_HOLD_NONE 0
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 24d59cc..e960275 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -110,52 +110,52 @@ static DEFINE_PER_CPU(u64, current_tsc_ratio);
* count only mode.
*/
-static unsigned short pause_filter_thresh = KVM_DEFAULT_PLE_GAP;
+static unsigned short __read_mostly pause_filter_thresh = KVM_DEFAULT_PLE_GAP;
module_param(pause_filter_thresh, ushort, 0444);
-static unsigned short pause_filter_count = KVM_SVM_DEFAULT_PLE_WINDOW;
+static unsigned short __read_mostly pause_filter_count = KVM_SVM_DEFAULT_PLE_WINDOW;
module_param(pause_filter_count, ushort, 0444);
/* Default doubles per-vcpu window every exit. */
-static unsigned short pause_filter_count_grow = KVM_DEFAULT_PLE_WINDOW_GROW;
+static unsigned short __read_mostly pause_filter_count_grow = KVM_DEFAULT_PLE_WINDOW_GROW;
module_param(pause_filter_count_grow, ushort, 0444);
/* Default resets per-vcpu window every exit to pause_filter_count. */
-static unsigned short pause_filter_count_shrink = KVM_DEFAULT_PLE_WINDOW_SHRINK;
+static unsigned short __read_mostly pause_filter_count_shrink = KVM_DEFAULT_PLE_WINDOW_SHRINK;
module_param(pause_filter_count_shrink, ushort, 0444);
/* Default is to compute the maximum so we can never overflow. */
-static unsigned short pause_filter_count_max = KVM_SVM_DEFAULT_PLE_WINDOW_MAX;
+static unsigned short __read_mostly pause_filter_count_max = KVM_SVM_DEFAULT_PLE_WINDOW_MAX;
module_param(pause_filter_count_max, ushort, 0444);
/*
* Use nested page tables by default. Note, NPT may get forced off by
* svm_hardware_setup() if it's unsupported by hardware or the host kernel.
*/
-bool npt_enabled = true;
+bool __read_mostly npt_enabled = true;
module_param_named(npt, npt_enabled, bool, 0444);
/* allow nested virtualization in KVM/SVM */
-static int nested = true;
+static int __read_mostly nested = true;
module_param(nested, int, 0444);
/* enable/disable Next RIP Save */
-int nrips = true;
+int __read_mostly nrips = true;
module_param(nrips, int, 0444);
/* enable/disable Virtual VMLOAD VMSAVE */
-static int vls = true;
+static int __read_mostly vls = true;
module_param(vls, int, 0444);
/* enable/disable Virtual GIF */
-int vgif = true;
+int __read_mostly vgif = true;
module_param(vgif, int, 0444);
/* enable/disable LBR virtualization */
-int lbrv = true;
+int __read_mostly lbrv = true;
module_param(lbrv, int, 0444);
-static int tsc_scaling = true;
+static int __read_mostly tsc_scaling = true;
module_param(tsc_scaling, int, 0444);
module_param(enable_device_posted_irqs, bool, 0444);
@@ -164,17 +164,17 @@ bool __read_mostly dump_invalid_vmcb;
module_param(dump_invalid_vmcb, bool, 0644);
-bool intercept_smi = true;
+bool __read_mostly intercept_smi = true;
module_param(intercept_smi, bool, 0444);
-bool vnmi = true;
+bool __read_mostly vnmi = true;
module_param(vnmi, bool, 0444);
-static bool svm_gp_erratum_intercept = true;
+static bool __read_mostly svm_gp_erratum_intercept = true;
-static u8 rsm_ins_bytes[] = "\x0f\xaa";
+static u8 __read_mostly rsm_ins_bytes[] = "\x0f\xaa";
-static unsigned long iopm_base;
+static unsigned long __read_mostly iopm_base;
DEFINE_PER_CPU(struct svm_cpu_data, svm_data);
--
2.9.4
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] KVM: SVM: Add __read_mostly to frequently read module parameters
2026-01-30 20:44 [PATCH] KVM: SVM: Add __read_mostly to frequently read module parameters lirongqing
@ 2026-01-30 20:57 ` Sean Christopherson
2026-01-31 12:24 ` 答复: [????] " Li,Rongqing
0 siblings, 1 reply; 3+ messages in thread
From: Sean Christopherson @ 2026-01-30 20:57 UTC (permalink / raw)
To: lirongqing
Cc: Paolo Bonzini, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H . Peter Anvin, kvm
On Fri, Jan 30, 2026, lirongqing wrote:
> From: Li RongQing <lirongqing@baidu.com>
>
> Mark static global variables that are primarily read-only with
> __read_mostly to optimize cache utilization and performance.
>
> The modified variables are module parameters and configuration
> flags that are:
> - Initialized at boot time
Please make these __ro_after_init where possible, not __read_mostly. E.g.
force_avic is definitely read-only after init.
^ permalink raw reply [flat|nested] 3+ messages in thread
* 答复: [????] Re: [PATCH] KVM: SVM: Add __read_mostly to frequently read module parameters
2026-01-30 20:57 ` Sean Christopherson
@ 2026-01-31 12:24 ` Li,Rongqing
0 siblings, 0 replies; 3+ messages in thread
From: Li,Rongqing @ 2026-01-31 12:24 UTC (permalink / raw)
To: Sean Christopherson
Cc: Paolo Bonzini, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86@kernel.org, H . Peter Anvin, kvm@vger.kernel.org
> On Fri, Jan 30, 2026, lirongqing wrote:
> > From: Li RongQing <lirongqing@baidu.com>
> >
> > Mark static global variables that are primarily read-only with
> > __read_mostly to optimize cache utilization and performance.
> >
> > The modified variables are module parameters and configuration flags
> > that are:
> > - Initialized at boot time
>
> Please make these __ro_after_init where possible, not __read_mostly. E.g.
> force_avic is definitely read-only after init.
Ok, I will send v2
Thanks
[Li,Rongqing]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-01-31 12:25 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-30 20:44 [PATCH] KVM: SVM: Add __read_mostly to frequently read module parameters lirongqing
2026-01-30 20:57 ` Sean Christopherson
2026-01-31 12:24 ` 答复: [????] " Li,Rongqing
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox