lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Yw5N+eGfOsCgtHpw@google.com>
Date:   Tue, 30 Aug 2022 17:50:49 +0000
From:   Sean Christopherson <seanjc@...gle.com>
To:     Like Xu <like.xu.linux@...il.com>
Cc:     Paolo Bonzini <pbonzini@...hat.com>,
        Jim Mattson <jmattson@...gle.com>,
        linux-kernel@...r.kernel.org, kvm@...r.kernel.org
Subject: Re: [PATCH RESEND v2 5/8] KVM: x86/pmu: Defer reprogram_counter() to
 kvm_pmu_handle_event()

On Tue, Aug 23, 2022, Like Xu wrote:
> From: Like Xu <likexu@...cent.com>
> 
> During a KVM-trap from vm-exit to vm-entry, requests from different
> sources will try to create one or more perf_events via reprogram_counter(),
> which will allow some predecessor actions to be undone posteriorly,
> especially repeated calls to some perf subsystem interfaces. These
> repetitive calls can be omitted because only the final state of the
> perf_event and the hardware resources it occupies will take effect
> for the guest right before the vm-entry.
> 
> To realize this optimization, KVM marks the creation requirements via
> an inline version of reprogram_counter(), and then defers the actual
> execution with the help of vcpu KVM_REQ_PMU request.

Use imperative mood and state what change is being made, not what KVM's behavior
is as a result of the change.

And this is way more complicated than it needs to be, and it also neglects to
call out that the deferred logic is needed for a bug fix.  IIUC:

  Batch reprogramming PMU counters by setting KVM_REQ_PMU and thus deferring
  reprogramming kvm_pmu_handle_event() to avoid reprogramming a counter
  multiple times during a single VM-Exit.

  Deferring programming will also allow KVM to fix a bug where immediately
  reprogramming a counter can result in sleeping (taking a mutex) while
  interrupts are disabled in the VM-Exit fastpath.

> Opportunistically update related comments to avoid misunderstandings.
> 
> diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
> index d9b9a0f0db17..6940cbeee54d 100644
> --- a/arch/x86/kvm/pmu.c
> +++ b/arch/x86/kvm/pmu.c
> @@ -101,7 +101,7 @@ static inline void __kvm_perf_overflow(struct kvm_pmc *pmc, bool in_pmi)
>  	struct kvm_pmu *pmu = pmc_to_pmu(pmc);
>  	bool skip_pmi = false;
>  
> -	/* Ignore counters that have been reprogrammed already. */
> +	/* Ignore counters that have not been reprogrammed. */

Eh, just drop this comment, it's fairly obvious what the code is doing and your
suggested comment is wrong in the sense that the counters haven't actually been
reprogrammed, i.e. it should be:

	/* Ignore counters that don't need to be reprogrammed. */

but IMO that's pretty obvious.

>  	if (test_and_set_bit(pmc->idx, pmu->reprogram_pmi))
>  		return;
>  
> @@ -293,7 +293,7 @@ static bool check_pmu_event_filter(struct kvm_pmc *pmc)
>  	return allow_event;
>  }
>  
> -void reprogram_counter(struct kvm_pmc *pmc)
> +static void __reprogram_counter(struct kvm_pmc *pmc)

This is misleading.  Double-underscore variants are usually inner helpers, whereas
these have a different relationship.

Instaed of renaming reprogram_counter(), how about introcuing

	kvm_pmu_request_counter_reprogam()

to make it obvious that KVM is _requesting_ a reprogram and not actually doing
the reprogram.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