Skip to content

Commit b146653

Browse files
committed
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) <[email protected]> Tested-by: Naveen N Rao (AMD) <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent ad65dca commit b146653

File tree

2 files changed

+26
-18
lines changed

2 files changed

+26
-18
lines changed

arch/x86/kvm/svm/avic.c

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@
6464

6565
static_assert(__AVIC_GATAG(AVIC_VM_ID_MASK, AVIC_VCPU_IDX_MASK) == -1u);
6666

67+
/*
68+
* enable / disable AVIC. Because the defaults differ for APICv
69+
* support between VMX and SVM we cannot use module_param_named.
70+
*/
71+
static bool avic;
72+
module_param(avic, bool, 0444);
73+
module_param(enable_ipiv, bool, 0444);
74+
6775
static bool force_avic;
6876
module_param_unsafe(force_avic, bool, 0444);
6977

@@ -1141,15 +1149,9 @@ void avic_vcpu_unblocking(struct kvm_vcpu *vcpu)
11411149
avic_vcpu_load(vcpu, vcpu->cpu);
11421150
}
11431151

1144-
/*
1145-
* Note:
1146-
* - The module param avic enable both xAPIC and x2APIC mode.
1147-
* - Hypervisor can support both xAVIC and x2AVIC in the same guest.
1148-
* - The mode can be switched at run-time.
1149-
*/
1150-
bool __init avic_hardware_setup(void)
1152+
static bool __init avic_want_avic_enabled(void)
11511153
{
1152-
if (!npt_enabled)
1154+
if (!avic || !npt_enabled)
11531155
return false;
11541156

11551157
/* AVIC is a prerequisite for x2AVIC. */
@@ -1173,6 +1175,21 @@ bool __init avic_hardware_setup(void)
11731175
if (!boot_cpu_has(X86_FEATURE_AVIC))
11741176
pr_warn("AVIC unsupported in CPUID but force enabled, your system might crash and burn\n");
11751177

1178+
return true;
1179+
}
1180+
1181+
/*
1182+
* Note:
1183+
* - The module param avic enable both xAPIC and x2APIC mode.
1184+
* - Hypervisor can support both xAVIC and x2AVIC in the same guest.
1185+
* - The mode can be switched at run-time.
1186+
*/
1187+
bool __init avic_hardware_setup(void)
1188+
{
1189+
avic = avic_want_avic_enabled();
1190+
if (!avic)
1191+
return false;
1192+
11761193
pr_info("AVIC enabled\n");
11771194

11781195
/* AVIC is a prerequisite for x2AVIC. */

arch/x86/kvm/svm/svm.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,6 @@ module_param(lbrv, int, 0444);
158158
static int tsc_scaling = true;
159159
module_param(tsc_scaling, int, 0444);
160160

161-
/*
162-
* enable / disable AVIC. Because the defaults differ for APICv
163-
* support between VMX and SVM we cannot use module_param_named.
164-
*/
165-
static bool avic;
166-
module_param(avic, bool, 0444);
167-
module_param(enable_ipiv, bool, 0444);
168-
169161
module_param(enable_device_posted_irqs, bool, 0444);
170162

171163
bool __read_mostly dump_invalid_vmcb;
@@ -5330,8 +5322,7 @@ static __init int svm_hardware_setup(void)
53305322
goto err;
53315323
}
53325324

5333-
enable_apicv = avic = avic && avic_hardware_setup();
5334-
5325+
enable_apicv = avic_hardware_setup();
53355326
if (!enable_apicv) {
53365327
enable_ipiv = false;
53375328
svm_x86_ops.vcpu_blocking = NULL;

0 commit comments

Comments
 (0)