• Christian Borntraeger's avatar
    KVM: set owner of cpu and vm file operations · 3d3aab1b
    Christian Borntraeger authored
    There is a race between a "close of the file descriptors" and module
    unload in the kvm module.
    
    You can easily trigger this problem by applying this debug patch:
    >--- kvm.orig/virt/kvm/kvm_main.c
    >+++ kvm/virt/kvm/kvm_main.c
    >@@ -648,10 +648,14 @@ void kvm_free_physmem(struct kvm *kvm)
    >                kvm_free_physmem_slot(&kvm->memslots[i], NULL);
    > }
    >
    >+#include <linux/delay.h>
    > static void kvm_destroy_vm(struct kvm *kvm)
    > {
    >        struct mm_struct *mm = kvm->mm;
    >
    >+       printk("off1\n");
    >+       msleep(5000);
    >+       printk("off2\n");
    >        spin_lock(&kvm_lock);
    >        list_del(&kvm->vm_list);
    >        spin_unlock(&kvm_lock);
    
    and killing the userspace, followed by an rmmod.
    
    The problem is that kvm_destroy_vm can run while the module count
    is 0. That means, you can remove the module while kvm_destroy_vm
    is running. But kvm_destroy_vm is part of the module text. This
    causes a kerneloops. The race exists without the msleep but is much
    harder to trigger.
    
    This patch requires the fix for anon_inodes (anon_inodes: use fops->owner
    for module refcount).
    With this patch, we can set the owner of all anonymous KVM inodes file
    operations. The VFS will then control the KVM module refcount as long as there
    is an open file. kvm_destroy_vm will be called by the release function of the
    last closed file - before the VFS drops the module refcount.
    Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
    3d3aab1b
kvm_main.c 51 KB