[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <0008cb01-9100-6664-2cb8-e1c741f69a77@redhat.com>
Date: Thu, 18 Nov 2021 15:53:30 +0100
From: Paolo Bonzini <pbonzini@...hat.com>
To: Like Xu <like.xu.linux@...il.com>,
Jim Mattson <jmattson@...gle.com>
Cc: Sean Christopherson <seanjc@...gle.com>,
Vitaly Kuznetsov <vkuznets@...hat.com>,
Wanpeng Li <wanpengli@...cent.com>,
Joerg Roedel <joro@...tes.org>, kvm@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH 4/4] KVM: x86/pmu: Refactoring kvm_perf_overflow{_intr}()
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
Powered by blists - more mailing lists