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

KVM: selftests: introduce P44V64 for z196 and EC12

Older machines like z196 and zEC12 do only support 44 bits of physical
addresses. Make this the default and check via IBC if we are on a later
machine. We then add P47V64 as an additional model.

Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Link: https://lore.kernel.org/kvm/20210701153853.33063-1-borntraeger@de.ibm.com/
Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")

+23 -1
+2 -1
tools/testing/selftests/kvm/include/kvm_util.h
··· 44 44 VM_MODE_P40V48_64K, 45 45 VM_MODE_PXXV48_4K, /* For 48bits VA but ANY bits PA */ 46 46 VM_MODE_P47V64_4K, 47 + VM_MODE_P44V64_4K, 47 48 NUM_VM_MODES, 48 49 }; 49 50 ··· 62 61 63 62 #elif defined(__s390x__) 64 63 65 - #define VM_MODE_DEFAULT VM_MODE_P47V64_4K 64 + #define VM_MODE_DEFAULT VM_MODE_P44V64_4K 66 65 #define MIN_PAGE_SHIFT 12U 67 66 #define ptes_per_page(page_size) ((page_size) / 16) 68 67
+16
tools/testing/selftests/kvm/lib/guest_modes.c
··· 22 22 } 23 23 } 24 24 #endif 25 + #ifdef __s390x__ 26 + { 27 + int kvm_fd, vm_fd; 28 + struct kvm_s390_vm_cpu_processor info; 29 + 30 + kvm_fd = open_kvm_dev_path_or_exit(); 31 + vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0); 32 + kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL, 33 + KVM_S390_VM_CPU_PROCESSOR, &info, false); 34 + close(vm_fd); 35 + close(kvm_fd); 36 + /* Starting with z13 we have 47bits of physical address */ 37 + if (info.ibc >= 0x30) 38 + guest_mode_append(VM_MODE_P47V64_4K, true, true); 39 + } 40 + #endif 25 41 } 26 42 27 43 void for_each_guest_mode(void (*func)(enum vm_guest_mode, void *), void *arg)
+5
tools/testing/selftests/kvm/lib/kvm_util.c
··· 176 176 [VM_MODE_P40V48_64K] = "PA-bits:40, VA-bits:48, 64K pages", 177 177 [VM_MODE_PXXV48_4K] = "PA-bits:ANY, VA-bits:48, 4K pages", 178 178 [VM_MODE_P47V64_4K] = "PA-bits:47, VA-bits:64, 4K pages", 179 + [VM_MODE_P44V64_4K] = "PA-bits:44, VA-bits:64, 4K pages", 179 180 }; 180 181 _Static_assert(sizeof(strings)/sizeof(char *) == NUM_VM_MODES, 181 182 "Missing new mode strings?"); ··· 195 194 { 40, 48, 0x10000, 16 }, 196 195 { 0, 0, 0x1000, 12 }, 197 196 { 47, 64, 0x1000, 12 }, 197 + { 44, 64, 0x1000, 12 }, 198 198 }; 199 199 _Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct vm_guest_mode_params) == NUM_VM_MODES, 200 200 "Missing new mode params?"); ··· 282 280 #endif 283 281 break; 284 282 case VM_MODE_P47V64_4K: 283 + vm->pgtable_levels = 5; 284 + break; 285 + case VM_MODE_P44V64_4K: 285 286 vm->pgtable_levels = 5; 286 287 break; 287 288 default: