summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoshimi Ichiyanagi <ichiyanagi.yoshimi@lab.ntt.co.jp>2006-12-29 16:49:41 -0800
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-30 10:56:44 -0800
commit09db28b8a3765a7ec35eba80420c71a7973f5a88 (patch)
tree13a43df5bceb1016dd6ad0179b9de8dacabbe145
parenta9058ecd3cd72634cf548588ce79b3f225c9ca32 (diff)
downloadlwn-09db28b8a3765a7ec35eba80420c71a7973f5a88.tar.gz
lwn-09db28b8a3765a7ec35eba80420c71a7973f5a88.zip
[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>
-rw-r--r--drivers/kvm/kvm_main.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 38375e2bb703..06314071c6d2 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -1865,6 +1865,11 @@ int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module)
{
int r;
+ if (kvm_arch_ops) {
+ printk(KERN_ERR "kvm: already loaded the other module\n");
+ return -EEXIST;
+ }
+
kvm_arch_ops = ops;
if (!kvm_arch_ops->cpu_has_kvm_support()) {
@@ -1907,6 +1912,7 @@ void kvm_exit_arch(void)
unregister_reboot_notifier(&kvm_reboot_notifier);
on_each_cpu(kvm_arch_ops->hardware_disable, 0, 0, 1);
kvm_arch_ops->hardware_unsetup();
+ kvm_arch_ops = NULL;
}
static __init int kvm_init(void)