mirror of
https://github.com/genesi/linux-legacy.git
synced 2026-07-08 17:56:06 +00:00
KVM: Prevent kvm_init from corrupting debugfs structures
commit: 0ea4ed8e948c30f88c824c973ee4b9529015fe65 upstream
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.
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
77608cc64e
commit
6fa5a4d48a
@@ -2590,8 +2590,6 @@ int kvm_init(void *opaque, unsigned int vcpu_size,
|
||||
int r;
|
||||
int cpu;
|
||||
|
||||
kvm_init_debug();
|
||||
|
||||
r = kvm_arch_init(opaque);
|
||||
if (r)
|
||||
goto out_fail;
|
||||
@@ -2658,6 +2656,8 @@ int kvm_init(void *opaque, unsigned int vcpu_size,
|
||||
kvm_preempt_ops.sched_in = kvm_sched_in;
|
||||
kvm_preempt_ops.sched_out = kvm_sched_out;
|
||||
|
||||
kvm_init_debug();
|
||||
|
||||
return 0;
|
||||
|
||||
out_free:
|
||||
@@ -2679,7 +2679,6 @@ out_free_0:
|
||||
__free_page(bad_page);
|
||||
out:
|
||||
kvm_arch_exit();
|
||||
kvm_exit_debug();
|
||||
out_fail:
|
||||
return r;
|
||||
}
|
||||
@@ -2688,6 +2687,7 @@ EXPORT_SYMBOL_GPL(kvm_init);
|
||||
void kvm_exit(void)
|
||||
{
|
||||
kvm_trace_cleanup();
|
||||
kvm_exit_debug();
|
||||
misc_deregister(&kvm_dev);
|
||||
kmem_cache_destroy(kvm_vcpu_cache);
|
||||
sysdev_unregister(&kvm_sysdev);
|
||||
@@ -2697,7 +2697,6 @@ void kvm_exit(void)
|
||||
on_each_cpu(hardware_disable, NULL, 1);
|
||||
kvm_arch_hardware_unsetup();
|
||||
kvm_arch_exit();
|
||||
kvm_exit_debug();
|
||||
free_cpumask_var(cpus_hardware_enabled);
|
||||
__free_page(bad_page);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user