From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: <pbonzini@redhat.com>, <joro@8bytes.org>, <bp@alien8.de>,
<gleb@kernel.org>, <alex.williamson@redhat.com>,
<kvm@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<wei@redhat.com>, <sherry.hurwitz@amd.com>
Subject: Re: [PART1 RFC v3 10/12] svm: Do not expose x2APIC when enable AVIC
Date: Thu, 31 Mar 2016 11:15:36 +0700 [thread overview]
Message-ID: <56FCA468.8090406@amd.com> (raw)
In-Reply-To: <20160318205948.GA26119@potion.brq.redhat.com>
Hi Radim,
On 03/19/2016 03:59 AM, Radim Krčmář wrote:
> 2016-03-18 01:09-0500, Suravee Suthikulpanit:
>> From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
>>
>> Since AVIC only virtualizes xAPIC hardware for the guest, we need to:
>> * Intercept APIC BAR msr accesses to disable x2APIC
>> * Intercept CPUID access to not advertise x2APIC support
>> * Hide x2APIC support when checking via KVM ioctl
>>
>> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
>> ---
>> arch/x86/kvm/svm.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 42 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
>> index 6303147..ba84d57 100644
>> --- a/arch/x86/kvm/svm.c
>> +++ b/arch/x86/kvm/svm.c
>> @@ -209,6 +209,7 @@ static const struct svm_direct_access_msrs {
>> { .index = MSR_IA32_LASTBRANCHTOIP, .always = false },
>> { .index = MSR_IA32_LASTINTFROMIP, .always = false },
>> { .index = MSR_IA32_LASTINTTOIP, .always = false },
>> + { .index = MSR_IA32_APICBASE, .always = false },
>> { .index = MSR_INVALID, .always = false },
>> };
>>
>> @@ -853,6 +854,9 @@ static void svm_vcpu_init_msrpm(u32 *msrpm)
>>
>> set_msr_interception(msrpm, direct_access_msrs[i].index, 1, 1);
>> }
>> +
>> + if (svm_vcpu_avic_enabled(svm))
>> + set_msr_interception(msrpm, MSR_IA32_APICBASE, 1, 1);
>
> AVIC really won't exit on writes to MSR_IA32_APICBASE otherwise?
Actually, I got confused about this part. This should not be needed.
>
>> @@ -3308,6 +3312,18 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>> msr_info->data = 0x1E;
>> }
>> break;
>> + case MSR_IA32_APICBASE:
>> + if (svm_vcpu_avic_enabled(svm)) {
>> + /* Note:
>> + * For AVIC, we need to disable X2APIC
>> + * and enable XAPIC
>> + */
>> + kvm_get_msr_common(vcpu, msr_info);
>> + msr_info->data &= ~X2APIC_ENABLE;
>> + msr_info->data |= XAPIC_ENABLE;
>> + break;
>
> No. This won't make the guest switch to xAPIC.
> x2APIC can only be enabled if CPUID has that flag and it's impossible to
> toggle that CPUID flag it during runtime.
This is also not needed since we already disable the x2APIC in the CPUID
below.
>> + }
>> + /* Follow through if not AVIC */
>> default:
>> return kvm_get_msr_common(vcpu, msr_info);
>> }
>> @@ -3436,6 +3452,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
>> case MSR_VM_IGNNE:
>> vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data);
>> break;
>> + case MSR_IA32_APICBASE:
>> + if (svm_vcpu_avic_enabled(svm))
>> + avic_update_vapic_bar(to_svm(vcpu), data);
>
> There is no connection to x2APIC, please do it in a different patch.
Right. I'll move this.
>
>> + /* Follow through */
>> default:
>> return kvm_set_msr_common(vcpu, msr);
>> }
>> @@ -4554,11 +4574,26 @@ static void svm_cpuid_update(struct kvm_vcpu *vcpu)
>>
>> /* Update nrips enabled cache */
>> svm->nrips_enabled = !!guest_cpuid_has_nrips(&svm->vcpu);
>> +
>> + /* Do not support X2APIC when enable AVIC */
>> + if (svm_vcpu_avic_enabled(svm)) {
>> + int i;
>> +
>> + for (i = 0 ; i < vcpu->arch.cpuid_nent ; i++) {
>> + if (vcpu->arch.cpuid_entries[i].function == 1)
>
> Please use kvm_find_cpuid_entry for the search.
>
>> + vcpu->arch.cpuid_entries[i].ecx &= ~(1 << 21);
>
> and X86_FEATURE_X2APIC (or something with X2APIC in name) for the bit.
>
> The code will become so obvious that the comment can be removed. :)
Good point. I can only find example of using (X86_FEATURE_X2APIC % 32)
== 21.
>> + }
>> + }
>> }
>>
>> static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
>> {
>> switch (func) {
>> + case 0x00000001:
>> + /* Do not support X2APIC when enable AVIC */
>> + if (avic)
>> + entry->ecx &= ~(1 << 21);
>
> I think this might be the right place for the code you have in
> svm_cpuid_update.
Right. I'll also make change to use (X86_FEATURE_X2APIC % 32)
> Btw. how does x2APIC behave under AVIC?
> We definitely shouldn't recommend/expose x2APIC with AVIC as AVIC
> doesn't accelerate x2APIC guest-facing interface,
Access to offset 0x400+ would generate #VMEXIT no accel fault
read/write. So, we will need to handle and emulate this in the host.
> but the MSR interface is going to exit and host-side interrupt
> delivery will probably still work, so I don't see
> a huge problem with it.
Agree that it will still work. However, in such case, the guest code
would likely default to using x2APIC interface, which will not be
handled by the AVIC hardware, and resulting in no performance
improvement that we are trying to introduce.
Thanks,
Suravee
next prev parent reply other threads:[~2016-03-31 4:15 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-18 6:09 [PART1 RFC v3 00/12] KVM: x86: Introduce SVM AVIC support Suravee Suthikulpanit
2016-03-18 6:09 ` [PART1 RFC v3 01/12] KVM: x86: Misc LAPIC changes to expose helper functions Suravee Suthikulpanit
2016-03-18 11:16 ` Paolo Bonzini
2016-03-18 6:09 ` [PART1 RFC v3 02/12] KVM: x86: Introducing kvm_x86_ops VM init/uninit hooks Suravee Suthikulpanit
2016-03-18 10:11 ` Paolo Bonzini
2016-03-29 5:27 ` Suravee Suthikulpanit
2016-03-29 10:21 ` Paolo Bonzini
2016-03-29 11:47 ` Suravee Suthikulpanit
2016-03-30 10:00 ` Suravee Suthikulpanit
2016-03-30 12:07 ` Paolo Bonzini
2016-03-30 12:18 ` Suravee Suthikulpanit
2016-03-18 6:09 ` [PART1 RFC v3 03/12] KVM: x86: Introducing kvm_x86_ops VCPU blocking/unblocking hooks Suravee Suthikulpanit
2016-03-18 10:11 ` Paolo Bonzini
2016-03-18 6:09 ` [PART1 RFC v3 04/12] KVM: split kvm_vcpu_wake_up from kvm_vcpu_kick Suravee Suthikulpanit
2016-03-18 10:11 ` Paolo Bonzini
2016-03-18 6:09 ` [PART1 RFC v3 05/12] svm: Introduce new AVIC VMCB registers Suravee Suthikulpanit
2016-03-18 10:11 ` Paolo Bonzini
2016-03-18 6:09 ` [PART1 RFC v3 06/12] KVM: x86: Detect and Initialize AVIC support Suravee Suthikulpanit
2016-03-18 11:21 ` Paolo Bonzini
2016-03-18 6:09 ` [PART1 RFC v3 07/12] svm: Add interrupt injection via AVIC Suravee Suthikulpanit
2016-03-18 10:22 ` Paolo Bonzini
2016-04-05 13:26 ` Suravee Suthikulpanit
2016-04-05 15:56 ` Suravee Suthikulpanit
2016-03-18 6:09 ` [PART1 RFC v3 08/12] KVM: x86: Add trace events for AVIC Suravee Suthikulpanit
2016-03-18 10:24 ` Paolo Bonzini
2016-03-28 11:27 ` Suravee Suthikulpanit
2016-03-18 6:09 ` [PART1 RFC v3 09/12] svm: Add VMEXIT handlers " Suravee Suthikulpanit
2016-03-18 11:11 ` Paolo Bonzini
2016-03-18 6:09 ` [PART1 RFC v3 10/12] svm: Do not expose x2APIC when enable AVIC Suravee Suthikulpanit
2016-03-18 20:59 ` Radim Krčmář
2016-03-31 4:15 ` Suravee Suthikulpanit [this message]
2016-03-31 11:23 ` Paolo Bonzini
2016-04-05 10:14 ` Suravee Suthikulpanit
2016-03-18 6:09 ` [PART1 RFC v3 11/12] svm: Do not intercept CR8 " Suravee Suthikulpanit
2016-03-18 21:10 ` Radim Krčmář
2016-03-30 12:15 ` Suravee Suthikulpanit
2016-03-18 6:09 ` [PART1 RFC v3 12/12] svm: Manage vcpu load/unload " Suravee Suthikulpanit
2016-03-18 21:44 ` Radim Krčmář
2016-03-31 8:52 ` Suravee Suthikulpanit
2016-03-31 14:19 ` Radim Krčmář
2016-04-05 10:07 ` Suravee Suthikulpanit
2016-04-05 14:56 ` Radim Krčmář
2016-04-06 3:40 ` Suravee Suthikulpanit
2016-04-06 12:36 ` Radim Krčmář
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=56FCA468.8090406@amd.com \
--to=suravee.suthikulpanit@amd.com \
--cc=alex.williamson@redhat.com \
--cc=bp@alien8.de \
--cc=gleb@kernel.org \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=rkrcmar@redhat.com \
--cc=sherry.hurwitz@amd.com \
--cc=wei@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).