mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-22 15:36:57 -04:00
KVM: SVM: Move global "avic" variable to avic.c
Move "avic" to avic.c so that it's colocated with the other AVIC specific globals and module params, and so that avic_hardware_setup() is a bit more self-contained, e.g. similar to sev_hardware_setup(). Deliberately set enable_apicv in svm.c as it's already globally visible (defined by kvm.ko, not by kvm-amd.ko), and to clearly capture the dependency on enable_apicv being initialized (svm_hardware_setup() clears several AVIC-specific hooks when enable_apicv is disabled). Alternatively, clearing of the hooks (and enable_ipiv) could be moved to avic_hardware_setup(), but that's not obviously better, e.g. it's helpful to isolate the setting of enable_apicv when reading code from the generic x86 side of the world. No functional change intended. Acked-by: Naveen N Rao (AMD) <naveen@kernel.org> Tested-by: Naveen N Rao (AMD) <naveen@kernel.org> Link: https://lore.kernel.org/r/20250919215934.1590410-7-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
@@ -64,6 +64,14 @@
|
||||
|
||||
static_assert(__AVIC_GATAG(AVIC_VM_ID_MASK, AVIC_VCPU_IDX_MASK) == -1u);
|
||||
|
||||
/*
|
||||
* enable / disable AVIC. Because the defaults differ for APICv
|
||||
* support between VMX and SVM we cannot use module_param_named.
|
||||
*/
|
||||
static bool avic;
|
||||
module_param(avic, bool, 0444);
|
||||
module_param(enable_ipiv, bool, 0444);
|
||||
|
||||
static bool force_avic;
|
||||
module_param_unsafe(force_avic, bool, 0444);
|
||||
|
||||
@@ -1141,15 +1149,9 @@ void avic_vcpu_unblocking(struct kvm_vcpu *vcpu)
|
||||
avic_vcpu_load(vcpu, vcpu->cpu);
|
||||
}
|
||||
|
||||
/*
|
||||
* Note:
|
||||
* - The module param avic enable both xAPIC and x2APIC mode.
|
||||
* - Hypervisor can support both xAVIC and x2AVIC in the same guest.
|
||||
* - The mode can be switched at run-time.
|
||||
*/
|
||||
bool __init avic_hardware_setup(void)
|
||||
static bool __init avic_want_avic_enabled(void)
|
||||
{
|
||||
if (!npt_enabled)
|
||||
if (!avic || !npt_enabled)
|
||||
return false;
|
||||
|
||||
/* AVIC is a prerequisite for x2AVIC. */
|
||||
@@ -1173,6 +1175,21 @@ bool __init avic_hardware_setup(void)
|
||||
if (!boot_cpu_has(X86_FEATURE_AVIC))
|
||||
pr_warn("AVIC unsupported in CPUID but force enabled, your system might crash and burn\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note:
|
||||
* - The module param avic enable both xAPIC and x2APIC mode.
|
||||
* - Hypervisor can support both xAVIC and x2AVIC in the same guest.
|
||||
* - The mode can be switched at run-time.
|
||||
*/
|
||||
bool __init avic_hardware_setup(void)
|
||||
{
|
||||
avic = avic_want_avic_enabled();
|
||||
if (!avic)
|
||||
return false;
|
||||
|
||||
pr_info("AVIC enabled\n");
|
||||
|
||||
/* AVIC is a prerequisite for x2AVIC. */
|
||||
|
||||
@@ -158,14 +158,6 @@ module_param(lbrv, int, 0444);
|
||||
static int tsc_scaling = true;
|
||||
module_param(tsc_scaling, int, 0444);
|
||||
|
||||
/*
|
||||
* enable / disable AVIC. Because the defaults differ for APICv
|
||||
* support between VMX and SVM we cannot use module_param_named.
|
||||
*/
|
||||
static bool avic;
|
||||
module_param(avic, bool, 0444);
|
||||
module_param(enable_ipiv, bool, 0444);
|
||||
|
||||
module_param(enable_device_posted_irqs, bool, 0444);
|
||||
|
||||
bool __read_mostly dump_invalid_vmcb;
|
||||
@@ -5330,8 +5322,7 @@ static __init int svm_hardware_setup(void)
|
||||
goto err;
|
||||
}
|
||||
|
||||
enable_apicv = avic = avic && avic_hardware_setup();
|
||||
|
||||
enable_apicv = avic_hardware_setup();
|
||||
if (!enable_apicv) {
|
||||
enable_ipiv = false;
|
||||
svm_x86_ops.vcpu_blocking = NULL;
|
||||
|
||||
Reference in New Issue
Block a user