All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Li,Rongqing" <lirongqing@baidu.com>
To: Sean Christopherson <sean.j.christopherson@intel.com>,
	Peter Zijlstra <peterz@infradead.org>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"x86@kernel.org" <x86@kernel.org>,
	"hpa@zytor.com" <hpa@zytor.com>, "bp@alien8.de" <bp@alien8.de>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"joro@8bytes.org" <joro@8bytes.org>,
	"jmattson@google.com" <jmattson@google.com>,
	"wanpengli@tencent.com" <wanpengli@tencent.com>,
	"vkuznets@redhat.com" <vkuznets@redhat.com>,
	"pbonzini@redhat.com" <pbonzini@redhat.com>
Subject: 答复: [PATCH] [RFC] kvm: x86: emulate APERF/MPERF registers
Date: Sun, 26 Apr 2020 03:22:35 +0000	[thread overview]
Message-ID: <49b5870b24184a18aaac08382a023b29@baidu.com> (raw)
In-Reply-To: <20200424144625.GB30013@linux.intel.com>

> -----邮件原件-----
> 发件人: Sean Christopherson [mailto:sean.j.christopherson@intel.com]
> 发送时间: 2020年4月24日 22:46
> 收件人: Peter Zijlstra <peterz@infradead.org>
> 抄送: Li,Rongqing <lirongqing@baidu.com>; linux-kernel@vger.kernel.org;
> kvm@vger.kernel.org; x86@kernel.org; hpa@zytor.com; bp@alien8.de;
> mingo@redhat.com; tglx@linutronix.de; joro@8bytes.org;
> jmattson@google.com; wanpengli@tencent.com; vkuznets@redhat.com;
> pbonzini@redhat.com
> 主题: Re: [PATCH] [RFC] kvm: x86: emulate APERF/MPERF registers
> 
> On Fri, Apr 24, 2020 at 12:01:43PM +0200, Peter Zijlstra wrote:
> > On Fri, Apr 24, 2020 at 01:08:55PM +0800, Li RongQing wrote:
> > > diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index
> > > 901cd1fdecd9..00e4993cb338 100644
> > > --- a/arch/x86/kvm/cpuid.c
> > > +++ b/arch/x86/kvm/cpuid.c
> > > @@ -558,7 +558,10 @@ static inline int __do_cpuid_func(struct
> kvm_cpuid_array *array, u32 function)
> > >  	case 6: /* Thermal management */
> > >  		entry->eax = 0x4; /* allow ARAT */
> > >  		entry->ebx = 0;
> > > -		entry->ecx = 0;
> > > +		if (boot_cpu_has(X86_FEATURE_APERFMPERF))
> > > +			entry->ecx = 0x1;
> > > +		else
> > > +			entry->ecx = 0x0;
> > >  		entry->edx = 0;
> > >  		break;
> > >  	/* function 7 has additional index. */
> >
> > AFAICT this is generic x86 code, that is, this will tell an AMD SVM
> > guest it has APERFMPERF on.
> >
> > > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index
> > > 91749f1254e8..f20216fc0b57 100644
> > > --- a/arch/x86/kvm/vmx/vmx.c
> > > +++ b/arch/x86/kvm/vmx/vmx.c
> > > @@ -1064,6 +1064,11 @@ static inline void pt_save_msr(struct pt_ctx
> > > *ctx, u32 addr_range)
> > >
> > >  static void pt_guest_enter(struct vcpu_vmx *vmx)  {
> > > +	struct kvm_vcpu *vcpu = &vmx->vcpu;
> > > +
> > > +	rdmsrl(MSR_IA32_MPERF, vcpu->arch.host_mperf);
> > > +	rdmsrl(MSR_IA32_APERF, vcpu->arch.host_aperf);
> 
> Why are these buried in Processor Trace code?  Is APERFMERF in any way
> dependent on PT?
> 

No;
I will move it out PT codes

> > > +
> > >  	if (vmx_pt_mode_is_system())
> > >  		return;
> > >
> > > @@ -1081,6 +1086,15 @@ static void pt_guest_enter(struct vcpu_vmx
> > > *vmx)
> > >
> > >  static void pt_guest_exit(struct vcpu_vmx *vmx)  {
> > > +	struct kvm_vcpu *vcpu = &vmx->vcpu;
> > > +	u64 perf;
> > > +
> > > +	rdmsrl(MSR_IA32_MPERF, perf);
> > > +	vcpu->arch.v_mperf += perf - vcpu->arch.host_mperf;
> > > +
> > > +	rdmsrl(MSR_IA32_APERF, perf);
> > > +	vcpu->arch.v_aperf += perf - vcpu->arch.host_aperf;
> 
> This requires four RDMSRs per VMX transition.  Doing that unconditionally will
> drastically impact performance.  Not to mention that reading the MSRs
> without checking for host support will generate #GPs and WARNs on hardware
> without APERFMPERF.
> 
> Assuming we're going forward with this, at an absolute minimum the RDMSRs
> need to be wrapped with checks on host _and_ guest support for the emulated
> behavior.  Given the significant overhead, this might even be something that
> should require an extra opt-in from userspace to enable.
> 

will do as your suggestion 

> > > +
> > >  	if (vmx_pt_mode_is_system())
> > >  		return;
> > >
> > > @@ -1914,6 +1928,12 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu,
> struct msr_data *msr_info)
> > >  		    !guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP))
> > >  			return 1;
> > >  		goto find_shared_msr;
> > > +	case MSR_IA32_MPERF:
> > > +		msr_info->data = vcpu->arch.v_mperf;
> > > +		break;
> > > +	case MSR_IA32_APERF:
> > > +		msr_info->data = vcpu->arch.v_aperf;
> > > +		break;
> > >  	default:
> > >  	find_shared_msr:
> > >  		msr = find_msr_entry(vmx, msr_info->index);
> >
> > But then here you only emulate it for VMX, which then results in SVM
> > guests going wobbly.
> 
> Ya.

