aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2015-03-11 11:47:33 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-06-20 03:55:24 -0400
commit37d9df98b71afdf3baf41ee5451b6206c13328c6 (patch)
tree9eac97b278ade808aef637721d417a03a5285bc1 /arch/s390/kvm
parent65d0b0d4bcc67b596d8e7286c3bebf24c59ade6a (diff)
KVM: s390: backup the currently enabled gmap when scheduled out
Nested virtualization will have to enable own gmaps. Current code would enable the wrong gmap whenever scheduled out and back in, therefore resulting in the wrong gmap being enabled. This patch reenables the last enabled gmap, therefore avoiding having to touch vcpu->arch.gmap when enabling a different gmap. Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r--arch/s390/kvm/kvm-s390.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 45a8316ba1eb..a890f7d20711 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1719,7 +1719,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
1719 1719
1720 save_access_regs(vcpu->arch.host_acrs); 1720 save_access_regs(vcpu->arch.host_acrs);
1721 restore_access_regs(vcpu->run->s.regs.acrs); 1721 restore_access_regs(vcpu->run->s.regs.acrs);
1722 gmap_enable(vcpu->arch.gmap); 1722 gmap_enable(vcpu->arch.enabled_gmap);
1723 atomic_or(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags); 1723 atomic_or(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
1724 if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu)) 1724 if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu))
1725 __start_cpu_timer_accounting(vcpu); 1725 __start_cpu_timer_accounting(vcpu);
@@ -1732,7 +1732,8 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
1732 if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu)) 1732 if (vcpu->arch.cputm_enabled && !is_vcpu_idle(vcpu))
1733 __stop_cpu_timer_accounting(vcpu); 1733 __stop_cpu_timer_accounting(vcpu);
1734 atomic_andnot(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags); 1734 atomic_andnot(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
1735 gmap_disable(vcpu->arch.gmap); 1735 vcpu->arch.enabled_gmap = gmap_get_enabled();
1736 gmap_disable(vcpu->arch.enabled_gmap);
1736 1737
1737 /* Save guest register state */ 1738 /* Save guest register state */
1738 save_fpu_regs(); 1739 save_fpu_regs();
@@ -1781,7 +1782,8 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
1781 vcpu->arch.gmap = vcpu->kvm->arch.gmap; 1782 vcpu->arch.gmap = vcpu->kvm->arch.gmap;
1782 sca_add_vcpu(vcpu); 1783 sca_add_vcpu(vcpu);
1783 } 1784 }
1784 1785 /* make vcpu_load load the right gmap on the first trigger */
1786 vcpu->arch.enabled_gmap = vcpu->arch.gmap;
1785} 1787}
1786 1788
1787static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu) 1789static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)