target/i386/kvm: Clean up return values of MSR filter related functions

Before commit 0cc42e63bb54 ("kvm/i386: refactor kvm_arch_init and split
it into smaller functions"), error_report() attempts to print the error
code from kvm_filter_msr(). However, printing error code does not work
due to kvm_filter_msr() returns bool instead int.

0cc42e63bb54 fixed the error by removing error code printing, but this
lost useful error messages. Bring it back by making kvm_filter_msr()
return int.

This also makes the function call chain processing clearer, allowing for
better handling of error result propagation from kvm_filter_msr() to
kvm_arch_init(), preparing for the subsequent cleanup work of error
handling in kvm_arch_init().

Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Reviewed-by: Zide Chen <zide.chen@intel.com>
Link: https://lore.kernel.org/r/20241106030728.553238-9-zhao1.liu@intel.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Zhao Liu 2024-11-06 11:07:25 +08:00 committed by Paolo Bonzini
parent 26824f9cac
commit fb81c9cfdd

View File

@ -108,7 +108,7 @@ typedef struct {
} KVMMSRHandlers;
static void kvm_init_msrs(X86CPU *cpu);
static bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
static int kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
QEMUWRMSRHandler *wrmsr);
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
@ -3150,7 +3150,9 @@ static int kvm_vm_enable_notify_vmexit(KVMState *s)
static int kvm_vm_enable_userspace_msr(KVMState *s)
{
int ret = kvm_vm_enable_cap(s, KVM_CAP_X86_USER_SPACE_MSR, 0,
int ret;
ret = kvm_vm_enable_cap(s, KVM_CAP_X86_USER_SPACE_MSR, 0,
KVM_MSR_EXIT_REASON_FILTER);
if (ret < 0) {
error_report("Could not enable user space MSRs: %s",
@ -3158,9 +3160,11 @@ static int kvm_vm_enable_userspace_msr(KVMState *s)
exit(1);
}
if (!kvm_filter_msr(s, MSR_CORE_THREAD_COUNT,
kvm_rdmsr_core_thread_count, NULL)) {
error_report("Could not install MSR_CORE_THREAD_COUNT handler!");
ret = kvm_filter_msr(s, MSR_CORE_THREAD_COUNT,
kvm_rdmsr_core_thread_count, NULL);
if (ret < 0) {
error_report("Could not install MSR_CORE_THREAD_COUNT handler: %s",
strerror(-ret));
exit(1);
}
@ -3169,36 +3173,37 @@ static int kvm_vm_enable_userspace_msr(KVMState *s)
static void kvm_vm_enable_energy_msrs(KVMState *s)
{
bool r;
int ret;
if (s->msr_energy.enable == true) {
r = kvm_filter_msr(s, MSR_RAPL_POWER_UNIT,
ret = kvm_filter_msr(s, MSR_RAPL_POWER_UNIT,
kvm_rdmsr_rapl_power_unit, NULL);
if (!r) {
error_report("Could not install MSR_RAPL_POWER_UNIT \
handler");
if (ret < 0) {
error_report("Could not install MSR_RAPL_POWER_UNIT handler: %s",
strerror(-ret));
exit(1);
}
r = kvm_filter_msr(s, MSR_PKG_POWER_LIMIT,
ret = kvm_filter_msr(s, MSR_PKG_POWER_LIMIT,
kvm_rdmsr_pkg_power_limit, NULL);
if (!r) {
error_report("Could not install MSR_PKG_POWER_LIMIT \
handler");
if (ret < 0) {
error_report("Could not install MSR_PKG_POWER_LIMIT handler: %s",
strerror(-ret));
exit(1);
}
r = kvm_filter_msr(s, MSR_PKG_POWER_INFO,
ret = kvm_filter_msr(s, MSR_PKG_POWER_INFO,
kvm_rdmsr_pkg_power_info, NULL);
if (!r) {
error_report("Could not install MSR_PKG_POWER_INFO \
handler");
if (ret < 0) {
error_report("Could not install MSR_PKG_POWER_INFO handler: %s",
strerror(-ret));
exit(1);
}
r = kvm_filter_msr(s, MSR_PKG_ENERGY_STATUS,
ret = kvm_filter_msr(s, MSR_PKG_ENERGY_STATUS,
kvm_rdmsr_pkg_energy_status, NULL);
if (!r) {
error_report("Could not install MSR_PKG_ENERGY_STATUS \
handler");
if (ret < 0) {
error_report("Could not install MSR_PKG_ENERGY_STATUS handler: %s",
strerror(-ret));
exit(1);
}
}
@ -5841,13 +5846,13 @@ void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg)
}
}
static bool kvm_install_msr_filters(KVMState *s)
static int kvm_install_msr_filters(KVMState *s)
{
uint64_t zero = 0;
struct kvm_msr_filter filter = {
.flags = KVM_MSR_FILTER_DEFAULT_ALLOW,
};
int r, i, j = 0;
int i, j = 0;
for (i = 0; i < KVM_MSR_FILTER_MAX_RANGES; i++) {
KVMMSRHandlers *handler = &msr_handlers[i];
@ -5871,18 +5876,13 @@ static bool kvm_install_msr_filters(KVMState *s)
}
}
r = kvm_vm_ioctl(s, KVM_X86_SET_MSR_FILTER, &filter);
if (r) {
return false;
return kvm_vm_ioctl(s, KVM_X86_SET_MSR_FILTER, &filter);
}
return true;
}
static bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
static int kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
QEMUWRMSRHandler *wrmsr)
{
int i;
int i, ret;
for (i = 0; i < ARRAY_SIZE(msr_handlers); i++) {
if (!msr_handlers[i].msr) {
@ -5892,16 +5892,17 @@ static bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
.wrmsr = wrmsr,
};
if (!kvm_install_msr_filters(s)) {
ret = kvm_install_msr_filters(s);
if (ret) {
msr_handlers[i] = (KVMMSRHandlers) { };
return false;
return ret;
}
return true;
return 0;
}
}
return false;
return -EINVAL;
}
static int kvm_handle_rdmsr(X86CPU *cpu, struct kvm_run *run)