Commit 0f6ce597 authored by Charles Jacobsen's avatar Charles Jacobsen Committed by Vikram Narayanan

Switched to a kmem cache for allocating lcd_arch's.

Was getting bad load/store msr addresses for vm exits.
Properly detected by the lcd_arch_check code.

In struct lcd_arch, the msr_autoload fields were not
word aligned in some instances (see requirement
in Intel SDM V3 26.2.1.2). Even with compiler align
attributes, if we use kmalloc, proper alignment is
not guaranteed - we can allocate a struct lcd_arch
on the wrong byte and it throws off the alignment
of the entire struct.

kmem cache allows specifying alignment. Appears to be
working correctly.
parent 3c46c2ca
......@@ -49,6 +49,8 @@ extern const unsigned long vmx_return;
/* SHARED / PERCPU VARS -------------------------------------------------- */
static struct kmem_cache *vcpu_cache;
static struct vmx_vmcs_config vmcs_config;
static struct vmx_capability vmx_capability;
......@@ -882,6 +884,19 @@ int lcd_arch_init(void)
goto failed2;
}
/*
* Init vcpu cache
*/
vcpu_cache = kmem_cache_create("lcd_arch_vcpu",
sizeof(struct lcd_arch),
__alignof__(struct lcd_arch),
0, NULL);
if (!vcpu_cache) {
printk(KERN_ERR "lcd_vmx: failed to set up kmem cache\n");
ret = -ENOMEM;
goto failed3;
}
/*
* Run tests
*/
......@@ -889,6 +904,7 @@ int lcd_arch_init(void)
return 0;
failed3:
failed2:
on_each_cpu(vmx_disable, NULL, 1);
failed1:
......@@ -902,6 +918,7 @@ void lcd_arch_exit(void)
on_each_cpu(vmx_disable, NULL, 1);
vmx_free_vmxon_areas();
free_page((unsigned long)msr_bitmap);
kmem_cache_destroy(vcpu_cache);
}
/* VMX EPT -------------------------------------------------- */
......@@ -2367,7 +2384,7 @@ struct lcd_arch* lcd_arch_create(void)
/*
* Alloc lcd_arch
*/
vcpu = kmalloc(sizeof(*vcpu), GFP_KERNEL);
vcpu = kmem_cache_alloc(vcpu_cache, GFP_KERNEL);
if (!vcpu) {
printk(KERN_ERR "lcd arch create: failed to alloc lcd\n");
goto fail_vcpu;
......@@ -2442,7 +2459,7 @@ fail_ept:
fail_vpid:
vmx_free_vmcs(vcpu->vmcs);
fail_vmcs:
kfree(vcpu);
kmem_cache_free(vcpu_cache, vcpu);
fail_vcpu:
return NULL;
}
......@@ -2483,7 +2500,7 @@ void lcd_arch_destroy(struct lcd_arch *vcpu)
vmx_destroy_tss(vcpu);
vmx_destroy_stack(vcpu);
vmx_free_ept(vcpu);
kfree(vcpu);
kmem_cache_free(vcpu_cache, vcpu);
}
/* VMX EXIT HANDLING -------------------------------------------------- */
......
......@@ -1720,7 +1720,8 @@ void lcd_destroy_as_module(struct task_struct *t, char *module_name)
* Tell kthread to stop, and delete the module when it's done.
*/
ret = kthread_stop(t);
LCD_ERR("kthread retval = %d", ret);
if (ret)
LCD_ERR("kthread retval = %d", ret);
mutex_lock(&module_mutex);
m = find_module(module_name);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment