Message ID | 1360755761-725-1-git-send-email-bp@alien8.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Feb 13, 2013 at 12:42:41PM +0100, Borislav Petkov wrote: > From: Borislav Petkov <bp@suse.de> > > The "x86, AMD: Enable WC+ memory type on family 10 processors" patch > currently in -tip added a workaround for AMD F10h CPUs which #GPs my > guest when booted in kvm. This is because it accesses MSR_AMD64_BU_CFG2 > which is not currently ignored by kvm. Do that because this MSR is only > baremetal-relevant anyway. While at it, move the ignored MSRs at the > beginning of kvm_set_msr_common so that we exit then and there. > Is your guest compiled without PV support? With PV Linux traps #GP for all MSRs and it saves us in more than one places. > Signed-off-by: Borislav Petkov <bp@suse.de> > Cc: Boris Ostrovsky <boris.ostrovsky@amd.com> > Cc: Andre Przywara <andre@andrep.de> > Cc: Marcelo Tosatti <mtosatti@redhat.com> > Cc: Gleb Natapov <gleb@redhat.com> > --- > arch/x86/kvm/x86.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index c243b81e3c74..37040079cd6b 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -1881,6 +1881,14 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > u64 data = msr_info->data; > > switch (msr) { > + case MSR_AMD64_NB_CFG: > + case MSR_IA32_UCODE_REV: > + case MSR_IA32_UCODE_WRITE: > + case MSR_VM_HSAVE_PA: > + case MSR_AMD64_PATCH_LOADER: > + case MSR_AMD64_BU_CFG2: > + break; > + > case MSR_EFER: > return set_efer(vcpu, data); > case MSR_K7_HWCR: > @@ -1900,8 +1908,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > return 1; > } > break; > - case MSR_AMD64_NB_CFG: > - break; > case MSR_IA32_DEBUGCTLMSR: > if (!data) { > /* We support the non-activated case already */ > @@ -1914,11 +1920,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > vcpu_unimpl(vcpu, "%s: MSR_IA32_DEBUGCTLMSR 0x%llx, nop\n", > __func__, data); > break; > - case MSR_IA32_UCODE_REV: > - case MSR_IA32_UCODE_WRITE: > - case MSR_VM_HSAVE_PA: > - case MSR_AMD64_PATCH_LOADER: > - break; > case 0x200 ... 0x2ff: > return set_msr_mtrr(vcpu, msr, data); > case MSR_IA32_APICBASE: > @@ -2253,6 +2254,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) > case MSR_K8_INT_PENDING_MSG: > case MSR_AMD64_NB_CFG: > case MSR_FAM10H_MMIO_CONF_BASE: > + case MSR_AMD64_BU_CFG2: > data = 0; > break; > case MSR_P6_PERFCTR0: > -- > 1.8.1.3.535.ga923c31 -- Gleb. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Feb 13, 2013 at 01:47:47PM +0200, Gleb Natapov wrote: > On Wed, Feb 13, 2013 at 12:42:41PM +0100, Borislav Petkov wrote: > > From: Borislav Petkov <bp@suse.de> > > > > The "x86, AMD: Enable WC+ memory type on family 10 processors" patch > > currently in -tip added a workaround for AMD F10h CPUs which #GPs my > > guest when booted in kvm. This is because it accesses MSR_AMD64_BU_CFG2 > > which is not currently ignored by kvm. Do that because this MSR is only > > baremetal-relevant anyway. While at it, move the ignored MSRs at the > > beginning of kvm_set_msr_common so that we exit then and there. > > > Is your guest compiled without PV support? With PV Linux traps #GP for > all MSRs and it saves us in more than one places. Yes, CONFIG_PARAVIRT_GUEST is not set on the guest kernel.
On Wed, Feb 13, 2013 at 12:55:26PM +0100, Borislav Petkov wrote: > On Wed, Feb 13, 2013 at 01:47:47PM +0200, Gleb Natapov wrote: > > On Wed, Feb 13, 2013 at 12:42:41PM +0100, Borislav Petkov wrote: > > > From: Borislav Petkov <bp@suse.de> > > > > > > The "x86, AMD: Enable WC+ memory type on family 10 processors" patch > > > currently in -tip added a workaround for AMD F10h CPUs which #GPs my > > > guest when booted in kvm. This is because it accesses MSR_AMD64_BU_CFG2 > > > which is not currently ignored by kvm. Do that because this MSR is only > > > baremetal-relevant anyway. While at it, move the ignored MSRs at the > > > beginning of kvm_set_msr_common so that we exit then and there. > > > > > Is your guest compiled without PV support? With PV Linux traps #GP for > > all MSRs and it saves us in more than one places. > > Yes, CONFIG_PARAVIRT_GUEST is not set on the guest kernel. > Thanks. It does not mean that the patch should not be applied though. I cannot seems to find the documentation for the MSR anywhere, do you have a pointer? -- Gleb. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Feb 13, 2013 at 02:10:02PM +0200, Gleb Natapov wrote: > > > Is your guest compiled without PV support? With PV Linux traps #GP for > > > all MSRs and it saves us in more than one places. > > > > Yes, CONFIG_PARAVIRT_GUEST is not set on the guest kernel. > > > Thanks. It does not mean that the patch should not be applied though. Right, but, come to think of it, adding an MSR each time to those functions could turn out to be a PITA. The PV solution with trapping on the MSR accesses might be better so maybe CONFIG_KVM should do select KVM_GUEST ? This is even a good forward-looking solution. > I cannot seems to find the documentation for the MSR anywhere, do you > have a pointer? http://support.amd.com/us/Processor_TechDocs/31116.pdf, p.438 Thanks.
On Wed, Feb 13, 2013 at 02:35:49PM +0100, Borislav Petkov wrote: > On Wed, Feb 13, 2013 at 02:10:02PM +0200, Gleb Natapov wrote: > > > > Is your guest compiled without PV support? With PV Linux traps #GP for > > > > all MSRs and it saves us in more than one places. > > > > > > Yes, CONFIG_PARAVIRT_GUEST is not set on the guest kernel. > > > > > Thanks. It does not mean that the patch should not be applied though. > > Right, > > but, come to think of it, adding an MSR each time to those functions > could turn out to be a PITA. The PV solution with trapping on the MSR > accesses might be better so maybe CONFIG_KVM should do > PV solution does not exists for some other guests. > select KVM_GUEST > > ? I can easily imaging the situation where one whats to build different kernels for host and guest and do not have PV in the host one. > > This is even a good forward-looking solution. > > > I cannot seems to find the documentation for the MSR anywhere, do you > > have a pointer? > > http://support.amd.com/us/Processor_TechDocs/31116.pdf, p.438 > Thanks, -- Gleb. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Feb 13, 2013 at 12:42:41PM +0100, Borislav Petkov wrote: > From: Borislav Petkov <bp@suse.de> > > The "x86, AMD: Enable WC+ memory type on family 10 processors" patch > currently in -tip added a workaround for AMD F10h CPUs which #GPs my > guest when booted in kvm. This is because it accesses MSR_AMD64_BU_CFG2 > which is not currently ignored by kvm. Do that because this MSR is only > baremetal-relevant anyway. While at it, move the ignored MSRs at the > beginning of kvm_set_msr_common so that we exit then and there. > > Signed-off-by: Borislav Petkov <bp@suse.de> > Cc: Boris Ostrovsky <boris.ostrovsky@amd.com> > Cc: Andre Przywara <andre@andrep.de> > Cc: Marcelo Tosatti <mtosatti@redhat.com> > Cc: Gleb Natapov <gleb@redhat.com> Acked-by: Gleb Natapov <gleb@redhat.com> Ingo, MSR_AMD64_BU_CFG2 exists only on tip. Can you get this through the tip too? > --- > arch/x86/kvm/x86.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index c243b81e3c74..37040079cd6b 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -1881,6 +1881,14 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > u64 data = msr_info->data; > > switch (msr) { > + case MSR_AMD64_NB_CFG: > + case MSR_IA32_UCODE_REV: > + case MSR_IA32_UCODE_WRITE: > + case MSR_VM_HSAVE_PA: > + case MSR_AMD64_PATCH_LOADER: > + case MSR_AMD64_BU_CFG2: > + break; > + > case MSR_EFER: > return set_efer(vcpu, data); > case MSR_K7_HWCR: > @@ -1900,8 +1908,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > return 1; > } > break; > - case MSR_AMD64_NB_CFG: > - break; > case MSR_IA32_DEBUGCTLMSR: > if (!data) { > /* We support the non-activated case already */ > @@ -1914,11 +1920,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > vcpu_unimpl(vcpu, "%s: MSR_IA32_DEBUGCTLMSR 0x%llx, nop\n", > __func__, data); > break; > - case MSR_IA32_UCODE_REV: > - case MSR_IA32_UCODE_WRITE: > - case MSR_VM_HSAVE_PA: > - case MSR_AMD64_PATCH_LOADER: > - break; > case 0x200 ... 0x2ff: > return set_msr_mtrr(vcpu, msr, data); > case MSR_IA32_APICBASE: > @@ -2253,6 +2254,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) > case MSR_K8_INT_PENDING_MSG: > case MSR_AMD64_NB_CFG: > case MSR_FAM10H_MMIO_CONF_BASE: > + case MSR_AMD64_BU_CFG2: > data = 0; > break; > case MSR_P6_PERFCTR0: > -- > 1.8.1.3.535.ga923c31 -- Gleb. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index c243b81e3c74..37040079cd6b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1881,6 +1881,14 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) u64 data = msr_info->data; switch (msr) { + case MSR_AMD64_NB_CFG: + case MSR_IA32_UCODE_REV: + case MSR_IA32_UCODE_WRITE: + case MSR_VM_HSAVE_PA: + case MSR_AMD64_PATCH_LOADER: + case MSR_AMD64_BU_CFG2: + break; + case MSR_EFER: return set_efer(vcpu, data); case MSR_K7_HWCR: @@ -1900,8 +1908,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) return 1; } break; - case MSR_AMD64_NB_CFG: - break; case MSR_IA32_DEBUGCTLMSR: if (!data) { /* We support the non-activated case already */ @@ -1914,11 +1920,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) vcpu_unimpl(vcpu, "%s: MSR_IA32_DEBUGCTLMSR 0x%llx, nop\n", __func__, data); break; - case MSR_IA32_UCODE_REV: - case MSR_IA32_UCODE_WRITE: - case MSR_VM_HSAVE_PA: - case MSR_AMD64_PATCH_LOADER: - break; case 0x200 ... 0x2ff: return set_msr_mtrr(vcpu, msr, data); case MSR_IA32_APICBASE: @@ -2253,6 +2254,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) case MSR_K8_INT_PENDING_MSG: case MSR_AMD64_NB_CFG: case MSR_FAM10H_MMIO_CONF_BASE: + case MSR_AMD64_BU_CFG2: data = 0; break; case MSR_P6_PERFCTR0: