]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
KVM: s390: Limit sthyi execution
authorJanosch Frank <frankja@linux.vnet.ibm.com>
Tue, 10 May 2016 13:03:42 +0000 (15:03 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 10 Jun 2016 10:07:12 +0000 (12:07 +0200)
Store hypervisor information is a valid instruction not only in
supervisor state but also in problem state, i.e. the guest's
userspace. Its execution is not only computational and memory
intensive, but also has to get hold of the ipte lock to write to the
guest's memory.

This lock is not intended to be held often and long, especially not
from the untrusted guest userspace. Therefore we apply rate limiting
of sthyi executions per VM.

Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Acked-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/sthyi.c

index 7233b1c499646f1d57661e6a73b9b8bf479347d8..bcc20dc91ea8aa40302c94f7f45b8a48376caa92 100644 (file)
@@ -652,6 +652,7 @@ struct kvm_arch{
        wait_queue_head_t ipte_wq;
        int ipte_lock_count;
        struct mutex ipte_mutex;
+       struct ratelimit_state sthyi_limit;
        spinlock_t start_stop_lock;
        struct sie_page2 *sie_page2;
        struct kvm_s390_cpu_model model;
index 1c10254119b3311fac694c0d3fe6ac506edc5c1c..44297ff53b443177b810dbe06fed6a68dfa05a05 100644 (file)
@@ -1151,6 +1151,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
 
        rc = -ENOMEM;
 
+       ratelimit_state_init(&kvm->arch.sthyi_limit, 5 * HZ, 500);
+
        kvm->arch.use_esca = 0; /* start with basic SCA */
        rwlock_init(&kvm->arch.sca_lock);
        kvm->arch.sca = (struct bsca_block *) get_zeroed_page(GFP_KERNEL);
index 894d5626f18d589c08cd09237c43e7159e32d88e..bd98b7d252004dae3d9ea569c6705ea92c8e51f0 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/errno.h>
 #include <linux/pagemap.h>
 #include <linux/vmalloc.h>
+#include <linux/ratelimit.h>
 
 #include <asm/kvm_host.h>
 #include <asm/asm-offsets.h>
@@ -403,6 +404,16 @@ int handle_sthyi(struct kvm_vcpu *vcpu)
        u64 code, addr, cc = 0;
        struct sthyi_sctns *sctns = NULL;
 
+       /*
+        * STHYI requires extensive locking in the higher hypervisors
+        * and is very computational/memory expensive. Therefore we
+        * ratelimit the executions per VM.
+        */
+       if (!__ratelimit(&vcpu->kvm->arch.sthyi_limit)) {
+               kvm_s390_retry_instr(vcpu);
+               return 0;
+       }
+
        kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);
        code = vcpu->run->s.regs.gprs[reg1];
        addr = vcpu->run->s.regs.gprs[reg2];