Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1373140 > unrolled thread

[PART1 RFC v4 09/11] svm: Do not expose x2APIC when enable AVIC

Started bySuravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
First post2016-04-07 10:30 +0200
Last post2016-04-13 00:10 +0200
Articles 3 — 3 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PART1 RFC v4 09/11] svm: Do not expose x2APIC when enable AVIC Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> - 2016-04-07 10:30 +0200
    Re: [PART1 RFC v4 09/11] svm: Do not expose x2APIC when enable AVIC Radim Krčmář <rkrcmar@redhat.com> - 2016-04-11 23:00 +0200
      Re: [PART1 RFC v4 09/11] svm: Do not expose x2APIC when enable AVIC Paolo Bonzini <pbonzini@redhat.com> - 2016-04-13 00:10 +0200

#1373140 — [PART1 RFC v4 09/11] svm: Do not expose x2APIC when enable AVIC

FromSuravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Date2016-04-07 10:30 +0200
Subject[PART1 RFC v4 09/11] svm: Do not expose x2APIC when enable AVIC
Message-ID<rldua-10J-7@gated-at.bofh.it>
From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>

Since AVIC only virtualizes xAPIC hardware for the guest, this patch
disable x2APIC support in guest CPUID.

Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
---
 arch/x86/kvm/svm.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 13fba3b..74b0751 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -4560,14 +4560,26 @@ static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
 static void svm_cpuid_update(struct kvm_vcpu *vcpu)
 {
 	struct vcpu_svm *svm = to_svm(vcpu);
+	struct kvm_cpuid_entry2 *entry;
 
 	/* Update nrips enabled cache */
 	svm->nrips_enabled = !!guest_cpuid_has_nrips(&svm->vcpu);
+
+	if (!svm_vcpu_avic_enabled(svm))
+		return;
+
+	entry = kvm_find_cpuid_entry(vcpu, 0x1, 0);
+	if (entry->function == 1)
+		entry->ecx &= ~bit(X86_FEATURE_X2APIC);
 }
 
 static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
 {
 	switch (func) {
+	case 0x00000001:
+		if (avic)
+			entry->ecx &= ~bit(X86_FEATURE_X2APIC);
+		break;
 	case 0x80000001:
 		if (nested)
 			entry->ecx |= (1 << 2); /* Set SVM bit */
-- 
1.9.1

[toc] | [next] | [standalone]


#1376284

FromRadim Krčmář <rkrcmar@redhat.com>
Date2016-04-11 23:00 +0200
Message-ID<rmR6a-3xa-3@gated-at.bofh.it>
In reply to#1373140
2016-04-07 03:20-0500, Suravee Suthikulpanit:
> From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
> 
> Since AVIC only virtualizes xAPIC hardware for the guest, this patch
> disable x2APIC support in guest CPUID.
> 
> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
> ---
> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
> @@ -4560,14 +4560,26 @@ static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
>  static void svm_cpuid_update(struct kvm_vcpu *vcpu)
>  {
>  	struct vcpu_svm *svm = to_svm(vcpu);
> +	struct kvm_cpuid_entry2 *entry;
>  
>  	/* Update nrips enabled cache */
>  	svm->nrips_enabled = !!guest_cpuid_has_nrips(&svm->vcpu);
> +
> +	if (!svm_vcpu_avic_enabled(svm))
> +		return;
> +
> +	entry = kvm_find_cpuid_entry(vcpu, 0x1, 0);
> +	if (entry->function == 1)

entry->function == 1 will always be true, because entry can be NULL
otherwise, so we would bug before.  Check for entry.

> +		entry->ecx &= ~bit(X86_FEATURE_X2APIC);
>  }
>  
>  static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
>  {
>  	switch (func) {
> +	case 0x00000001:

("case 1:" or "case 0x1:" would be easier to read.)

> +		if (avic)
> +			entry->ecx &= ~bit(X86_FEATURE_X2APIC);
> +		break;


---
A rant for the unlikely case I get back to fix the broader situation:
Only one of these two additions is needed.  If we do the second one,
then userspace should not set X2APIC, therefore the first one is
useless.

Omitting the second one allows userspace to clear apicv_active and set
X86_FEATURE_X2APIC, but it needs a non-intuitive order of ioctls, so I
think we should have the second one.

The problem is that KVM doesn't seems to check whether userspace sets
cpuid that is a subset of supported ones, so omitting the first one
needlessly expands the space for potential failures.

[toc] | [prev] | [next] | [standalone]


#1377347

FromPaolo Bonzini <pbonzini@redhat.com>
Date2016-04-13 00:10 +0200
Message-ID<rneFs-6vF-9@gated-at.bofh.it>
In reply to#1376284

On 11/04/2016 22:54, Radim Krčmář wrote:
>> >  
>> >  static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
>> >  {
>> >  	switch (func) {
>> > +	case 0x00000001:
> ("case 1:" or "case 0x1:" would be easier to read.)
> 
>> > +		if (avic)
>> > +			entry->ecx &= ~bit(X86_FEATURE_X2APIC);
>> > +		break;
> 
> ---
> A rant for the unlikely case I get back to fix the broader situation:
> Only one of these two additions is needed.  If we do the second one,
> then userspace should not set X2APIC, therefore the first one is
> useless.
> 
> Omitting the second one allows userspace to clear apicv_active and set
> X86_FEATURE_X2APIC, but it needs a non-intuitive order of ioctls, so I
> think we should have the second one.
> 
> The problem is that KVM doesn't seems to check whether userspace sets
> cpuid that is a subset of supported ones, so omitting the first one
> needlessly expands the space for potential failures.

Yes, we need both.

Paolo

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web