Skip to content
  • Wanpeng Li's avatar
    kvm: vfio: fix unregister kvm_device_ops of vfio · 571ee1b6
    Wanpeng Li authored
    After commit 80ce1639 (KVM: VFIO: register kvm_device_ops dynamically),
    kvm_device_ops of vfio can be registered dynamically. Commit 3c3c29fd
    
    
    (kvm-vfio: do not use module_init) move the dynamic register invoked by
    kvm_init in order to fix broke unloading of the kvm module. However,
    kvm_device_ops of vfio is unregistered after rmmod kvm-intel module
    which lead to device type collision detection warning after kvm-intel
    module reinsmod.
    
        WARNING: CPU: 1 PID: 10358 at /root/cathy/kvm/arch/x86/kvm/../../../virt/kvm/kvm_main.c:3289 kvm_init+0x234/0x282 [kvm]()
        Modules linked in: kvm_intel(O+) kvm(O) nfsv3 nfs_acl auth_rpcgss oid_registry nfsv4 dns_resolver nfs fscache lockd sunrpc pci_stub bridge stp llc autofs4 8021q cpufreq_ondemand ipv6 joydev microcode pcspkr igb i2c_algo_bit ehci_pci ehci_hcd e1000e i2c_i801 ixgbe ptp pps_core hwmon mdio tpm_tis tpm ipmi_si ipmi_msghandler acpi_cpufreq isci libsas scsi_transport_sas button dm_mirror dm_region_hash dm_log dm_mod [last unloaded: kvm_intel]
        CPU: 1 PID: 10358 Comm: insmod Tainted: G        W  O   3.17.0-rc1 #2
        Hardware name: Intel Corporation S2600CP/S2600CP, BIOS RMLSDP.86I.00.29.D696.1311111329 11/11/2013
         0000000000000cd9 ffff880ff08cfd18 ffffffff814a61d9 0000000000000cd9
         0000000000000000 ffff880ff08cfd58 ffffffff810417b7 ffff880ff08cfd48
         ffffffffa045bcac ffffffffa049c420 0000000000000040 00000000000000ff
        Call Trace:
         [<ffffffff814a61d9>] dump_stack+0x49/0x60
         [<ffffffff810417b7>] warn_slowpath_common+0x7c/0x96
         [<ffffffffa045bcac>] ? kvm_init+0x234/0x282 [kvm]
         [<ffffffff810417e6>] warn_slowpath_null+0x15/0x17
         [<ffffffffa045bcac>] kvm_init+0x234/0x282 [kvm]
         [<ffffffffa016e995>] vmx_init+0x1bf/0x42a [kvm_intel]
         [<ffffffffa016e7d6>] ? vmx_check_processor_compat+0x64/0x64 [kvm_intel]
         [<ffffffff810002ab>] do_one_initcall+0xe3/0x170
         [<ffffffff811168a9>] ? __vunmap+0xad/0xb8
         [<ffffffff8109c58f>] do_init_module+0x2b/0x174
         [<ffffffff8109d414>] load_module+0x43e/0x569
         [<ffffffff8109c6d8>] ? do_init_module+0x174/0x174
         [<ffffffff8109c75a>] ? copy_module_from_user+0x39/0x82
         [<ffffffff8109b7dd>] ? module_sect_show+0x20/0x20
         [<ffffffff8109d65f>] SyS_init_module+0x54/0x81
         [<ffffffff814a9a12>] system_call_fastpath+0x16/0x1b
        ---[ end trace 0626f4a3ddea56f3 ]---
    
    The bug can be reproduced by:
    
        rmmod kvm_intel.ko
        insmod kvm_intel.ko
    
    without rmmod/insmod kvm.ko
    This patch fixes the bug by unregistering kvm_device_ops of vfio when the
    kvm-intel module is removed.
    
    Reported-by: default avatarLiu Rongrong <rongrongx.liu@intel.com>
    Fixes: 3c3c29fd
    
    
    Signed-off-by: default avatarWanpeng Li <wanpeng.li@linux.intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    571ee1b6