[kvm-unit-tests PATCH v2 5/6] x86: lib/alloc: introduce alloc_zeroed_page

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This allows us to remove a bunch of memsets.

Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx>
---
 lib/alloc.c     |  8 ++++++++
 lib/alloc.h     |  1 +
 lib/x86/vm.c    |  4 +---
 x86/vmx.c       | 19 +++++++------------
 x86/vmx_tests.c | 28 ++++++++++------------------
 5 files changed, 27 insertions(+), 33 deletions(-)

diff --git a/lib/alloc.c b/lib/alloc.c
index ce1198e2977f..d797690cc458 100644
--- a/lib/alloc.c
+++ b/lib/alloc.c
@@ -191,6 +191,14 @@ void *alloc_page(void)
 	return p;
 }
 
+void *alloc_zeroed_page(void)
+{
+	void *p = alloc_page();
+
+	memset(p, 0, PAGE_SIZE);
+	return p;
+}
+
 void free_page(void *page)
 {
 	spin_lock(&heap_lock);
diff --git a/lib/alloc.h b/lib/alloc.h
index a37330b3088a..f61a5200c829 100644
--- a/lib/alloc.h
+++ b/lib/alloc.h
@@ -126,6 +126,7 @@ extern void phys_alloc_show(void);
  */
 extern void heap_init(void *start, size_t size);
 extern void *alloc_page(void);
+extern void *alloc_zeroed_page(void);
 extern void free_page(void *page);
 
 #endif /* _ALLOC_H_ */
diff --git a/lib/x86/vm.c b/lib/x86/vm.c
index 4e399f80dd31..8b95104ef80f 100644
--- a/lib/x86/vm.c
+++ b/lib/x86/vm.c
@@ -91,9 +91,7 @@ static void setup_mmu_range(unsigned long *cr3, unsigned long start,
 
 static void setup_mmu(unsigned long len)
 {
-    unsigned long *cr3 = alloc_page();
-
-    memset(cr3, 0, PAGE_SIZE);
+    unsigned long *cr3 = alloc_zeroed_page();
 
 #ifdef __x86_64__
     if (len < (1ul << 32))
diff --git a/x86/vmx.c b/x86/vmx.c
index 411ed3211d4d..5d333e077a02 100644
--- a/x86/vmx.c
+++ b/x86/vmx.c
@@ -29,6 +29,7 @@
  */
 
 #include "libcflat.h"
+#include "alloc.h"
 #include "processor.h"
 #include "vm.h"
 #include "desc.h"
@@ -276,9 +277,8 @@ static void split_large_ept_entry(unsigned long *ptep, int level)
 	assert(pte & EPT_LARGE_PAGE);
 	assert(level == 2 || level == 3);
 
-	new_pt = alloc_page();
+	new_pt = alloc_zeroed_page();
 	assert(new_pt);
-	memset(new_pt, 0, PAGE_SIZE);
 
 	prototype = pte & ~EPT_ADDR_MASK;
 	if (level == 2)
@@ -617,8 +617,7 @@ static void init_vmcs_guest(void)
 
 static int init_vmcs(struct vmcs **vmcs)
 {
-	*vmcs = alloc_page();
-	memset(*vmcs, 0, PAGE_SIZE);
+	*vmcs = alloc_zeroed_page();
 	(*vmcs)->revision_id = basic.revision;
 	/* vmclear first to init vmcs */
 	if (vmcs_clear(*vmcs)) {
@@ -656,8 +655,7 @@ static void init_vmx(void)
 	ulong fix_cr0_set, fix_cr0_clr;
 	ulong fix_cr4_set, fix_cr4_clr;
 
-	vmxon_region = alloc_page();
-	memset(vmxon_region, 0, PAGE_SIZE);
+	vmxon_region = alloc_zeroed_page();
 
 	fix_cr0_set =  rdmsr(MSR_IA32_VMX_CR0_FIXED0);
 	fix_cr0_clr =  rdmsr(MSR_IA32_VMX_CR0_FIXED1);
@@ -686,10 +684,8 @@ static void init_vmx(void)
 
 	*vmxon_region = basic.revision;
 
-	guest_stack = alloc_page();
-	memset(guest_stack, 0, PAGE_SIZE);
-	guest_syscall_stack = alloc_page();
-	memset(guest_syscall_stack, 0, PAGE_SIZE);
+	guest_stack = alloc_zeroed_page();
+	guest_syscall_stack = alloc_zeroed_page();
 }
 
 static void do_vmxon_off(void *data)
@@ -811,8 +807,7 @@ static void test_vmptrst(void)
 	int ret;
 	struct vmcs *vmcs1, *vmcs2;
 
-	vmcs1 = alloc_page();
-	memset(vmcs1, 0, PAGE_SIZE);
+	vmcs1 = alloc_zeroed_page();
 	init_vmcs(&vmcs1);
 	ret = vmcs_save(&vmcs2);
 	report("test vmptrst", (!ret) && (vmcs1 == vmcs2));
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index 58736d789bd5..ebc220e8329c 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -3,6 +3,7 @@
  *
  * Author : Arthur Chunqi Li <yzt356@xxxxxxxxx>
  */
+#include "alloc.h"
 #include "vmx.h"
 #include "msr.h"
 #include "processor.h"
@@ -223,8 +224,7 @@ void msr_bmp_init()
 	void *msr_bitmap;
 	u32 ctrl_cpu0;
 
-	msr_bitmap = alloc_page();
-	memset(msr_bitmap, 0x0, PAGE_SIZE);
+	msr_bitmap = alloc_zeroed_page();
 	ctrl_cpu0 = vmcs_read(CPU_EXEC_CTRL0);
 	ctrl_cpu0 |= CPU_MSR_BITMAP;
 	vmcs_write(CPU_EXEC_CTRL0, ctrl_cpu0);
@@ -565,10 +565,8 @@ static int iobmp_init()
 {
 	u32 ctrl_cpu0;
 
-	io_bitmap_a = alloc_page();
-	io_bitmap_b = alloc_page();
-	memset(io_bitmap_a, 0x0, PAGE_SIZE);
-	memset(io_bitmap_b, 0x0, PAGE_SIZE);
+	io_bitmap_a = alloc_zeroed_page();
+	io_bitmap_b = alloc_zeroed_page();
 	ctrl_cpu0 = vmcs_read(CPU_EXEC_CTRL0);
 	ctrl_cpu0 |= CPU_IO_BITMAP;
 	ctrl_cpu0 &= (~CPU_IO);
@@ -937,8 +935,7 @@ static int setup_ept()
 		return 1;
 	}
 	eptp |= (3 << EPTP_PG_WALK_LEN_SHIFT);
-	pml4 = alloc_page();
-	memset(pml4, 0, PAGE_SIZE);
+	pml4 = alloc_zeroed_page();
 	eptp |= virt_to_phys(pml4);
 	vmcs_write(EPTP, eptp);
 	support_2m = !!(ept_vpid.val & EPT_CAP_2M_PAGE);
@@ -972,10 +969,8 @@ static int ept_init()
 	vmcs_write(CPU_EXEC_CTRL1, ctrl_cpu[1]);
 	if (setup_ept())
 		return VMX_TEST_EXIT;
-	data_page1 = alloc_page();
-	data_page2 = alloc_page();
-	memset(data_page1, 0x0, PAGE_SIZE);
-	memset(data_page2, 0x0, PAGE_SIZE);
+	data_page1 = alloc_zeroed_page();
+	data_page2 = alloc_zeroed_page();
 	*((u32 *)data_page1) = MAGIC_VAL_1;
 	*((u32 *)data_page2) = MAGIC_VAL_2;
 	install_ept(pml4, (unsigned long)data_page1, (unsigned long)data_page2,
@@ -1538,12 +1533,9 @@ struct vmx_msr_entry *exit_msr_store, *entry_msr_load, *exit_msr_load;
 static int msr_switch_init(struct vmcs *vmcs)
 {
 	msr_bmp_init();
-	exit_msr_store = alloc_page();
-	exit_msr_load = alloc_page();
-	entry_msr_load = alloc_page();
-	memset(exit_msr_store, 0, PAGE_SIZE);
-	memset(exit_msr_load, 0, PAGE_SIZE);
-	memset(entry_msr_load, 0, PAGE_SIZE);
+	exit_msr_store = alloc_zeroed_page();
+	exit_msr_load = alloc_zeroed_page();
+	entry_msr_load = alloc_zeroed_page();
 	entry_msr_load[0].index = MSR_KERNEL_GS_BASE;
 	entry_msr_load[0].value = MSR_MAGIC;
 
-- 
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux