]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - tools/testing/selftests/kvm/dirty_log_test.c
KVM: selftests: Create VM earlier for dirty log test
[linux.git] / tools / testing / selftests / kvm / dirty_log_test.c
index dc3346e090f5694063921010790e8a0208e251e2..cf2099abb121852e9034d843da0c1e038aacce43 100644 (file)
@@ -249,14 +249,12 @@ static void vm_dirty_log_verify(unsigned long *bmap)
 }
 
 static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,
-                               uint64_t extra_mem_pages, void *guest_code,
-                               unsigned long type)
+                               uint64_t extra_mem_pages, void *guest_code)
 {
        struct kvm_vm *vm;
        uint64_t extra_pg_pages = extra_mem_pages / 512 * 2;
 
-       vm = _vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages,
-                       O_RDWR, type);
+       vm = _vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
        kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
 #ifdef __x86_64__
        vm_create_irqchip(vm);
@@ -265,6 +263,9 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,
        return vm;
 }
 
+#define DIRTY_MEM_BITS 30 /* 1G */
+#define PAGE_SHIFT_4K  12
+
 static void run_test(enum vm_guest_mode mode, unsigned long iterations,
                     unsigned long interval, uint64_t phys_offset)
 {
@@ -273,7 +274,18 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
        struct kvm_vm *vm;
        uint64_t max_gfn;
        unsigned long *bmap;
-       unsigned long type = 0;
+
+       /*
+        * We reserve page table for 2 times of extra dirty mem which
+        * will definitely cover the original (1G+) test range.  Here
+        * we do the calculation with 4K page size which is the
+        * smallest so the page number will be enough for all archs
+        * (e.g., 64K page size guest will need even less memory for
+        * page tables).
+        */
+       vm = create_vm(mode, VCPU_ID,
+                      2ul << (DIRTY_MEM_BITS - PAGE_SHIFT_4K),
+                      guest_code);
 
        switch (mode) {
        case VM_MODE_P52V48_4K:
@@ -314,10 +326,6 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
         * bits we can change to 39.
         */
        guest_pa_bits = 39;
-#endif
-#ifdef __aarch64__
-       if (guest_pa_bits != 40)
-               type = KVM_VM_TYPE_ARM_IPA_SIZE(guest_pa_bits);
 #endif
        max_gfn = (1ul << (guest_pa_bits - guest_page_shift)) - 1;
        guest_page_size = (1ul << guest_page_shift);
@@ -325,7 +333,7 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
         * A little more than 1G of guest page sized pages.  Cover the
         * case where the size is not aligned to 64 pages.
         */
-       guest_num_pages = (1ul << (30 - guest_page_shift)) + 16;
+       guest_num_pages = (1ul << (DIRTY_MEM_BITS - guest_page_shift)) + 16;
 #ifdef __s390x__
        /* Round up to multiple of 1M (segment size) */
        guest_num_pages = (guest_num_pages + 0xff) & ~0xffUL;
@@ -351,8 +359,6 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
        bmap = bitmap_alloc(host_num_pages);
        host_bmap_track = bitmap_alloc(host_num_pages);
 
-       vm = create_vm(mode, VCPU_ID, guest_num_pages, guest_code, type);
-
 #ifdef USE_CLEAR_DIRTY_LOG
        struct kvm_enable_cap cap = {};