Skip to content

Commit d2401a6

Browse files
trueptolemybonzini
authored andcommitted
target/i386/kvm: Clean up error handling in kvm_arch_init()
Currently, there're following incorrect error handling cases in kvm_arch_init(): * Missed to handle failure of kvm_get_supported_feature_msrs(). * Missed to return when kvm_vm_enable_disable_exits() fails. * MSR filter related cases called exit() directly instead of returning to kvm_init(). (The caller of kvm_arch_init() - kvm_init() - needs to know if kvm_arch_init() fails in order to perform cleanup). Fix the above cases. Signed-off-by: Zhao Liu <[email protected]> Reviewed-by: Zide Chen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Paolo Bonzini <[email protected]>
1 parent d7f895c commit d2401a6

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

target/i386/kvm/kvm.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3162,7 +3162,7 @@ static int kvm_vm_enable_userspace_msr(KVMState *s)
31623162
return 0;
31633163
}
31643164

3165-
static void kvm_vm_enable_energy_msrs(KVMState *s)
3165+
static int kvm_vm_enable_energy_msrs(KVMState *s)
31663166
{
31673167
int ret;
31683168

@@ -3172,33 +3172,33 @@ static void kvm_vm_enable_energy_msrs(KVMState *s)
31723172
if (ret < 0) {
31733173
error_report("Could not install MSR_RAPL_POWER_UNIT handler: %s",
31743174
strerror(-ret));
3175-
exit(1);
3175+
return ret;
31763176
}
31773177

31783178
ret = kvm_filter_msr(s, MSR_PKG_POWER_LIMIT,
31793179
kvm_rdmsr_pkg_power_limit, NULL);
31803180
if (ret < 0) {
31813181
error_report("Could not install MSR_PKG_POWER_LIMIT handler: %s",
31823182
strerror(-ret));
3183-
exit(1);
3183+
return ret;
31843184
}
31853185

31863186
ret = kvm_filter_msr(s, MSR_PKG_POWER_INFO,
31873187
kvm_rdmsr_pkg_power_info, NULL);
31883188
if (ret < 0) {
31893189
error_report("Could not install MSR_PKG_POWER_INFO handler: %s",
31903190
strerror(-ret));
3191-
exit(1);
3191+
return ret;
31923192
}
31933193
ret = kvm_filter_msr(s, MSR_PKG_ENERGY_STATUS,
31943194
kvm_rdmsr_pkg_energy_status, NULL);
31953195
if (ret < 0) {
31963196
error_report("Could not install MSR_PKG_ENERGY_STATUS handler: %s",
31973197
strerror(-ret));
3198-
exit(1);
3198+
return ret;
31993199
}
32003200
}
3201-
return;
3201+
return 0;
32023202
}
32033203

32043204
int kvm_arch_init(MachineState *ms, KVMState *s)
@@ -3265,7 +3265,10 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
32653265
return ret;
32663266
}
32673267

3268-
kvm_get_supported_feature_msrs(s);
3268+
ret = kvm_get_supported_feature_msrs(s);
3269+
if (ret < 0) {
3270+
return ret;
3271+
}
32693272

32703273
uname(&utsname);
32713274
lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0;
@@ -3301,6 +3304,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
33013304
if (ret < 0) {
33023305
error_report("kvm: guest stopping CPU not supported: %s",
33033306
strerror(-ret));
3307+
return ret;
33043308
}
33053309
}
33063310

@@ -3332,12 +3336,15 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
33323336
}
33333337

33343338
if (s->msr_energy.enable == true) {
3335-
kvm_vm_enable_energy_msrs(s);
3339+
ret = kvm_vm_enable_energy_msrs(s);
3340+
if (ret < 0) {
3341+
return ret;
3342+
}
33363343

33373344
ret = kvm_msr_energy_thread_init(s, ms);
33383345
if (ret < 0) {
33393346
error_report("kvm : error RAPL feature requirement not met");
3340-
exit(1);
3347+
return ret;
33413348
}
33423349
}
33433350
}

0 commit comments

Comments
 (0)