Messages in this thread | | | Date | Thu, 18 Nov 2021 15:53:30 +0100 | Subject | Re: [PATCH 4/4] KVM: x86/pmu: Refactoring kvm_perf_overflow{_intr}() | From | Paolo Bonzini <> |
| |
On 11/16/21 13:20, Like Xu wrote: > - } > + if (!intr) > + return; > + > + /* > + * Inject PMI. If vcpu was in a guest mode during NMI PMI > + * can be ejected on a guest mode re-entry. Otherwise we can't > + * be sure that vcpu wasn't executing hlt instruction at the > + * time of vmexit and is not going to re-enter guest mode until > + * woken up. So we should wake it, but this is impossible from > + * NMI context. Do it from irq work instead. > + */ > + if (!kvm_is_in_guest()) > + irq_work_queue(&pmc_to_pmu(pmc)->irq_work); > + else > + kvm_make_request(KVM_REQ_PMI, pmc->vcpu); > +} > + > +static void kvm_perf_overflow(struct perf_event *perf_event, > + struct perf_sample_data *data, > + struct pt_regs *regs) > +{ > + struct kvm_pmc *pmc = perf_event->overflow_handler_context; > + struct kvm_pmu *pmu = pmc_to_pmu(pmc); > + > + if (!test_and_set_bit(pmc->idx, pmu->reprogram_pmi)) > + kvm_pmu_counter_overflow(pmc, need_overflow_intr(pmc)); > }
It could be even better to make a single function, but instead of need_overflow_intr(pmc) you should store into pmc from pmc_reprogram_counter. Like this:
/* Ignore counters that have been reported already. */ if (test_and_set_bit(pmc->idx, pmu->reprogram_pmi)) return;
__set_bit(pmc->idx, (unsigned long *)&pmu->global_status); kvm_make_request(KVM_REQ_PMU, pmc->vcpu);
if (pmc->intr) { /* * Inject PMI. If vcpu was in a guest mode during NMI PMI * can be ejected on a guest mode re-entry. Otherwise we can't * be sure that vcpu wasn't executing hlt instruction at the * time of vmexit and is not going to re-enter guest mode until * woken up. So we should wake it, but this is impossible from * NMI context. Do it from irq work instead. */ if (!kvm_is_in_guest()) irq_work_queue(pmu->irq_work); else kvm_make_request(KVM_REQ_PMI, pmc->vcpu); }
Paolo
| |