162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * tools/testing/selftests/kvm/include/memstress.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2020, Google LLC. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef SELFTEST_KVM_MEMSTRESS_H 962306a36Sopenharmony_ci#define SELFTEST_KVM_MEMSTRESS_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <pthread.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "kvm_util.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* Default guest test virtual memory offset */ 1662306a36Sopenharmony_ci#define DEFAULT_GUEST_TEST_MEM 0xc0000000 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define DEFAULT_PER_VCPU_MEM_SIZE (1 << 30) /* 1G */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define MEMSTRESS_MEM_SLOT_INDEX 1 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistruct memstress_vcpu_args { 2362306a36Sopenharmony_ci uint64_t gpa; 2462306a36Sopenharmony_ci uint64_t gva; 2562306a36Sopenharmony_ci uint64_t pages; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci /* Only used by the host userspace part of the vCPU thread */ 2862306a36Sopenharmony_ci struct kvm_vcpu *vcpu; 2962306a36Sopenharmony_ci int vcpu_idx; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct memstress_args { 3362306a36Sopenharmony_ci struct kvm_vm *vm; 3462306a36Sopenharmony_ci /* The starting address and size of the guest test region. */ 3562306a36Sopenharmony_ci uint64_t gpa; 3662306a36Sopenharmony_ci uint64_t size; 3762306a36Sopenharmony_ci uint64_t guest_page_size; 3862306a36Sopenharmony_ci uint32_t random_seed; 3962306a36Sopenharmony_ci uint32_t write_percent; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci /* Run vCPUs in L2 instead of L1, if the architecture supports it. */ 4262306a36Sopenharmony_ci bool nested; 4362306a36Sopenharmony_ci /* Randomize which pages are accessed by the guest. */ 4462306a36Sopenharmony_ci bool random_access; 4562306a36Sopenharmony_ci /* True if all vCPUs are pinned to pCPUs */ 4662306a36Sopenharmony_ci bool pin_vcpus; 4762306a36Sopenharmony_ci /* The vCPU=>pCPU pinning map. Only valid if pin_vcpus is true. */ 4862306a36Sopenharmony_ci uint32_t vcpu_to_pcpu[KVM_MAX_VCPUS]; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci /* Test is done, stop running vCPUs. */ 5162306a36Sopenharmony_ci bool stop_vcpus; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci struct memstress_vcpu_args vcpu_args[KVM_MAX_VCPUS]; 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciextern struct memstress_args memstress_args; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct kvm_vm *memstress_create_vm(enum vm_guest_mode mode, int nr_vcpus, 5962306a36Sopenharmony_ci uint64_t vcpu_memory_bytes, int slots, 6062306a36Sopenharmony_ci enum vm_mem_backing_src_type backing_src, 6162306a36Sopenharmony_ci bool partition_vcpu_memory_access); 6262306a36Sopenharmony_civoid memstress_destroy_vm(struct kvm_vm *vm); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_civoid memstress_set_write_percent(struct kvm_vm *vm, uint32_t write_percent); 6562306a36Sopenharmony_civoid memstress_set_random_seed(struct kvm_vm *vm, uint32_t random_seed); 6662306a36Sopenharmony_civoid memstress_set_random_access(struct kvm_vm *vm, bool random_access); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_civoid memstress_start_vcpu_threads(int vcpus, void (*vcpu_fn)(struct memstress_vcpu_args *)); 6962306a36Sopenharmony_civoid memstress_join_vcpu_threads(int vcpus); 7062306a36Sopenharmony_civoid memstress_guest_code(uint32_t vcpu_id); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciuint64_t memstress_nested_pages(int nr_vcpus); 7362306a36Sopenharmony_civoid memstress_setup_nested(struct kvm_vm *vm, int nr_vcpus, struct kvm_vcpu *vcpus[]); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_civoid memstress_enable_dirty_logging(struct kvm_vm *vm, int slots); 7662306a36Sopenharmony_civoid memstress_disable_dirty_logging(struct kvm_vm *vm, int slots); 7762306a36Sopenharmony_civoid memstress_get_dirty_log(struct kvm_vm *vm, unsigned long *bitmaps[], int slots); 7862306a36Sopenharmony_civoid memstress_clear_dirty_log(struct kvm_vm *vm, unsigned long *bitmaps[], 7962306a36Sopenharmony_ci int slots, uint64_t pages_per_slot); 8062306a36Sopenharmony_ciunsigned long **memstress_alloc_bitmaps(int slots, uint64_t pages_per_slot); 8162306a36Sopenharmony_civoid memstress_free_bitmaps(unsigned long *bitmaps[], int slots); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#endif /* SELFTEST_KVM_MEMSTRESS_H */ 84