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;
 
 
        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);
 
 #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>
        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, ®1, ®2);
        code = vcpu->run->s.regs.gprs[reg1];
        addr = vcpu->run->s.regs.gprs[reg2];