19fda6753SDavid Matlack // SPDX-License-Identifier: GPL-2.0 29fda6753SDavid Matlack /* 39fda6753SDavid Matlack * tools/testing/selftests/kvm/include/memstress.h 49fda6753SDavid Matlack * 59fda6753SDavid Matlack * Copyright (C) 2020, Google LLC. 69fda6753SDavid Matlack */ 79fda6753SDavid Matlack 89fda6753SDavid Matlack #ifndef SELFTEST_KVM_MEMSTRESS_H 99fda6753SDavid Matlack #define SELFTEST_KVM_MEMSTRESS_H 109fda6753SDavid Matlack 119fda6753SDavid Matlack #include <pthread.h> 129fda6753SDavid Matlack 139fda6753SDavid Matlack #include "kvm_util.h" 149fda6753SDavid Matlack 159fda6753SDavid Matlack /* Default guest test virtual memory offset */ 169fda6753SDavid Matlack #define DEFAULT_GUEST_TEST_MEM 0xc0000000 179fda6753SDavid Matlack 189fda6753SDavid Matlack #define DEFAULT_PER_VCPU_MEM_SIZE (1 << 30) /* 1G */ 199fda6753SDavid Matlack 207812d80cSDavid Matlack #define MEMSTRESS_MEM_SLOT_INDEX 1 219fda6753SDavid Matlack 227812d80cSDavid Matlack struct memstress_vcpu_args { 239fda6753SDavid Matlack uint64_t gpa; 249fda6753SDavid Matlack uint64_t gva; 259fda6753SDavid Matlack uint64_t pages; 269fda6753SDavid Matlack 279fda6753SDavid Matlack /* Only used by the host userspace part of the vCPU thread */ 289fda6753SDavid Matlack struct kvm_vcpu *vcpu; 299fda6753SDavid Matlack int vcpu_idx; 309fda6753SDavid Matlack }; 319fda6753SDavid Matlack 327812d80cSDavid Matlack struct memstress_args { 339fda6753SDavid Matlack struct kvm_vm *vm; 349fda6753SDavid Matlack /* The starting address and size of the guest test region. */ 359fda6753SDavid Matlack uint64_t gpa; 369fda6753SDavid Matlack uint64_t size; 379fda6753SDavid Matlack uint64_t guest_page_size; 389fda6753SDavid Matlack uint32_t random_seed; 399fda6753SDavid Matlack uint32_t write_percent; 409fda6753SDavid Matlack 419fda6753SDavid Matlack /* Run vCPUs in L2 instead of L1, if the architecture supports it. */ 429fda6753SDavid Matlack bool nested; 439fda6753SDavid Matlack /* Randomize which pages are accessed by the guest. */ 449fda6753SDavid Matlack bool random_access; 459fda6753SDavid Matlack /* True if all vCPUs are pinned to pCPUs */ 469fda6753SDavid Matlack bool pin_vcpus; 479fda6753SDavid Matlack /* The vCPU=>pCPU pinning map. Only valid if pin_vcpus is true. */ 489fda6753SDavid Matlack uint32_t vcpu_to_pcpu[KVM_MAX_VCPUS]; 499fda6753SDavid Matlack 50eb561891SPaolo Bonzini /* Test is done, stop running vCPUs. */ 51eb561891SPaolo Bonzini bool stop_vcpus; 52eb561891SPaolo Bonzini 537812d80cSDavid Matlack struct memstress_vcpu_args vcpu_args[KVM_MAX_VCPUS]; 549fda6753SDavid Matlack }; 559fda6753SDavid Matlack 567812d80cSDavid Matlack extern struct memstress_args memstress_args; 579fda6753SDavid Matlack 587812d80cSDavid Matlack struct kvm_vm *memstress_create_vm(enum vm_guest_mode mode, int nr_vcpus, 599fda6753SDavid Matlack uint64_t vcpu_memory_bytes, int slots, 609fda6753SDavid Matlack enum vm_mem_backing_src_type backing_src, 619fda6753SDavid Matlack bool partition_vcpu_memory_access); 627812d80cSDavid Matlack void memstress_destroy_vm(struct kvm_vm *vm); 639fda6753SDavid Matlack 647812d80cSDavid Matlack void memstress_set_write_percent(struct kvm_vm *vm, uint32_t write_percent); 657812d80cSDavid Matlack void memstress_set_random_seed(struct kvm_vm *vm, uint32_t random_seed); 667812d80cSDavid Matlack void memstress_set_random_access(struct kvm_vm *vm, bool random_access); 679fda6753SDavid Matlack 687812d80cSDavid Matlack void memstress_start_vcpu_threads(int vcpus, void (*vcpu_fn)(struct memstress_vcpu_args *)); 697812d80cSDavid Matlack void memstress_join_vcpu_threads(int vcpus); 707812d80cSDavid Matlack void memstress_guest_code(uint32_t vcpu_id); 719fda6753SDavid Matlack 727812d80cSDavid Matlack uint64_t memstress_nested_pages(int nr_vcpus); 737812d80cSDavid Matlack void memstress_setup_nested(struct kvm_vm *vm, int nr_vcpus, struct kvm_vcpu *vcpus[]); 749fda6753SDavid Matlack 75*de10b798SBen Gardon void memstress_enable_dirty_logging(struct kvm_vm *vm, int slots); 76*de10b798SBen Gardon void memstress_disable_dirty_logging(struct kvm_vm *vm, int slots); 77*de10b798SBen Gardon void memstress_get_dirty_log(struct kvm_vm *vm, unsigned long *bitmaps[], int slots); 78*de10b798SBen Gardon void memstress_clear_dirty_log(struct kvm_vm *vm, unsigned long *bitmaps[], 79*de10b798SBen Gardon int slots, uint64_t pages_per_slot); 80*de10b798SBen Gardon unsigned long **memstress_alloc_bitmaps(int slots, uint64_t pages_per_slot); 81*de10b798SBen Gardon void memstress_free_bitmaps(unsigned long *bitmaps[], int slots); 82*de10b798SBen Gardon 839fda6753SDavid Matlack #endif /* SELFTEST_KVM_MEMSTRESS_H */ 84