[PATCH] KVM: Initialize kvm_arch_ops on unload
The latest version of kvm doesn't initialize kvm_arch_ops in kvm_init(), which causes an error with the following sequence. 1. Load the supported arch's module. 2. Load the unsupported arch's module.$B!!(B(loading error) 3. Unload the unsupported arch's module. You'll get the following error message after step 3. "BUG: unable to handle to handle kernel paging request at virtual address xxxxxxxx" The problem here is that the unsupported arch's module overwrites kvm_arch_ops of the supported arch's module at step 2. This patch initializes kvm_arch_ops upon loading architecture specific kvm module, and prevents overwriting kvm_arch_ops when kvm_arch_ops is already set correctly. Signed-off-by: Avi Kivity <avi@qumranet.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
a9058ecd3c
commit
09db28b8a3
|
@ -1865,6 +1865,11 @@ int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
if (kvm_arch_ops) {
|
||||||
|
printk(KERN_ERR "kvm: already loaded the other module\n");
|
||||||
|
return -EEXIST;
|
||||||
|
}
|
||||||
|
|
||||||
kvm_arch_ops = ops;
|
kvm_arch_ops = ops;
|
||||||
|
|
||||||
if (!kvm_arch_ops->cpu_has_kvm_support()) {
|
if (!kvm_arch_ops->cpu_has_kvm_support()) {
|
||||||
|
@ -1907,6 +1912,7 @@ void kvm_exit_arch(void)
|
||||||
unregister_reboot_notifier(&kvm_reboot_notifier);
|
unregister_reboot_notifier(&kvm_reboot_notifier);
|
||||||
on_each_cpu(kvm_arch_ops->hardware_disable, 0, 0, 1);
|
on_each_cpu(kvm_arch_ops->hardware_disable, 0, 0, 1);
|
||||||
kvm_arch_ops->hardware_unsetup();
|
kvm_arch_ops->hardware_unsetup();
|
||||||
|
kvm_arch_ops = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int kvm_init(void)
|
static __init int kvm_init(void)
|
||||||
|
|
Loading…
Reference in New Issue