lkml.org 
[lkml]   [2021]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe: [PATCH 4/4] KVM: x86/pmu: Refactoring kvm_perf_overflow{_intr}()
From
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

\
 
 \ /
  Last update: 2021-11-18 15:54    [W:0.179 / U:0.716 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site