On Tue, 28 Nov 2023, Shaoqin Huang wrote:
+static void kvm_arm_pmu_filter_init(CPUState *cs) +{ + static bool pmu_filter_init = false; + struct kvm_pmu_event_filter filter; + struct kvm_device_attr attr = { + .group = KVM_ARM_VCPU_PMU_V3_CTRL, + .attr = KVM_ARM_VCPU_PMU_V3_FILTER, + .addr = (uint64_t)&filter, + }; + KVMState *kvm_state = cs->kvm_state; + char *tmp; + char *str, act; + + if (!kvm_state->kvm_pmu_filter) + return; + + if (kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr)) { + error_report("The kernel doesn't support the pmu event filter!\n"); + abort(); + } + + /* The filter only needs to be initialized for 1 vcpu. */ + if (!pmu_filter_init) + pmu_filter_init = true;
Imho this is missing an else to bail out. Or the shorter version if (pmu_filter_init) return; pmu_filter_init = true; which could also move above the other tests. Sebastian