• Wanpeng Li's avatar
    KVM: MMU: Fix infinite loop when there is no available mmu page · ed52870f
    Wanpeng Li authored
    The below test case can cause infinite loop in kvm when ept=0.
    
        #include <unistd.h>
        #include <sys/syscall.h>
        #include <string.h>
        #include <stdint.h>
        #include <linux/kvm.h>
        #include <fcntl.h>
        #include <sys/ioctl.h>
    
        long r[5];
        int main()
        {
        	r[2] = open("/dev/kvm", O_RDONLY);
        	r[3] = ioctl(r[2], KVM_CREATE_VM, 0);
        	r[4] = ioctl(r[3], KVM_CREATE_VCPU, 7);
        	ioctl(r[4], KVM_RUN, 0);
        }
    
    It doesn't setup the memory regions, mmu_alloc_shadow/direct_roots() in
    kvm return 1 when kvm fails to allocate root page table which can result
    in beblow infinite loop:
    
        vcpu_run() {
        	for (;;) {
    	    	r = vcpu_enter_guest()::kvm_mmu_reload() returns 1
    	    	if (r <= 0)
    	    		break;
    	    	if (need_resched())
    	    		cond_resched();
          }
        }
    
    This patch fixes it by returning -ENOSPC when there is no available kvm mmu
    page for root page table.
    
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Cc: stable@vger.kernel.org
    Fixes: 26eeb53c (KVM: MMU: Bail out immediately if there is no available mmu page)
    Signed-off-by: default avatarWanpeng Li <wanpeng.li@hotmail.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    ed52870f
mmu.c 141 KB