public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [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