Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1407423 > unrolled thread
| Started by | kmeaw@yandex-team.ru |
|---|---|
| First post | 2016-05-26 09:50 +0200 |
| Last post | 2016-05-27 17:30 +0200 |
| Articles | 7 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH] KVM: Handle MSR_IA32_PERF_CTL kmeaw@yandex-team.ru - 2016-05-26 09:50 +0200
Re: [PATCH] KVM: Handle MSR_IA32_PERF_CTL Radim Krčmář <rkrcmar@redhat.com> - 2016-05-26 22:40 +0200
Re: [PATCH] KVM: Handle MSR_IA32_PERF_CTL "Gabriel L. Somlo" <gsomlo@gmail.com> - 2016-05-26 22:50 +0200
Re: [PATCH] KVM: Handle MSR_IA32_PERF_CTL Radim Krčmář <rkrcmar@redhat.com> - 2016-05-27 17:30 +0200
Re: [PATCH] KVM: Handle MSR_IA32_PERF_CTL Radim Krčmář <rkrcmar@redhat.com> - 2016-05-27 17:40 +0200
Re: [PATCH] KVM: Handle MSR_IA32_PERF_CTL Paolo Bonzini <pbonzini@redhat.com> - 2016-05-31 10:00 +0200
Re: [PATCH] KVM: Handle MSR_IA32_PERF_CTL Radim Krčmář <rkrcmar@redhat.com> - 2016-05-27 17:30 +0200
| From | kmeaw@yandex-team.ru |
|---|---|
| Date | 2016-05-26 09:50 +0200 |
| Subject | [PATCH] KVM: Handle MSR_IA32_PERF_CTL |
| Message-ID | <rCYdk-3zo-21@gated-at.bofh.it> |
From: Dmitry Bilunov <kmeaw@yandex-team.ru>
Intel CPUs having Turbo Boost feature implement an MSR to provide a
control interface via rdmsr/wrmsr instructions. One could detect the
presence of this feature by issuing one of these instructions and
handling the #GP exception which is generated in case the referenced MSR
is not implemented by the CPU.
KVM's vCPU model behaves exactly as a real CPU in this case by injecting
a fault when MSR_IA32_PERF_CTL is called (which KVM does not support).
However, some operating systems use this register during an early boot
stage in which their kernel is not capable of handling #GP correctly,
causing #DP and finally a triple fault effectively resetting the vCPU.
This patch implements a dummy handler for MSR_IA32_PERF_CTL to avoid the
crashes. Most notably it fixes an issue with MacOS X 10.10 kernel.
Signed-off-by: Dmitry Bilunov <kmeaw@yandex-team.ru>
---
arch/x86/kvm/x86.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index c805cf4..9f38c7f 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -983,6 +983,7 @@ static u32 emulated_msrs[] = {
MSR_IA32_MCG_STATUS,
MSR_IA32_MCG_CTL,
MSR_IA32_SMBASE,
+ MSR_IA32_PERF_CTL,
};
static unsigned num_emulated_msrs;
@@ -2050,6 +2051,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
case MSR_VM_HSAVE_PA:
case MSR_AMD64_PATCH_LOADER:
case MSR_AMD64_BU_CFG2:
+ case MSR_IA32_PERF_CTL:
break;
case MSR_EFER:
@@ -2314,6 +2316,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
case MSR_AMD64_NB_CFG:
case MSR_FAM10H_MMIO_CONF_BASE:
case MSR_AMD64_BU_CFG2:
+ case MSR_IA32_PERF_CTL:
msr_info->data = 0;
break;
case MSR_K7_EVNTSEL0 ... MSR_K7_EVNTSEL3:
--
2.8.2
[toc] | [next] | [standalone]
| From | Radim Krčmář <rkrcmar@redhat.com> |
|---|---|
| Date | 2016-05-26 22:40 +0200 |
| Message-ID | <rDaet-2yj-11@gated-at.bofh.it> |
| In reply to | #1407423 |
2016-05-26 10:32+0300, kmeaw@yandex-team.ru: > From: Dmitry Bilunov <kmeaw@yandex-team.ru> > > Intel CPUs having Turbo Boost feature implement an MSR to provide a > control interface via rdmsr/wrmsr instructions. One could detect the > presence of this feature by issuing one of these instructions and > handling the #GP exception which is generated in case the referenced MSR > is not implemented by the CPU. > > KVM's vCPU model behaves exactly as a real CPU in this case by injecting > a fault when MSR_IA32_PERF_CTL is called (which KVM does not support). > However, some operating systems use this register during an early boot > stage in which their kernel is not capable of handling #GP correctly, > causing #DP and finally a triple fault effectively resetting the vCPU. > > This patch implements a dummy handler for MSR_IA32_PERF_CTL to avoid the > crashes. Most notably it fixes an issue with MacOS X 10.10 kernel. > > Signed-off-by: Dmitry Bilunov <kmeaw@yandex-team.ru> > --- > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > @@ -2050,6 +2051,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > case MSR_VM_HSAVE_PA: > case MSR_AMD64_PATCH_LOADER: > case MSR_AMD64_BU_CFG2: > + case MSR_IA32_PERF_CTL: > break; Does MacOS X write it too? Thanks.
[toc] | [prev] | [next] | [standalone]
| From | "Gabriel L. Somlo" <gsomlo@gmail.com> |
|---|---|
| Date | 2016-05-26 22:50 +0200 |
| Message-ID | <rDaoa-2BP-9@gated-at.bofh.it> |
| In reply to | #1407704 |
On Thu, May 26, 2016 at 10:39:31PM +0200, Radim Krčmář wrote: > 2016-05-26 10:32+0300, kmeaw@yandex-team.ru: > > From: Dmitry Bilunov <kmeaw@yandex-team.ru> > > > > Intel CPUs having Turbo Boost feature implement an MSR to provide a > > control interface via rdmsr/wrmsr instructions. One could detect the > > presence of this feature by issuing one of these instructions and > > handling the #GP exception which is generated in case the referenced MSR > > is not implemented by the CPU. > > > > KVM's vCPU model behaves exactly as a real CPU in this case by injecting > > a fault when MSR_IA32_PERF_CTL is called (which KVM does not support). > > However, some operating systems use this register during an early boot > > stage in which their kernel is not capable of handling #GP correctly, > > causing #DP and finally a triple fault effectively resetting the vCPU. > > > > This patch implements a dummy handler for MSR_IA32_PERF_CTL to avoid the > > crashes. Most notably it fixes an issue with MacOS X 10.10 kernel. > > > > Signed-off-by: Dmitry Bilunov <kmeaw@yandex-team.ru> > > --- > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > > @@ -2050,6 +2051,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > > case MSR_VM_HSAVE_PA: > > case MSR_AMD64_PATCH_LOADER: > > case MSR_AMD64_BU_CFG2: > > + case MSR_IA32_PERF_CTL: > > break; > > Does MacOS X write it too? After setting /sys/module/kvm/parameters/ignore_msrs, all I get in dmesg after firing up OS X is: vcpu0 ignored rdmsr: 0x199 So no, I don't think it would try to write it. HTH, --Gabriel
[toc] | [prev] | [next] | [standalone]
| From | Radim Krčmář <rkrcmar@redhat.com> |
|---|---|
| Date | 2016-05-27 17:30 +0200 |
| Message-ID | <rDrS2-59z-27@gated-at.bofh.it> |
| In reply to | #1407709 |
2016-05-27 09:49+0300, kmeaw@yandex-team.ru: > 26.05.2016, 23:44, "Gabriel L. Somlo" <gsomlo@gmail.com>: >> On Thu, May 26, 2016 at 10:39:31PM +0200, Radim Krčmář wrote: >>> 2016-05-26 10:32+0300, kmeaw@yandex-team.ru: >>> > This patch implements a dummy handler for MSR_IA32_PERF_CTL to avoid the >>> > crashes. Most notably it fixes an issue with MacOS X 10.10 kernel. >>> Does MacOS X write it too? >> >> After setting /sys/module/kvm/parameters/ignore_msrs, all I get in >> dmesg after firing up OS X is: >> >> vcpu0 ignored rdmsr: 0x199 >> >> So no, I don't think it would try to write it. > > That's right, OS X does not issue an wrmsr to 0x199. More specifically, I have not > observed that on my KVM instances. Should I remove the "wrmsr" portion from the > patch? Yes, please. Silently ignoring the write is worse than #GP and #GP is not a problem, so I wouldn't bother with a phony implementation. Returning 0 on read is ok as seems to mean P-state=0, which is within expectations. (I wonder why MacOS X doesn't read IA32_PERF_STATUS, though.)
[toc] | [prev] | [next] | [standalone]
| From | Radim Krčmář <rkrcmar@redhat.com> |
|---|---|
| Date | 2016-05-27 17:40 +0200 |
| Message-ID | <rDs1H-5cE-19@gated-at.bofh.it> |
| In reply to | #1408140 |
2016-05-27 17:22+0200, Radim Krčmář: > (I wonder why MacOS X doesn't read IA32_PERF_STATUS, though.) Oh, it maybe does ... we already emulate status and return 0x1000 in its bottom 16 bits. I have no idea what is that supposed to mean, but I think we should return 0x1000 in IA32_PERF_CTL then. (Would be nice to understand how that 0x1000 happened ... we might want 0 in both.)
[toc] | [prev] | [next] | [standalone]
| From | Paolo Bonzini <pbonzini@redhat.com> |
|---|---|
| Date | 2016-05-31 10:00 +0200 |
| Message-ID | <rEMKJ-8eR-1@gated-at.bofh.it> |
| In reply to | #1408144 |
> 2016-05-27 17:22+0200, Radim Krčmář:
> > (I wonder why MacOS X doesn't read IA32_PERF_STATUS, though.)
>
> Oh, it maybe does ... we already emulate status and return 0x1000 in its
> bottom 16 bits. I have no idea what is that supposed to mean, but I
> think we should return 0x1000 in IA32_PERF_CTL then.
It's 1000, not 0x1000 (instead, on real hardware the value is typically a
multiple of 256). It was added for Darwin too.
Returning different values is okay, because they are different on real
hardware too:
(sudo dd if=/dev/cpu/0/msr skip=$((0x198)) iflag=skip_bytes bs=8 count=1;
sudo dd if=/dev/cpu/0/msr skip=$((0x199)) iflag=skip_bytes bs=8 count=1) | od -tx8
0000000 00001f3900001100 0000000000001300
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
PERF_STATUS PERF_CTL
And perhaps if we returned non-zero values for PERF_CTL Darwin would try to
write to it. So returning zero is fine, I think. There is no correct answer...
Paolo
> (Would be nice to understand how that 0x1000 happened ... we might want
> 0 in both.)
>
[toc] | [prev] | [next] | [standalone]
| From | Radim Krčmář <rkrcmar@redhat.com> |
|---|---|
| Date | 2016-05-27 17:30 +0200 |
| Message-ID | <rDrS2-59z-25@gated-at.bofh.it> |
| In reply to | #1407423 |
2016-05-26 10:32+0300, kmeaw@yandex-team.ru:
> From: Dmitry Bilunov <kmeaw@yandex-team.ru>
>
> Intel CPUs having Turbo Boost feature implement an MSR to provide a
> control interface via rdmsr/wrmsr instructions. One could detect the
> presence of this feature by issuing one of these instructions and
> handling the #GP exception which is generated in case the referenced MSR
> is not implemented by the CPU.
>
> KVM's vCPU model behaves exactly as a real CPU in this case by injecting
> a fault when MSR_IA32_PERF_CTL is called (which KVM does not support).
> However, some operating systems use this register during an early boot
> stage in which their kernel is not capable of handling #GP correctly,
> causing #DP and finally a triple fault effectively resetting the vCPU.
>
> This patch implements a dummy handler for MSR_IA32_PERF_CTL to avoid the
> crashes. Most notably it fixes an issue with MacOS X 10.10 kernel.
>
> Signed-off-by: Dmitry Bilunov <kmeaw@yandex-team.ru>
> ---
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> @@ -983,6 +983,7 @@ static u32 emulated_msrs[] = {
> MSR_IA32_MCG_STATUS,
> MSR_IA32_MCG_CTL,
> MSR_IA32_SMBASE,
> + MSR_IA32_PERF_CTL,
The MSR value is always 0, so there is no point in putting it here.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web