I will make this code suitable for AMD and Intel cpu

> 
> > Also, on Intel, the moment you advertise APERFMPERF, we'll try and
> > read MSR_PLATFORM_INFO / MSR_TURBO_RATIO_LIMIT*, I don't suppose
> > you're passing those through as well?
> 
> AFAICT, the proposed patch isn't fully advertising APERFMPERF, it's advertising
> Turbo Boost / Dynamic Acceleration to the guest when APERFMPERF can be
> used by the host to emulate IDA.  The transliteration of the above code to be
> VMX-only is:

Do you means when we forward APERFMPERF to guest , guest has similar IDA capability,
 and not need to consider MSR_PLATFORM_INFO / MSR_TURBO_RATIO_LIMIT* ?

-Li
> 
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index
> 766303b31949..7e459b66b06e 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -7191,6 +7191,9 @@ static __init void vmx_set_cpu_caps(void)
>         if (nested)
>                 kvm_cpu_cap_set(X86_FEATURE_VMX);
> 
> +       if (boot_cpu_has(X86_FEATURE_APERFMPERF))
> +               kvm_cpu_cap_set(X86_FEATURE_IDA);
> +
>         /* CPUID 0x7 */
>         if (kvm_mpx_supported())
>                 kvm_cpu_cap_check_and_set(X86_FEATURE_MPX);
> 
> I have no clue as to whether that's sane/correct.

  parent reply	other threads:[~2020-04-26  4:09 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-24  5:08 [PATCH] [RFC] kvm: x86: emulate APERF/MPERF registers Li RongQing
2020-04-24 10:01 ` Peter Zijlstra
2020-04-24 14:46   ` Sean Christopherson
2020-04-24 16:25     ` Jim Mattson
2020-04-24 16:30       ` Paolo Bonzini
2020-04-26  3:24         ` 答复: " Li,Rongqing
2020-04-27 17:30           ` Jim Mattson
2020-04-27 19:10             ` Paolo Bonzini
2020-04-26  3:22     ` Li,Rongqing [this message]
2020-04-26  8:30   ` 答复: " Li,Rongqing

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49b5870b24184a18aaac08382a023b29@baidu.com \
    --to=lirongqing@baidu.com \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=sean.j.christopherson@intel.com \
    --cc=tglx@linutronix.de \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.