KVM: Prevent kvm_init from corrupting debugfs structures
authorDarrick J. Wong <djwong@us.ibm.com>
Wed, 14 Oct 2009 23:21:00 +0000 (16:21 -0700)
committerMarcelo Tosatti <mtosatti@redhat.com>
Fri, 16 Oct 2009 15:30:26 +0000 (12:30 -0300)
commit0ea4ed8e948c30f88c824c973ee4b9529015fe65
treeb7bbcbc50fda3290c3acbb6ca38bd1e4dd3f05c6
parent8a8365c560b8b631e0a2d1ac032fbca66a9645bc
KVM: Prevent kvm_init from corrupting debugfs structures

I'm seeing an oops condition when kvm-intel and kvm-amd are modprobe'd
during boot (say on an Intel system) and then rmmod'd:

   # modprobe kvm-intel
     kvm_init()
     kvm_init_debug()
     kvm_arch_init()  <-- stores debugfs dentries internally
     (success, etc)

   # modprobe kvm-amd
     kvm_init()
     kvm_init_debug() <-- second initialization clobbers kvm's
                          internal pointers to dentries
     kvm_arch_init()
     kvm_exit_debug() <-- and frees them

   # rmmod kvm-intel
     kvm_exit()
     kvm_exit_debug() <-- double free of debugfs files!

     *BOOM*

If execution gets to the end of kvm_init(), then the calling module has been
established as the kvm provider.  Move the debugfs initialization to the end of
the function, and remove the now-unnecessary call to kvm_exit_debug() from the
error path.  That way we avoid trampling on the debugfs entries and freeing
them twice.

Cc: stable@kernel.org
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
virt/kvm/kvm_main.c