@samitouri / QOSamiQemu / commits / b3f0a55576

i386/kvm: avoid installing duplicate msr entries in msr_handlers

kvm_filter_msr() does not check if an msr entry is already present in the msr_handlers table and installs a new handler unconditionally. If the function is called again with the same MSR, it will result in duplicate entries in the table and multiple such calls will fill up the table needlessly. Fix that. Signed-off-by: Ani Sinha <anisinha@redhat.com> Link: https://lore.kernel.org/r/20260225035000.385950-2-anisinha@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Ani Sinha committed Feb 25, 2026 at 09:19 UTC b3f0a55576434245906e85b43be4eeb21b198b6a
1 file changed +16 -10
target/i386/kvm/kvm.c
+16 -10
@@ -6273,27 +6273,33 @@ static int kvm_install_msr_filters(KVMState *s)
6273 static int kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
6274 QEMUWRMSRHandler *wrmsr)
6275 {
6276 - int i, ret;
6276 + int i, ret = 0;
6277
6278 for (i = 0; i < ARRAY_SIZE(msr_handlers); i++) {
6279 - if (!msr_handlers[i].msr) {
6279 + if (msr_handlers[i].msr == msr) {
6280 + break;
6281 + } else if (!msr_handlers[i].msr) {
6282 msr_handlers[i] = (KVMMSRHandlers) {
6283 .msr = msr,
6284 .rdmsr = rdmsr,
6285 .wrmsr = wrmsr,
6286 };
6287 + break;
6288 + }
6289 + }
6290
6286 - ret = kvm_install_msr_filters(s);
6287 - if (ret) {
6288 - msr_handlers[i] = (KVMMSRHandlers) { };
6289 - return ret;
6290 - }
6291 + if (i == ARRAY_SIZE(msr_handlers)) {
6292 + ret = -EINVAL;
6293 + goto end;
6294 + }
6295
6292 - return 0;
6293 - }
6296 + ret = kvm_install_msr_filters(s);
6297 + if (ret) {
6298 + msr_handlers[i] = (KVMMSRHandlers) { };
6299 }
6300
6296 - return -EINVAL;
6301 + end:
6302 + return ret;
6303 }
6304
6305 static int kvm_handle_rdmsr(X86CPU *cpu, struct kvm_run *run)