| From foo@baz Tue Aug 14 16:14:56 CEST 2018 |
| From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Date: Wed, 20 Jun 2018 22:00:47 -0400 |
| Subject: x86/KVM/VMX: Separate the VMX AUTOLOAD guest/host number accounting |
| |
| From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| |
| commit 3190709335dd31fe1aeeebfe4ffb6c7624ef971f upstream |
| |
| This allows to load a different number of MSRs depending on the context: |
| VMEXIT or VMENTER. |
| |
| Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kvm/vmx.c | 29 +++++++++++++++++++---------- |
| 1 file changed, 19 insertions(+), 10 deletions(-) |
| |
| --- a/arch/x86/kvm/vmx.c |
| +++ b/arch/x86/kvm/vmx.c |
| @@ -2011,12 +2011,18 @@ static void clear_atomic_switch_msr(stru |
| } |
| i = find_msr(&m->guest, msr); |
| if (i < 0) |
| - return; |
| + goto skip_guest; |
| --m->guest.nr; |
| - --m->host.nr; |
| m->guest.val[i] = m->guest.val[m->guest.nr]; |
| - m->host.val[i] = m->host.val[m->host.nr]; |
| vmcs_write32(VM_ENTRY_MSR_LOAD_COUNT, m->guest.nr); |
| + |
| +skip_guest: |
| + i = find_msr(&m->host, msr); |
| + if (i < 0) |
| + return; |
| + |
| + --m->host.nr; |
| + m->host.val[i] = m->host.val[m->host.nr]; |
| vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, m->host.nr); |
| } |
| |
| @@ -2034,7 +2040,7 @@ static void add_atomic_switch_msr_specia |
| static void add_atomic_switch_msr(struct vcpu_vmx *vmx, unsigned msr, |
| u64 guest_val, u64 host_val) |
| { |
| - int i; |
| + int i, j; |
| struct msr_autoload *m = &vmx->msr_autoload; |
| |
| switch (msr) { |
| @@ -2070,21 +2076,24 @@ static void add_atomic_switch_msr(struct |
| } |
| |
| i = find_msr(&m->guest, msr); |
| - if (i == NR_AUTOLOAD_MSRS) { |
| + j = find_msr(&m->host, msr); |
| + if (i == NR_AUTOLOAD_MSRS || j == NR_AUTOLOAD_MSRS) { |
| printk_once(KERN_WARNING "Not enough msr switch entries. " |
| "Can't add msr %x\n", msr); |
| return; |
| - } else if (i < 0) { |
| + } |
| + if (i < 0) { |
| i = m->guest.nr++; |
| - ++m->host.nr; |
| vmcs_write32(VM_ENTRY_MSR_LOAD_COUNT, m->guest.nr); |
| + } |
| + if (j < 0) { |
| + j = m->host.nr++; |
| vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, m->host.nr); |
| } |
| - |
| m->guest.val[i].index = msr; |
| m->guest.val[i].value = guest_val; |
| - m->host.val[i].index = msr; |
| - m->host.val[i].value = host_val; |
| + m->host.val[j].index = msr; |
| + m->host.val[j].value = host_val; |
| } |
| |
| static void reload_tss(void) |