Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: selftests: Expose align() helpers to tests

Refactor align() to work with non-pointers and split into separate
helpers for aligning up vs. down. Add align_ptr_up() for use with
pointers. Expose all helpers so that they can be used by tests and/or
other utilities. The align_down() helper in particular will be used to
ensure gpa alignment for hugepages.

No functional change intended.

[Added sepearate up/down helpers and replaced open-coded alignment
bit math throughout the KVM selftests.]

Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: David Matlack <dmatlack@google.com>
Reviewed-by: Ben Gardon <bgardon@google.com>
Message-Id: <20211111000310.1435032-3-dmatlack@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Sean Christopherson and committed by
Paolo Bonzini
c071ff41 531ca3d6

+34 -19
+3 -3
tools/testing/selftests/kvm/dirty_log_test.c
··· 115 115 addr = guest_test_virt_mem; 116 116 addr += (READ_ONCE(random_array[i]) % guest_num_pages) 117 117 * guest_page_size; 118 - addr &= ~(host_page_size - 1); 118 + addr = align_down(addr, host_page_size); 119 119 *(uint64_t *)addr = READ_ONCE(iteration); 120 120 } 121 121 ··· 737 737 if (!p->phys_offset) { 738 738 guest_test_phys_mem = (vm_get_max_gfn(vm) - 739 739 guest_num_pages) * guest_page_size; 740 - guest_test_phys_mem &= ~(host_page_size - 1); 740 + guest_test_phys_mem = align_down(guest_test_phys_mem, host_page_size); 741 741 } else { 742 742 guest_test_phys_mem = p->phys_offset; 743 743 } 744 744 745 745 #ifdef __s390x__ 746 746 /* Align to 1M (segment size) */ 747 - guest_test_phys_mem &= ~((1 << 20) - 1); 747 + guest_test_phys_mem = align_down(guest_test_phys_mem, 1 << 20); 748 748 #endif 749 749 750 750 pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem);
+25
tools/testing/selftests/kvm/include/test_util.h
··· 117 117 return vm_mem_backing_src_alias(t)->flag & MAP_SHARED; 118 118 } 119 119 120 + /* Aligns x up to the next multiple of size. Size must be a power of 2. */ 121 + static inline uint64_t align_up(uint64_t x, uint64_t size) 122 + { 123 + uint64_t mask = size - 1; 124 + 125 + TEST_ASSERT(size != 0 && !(size & (size - 1)), 126 + "size not a power of 2: %lu", size); 127 + return ((x + mask) & ~mask); 128 + } 129 + 130 + static inline uint64_t align_down(uint64_t x, uint64_t size) 131 + { 132 + uint64_t x_aligned_up = align_up(x, size); 133 + 134 + if (x == x_aligned_up) 135 + return x; 136 + else 137 + return x_aligned_up - size; 138 + } 139 + 140 + static inline void *align_ptr_up(void *x, size_t size) 141 + { 142 + return (void *)align_up((unsigned long)x, size); 143 + } 144 + 120 145 #endif /* SELFTEST_KVM_TEST_UTIL_H */
+1 -1
tools/testing/selftests/kvm/kvm_page_table_test.c
··· 280 280 #ifdef __s390x__ 281 281 alignment = max(0x100000, alignment); 282 282 #endif 283 - guest_test_phys_mem &= ~(alignment - 1); 283 + guest_test_phys_mem = align_down(guest_test_virt_mem, alignment); 284 284 285 285 /* Set up the shared data structure test_args */ 286 286 test_args.vm = vm;
+1 -2
tools/testing/selftests/kvm/lib/elf.c
··· 157 157 "memsize of 0,\n" 158 158 " phdr index: %u p_memsz: 0x%" PRIx64, 159 159 n1, (uint64_t) phdr.p_memsz); 160 - vm_vaddr_t seg_vstart = phdr.p_vaddr; 161 - seg_vstart &= ~(vm_vaddr_t)(vm->page_size - 1); 160 + vm_vaddr_t seg_vstart = align_down(phdr.p_vaddr, vm->page_size); 162 161 vm_vaddr_t seg_vend = phdr.p_vaddr + phdr.p_memsz - 1; 163 162 seg_vend |= vm->page_size - 1; 164 163 size_t seg_size = seg_vend - seg_vstart + 1;
+2 -11
tools/testing/selftests/kvm/lib/kvm_util.c
··· 22 22 23 23 static int vcpu_mmap_sz(void); 24 24 25 - /* Aligns x up to the next multiple of size. Size must be a power of 2. */ 26 - static void *align(void *x, size_t size) 27 - { 28 - size_t mask = size - 1; 29 - TEST_ASSERT(size != 0 && !(size & (size - 1)), 30 - "size not a power of 2: %lu", size); 31 - return (void *) (((size_t) x + mask) & ~mask); 32 - } 33 - 34 25 /* 35 26 * Open KVM_DEV_PATH if available, otherwise exit the entire program. 36 27 * ··· 902 911 region->mmap_start, errno); 903 912 904 913 /* Align host address */ 905 - region->host_mem = align(region->mmap_start, alignment); 914 + region->host_mem = align_ptr_up(region->mmap_start, alignment); 906 915 907 916 /* As needed perform madvise */ 908 917 if ((src_type == VM_MEM_SRC_ANONYMOUS || ··· 945 954 "mmap of alias failed, errno: %i", errno); 946 955 947 956 /* Align host alias address */ 948 - region->host_alias = align(region->mmap_alias, alignment); 957 + region->host_alias = align_ptr_up(region->mmap_alias, alignment); 949 958 } 950 959 } 951 960
+2 -2
tools/testing/selftests/kvm/lib/perf_test_util.c
··· 92 92 93 93 guest_test_phys_mem = (vm_get_max_gfn(vm) - guest_num_pages) * 94 94 perf_test_args.guest_page_size; 95 - guest_test_phys_mem &= ~(perf_test_args.host_page_size - 1); 95 + guest_test_phys_mem = align_down(guest_test_phys_mem, perf_test_args.host_page_size); 96 96 #ifdef __s390x__ 97 97 /* Align to 1M (segment size) */ 98 - guest_test_phys_mem &= ~((1 << 20) - 1); 98 + guest_test_phys_mem = align_down(guest_test_phys_mem, 1 << 20); 99 99 #endif 100 100 pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem); 101 101