120c8ccb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2edf88417SAvi Kivity #ifndef __KVM_HOST_H 3edf88417SAvi Kivity #define __KVM_HOST_H 4edf88417SAvi Kivity 5edf88417SAvi Kivity 6edf88417SAvi Kivity #include <linux/types.h> 7edf88417SAvi Kivity #include <linux/hardirq.h> 8edf88417SAvi Kivity #include <linux/list.h> 9edf88417SAvi Kivity #include <linux/mutex.h> 10edf88417SAvi Kivity #include <linux/spinlock.h> 11edf88417SAvi Kivity #include <linux/signal.h> 12edf88417SAvi Kivity #include <linux/sched.h> 136bd5b743SWanpeng Li #include <linux/sched/stat.h> 14187f1882SPaul Gortmaker #include <linux/bug.h> 154a42d848SDavid Stevens #include <linux/minmax.h> 16edf88417SAvi Kivity #include <linux/mm.h> 17b297e672SEric B Munson #include <linux/mmu_notifier.h> 18edf88417SAvi Kivity #include <linux/preempt.h> 190937c48dSSheng Yang #include <linux/msi.h> 20d89f5effSJan Kiszka #include <linux/slab.h> 21d1e5b0e9SMarc Orr #include <linux/vmalloc.h> 22bd2b53b2SMichael S. Tsirkin #include <linux/rcupdate.h> 23bd80158aSJan Kiszka #include <linux/ratelimit.h> 2483f09228SXiao Guangrong #include <linux/err.h> 25c11f11fcSFrederic Weisbecker #include <linux/irqflags.h> 26521921baSFrederic Weisbecker #include <linux/context_tracking.h> 271a02b270SEric Auger #include <linux/irqbypass.h> 28da4ad88cSDavidlohr Bueso #include <linux/rcuwait.h> 29e3736c3eSElena Reshetova #include <linux/refcount.h> 301d487e9bSPaolo Bonzini #include <linux/nospec.h> 312fdef3a2SSergey Senozhatsky #include <linux/notifier.h> 32ef9989afSMark Rutland #include <linux/ftrace.h> 3326b8345aSMaciej S. Szmigiero #include <linux/hashtable.h> 34ef9989afSMark Rutland #include <linux/instrumentation.h> 35ed922739SMaciej S. Szmigiero #include <linux/interval_tree.h> 36a54d8066SMaciej S. Szmigiero #include <linux/rbtree.h> 37c5b07754SMarc Zyngier #include <linux/xarray.h> 38edf88417SAvi Kivity #include <asm/signal.h> 39edf88417SAvi Kivity 40edf88417SAvi Kivity #include <linux/kvm.h> 41edf88417SAvi Kivity #include <linux/kvm_para.h> 42edf88417SAvi Kivity 43edf88417SAvi Kivity #include <linux/kvm_types.h> 44edf88417SAvi Kivity 45edf88417SAvi Kivity #include <asm/kvm_host.h> 46fb04a1edSPeter Xu #include <linux/kvm_dirty_ring.h> 47edf88417SAvi Kivity 48a1c42ddeSJuergen Gross #ifndef KVM_MAX_VCPU_IDS 49a1c42ddeSJuergen Gross #define KVM_MAX_VCPU_IDS KVM_MAX_VCPUS 500b1b1dfdSGreg Kurz #endif 510b1b1dfdSGreg Kurz 52edf88417SAvi Kivity /* 5367b29204SXiao Guangrong * The bit 16 ~ bit 31 of kvm_memory_region::flags are internally used 5467b29204SXiao Guangrong * in kvm, other bits are visible for userspace which are defined in 5567b29204SXiao Guangrong * include/linux/kvm_h. 5667b29204SXiao Guangrong */ 5767b29204SXiao Guangrong #define KVM_MEMSLOT_INVALID (1UL << 16) 5867b29204SXiao Guangrong 59361209e0SSean Christopherson /* 60164bf7e5SSean Christopherson * Bit 63 of the memslot generation number is an "update in-progress flag", 61361209e0SSean Christopherson * e.g. is temporarily set for the duration of install_new_memslots(). 62361209e0SSean Christopherson * This flag effectively creates a unique generation number that is used to 63361209e0SSean Christopherson * mark cached memslot data, e.g. MMIO accesses, as potentially being stale, 64361209e0SSean Christopherson * i.e. may (or may not) have come from the previous memslots generation. 65361209e0SSean Christopherson * 66361209e0SSean Christopherson * This is necessary because the actual memslots update is not atomic with 67361209e0SSean Christopherson * respect to the generation number update. Updating the generation number 68361209e0SSean Christopherson * first would allow a vCPU to cache a spte from the old memslots using the 69361209e0SSean Christopherson * new generation number, and updating the generation number after switching 70361209e0SSean Christopherson * to the new memslots would allow cache hits using the old generation number 71361209e0SSean Christopherson * to reference the defunct memslots. 72361209e0SSean Christopherson * 73361209e0SSean Christopherson * This mechanism is used to prevent getting hits in KVM's caches while a 74361209e0SSean Christopherson * memslot update is in-progress, and to prevent cache hits *after* updating 75361209e0SSean Christopherson * the actual generation number against accesses that were inserted into the 76361209e0SSean Christopherson * cache *before* the memslots were updated. 77361209e0SSean Christopherson */ 78164bf7e5SSean Christopherson #define KVM_MEMSLOT_GEN_UPDATE_IN_PROGRESS BIT_ULL(63) 79361209e0SSean Christopherson 8087da7e66SXiao Guangrong /* Two fragments for cross MMIO pages. */ 8187da7e66SXiao Guangrong #define KVM_MAX_MMIO_FRAGMENTS 2 82f78146b0SAvi Kivity 83f481b069SPaolo Bonzini #ifndef KVM_ADDRESS_SPACE_NUM 84f481b069SPaolo Bonzini #define KVM_ADDRESS_SPACE_NUM 1 85f481b069SPaolo Bonzini #endif 86f481b069SPaolo Bonzini 87f78146b0SAvi Kivity /* 889c5b1172SXiao Guangrong * For the normal pfn, the highest 12 bits should be zero, 8981c52c56SXiao Guangrong * so we can mask bit 62 ~ bit 52 to indicate the error pfn, 9081c52c56SXiao Guangrong * mask bit 63 to indicate the noslot pfn. 919c5b1172SXiao Guangrong */ 9281c52c56SXiao Guangrong #define KVM_PFN_ERR_MASK (0x7ffULL << 52) 9381c52c56SXiao Guangrong #define KVM_PFN_ERR_NOSLOT_MASK (0xfffULL << 52) 9481c52c56SXiao Guangrong #define KVM_PFN_NOSLOT (0x1ULL << 63) 956c8ee57bSXiao Guangrong 969c5b1172SXiao Guangrong #define KVM_PFN_ERR_FAULT (KVM_PFN_ERR_MASK) 979c5b1172SXiao Guangrong #define KVM_PFN_ERR_HWPOISON (KVM_PFN_ERR_MASK + 1) 9881c52c56SXiao Guangrong #define KVM_PFN_ERR_RO_FAULT (KVM_PFN_ERR_MASK + 2) 99fe5ed56cSPeter Xu #define KVM_PFN_ERR_SIGPENDING (KVM_PFN_ERR_MASK + 3) 1009c5b1172SXiao Guangrong 10181c52c56SXiao Guangrong /* 10281c52c56SXiao Guangrong * error pfns indicate that the gfn is in slot but faild to 10381c52c56SXiao Guangrong * translate it to pfn on host. 10481c52c56SXiao Guangrong */ 105ba049e93SDan Williams static inline bool is_error_pfn(kvm_pfn_t pfn) 10683f09228SXiao Guangrong { 1079c5b1172SXiao Guangrong return !!(pfn & KVM_PFN_ERR_MASK); 10883f09228SXiao Guangrong } 10983f09228SXiao Guangrong 11081c52c56SXiao Guangrong /* 111fe5ed56cSPeter Xu * KVM_PFN_ERR_SIGPENDING indicates that fetching the PFN was interrupted 112fe5ed56cSPeter Xu * by a pending signal. Note, the signal may or may not be fatal. 113fe5ed56cSPeter Xu */ 114fe5ed56cSPeter Xu static inline bool is_sigpending_pfn(kvm_pfn_t pfn) 115fe5ed56cSPeter Xu { 116fe5ed56cSPeter Xu return pfn == KVM_PFN_ERR_SIGPENDING; 117fe5ed56cSPeter Xu } 118fe5ed56cSPeter Xu 119fe5ed56cSPeter Xu /* 12081c52c56SXiao Guangrong * error_noslot pfns indicate that the gfn can not be 12181c52c56SXiao Guangrong * translated to pfn - it is not in slot or failed to 12281c52c56SXiao Guangrong * translate it to pfn. 12381c52c56SXiao Guangrong */ 124ba049e93SDan Williams static inline bool is_error_noslot_pfn(kvm_pfn_t pfn) 12583f09228SXiao Guangrong { 12681c52c56SXiao Guangrong return !!(pfn & KVM_PFN_ERR_NOSLOT_MASK); 12783f09228SXiao Guangrong } 12883f09228SXiao Guangrong 12981c52c56SXiao Guangrong /* noslot pfn indicates that the gfn is not in slot. */ 130ba049e93SDan Williams static inline bool is_noslot_pfn(kvm_pfn_t pfn) 13183f09228SXiao Guangrong { 13281c52c56SXiao Guangrong return pfn == KVM_PFN_NOSLOT; 13383f09228SXiao Guangrong } 13483f09228SXiao Guangrong 135bf640876SDominik Dingel /* 136bf640876SDominik Dingel * architectures with KVM_HVA_ERR_BAD other than PAGE_OFFSET (e.g. s390) 137bf640876SDominik Dingel * provide own defines and kvm_is_error_hva 138bf640876SDominik Dingel */ 139bf640876SDominik Dingel #ifndef KVM_HVA_ERR_BAD 140bf640876SDominik Dingel 141ca3a490cSXiao Guangrong #define KVM_HVA_ERR_BAD (PAGE_OFFSET) 1427068d097SXiao Guangrong #define KVM_HVA_ERR_RO_BAD (PAGE_OFFSET + PAGE_SIZE) 143ca3a490cSXiao Guangrong 144ca3a490cSXiao Guangrong static inline bool kvm_is_error_hva(unsigned long addr) 145ca3a490cSXiao Guangrong { 1467068d097SXiao Guangrong return addr >= PAGE_OFFSET; 147ca3a490cSXiao Guangrong } 148ca3a490cSXiao Guangrong 149bf640876SDominik Dingel #endif 150bf640876SDominik Dingel 1516cede2e6SXiao Guangrong #define KVM_ERR_PTR_BAD_PAGE (ERR_PTR(-ENOENT)) 1526cede2e6SXiao Guangrong 1539c5b1172SXiao Guangrong static inline bool is_error_page(struct page *page) 1546cede2e6SXiao Guangrong { 1556cede2e6SXiao Guangrong return IS_ERR(page); 1566cede2e6SXiao Guangrong } 1576cede2e6SXiao Guangrong 158930f7fd6SRadim Krčmář #define KVM_REQUEST_MASK GENMASK(7,0) 159930f7fd6SRadim Krčmář #define KVM_REQUEST_NO_WAKEUP BIT(8) 1607a97cec2SPaolo Bonzini #define KVM_REQUEST_WAIT BIT(9) 161df06dae3SSean Christopherson #define KVM_REQUEST_NO_ACTION BIT(10) 162edf88417SAvi Kivity /* 1632860c4b1SPaolo Bonzini * Architecture-independent vcpu->requests bit members 164c59fb127SPaolo Bonzini * Bits 3-7 are reserved for more arch-independent bits. 165edf88417SAvi Kivity */ 1667a97cec2SPaolo Bonzini #define KVM_REQ_TLB_FLUSH (0 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 167e65a3b46SSean Christopherson #define KVM_REQ_VM_DEAD (1 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 168084071d5SMarcelo Tosatti #define KVM_REQ_UNBLOCK 2 1692387149eSAndrew Jones #define KVM_REQUEST_ARCH_BASE 8 1702387149eSAndrew Jones 171df06dae3SSean Christopherson /* 172df06dae3SSean Christopherson * KVM_REQ_OUTSIDE_GUEST_MODE exists is purely as way to force the vCPU to 173df06dae3SSean Christopherson * OUTSIDE_GUEST_MODE. KVM_REQ_OUTSIDE_GUEST_MODE differs from a vCPU "kick" 174df06dae3SSean Christopherson * in that it ensures the vCPU has reached OUTSIDE_GUEST_MODE before continuing 175df06dae3SSean Christopherson * on. A kick only guarantees that the vCPU is on its way out, e.g. a previous 176df06dae3SSean Christopherson * kick may have set vcpu->mode to EXITING_GUEST_MODE, and so there's no 177df06dae3SSean Christopherson * guarantee the vCPU received an IPI and has actually exited guest mode. 178df06dae3SSean Christopherson */ 179df06dae3SSean Christopherson #define KVM_REQ_OUTSIDE_GUEST_MODE (KVM_REQUEST_NO_ACTION | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) 180df06dae3SSean Christopherson 1812387149eSAndrew Jones #define KVM_ARCH_REQ_FLAGS(nr, flags) ({ \ 182c593642cSPankaj Bharadiya BUILD_BUG_ON((unsigned)(nr) >= (sizeof_field(struct kvm_vcpu, requests) * 8) - KVM_REQUEST_ARCH_BASE); \ 1832387149eSAndrew Jones (unsigned)(((nr) + KVM_REQUEST_ARCH_BASE) | (flags)); \ 1842387149eSAndrew Jones }) 1852387149eSAndrew Jones #define KVM_ARCH_REQ(nr) KVM_ARCH_REQ_FLAGS(nr, 0) 1860cd31043SPaolo Bonzini 1877ee3e8c3SSean Christopherson bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req, 188620b2438SVitaly Kuznetsov unsigned long *vcpu_bitmap); 1897ee3e8c3SSean Christopherson bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req); 1907ee3e8c3SSean Christopherson bool kvm_make_all_cpus_request_except(struct kvm *kvm, unsigned int req, 1917ee3e8c3SSean Christopherson struct kvm_vcpu *except); 1927ee3e8c3SSean Christopherson bool kvm_make_cpus_request_mask(struct kvm *kvm, unsigned int req, 1937ee3e8c3SSean Christopherson unsigned long *vcpu_bitmap); 1947ee3e8c3SSean Christopherson 1955550af4dSSheng Yang #define KVM_USERSPACE_IRQ_SOURCE_ID 0 1967a84428aSAlex Williamson #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1 1975550af4dSSheng Yang 1980d9ce162SJunaid Shahid extern struct mutex kvm_lock; 199fc1b7492SGeoff Levand extern struct list_head vm_list; 200fc1b7492SGeoff Levand 201743eeb0bSSasha Levin struct kvm_io_range { 202743eeb0bSSasha Levin gpa_t addr; 203743eeb0bSSasha Levin int len; 204743eeb0bSSasha Levin struct kvm_io_device *dev; 205743eeb0bSSasha Levin }; 206743eeb0bSSasha Levin 207786a9f88SAmos Kong #define NR_IOBUS_DEVS 1000 208a1300716SAmos Kong 209edf88417SAvi Kivity struct kvm_io_bus { 210edf88417SAvi Kivity int dev_count; 2116ea34c9bSAmos Kong int ioeventfd_count; 212a1300716SAmos Kong struct kvm_io_range range[]; 213edf88417SAvi Kivity }; 214edf88417SAvi Kivity 215e93f8a0fSMarcelo Tosatti enum kvm_bus { 216e93f8a0fSMarcelo Tosatti KVM_MMIO_BUS, 217e93f8a0fSMarcelo Tosatti KVM_PIO_BUS, 218060f0ce6SCornelia Huck KVM_VIRTIO_CCW_NOTIFY_BUS, 21968c3b4d1SMichael S. Tsirkin KVM_FAST_MMIO_BUS, 220e93f8a0fSMarcelo Tosatti KVM_NR_BUSES 221e93f8a0fSMarcelo Tosatti }; 222e93f8a0fSMarcelo Tosatti 223e32edf4fSNikolay Nikolaev int kvm_io_bus_write(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr, 224e93f8a0fSMarcelo Tosatti int len, const void *val); 225e32edf4fSNikolay Nikolaev int kvm_io_bus_write_cookie(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, 226e32edf4fSNikolay Nikolaev gpa_t addr, int len, const void *val, long cookie); 227e32edf4fSNikolay Nikolaev int kvm_io_bus_read(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr, 228e32edf4fSNikolay Nikolaev int len, void *val); 229743eeb0bSSasha Levin int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, 230743eeb0bSSasha Levin int len, struct kvm_io_device *dev); 2315d3c4c79SSean Christopherson int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, 232edf88417SAvi Kivity struct kvm_io_device *dev); 2338a39d006SAndre Przywara struct kvm_io_device *kvm_io_bus_get_dev(struct kvm *kvm, enum kvm_bus bus_idx, 2348a39d006SAndre Przywara gpa_t addr); 235edf88417SAvi Kivity 236af585b92SGleb Natapov #ifdef CONFIG_KVM_ASYNC_PF 237af585b92SGleb Natapov struct kvm_async_pf { 238af585b92SGleb Natapov struct work_struct work; 239af585b92SGleb Natapov struct list_head link; 240af585b92SGleb Natapov struct list_head queue; 241af585b92SGleb Natapov struct kvm_vcpu *vcpu; 242af585b92SGleb Natapov struct mm_struct *mm; 243736c291cSSean Christopherson gpa_t cr2_or_gpa; 244af585b92SGleb Natapov unsigned long addr; 245af585b92SGleb Natapov struct kvm_arch_async_pf arch; 246f2e10669Schai wen bool wakeup_all; 2472a18b7e7SVitaly Kuznetsov bool notpresent_injected; 248af585b92SGleb Natapov }; 249af585b92SGleb Natapov 250af585b92SGleb Natapov void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu); 251af585b92SGleb Natapov void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu); 252e8c22266SVitaly Kuznetsov bool kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, 253736c291cSSean Christopherson unsigned long hva, struct kvm_arch_async_pf *arch); 254344d9588SGleb Natapov int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); 255af585b92SGleb Natapov #endif 256af585b92SGleb Natapov 2575f7c292bSSean Christopherson #ifdef KVM_ARCH_WANT_MMU_NOTIFIER 2583039bcc7SSean Christopherson struct kvm_gfn_range { 2593039bcc7SSean Christopherson struct kvm_memory_slot *slot; 2603039bcc7SSean Christopherson gfn_t start; 2613039bcc7SSean Christopherson gfn_t end; 2623039bcc7SSean Christopherson pte_t pte; 2633039bcc7SSean Christopherson bool may_block; 2643039bcc7SSean Christopherson }; 2653039bcc7SSean Christopherson bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range); 2663039bcc7SSean Christopherson bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range); 2673039bcc7SSean Christopherson bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range); 2683039bcc7SSean Christopherson bool kvm_set_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range); 2695f7c292bSSean Christopherson #endif 2705f7c292bSSean Christopherson 2716b7e2d09SXiao Guangrong enum { 2726b7e2d09SXiao Guangrong OUTSIDE_GUEST_MODE, 2736b7e2d09SXiao Guangrong IN_GUEST_MODE, 274c142786cSAvi Kivity EXITING_GUEST_MODE, 275c142786cSAvi Kivity READING_SHADOW_PAGE_TABLES, 2766b7e2d09SXiao Guangrong }; 2776b7e2d09SXiao Guangrong 278e45adf66SKarimAllah Ahmed #define KVM_UNMAPPED_PAGE ((void *) 0x500 + POISON_POINTER_DELTA) 279e45adf66SKarimAllah Ahmed 280e45adf66SKarimAllah Ahmed struct kvm_host_map { 281e45adf66SKarimAllah Ahmed /* 282e45adf66SKarimAllah Ahmed * Only valid if the 'pfn' is managed by the host kernel (i.e. There is 283e45adf66SKarimAllah Ahmed * a 'struct page' for it. When using mem= kernel parameter some memory 284e45adf66SKarimAllah Ahmed * can be used as guest memory but they are not managed by host 285e45adf66SKarimAllah Ahmed * kernel). 286e45adf66SKarimAllah Ahmed * If 'pfn' is not managed by the host kernel, this field is 287e45adf66SKarimAllah Ahmed * initialized to KVM_UNMAPPED_PAGE. 288e45adf66SKarimAllah Ahmed */ 289e45adf66SKarimAllah Ahmed struct page *page; 290e45adf66SKarimAllah Ahmed void *hva; 291e45adf66SKarimAllah Ahmed kvm_pfn_t pfn; 292e45adf66SKarimAllah Ahmed kvm_pfn_t gfn; 293e45adf66SKarimAllah Ahmed }; 294e45adf66SKarimAllah Ahmed 295e45adf66SKarimAllah Ahmed /* 296e45adf66SKarimAllah Ahmed * Used to check if the mapping is valid or not. Never use 'kvm_host_map' 297e45adf66SKarimAllah Ahmed * directly to check for that. 298e45adf66SKarimAllah Ahmed */ 299e45adf66SKarimAllah Ahmed static inline bool kvm_vcpu_mapped(struct kvm_host_map *map) 300e45adf66SKarimAllah Ahmed { 301e45adf66SKarimAllah Ahmed return !!map->hva; 302e45adf66SKarimAllah Ahmed } 303e45adf66SKarimAllah Ahmed 3046bd5b743SWanpeng Li static inline bool kvm_vcpu_can_poll(ktime_t cur, ktime_t stop) 3056bd5b743SWanpeng Li { 3066bd5b743SWanpeng Li return single_task_running() && !need_resched() && ktime_before(cur, stop); 3076bd5b743SWanpeng Li } 3086bd5b743SWanpeng Li 309f78146b0SAvi Kivity /* 310f78146b0SAvi Kivity * Sometimes a large or cross-page mmio needs to be broken up into separate 311f78146b0SAvi Kivity * exits for userspace servicing. 312f78146b0SAvi Kivity */ 313f78146b0SAvi Kivity struct kvm_mmio_fragment { 314f78146b0SAvi Kivity gpa_t gpa; 315f78146b0SAvi Kivity void *data; 316f78146b0SAvi Kivity unsigned len; 317f78146b0SAvi Kivity }; 318f78146b0SAvi Kivity 319edf88417SAvi Kivity struct kvm_vcpu { 320edf88417SAvi Kivity struct kvm *kvm; 32131bb117eSHollis Blanchard #ifdef CONFIG_PREEMPT_NOTIFIERS 322edf88417SAvi Kivity struct preempt_notifier preempt_notifier; 32331bb117eSHollis Blanchard #endif 324edf88417SAvi Kivity int cpu; 3258750e72aSRadim Krčmář int vcpu_id; /* id given by userspace at creation */ 3268750e72aSRadim Krčmář int vcpu_idx; /* index in kvm->vcpus array */ 3272031f287SSean Christopherson int ____srcu_idx; /* Don't use this directly. You've been warned. */ 3282031f287SSean Christopherson #ifdef CONFIG_PROVE_RCU 3292031f287SSean Christopherson int srcu_depth; 3302031f287SSean Christopherson #endif 3316b7e2d09SXiao Guangrong int mode; 33286dafed5SKarimAllah Ahmed u64 requests; 333d0bfb940SJan Kiszka unsigned long guest_debug; 3346b7e2d09SXiao Guangrong 3356b7e2d09SXiao Guangrong struct mutex mutex; 3366b7e2d09SXiao Guangrong struct kvm_run *run; 337f656ce01SMarcelo Tosatti 338510958e9SSean Christopherson #ifndef __KVM_HAVE_ARCH_WQP 339da4ad88cSDavidlohr Bueso struct rcuwait wait; 340510958e9SSean Christopherson #endif 3410e4524a5SChristian Borntraeger struct pid __rcu *pid; 342edf88417SAvi Kivity int sigset_active; 343edf88417SAvi Kivity sigset_t sigset; 34419020f8aSWanpeng Li unsigned int halt_poll_ns; 3453491caf2SChristian Borntraeger bool valid_wakeup; 346edf88417SAvi Kivity 347edf88417SAvi Kivity #ifdef CONFIG_HAS_IOMEM 348edf88417SAvi Kivity int mmio_needed; 349edf88417SAvi Kivity int mmio_read_completed; 350edf88417SAvi Kivity int mmio_is_write; 351f78146b0SAvi Kivity int mmio_cur_fragment; 352f78146b0SAvi Kivity int mmio_nr_fragments; 353f78146b0SAvi Kivity struct kvm_mmio_fragment mmio_fragments[KVM_MAX_MMIO_FRAGMENTS]; 354edf88417SAvi Kivity #endif 355edf88417SAvi Kivity 356af585b92SGleb Natapov #ifdef CONFIG_KVM_ASYNC_PF 357af585b92SGleb Natapov struct { 358af585b92SGleb Natapov u32 queued; 359af585b92SGleb Natapov struct list_head queue; 360af585b92SGleb Natapov struct list_head done; 361af585b92SGleb Natapov spinlock_t lock; 362af585b92SGleb Natapov } async_pf; 363af585b92SGleb Natapov #endif 364af585b92SGleb Natapov 3654c088493SRaghavendra K T #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT 3664c088493SRaghavendra K T /* 3674c088493SRaghavendra K T * Cpu relax intercept or pause loop exit optimization 3684c088493SRaghavendra K T * in_spin_loop: set when a vcpu does a pause loop exit 3694c088493SRaghavendra K T * or cpu relax intercepted. 3704c088493SRaghavendra K T * dy_eligible: indicates whether vcpu is eligible for directed yield. 3714c088493SRaghavendra K T */ 3724c088493SRaghavendra K T struct { 3734c088493SRaghavendra K T bool in_spin_loop; 3744c088493SRaghavendra K T bool dy_eligible; 3754c088493SRaghavendra K T } spin_loop; 3764c088493SRaghavendra K T #endif 3773a08a8f9SRaghavendra K T bool preempted; 378d73eb57bSWanpeng Li bool ready; 379edf88417SAvi Kivity struct kvm_vcpu_arch arch; 380ce55c049SJing Zhang struct kvm_vcpu_stat stat; 381ce55c049SJing Zhang char stats_id[KVM_STATS_NAME_SIZE]; 382fb04a1edSPeter Xu struct kvm_dirty_ring dirty_ring; 383fe22ed82SDavid Matlack 384fe22ed82SDavid Matlack /* 385a54d8066SMaciej S. Szmigiero * The most recently used memslot by this vCPU and the slots generation 386a54d8066SMaciej S. Szmigiero * for which it is valid. 387a54d8066SMaciej S. Szmigiero * No wraparound protection is needed since generations won't overflow in 388a54d8066SMaciej S. Szmigiero * thousands of years, even assuming 1M memslot operations per second. 389fe22ed82SDavid Matlack */ 390a54d8066SMaciej S. Szmigiero struct kvm_memory_slot *last_used_slot; 391a54d8066SMaciej S. Szmigiero u64 last_used_slot_gen; 392edf88417SAvi Kivity }; 393edf88417SAvi Kivity 394ef9989afSMark Rutland /* 395ef9989afSMark Rutland * Start accounting time towards a guest. 396ef9989afSMark Rutland * Must be called before entering guest context. 397ef9989afSMark Rutland */ 398ef9989afSMark Rutland static __always_inline void guest_timing_enter_irqoff(void) 3991ca0016cSSean Christopherson { 4001ca0016cSSean Christopherson /* 4011ca0016cSSean Christopherson * This is running in ioctl context so its safe to assume that it's the 4021ca0016cSSean Christopherson * stime pending cputime to flush. 4031ca0016cSSean Christopherson */ 4041ca0016cSSean Christopherson instrumentation_begin(); 4051ca0016cSSean Christopherson vtime_account_guest_enter(); 4061ca0016cSSean Christopherson instrumentation_end(); 407ef9989afSMark Rutland } 4081ca0016cSSean Christopherson 4091ca0016cSSean Christopherson /* 410ef9989afSMark Rutland * Enter guest context and enter an RCU extended quiescent state. 411ef9989afSMark Rutland * 412ef9989afSMark Rutland * Between guest_context_enter_irqoff() and guest_context_exit_irqoff() it is 413ef9989afSMark Rutland * unsafe to use any code which may directly or indirectly use RCU, tracing 414ef9989afSMark Rutland * (including IRQ flag tracing), or lockdep. All code in this period must be 415ef9989afSMark Rutland * non-instrumentable. 416ef9989afSMark Rutland */ 417ef9989afSMark Rutland static __always_inline void guest_context_enter_irqoff(void) 418ef9989afSMark Rutland { 419ef9989afSMark Rutland /* 4201ca0016cSSean Christopherson * KVM does not hold any references to rcu protected data when it 4211ca0016cSSean Christopherson * switches CPU into a guest mode. In fact switching to a guest mode 4221ca0016cSSean Christopherson * is very similar to exiting to userspace from rcu point of view. In 4231ca0016cSSean Christopherson * addition CPU may stay in a guest mode for quite a long time (up to 4241ca0016cSSean Christopherson * one time slice). Lets treat guest mode as quiescent state, just like 4251ca0016cSSean Christopherson * we do with user-mode execution. 4261ca0016cSSean Christopherson */ 4271ca0016cSSean Christopherson if (!context_tracking_guest_enter()) { 4281ca0016cSSean Christopherson instrumentation_begin(); 4291ca0016cSSean Christopherson rcu_virt_note_context_switch(smp_processor_id()); 4301ca0016cSSean Christopherson instrumentation_end(); 4311ca0016cSSean Christopherson } 4321ca0016cSSean Christopherson } 4331ca0016cSSean Christopherson 434ef9989afSMark Rutland /* 435ef9989afSMark Rutland * Deprecated. Architectures should move to guest_timing_enter_irqoff() and 436ef9989afSMark Rutland * guest_state_enter_irqoff(). 437ef9989afSMark Rutland */ 438ef9989afSMark Rutland static __always_inline void guest_enter_irqoff(void) 439ef9989afSMark Rutland { 440ef9989afSMark Rutland guest_timing_enter_irqoff(); 441ef9989afSMark Rutland guest_context_enter_irqoff(); 442ef9989afSMark Rutland } 443ef9989afSMark Rutland 444ef9989afSMark Rutland /** 445ef9989afSMark Rutland * guest_state_enter_irqoff - Fixup state when entering a guest 446ef9989afSMark Rutland * 447ef9989afSMark Rutland * Entry to a guest will enable interrupts, but the kernel state is interrupts 448ef9989afSMark Rutland * disabled when this is invoked. Also tell RCU about it. 449ef9989afSMark Rutland * 450ef9989afSMark Rutland * 1) Trace interrupts on state 451ef9989afSMark Rutland * 2) Invoke context tracking if enabled to adjust RCU state 452ef9989afSMark Rutland * 3) Tell lockdep that interrupts are enabled 453ef9989afSMark Rutland * 454ef9989afSMark Rutland * Invoked from architecture specific code before entering a guest. 455ef9989afSMark Rutland * Must be called with interrupts disabled and the caller must be 456ef9989afSMark Rutland * non-instrumentable. 457ef9989afSMark Rutland * The caller has to invoke guest_timing_enter_irqoff() before this. 458ef9989afSMark Rutland * 459ef9989afSMark Rutland * Note: this is analogous to exit_to_user_mode(). 460ef9989afSMark Rutland */ 461ef9989afSMark Rutland static __always_inline void guest_state_enter_irqoff(void) 462ef9989afSMark Rutland { 463ef9989afSMark Rutland instrumentation_begin(); 464ef9989afSMark Rutland trace_hardirqs_on_prepare(); 4658b023accSNick Desaulniers lockdep_hardirqs_on_prepare(); 466ef9989afSMark Rutland instrumentation_end(); 467ef9989afSMark Rutland 468ef9989afSMark Rutland guest_context_enter_irqoff(); 469ef9989afSMark Rutland lockdep_hardirqs_on(CALLER_ADDR0); 470ef9989afSMark Rutland } 471ef9989afSMark Rutland 472ef9989afSMark Rutland /* 473ef9989afSMark Rutland * Exit guest context and exit an RCU extended quiescent state. 474ef9989afSMark Rutland * 475ef9989afSMark Rutland * Between guest_context_enter_irqoff() and guest_context_exit_irqoff() it is 476ef9989afSMark Rutland * unsafe to use any code which may directly or indirectly use RCU, tracing 477ef9989afSMark Rutland * (including IRQ flag tracing), or lockdep. All code in this period must be 478ef9989afSMark Rutland * non-instrumentable. 479ef9989afSMark Rutland */ 480ef9989afSMark Rutland static __always_inline void guest_context_exit_irqoff(void) 4811ca0016cSSean Christopherson { 4821ca0016cSSean Christopherson context_tracking_guest_exit(); 483ef9989afSMark Rutland } 4841ca0016cSSean Christopherson 485ef9989afSMark Rutland /* 486ef9989afSMark Rutland * Stop accounting time towards a guest. 487ef9989afSMark Rutland * Must be called after exiting guest context. 488ef9989afSMark Rutland */ 489ef9989afSMark Rutland static __always_inline void guest_timing_exit_irqoff(void) 490ef9989afSMark Rutland { 4911ca0016cSSean Christopherson instrumentation_begin(); 4921ca0016cSSean Christopherson /* Flush the guest cputime we spent on the guest */ 4931ca0016cSSean Christopherson vtime_account_guest_exit(); 4941ca0016cSSean Christopherson instrumentation_end(); 4951ca0016cSSean Christopherson } 4961ca0016cSSean Christopherson 497ef9989afSMark Rutland /* 498ef9989afSMark Rutland * Deprecated. Architectures should move to guest_state_exit_irqoff() and 499ef9989afSMark Rutland * guest_timing_exit_irqoff(). 500ef9989afSMark Rutland */ 501ef9989afSMark Rutland static __always_inline void guest_exit_irqoff(void) 502ef9989afSMark Rutland { 503ef9989afSMark Rutland guest_context_exit_irqoff(); 504ef9989afSMark Rutland guest_timing_exit_irqoff(); 505ef9989afSMark Rutland } 506ef9989afSMark Rutland 5071ca0016cSSean Christopherson static inline void guest_exit(void) 5081ca0016cSSean Christopherson { 5091ca0016cSSean Christopherson unsigned long flags; 5101ca0016cSSean Christopherson 5111ca0016cSSean Christopherson local_irq_save(flags); 5121ca0016cSSean Christopherson guest_exit_irqoff(); 5131ca0016cSSean Christopherson local_irq_restore(flags); 5141ca0016cSSean Christopherson } 5151ca0016cSSean Christopherson 516ef9989afSMark Rutland /** 517ef9989afSMark Rutland * guest_state_exit_irqoff - Establish state when returning from guest mode 518ef9989afSMark Rutland * 519ef9989afSMark Rutland * Entry from a guest disables interrupts, but guest mode is traced as 520ef9989afSMark Rutland * interrupts enabled. Also with NO_HZ_FULL RCU might be idle. 521ef9989afSMark Rutland * 522ef9989afSMark Rutland * 1) Tell lockdep that interrupts are disabled 523ef9989afSMark Rutland * 2) Invoke context tracking if enabled to reactivate RCU 524ef9989afSMark Rutland * 3) Trace interrupts off state 525ef9989afSMark Rutland * 526ef9989afSMark Rutland * Invoked from architecture specific code after exiting a guest. 527ef9989afSMark Rutland * Must be invoked with interrupts disabled and the caller must be 528ef9989afSMark Rutland * non-instrumentable. 529ef9989afSMark Rutland * The caller has to invoke guest_timing_exit_irqoff() after this. 530ef9989afSMark Rutland * 531ef9989afSMark Rutland * Note: this is analogous to enter_from_user_mode(). 532ef9989afSMark Rutland */ 533ef9989afSMark Rutland static __always_inline void guest_state_exit_irqoff(void) 534ef9989afSMark Rutland { 535ef9989afSMark Rutland lockdep_hardirqs_off(CALLER_ADDR0); 536ef9989afSMark Rutland guest_context_exit_irqoff(); 537ef9989afSMark Rutland 538ef9989afSMark Rutland instrumentation_begin(); 539ef9989afSMark Rutland trace_hardirqs_off_finish(); 540ef9989afSMark Rutland instrumentation_end(); 541ef9989afSMark Rutland } 542ef9989afSMark Rutland 5436b7e2d09SXiao Guangrong static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu) 5446b7e2d09SXiao Guangrong { 545cde9af6eSAndrew Jones /* 546cde9af6eSAndrew Jones * The memory barrier ensures a previous write to vcpu->requests cannot 547cde9af6eSAndrew Jones * be reordered with the read of vcpu->mode. It pairs with the general 548cde9af6eSAndrew Jones * memory barrier following the write of vcpu->mode in VCPU RUN. 549cde9af6eSAndrew Jones */ 550cde9af6eSAndrew Jones smp_mb__before_atomic(); 5516b7e2d09SXiao Guangrong return cmpxchg(&vcpu->mode, IN_GUEST_MODE, EXITING_GUEST_MODE); 5526b7e2d09SXiao Guangrong } 5536b7e2d09SXiao Guangrong 554660c22c4STakuya Yoshikawa /* 555660c22c4STakuya Yoshikawa * Some of the bitops functions do not support too long bitmaps. 556660c22c4STakuya Yoshikawa * This number must be determined not to exceed such limits. 557660c22c4STakuya Yoshikawa */ 558660c22c4STakuya Yoshikawa #define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1) 559660c22c4STakuya Yoshikawa 560a54d8066SMaciej S. Szmigiero /* 561a54d8066SMaciej S. Szmigiero * Since at idle each memslot belongs to two memslot sets it has to contain 562a54d8066SMaciej S. Szmigiero * two embedded nodes for each data structure that it forms a part of. 563a54d8066SMaciej S. Szmigiero * 564a54d8066SMaciej S. Szmigiero * Two memslot sets (one active and one inactive) are necessary so the VM 565a54d8066SMaciej S. Szmigiero * continues to run on one memslot set while the other is being modified. 566a54d8066SMaciej S. Szmigiero * 567a54d8066SMaciej S. Szmigiero * These two memslot sets normally point to the same set of memslots. 568a54d8066SMaciej S. Szmigiero * They can, however, be desynchronized when performing a memslot management 569a54d8066SMaciej S. Szmigiero * operation by replacing the memslot to be modified by its copy. 570a54d8066SMaciej S. Szmigiero * After the operation is complete, both memslot sets once again point to 571a54d8066SMaciej S. Szmigiero * the same, common set of memslot data. 572a54d8066SMaciej S. Szmigiero * 573a54d8066SMaciej S. Szmigiero * The memslots themselves are independent of each other so they can be 574a54d8066SMaciej S. Szmigiero * individually added or deleted. 575a54d8066SMaciej S. Szmigiero */ 576edf88417SAvi Kivity struct kvm_memory_slot { 577a54d8066SMaciej S. Szmigiero struct hlist_node id_node[2]; 578a54d8066SMaciej S. Szmigiero struct interval_tree_node hva_node[2]; 579a54d8066SMaciej S. Szmigiero struct rb_node gfn_node[2]; 580edf88417SAvi Kivity gfn_t base_gfn; 581edf88417SAvi Kivity unsigned long npages; 582edf88417SAvi Kivity unsigned long *dirty_bitmap; 583db3fe4ebSTakuya Yoshikawa struct kvm_arch_memory_slot arch; 584edf88417SAvi Kivity unsigned long userspace_addr; 5856104f472SAlex Williamson u32 flags; 5861e702d9aSAlex Williamson short id; 5879e9eb226SPeter Xu u16 as_id; 588edf88417SAvi Kivity }; 589edf88417SAvi Kivity 5908283e36aSBen Gardon static inline bool kvm_slot_dirty_track_enabled(const struct kvm_memory_slot *slot) 591044c59c4SPeter Xu { 592044c59c4SPeter Xu return slot->flags & KVM_MEM_LOG_DIRTY_PAGES; 593044c59c4SPeter Xu } 594044c59c4SPeter Xu 59587bf6e7dSTakuya Yoshikawa static inline unsigned long kvm_dirty_bitmap_bytes(struct kvm_memory_slot *memslot) 59687bf6e7dSTakuya Yoshikawa { 59787bf6e7dSTakuya Yoshikawa return ALIGN(memslot->npages, BITS_PER_LONG) / 8; 59887bf6e7dSTakuya Yoshikawa } 59987bf6e7dSTakuya Yoshikawa 60003133347SClaudio Imbrenda static inline unsigned long *kvm_second_dirty_bitmap(struct kvm_memory_slot *memslot) 60103133347SClaudio Imbrenda { 60203133347SClaudio Imbrenda unsigned long len = kvm_dirty_bitmap_bytes(memslot); 60303133347SClaudio Imbrenda 60403133347SClaudio Imbrenda return memslot->dirty_bitmap + len / sizeof(*memslot->dirty_bitmap); 60503133347SClaudio Imbrenda } 60603133347SClaudio Imbrenda 6073c9bd400SJay Zhou #ifndef KVM_DIRTY_LOG_MANUAL_CAPS 6083c9bd400SJay Zhou #define KVM_DIRTY_LOG_MANUAL_CAPS KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE 6093c9bd400SJay Zhou #endif 6103c9bd400SJay Zhou 61184223598SCornelia Huck struct kvm_s390_adapter_int { 61284223598SCornelia Huck u64 ind_addr; 61384223598SCornelia Huck u64 summary_addr; 61484223598SCornelia Huck u64 ind_offset; 61584223598SCornelia Huck u32 summary_offset; 61684223598SCornelia Huck u32 adapter_id; 61784223598SCornelia Huck }; 61884223598SCornelia Huck 6195c919412SAndrey Smetanin struct kvm_hv_sint { 6205c919412SAndrey Smetanin u32 vcpu; 6215c919412SAndrey Smetanin u32 sint; 6225c919412SAndrey Smetanin }; 6235c919412SAndrey Smetanin 62414243b38SDavid Woodhouse struct kvm_xen_evtchn { 62514243b38SDavid Woodhouse u32 port; 6268733068bSDavid Woodhouse u32 vcpu_id; 6278733068bSDavid Woodhouse int vcpu_idx; 62814243b38SDavid Woodhouse u32 priority; 62914243b38SDavid Woodhouse }; 63014243b38SDavid Woodhouse 631399ec807SAvi Kivity struct kvm_kernel_irq_routing_entry { 632399ec807SAvi Kivity u32 gsi; 6335116d8f6SMichael S. Tsirkin u32 type; 6344925663aSGleb Natapov int (*set)(struct kvm_kernel_irq_routing_entry *e, 635aa2fbe6dSYang Zhang struct kvm *kvm, int irq_source_id, int level, 636aa2fbe6dSYang Zhang bool line_status); 637399ec807SAvi Kivity union { 638399ec807SAvi Kivity struct { 639399ec807SAvi Kivity unsigned irqchip; 640399ec807SAvi Kivity unsigned pin; 641399ec807SAvi Kivity } irqchip; 6420455e72cSEric Auger struct { 6430455e72cSEric Auger u32 address_lo; 6440455e72cSEric Auger u32 address_hi; 6450455e72cSEric Auger u32 data; 6460455e72cSEric Auger u32 flags; 6470455e72cSEric Auger u32 devid; 6480455e72cSEric Auger } msi; 64984223598SCornelia Huck struct kvm_s390_adapter_int adapter; 6505c919412SAndrey Smetanin struct kvm_hv_sint hv_sint; 65114243b38SDavid Woodhouse struct kvm_xen_evtchn xen_evtchn; 652399ec807SAvi Kivity }; 65346e624b9SGleb Natapov struct hlist_node link; 65446e624b9SGleb Natapov }; 65546e624b9SGleb Natapov 656b053b2aeSSteve Rutherford #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING 657b053b2aeSSteve Rutherford struct kvm_irq_routing_table { 658b053b2aeSSteve Rutherford int chip[KVM_NR_IRQCHIPS][KVM_IRQCHIP_NUM_PINS]; 659b053b2aeSSteve Rutherford u32 nr_rt_entries; 660b053b2aeSSteve Rutherford /* 661b053b2aeSSteve Rutherford * Array indexed by gsi. Each entry contains list of irq chips 662b053b2aeSSteve Rutherford * the gsi is connected to. 663b053b2aeSSteve Rutherford */ 664764e515fSGustavo A. R. Silva struct hlist_head map[]; 665b053b2aeSSteve Rutherford }; 6663ca9d84eSPaolo Bonzini #endif 667d663b8a2SPaolo Bonzini 668d663b8a2SPaolo Bonzini bool kvm_arch_irqchip_in_kernel(struct kvm *kvm); 669b053b2aeSSteve Rutherford 670bdd1c37aSChao Peng #ifndef KVM_INTERNAL_MEM_SLOTS 671bdd1c37aSChao Peng #define KVM_INTERNAL_MEM_SLOTS 0 6720743247fSAlex Williamson #endif 6730743247fSAlex Williamson 6744fc096a9SVitaly Kuznetsov #define KVM_MEM_SLOTS_NUM SHRT_MAX 675bdd1c37aSChao Peng #define KVM_USER_MEM_SLOTS (KVM_MEM_SLOTS_NUM - KVM_INTERNAL_MEM_SLOTS) 67693a5cef0SXiao Guangrong 677f481b069SPaolo Bonzini #ifndef __KVM_VCPU_MULTIPLE_ADDRESS_SPACE 678f481b069SPaolo Bonzini static inline int kvm_arch_vcpu_memslots_id(struct kvm_vcpu *vcpu) 679f481b069SPaolo Bonzini { 680f481b069SPaolo Bonzini return 0; 681f481b069SPaolo Bonzini } 682f481b069SPaolo Bonzini #endif 683f481b069SPaolo Bonzini 68446a26bf5SMarcelo Tosatti struct kvm_memslots { 68549c7754cSGleb Natapov u64 generation; 686a54d8066SMaciej S. Szmigiero atomic_long_t last_used_slot; 687ed922739SMaciej S. Szmigiero struct rb_root_cached hva_tree; 688a54d8066SMaciej S. Szmigiero struct rb_root gfn_tree; 68926b8345aSMaciej S. Szmigiero /* 690a54d8066SMaciej S. Szmigiero * The mapping table from slot id to memslot. 69126b8345aSMaciej S. Szmigiero * 69226b8345aSMaciej S. Szmigiero * 7-bit bucket count matches the size of the old id to index array for 69326b8345aSMaciej S. Szmigiero * 512 slots, while giving good performance with this slot count. 69426b8345aSMaciej S. Szmigiero * Higher bucket counts bring only small performance improvements but 69526b8345aSMaciej S. Szmigiero * always result in higher memory usage (even for lower memslot counts). 69626b8345aSMaciej S. Szmigiero */ 69726b8345aSMaciej S. Szmigiero DECLARE_HASHTABLE(id_hash, 7); 698a54d8066SMaciej S. Szmigiero int node_idx; 69946a26bf5SMarcelo Tosatti }; 70046a26bf5SMarcelo Tosatti 701edf88417SAvi Kivity struct kvm { 702531810caSBen Gardon #ifdef KVM_HAVE_MMU_RWLOCK 703531810caSBen Gardon rwlock_t mmu_lock; 704531810caSBen Gardon #else 705aaee2c94SMarcelo Tosatti spinlock_t mmu_lock; 706531810caSBen Gardon #endif /* KVM_HAVE_MMU_RWLOCK */ 707531810caSBen Gardon 70879fac95eSMarcelo Tosatti struct mutex slots_lock; 709b10a038eSBen Gardon 710b10a038eSBen Gardon /* 711b10a038eSBen Gardon * Protects the arch-specific fields of struct kvm_memory_slots in 712b10a038eSBen Gardon * use by the VM. To be used under the slots_lock (above) or in a 713b10a038eSBen Gardon * kvm->srcu critical section where acquiring the slots_lock would 714b10a038eSBen Gardon * lead to deadlock with the synchronize_srcu in 715b10a038eSBen Gardon * install_new_memslots. 716b10a038eSBen Gardon */ 717b10a038eSBen Gardon struct mutex slots_arch_lock; 718edf88417SAvi Kivity struct mm_struct *mm; /* userspace tied to this vm */ 719afa319a5SSean Christopherson unsigned long nr_memslot_pages; 720a54d8066SMaciej S. Szmigiero /* The two memslot sets - active and inactive (per address space) */ 721a54d8066SMaciej S. Szmigiero struct kvm_memslots __memslots[KVM_ADDRESS_SPACE_NUM][2]; 722a54d8066SMaciej S. Szmigiero /* The current active memslot set for each address space */ 723a80cf7b5SChristian Borntraeger struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM]; 724c5b07754SMarc Zyngier struct xarray vcpu_array; 7256c7b2202SPaolo Bonzini /* 7266c7b2202SPaolo Bonzini * Protected by slots_lock, but can be read outside if an 7276c7b2202SPaolo Bonzini * incorrect answer is acceptable. 7286c7b2202SPaolo Bonzini */ 7296c7b2202SPaolo Bonzini atomic_t nr_memslots_dirty_logging; 7306c7caebcSPaolo Bonzini 73152ac8b35SPaolo Bonzini /* Used to wait for completion of MMU notifiers. */ 73252ac8b35SPaolo Bonzini spinlock_t mn_invalidate_lock; 73352ac8b35SPaolo Bonzini unsigned long mn_active_invalidate_count; 73452ac8b35SPaolo Bonzini struct rcuwait mn_memslots_update_rcuwait; 73552ac8b35SPaolo Bonzini 736982ed0deSDavid Woodhouse /* For management / invalidation of gfn_to_pfn_caches */ 737982ed0deSDavid Woodhouse spinlock_t gpc_lock; 738982ed0deSDavid Woodhouse struct list_head gpc_list; 739982ed0deSDavid Woodhouse 7406c7caebcSPaolo Bonzini /* 7416c7caebcSPaolo Bonzini * created_vcpus is protected by kvm->lock, and is incremented 7426c7caebcSPaolo Bonzini * at the beginning of KVM_CREATE_VCPU. online_vcpus is only 7436c7caebcSPaolo Bonzini * incremented after storing the kvm_vcpu pointer in vcpus, 7446c7caebcSPaolo Bonzini * and is accessed atomically. 7456c7caebcSPaolo Bonzini */ 74673880c80SGleb Natapov atomic_t online_vcpus; 747f502cc56SSean Christopherson int max_vcpus; 7486c7caebcSPaolo Bonzini int created_vcpus; 749217ece61SRik van Riel int last_boosted_vcpu; 750edf88417SAvi Kivity struct list_head vm_list; 75160eead79SMarcelo Tosatti struct mutex lock; 7524a12f951SChristian Borntraeger struct kvm_io_bus __rcu *buses[KVM_NR_BUSES]; 753721eecbfSGregory Haskins #ifdef CONFIG_HAVE_KVM_EVENTFD 754721eecbfSGregory Haskins struct { 755721eecbfSGregory Haskins spinlock_t lock; 756721eecbfSGregory Haskins struct list_head items; 7577a84428aSAlex Williamson struct list_head resampler_list; 7587a84428aSAlex Williamson struct mutex resampler_lock; 759721eecbfSGregory Haskins } irqfds; 760d34e6b17SGregory Haskins struct list_head ioeventfds; 761721eecbfSGregory Haskins #endif 762edf88417SAvi Kivity struct kvm_vm_stat stat; 763edf88417SAvi Kivity struct kvm_arch arch; 764e3736c3eSElena Reshetova refcount_t users_count; 7654b4357e0SPaolo Bonzini #ifdef CONFIG_KVM_MMIO 7665f94c174SLaurent Vivier struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; 7672b3c246aSSasha Levin spinlock_t ring_lock; 7682b3c246aSSasha Levin struct list_head coalesced_zones; 7695f94c174SLaurent Vivier #endif 770e930bffeSAndrea Arcangeli 77160eead79SMarcelo Tosatti struct mutex irq_lock; 77275858a84SAvi Kivity #ifdef CONFIG_HAVE_KVM_IRQCHIP 773bd2b53b2SMichael S. Tsirkin /* 7749957c86dSPaul Mackerras * Update side is protected by irq_lock. 775bd2b53b2SMichael S. Tsirkin */ 7764b6a2872SArnd Bergmann struct kvm_irq_routing_table __rcu *irq_routing; 777c77dcacbSPaolo Bonzini #endif 778c77dcacbSPaolo Bonzini #ifdef CONFIG_HAVE_KVM_IRQFD 779136bdfeeSGleb Natapov struct hlist_head irq_ack_notifier_list; 78075858a84SAvi Kivity #endif 78175858a84SAvi Kivity 78236c1ed82SMarc Zyngier #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) 783e930bffeSAndrea Arcangeli struct mmu_notifier mmu_notifier; 78420ec3ebdSChao Peng unsigned long mmu_invalidate_seq; 78520ec3ebdSChao Peng long mmu_invalidate_in_progress; 78620ec3ebdSChao Peng unsigned long mmu_invalidate_range_start; 78720ec3ebdSChao Peng unsigned long mmu_invalidate_range_end; 788e930bffeSAndrea Arcangeli #endif 78907f0a7bdSScott Wood struct list_head devices; 7903c9bd400SJay Zhou u64 manual_dirty_log_protect; 791536a6f88SJanosch Frank struct dentry *debugfs_dentry; 792536a6f88SJanosch Frank struct kvm_stat_data **debugfs_stat_data; 7936ade8694SPaul E. McKenney struct srcu_struct srcu; 7946ade8694SPaul E. McKenney struct srcu_struct irq_srcu; 795fdeaf7e3SClaudio Imbrenda pid_t userspace_pid; 796acd05785SDavid Matlack unsigned int max_halt_poll_ns; 797fb04a1edSPeter Xu u32 dirty_ring_size; 7980b8f1173SSean Christopherson bool vm_bugged; 799f4d31653SPaolo Bonzini bool vm_dead; 8002fdef3a2SSergey Senozhatsky 8012fdef3a2SSergey Senozhatsky #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER 8022fdef3a2SSergey Senozhatsky struct notifier_block pm_notifier; 8032fdef3a2SSergey Senozhatsky #endif 804fcfe1baeSJing Zhang char stats_id[KVM_STATS_NAME_SIZE]; 805edf88417SAvi Kivity }; 806edf88417SAvi Kivity 807a737f256SChristoffer Dall #define kvm_err(fmt, ...) \ 808a737f256SChristoffer Dall pr_err("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__) 809a737f256SChristoffer Dall #define kvm_info(fmt, ...) \ 810a737f256SChristoffer Dall pr_info("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__) 811a737f256SChristoffer Dall #define kvm_debug(fmt, ...) \ 812a737f256SChristoffer Dall pr_debug("kvm [%i]: " fmt, task_pid_nr(current), ## __VA_ARGS__) 813ae0f5499SBandan Das #define kvm_debug_ratelimited(fmt, ...) \ 814ae0f5499SBandan Das pr_debug_ratelimited("kvm [%i]: " fmt, task_pid_nr(current), \ 815ae0f5499SBandan Das ## __VA_ARGS__) 816a737f256SChristoffer Dall #define kvm_pr_unimpl(fmt, ...) \ 817a737f256SChristoffer Dall pr_err_ratelimited("kvm [%i]: " fmt, \ 818a737f256SChristoffer Dall task_tgid_nr(current), ## __VA_ARGS__) 819edf88417SAvi Kivity 820a737f256SChristoffer Dall /* The guest did something we don't support. */ 821a737f256SChristoffer Dall #define vcpu_unimpl(vcpu, fmt, ...) \ 822671d9ab3SBorislav Petkov kvm_pr_unimpl("vcpu%i, guest rIP: 0x%lx " fmt, \ 823671d9ab3SBorislav Petkov (vcpu)->vcpu_id, kvm_rip_read(vcpu), ## __VA_ARGS__) 824edf88417SAvi Kivity 825ee86dbc6SAndrey Smetanin #define vcpu_debug(vcpu, fmt, ...) \ 826ee86dbc6SAndrey Smetanin kvm_debug("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__) 827ae0f5499SBandan Das #define vcpu_debug_ratelimited(vcpu, fmt, ...) \ 828ae0f5499SBandan Das kvm_debug_ratelimited("vcpu%i " fmt, (vcpu)->vcpu_id, \ 829ae0f5499SBandan Das ## __VA_ARGS__) 830765eaa0fSAndrey Smetanin #define vcpu_err(vcpu, fmt, ...) \ 831765eaa0fSAndrey Smetanin kvm_err("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__) 832ee86dbc6SAndrey Smetanin 833f4d31653SPaolo Bonzini static inline void kvm_vm_dead(struct kvm *kvm) 834f4d31653SPaolo Bonzini { 835f4d31653SPaolo Bonzini kvm->vm_dead = true; 836f4d31653SPaolo Bonzini kvm_make_all_cpus_request(kvm, KVM_REQ_VM_DEAD); 837f4d31653SPaolo Bonzini } 838f4d31653SPaolo Bonzini 8390b8f1173SSean Christopherson static inline void kvm_vm_bugged(struct kvm *kvm) 8400b8f1173SSean Christopherson { 8410b8f1173SSean Christopherson kvm->vm_bugged = true; 842f4d31653SPaolo Bonzini kvm_vm_dead(kvm); 8430b8f1173SSean Christopherson } 8440b8f1173SSean Christopherson 845f4d31653SPaolo Bonzini 8460b8f1173SSean Christopherson #define KVM_BUG(cond, kvm, fmt...) \ 8470b8f1173SSean Christopherson ({ \ 8480b8f1173SSean Christopherson int __ret = (cond); \ 8490b8f1173SSean Christopherson \ 8500b8f1173SSean Christopherson if (WARN_ONCE(__ret && !(kvm)->vm_bugged, fmt)) \ 8510b8f1173SSean Christopherson kvm_vm_bugged(kvm); \ 8520b8f1173SSean Christopherson unlikely(__ret); \ 8530b8f1173SSean Christopherson }) 8540b8f1173SSean Christopherson 8550b8f1173SSean Christopherson #define KVM_BUG_ON(cond, kvm) \ 8560b8f1173SSean Christopherson ({ \ 8570b8f1173SSean Christopherson int __ret = (cond); \ 8580b8f1173SSean Christopherson \ 8590b8f1173SSean Christopherson if (WARN_ON_ONCE(__ret && !(kvm)->vm_bugged)) \ 8600b8f1173SSean Christopherson kvm_vm_bugged(kvm); \ 8610b8f1173SSean Christopherson unlikely(__ret); \ 8620b8f1173SSean Christopherson }) 8630b8f1173SSean Christopherson 8642031f287SSean Christopherson static inline void kvm_vcpu_srcu_read_lock(struct kvm_vcpu *vcpu) 8652031f287SSean Christopherson { 8662031f287SSean Christopherson #ifdef CONFIG_PROVE_RCU 8672031f287SSean Christopherson WARN_ONCE(vcpu->srcu_depth++, 8682031f287SSean Christopherson "KVM: Illegal vCPU srcu_idx LOCK, depth=%d", vcpu->srcu_depth - 1); 8692031f287SSean Christopherson #endif 8702031f287SSean Christopherson vcpu->____srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); 8712031f287SSean Christopherson } 8722031f287SSean Christopherson 8732031f287SSean Christopherson static inline void kvm_vcpu_srcu_read_unlock(struct kvm_vcpu *vcpu) 8742031f287SSean Christopherson { 8752031f287SSean Christopherson srcu_read_unlock(&vcpu->kvm->srcu, vcpu->____srcu_idx); 8762031f287SSean Christopherson 8772031f287SSean Christopherson #ifdef CONFIG_PROVE_RCU 8782031f287SSean Christopherson WARN_ONCE(--vcpu->srcu_depth, 8792031f287SSean Christopherson "KVM: Illegal vCPU srcu_idx UNLOCK, depth=%d", vcpu->srcu_depth); 8802031f287SSean Christopherson #endif 8812031f287SSean Christopherson } 8822031f287SSean Christopherson 8833c9bd400SJay Zhou static inline bool kvm_dirty_log_manual_protect_and_init_set(struct kvm *kvm) 8843c9bd400SJay Zhou { 8853c9bd400SJay Zhou return !!(kvm->manual_dirty_log_protect & KVM_DIRTY_LOG_INITIALLY_SET); 8863c9bd400SJay Zhou } 8873c9bd400SJay Zhou 8884a12f951SChristian Borntraeger static inline struct kvm_io_bus *kvm_get_bus(struct kvm *kvm, enum kvm_bus idx) 8894a12f951SChristian Borntraeger { 8904a12f951SChristian Borntraeger return srcu_dereference_check(kvm->buses[idx], &kvm->srcu, 8913898da94SPaolo Bonzini lockdep_is_held(&kvm->slots_lock) || 8923898da94SPaolo Bonzini !refcount_read(&kvm->users_count)); 8934a12f951SChristian Borntraeger } 8944a12f951SChristian Borntraeger 895988a2caeSGleb Natapov static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i) 896988a2caeSGleb Natapov { 8971d487e9bSPaolo Bonzini int num_vcpus = atomic_read(&kvm->online_vcpus); 8981d487e9bSPaolo Bonzini i = array_index_nospec(i, num_vcpus); 8991d487e9bSPaolo Bonzini 9001d487e9bSPaolo Bonzini /* Pairs with smp_wmb() in kvm_vm_ioctl_create_vcpu. */ 901988a2caeSGleb Natapov smp_rmb(); 902c5b07754SMarc Zyngier return xa_load(&kvm->vcpu_array, i); 903988a2caeSGleb Natapov } 904988a2caeSGleb Natapov 905988a2caeSGleb Natapov #define kvm_for_each_vcpu(idx, vcpup, kvm) \ 906214bd3a6SMarc Zyngier xa_for_each_range(&kvm->vcpu_array, idx, vcpup, 0, \ 907214bd3a6SMarc Zyngier (atomic_read(&kvm->online_vcpus) - 1)) 908988a2caeSGleb Natapov 909db27a7a3SDavid Hildenbrand static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id) 910db27a7a3SDavid Hildenbrand { 9119b9e3fc4SGreg Kurz struct kvm_vcpu *vcpu = NULL; 91246808a4cSMarc Zyngier unsigned long i; 913db27a7a3SDavid Hildenbrand 9149b9e3fc4SGreg Kurz if (id < 0) 915c896939fSDavid Hildenbrand return NULL; 9169b9e3fc4SGreg Kurz if (id < KVM_MAX_VCPUS) 917c896939fSDavid Hildenbrand vcpu = kvm_get_vcpu(kvm, id); 918c896939fSDavid Hildenbrand if (vcpu && vcpu->vcpu_id == id) 919c896939fSDavid Hildenbrand return vcpu; 920db27a7a3SDavid Hildenbrand kvm_for_each_vcpu(i, vcpu, kvm) 921db27a7a3SDavid Hildenbrand if (vcpu->vcpu_id == id) 922db27a7a3SDavid Hildenbrand return vcpu; 923db27a7a3SDavid Hildenbrand return NULL; 924db27a7a3SDavid Hildenbrand } 925db27a7a3SDavid Hildenbrand 92627592ae8SMarc Zyngier void kvm_destroy_vcpus(struct kvm *kvm); 927edf88417SAvi Kivity 928ec7660ccSChristoffer Dall void vcpu_load(struct kvm_vcpu *vcpu); 929edf88417SAvi Kivity void vcpu_put(struct kvm_vcpu *vcpu); 930edf88417SAvi Kivity 9316ef768faSPaolo Bonzini #ifdef __KVM_HAVE_IOAPIC 932993225adSDavid Hildenbrand void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm); 933abdb080fSAndrey Smetanin void kvm_arch_post_irq_routing_update(struct kvm *kvm); 9346ef768faSPaolo Bonzini #else 935993225adSDavid Hildenbrand static inline void kvm_arch_post_irq_ack_notifier_list_update(struct kvm *kvm) 9366ef768faSPaolo Bonzini { 9376ef768faSPaolo Bonzini } 938abdb080fSAndrey Smetanin static inline void kvm_arch_post_irq_routing_update(struct kvm *kvm) 939b053b2aeSSteve Rutherford { 940b053b2aeSSteve Rutherford } 9416ef768faSPaolo Bonzini #endif 9426ef768faSPaolo Bonzini 943297e2105SPaul Mackerras #ifdef CONFIG_HAVE_KVM_IRQFD 944a0f155e9SCornelia Huck int kvm_irqfd_init(void); 945a0f155e9SCornelia Huck void kvm_irqfd_exit(void); 946a0f155e9SCornelia Huck #else 947a0f155e9SCornelia Huck static inline int kvm_irqfd_init(void) 948a0f155e9SCornelia Huck { 949a0f155e9SCornelia Huck return 0; 950a0f155e9SCornelia Huck } 951a0f155e9SCornelia Huck 952a0f155e9SCornelia Huck static inline void kvm_irqfd_exit(void) 953a0f155e9SCornelia Huck { 954a0f155e9SCornelia Huck } 955a0f155e9SCornelia Huck #endif 9560ee75beaSAvi Kivity int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, 957edf88417SAvi Kivity struct module *module); 958edf88417SAvi Kivity void kvm_exit(void); 959edf88417SAvi Kivity 960d39f13b0SIzik Eidus void kvm_get_kvm(struct kvm *kvm); 961605c7130SPeter Xu bool kvm_get_kvm_safe(struct kvm *kvm); 962d39f13b0SIzik Eidus void kvm_put_kvm(struct kvm *kvm); 96354526d1fSNathan Tempelman bool file_is_kvm(struct file *file); 964149487bdSSean Christopherson void kvm_put_kvm_no_destroy(struct kvm *kvm); 965d39f13b0SIzik Eidus 966f481b069SPaolo Bonzini static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id) 96790d83dc3SLai Jiangshan { 9681d487e9bSPaolo Bonzini as_id = array_index_nospec(as_id, KVM_ADDRESS_SPACE_NUM); 9697e988b10SChristian Borntraeger return srcu_dereference_check(kvm->memslots[as_id], &kvm->srcu, 9703898da94SPaolo Bonzini lockdep_is_held(&kvm->slots_lock) || 9713898da94SPaolo Bonzini !refcount_read(&kvm->users_count)); 97290d83dc3SLai Jiangshan } 97390d83dc3SLai Jiangshan 974f481b069SPaolo Bonzini static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm) 975f481b069SPaolo Bonzini { 976f481b069SPaolo Bonzini return __kvm_memslots(kvm, 0); 977f481b069SPaolo Bonzini } 978f481b069SPaolo Bonzini 9798e73485cSPaolo Bonzini static inline struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu) 9808e73485cSPaolo Bonzini { 981f481b069SPaolo Bonzini int as_id = kvm_arch_vcpu_memslots_id(vcpu); 982f481b069SPaolo Bonzini 983f481b069SPaolo Bonzini return __kvm_memslots(vcpu->kvm, as_id); 9848e73485cSPaolo Bonzini } 9858e73485cSPaolo Bonzini 986a54d8066SMaciej S. Szmigiero static inline bool kvm_memslots_empty(struct kvm_memslots *slots) 987a54d8066SMaciej S. Szmigiero { 988a54d8066SMaciej S. Szmigiero return RB_EMPTY_ROOT(&slots->gfn_tree); 989a54d8066SMaciej S. Szmigiero } 990a54d8066SMaciej S. Szmigiero 991a54d8066SMaciej S. Szmigiero #define kvm_for_each_memslot(memslot, bkt, slots) \ 992a54d8066SMaciej S. Szmigiero hash_for_each(slots->id_hash, bkt, memslot, id_node[slots->node_idx]) \ 993a54d8066SMaciej S. Szmigiero if (WARN_ON_ONCE(!memslot->npages)) { \ 994a54d8066SMaciej S. Szmigiero } else 995a54d8066SMaciej S. Szmigiero 9960577d1abSSean Christopherson static inline 9970577d1abSSean Christopherson struct kvm_memory_slot *id_to_memslot(struct kvm_memslots *slots, int id) 99828a37544SXiao Guangrong { 999f85e2cb5SXiao Guangrong struct kvm_memory_slot *slot; 1000a54d8066SMaciej S. Szmigiero int idx = slots->node_idx; 1001bf3e05bcSXiao Guangrong 1002a54d8066SMaciej S. Szmigiero hash_for_each_possible(slots->id_hash, slot, id_node[idx], id) { 100326b8345aSMaciej S. Szmigiero if (slot->id == id) 1004f85e2cb5SXiao Guangrong return slot; 100528a37544SXiao Guangrong } 100628a37544SXiao Guangrong 100726b8345aSMaciej S. Szmigiero return NULL; 100826b8345aSMaciej S. Szmigiero } 100926b8345aSMaciej S. Szmigiero 1010f4209439SMaciej S. Szmigiero /* Iterator used for walking memslots that overlap a gfn range. */ 1011f4209439SMaciej S. Szmigiero struct kvm_memslot_iter { 1012f4209439SMaciej S. Szmigiero struct kvm_memslots *slots; 1013f4209439SMaciej S. Szmigiero struct rb_node *node; 1014f4209439SMaciej S. Szmigiero struct kvm_memory_slot *slot; 1015f4209439SMaciej S. Szmigiero }; 1016f4209439SMaciej S. Szmigiero 1017f4209439SMaciej S. Szmigiero static inline void kvm_memslot_iter_next(struct kvm_memslot_iter *iter) 1018f4209439SMaciej S. Szmigiero { 1019f4209439SMaciej S. Szmigiero iter->node = rb_next(iter->node); 1020f4209439SMaciej S. Szmigiero if (!iter->node) 1021f4209439SMaciej S. Szmigiero return; 1022f4209439SMaciej S. Szmigiero 1023f4209439SMaciej S. Szmigiero iter->slot = container_of(iter->node, struct kvm_memory_slot, gfn_node[iter->slots->node_idx]); 1024f4209439SMaciej S. Szmigiero } 1025f4209439SMaciej S. Szmigiero 1026f4209439SMaciej S. Szmigiero static inline void kvm_memslot_iter_start(struct kvm_memslot_iter *iter, 1027f4209439SMaciej S. Szmigiero struct kvm_memslots *slots, 1028f4209439SMaciej S. Szmigiero gfn_t start) 1029f4209439SMaciej S. Szmigiero { 1030f4209439SMaciej S. Szmigiero int idx = slots->node_idx; 1031f4209439SMaciej S. Szmigiero struct rb_node *tmp; 1032f4209439SMaciej S. Szmigiero struct kvm_memory_slot *slot; 1033f4209439SMaciej S. Szmigiero 1034f4209439SMaciej S. Szmigiero iter->slots = slots; 1035f4209439SMaciej S. Szmigiero 1036f4209439SMaciej S. Szmigiero /* 1037f4209439SMaciej S. Szmigiero * Find the so called "upper bound" of a key - the first node that has 1038f4209439SMaciej S. Szmigiero * its key strictly greater than the searched one (the start gfn in our case). 1039f4209439SMaciej S. Szmigiero */ 1040f4209439SMaciej S. Szmigiero iter->node = NULL; 1041f4209439SMaciej S. Szmigiero for (tmp = slots->gfn_tree.rb_node; tmp; ) { 1042f4209439SMaciej S. Szmigiero slot = container_of(tmp, struct kvm_memory_slot, gfn_node[idx]); 1043f4209439SMaciej S. Szmigiero if (start < slot->base_gfn) { 1044f4209439SMaciej S. Szmigiero iter->node = tmp; 1045f4209439SMaciej S. Szmigiero tmp = tmp->rb_left; 1046f4209439SMaciej S. Szmigiero } else { 1047f4209439SMaciej S. Szmigiero tmp = tmp->rb_right; 1048f4209439SMaciej S. Szmigiero } 1049f4209439SMaciej S. Szmigiero } 1050f4209439SMaciej S. Szmigiero 1051f4209439SMaciej S. Szmigiero /* 1052f4209439SMaciej S. Szmigiero * Find the slot with the lowest gfn that can possibly intersect with 1053f4209439SMaciej S. Szmigiero * the range, so we'll ideally have slot start <= range start 1054f4209439SMaciej S. Szmigiero */ 1055f4209439SMaciej S. Szmigiero if (iter->node) { 1056f4209439SMaciej S. Szmigiero /* 1057f4209439SMaciej S. Szmigiero * A NULL previous node means that the very first slot 1058f4209439SMaciej S. Szmigiero * already has a higher start gfn. 1059f4209439SMaciej S. Szmigiero * In this case slot start > range start. 1060f4209439SMaciej S. Szmigiero */ 1061f4209439SMaciej S. Szmigiero tmp = rb_prev(iter->node); 1062f4209439SMaciej S. Szmigiero if (tmp) 1063f4209439SMaciej S. Szmigiero iter->node = tmp; 1064f4209439SMaciej S. Szmigiero } else { 1065f4209439SMaciej S. Szmigiero /* a NULL node below means no slots */ 1066f4209439SMaciej S. Szmigiero iter->node = rb_last(&slots->gfn_tree); 1067f4209439SMaciej S. Szmigiero } 1068f4209439SMaciej S. Szmigiero 1069f4209439SMaciej S. Szmigiero if (iter->node) { 1070f4209439SMaciej S. Szmigiero iter->slot = container_of(iter->node, struct kvm_memory_slot, gfn_node[idx]); 1071f4209439SMaciej S. Szmigiero 1072f4209439SMaciej S. Szmigiero /* 1073f4209439SMaciej S. Szmigiero * It is possible in the slot start < range start case that the 1074f4209439SMaciej S. Szmigiero * found slot ends before or at range start (slot end <= range start) 1075f4209439SMaciej S. Szmigiero * and so it does not overlap the requested range. 1076f4209439SMaciej S. Szmigiero * 1077f4209439SMaciej S. Szmigiero * In such non-overlapping case the next slot (if it exists) will 1078f4209439SMaciej S. Szmigiero * already have slot start > range start, otherwise the logic above 1079f4209439SMaciej S. Szmigiero * would have found it instead of the current slot. 1080f4209439SMaciej S. Szmigiero */ 1081f4209439SMaciej S. Szmigiero if (iter->slot->base_gfn + iter->slot->npages <= start) 1082f4209439SMaciej S. Szmigiero kvm_memslot_iter_next(iter); 1083f4209439SMaciej S. Szmigiero } 1084f4209439SMaciej S. Szmigiero } 1085f4209439SMaciej S. Szmigiero 1086f4209439SMaciej S. Szmigiero static inline bool kvm_memslot_iter_is_valid(struct kvm_memslot_iter *iter, gfn_t end) 1087f4209439SMaciej S. Szmigiero { 1088f4209439SMaciej S. Szmigiero if (!iter->node) 1089f4209439SMaciej S. Szmigiero return false; 1090f4209439SMaciej S. Szmigiero 1091f4209439SMaciej S. Szmigiero /* 1092f4209439SMaciej S. Szmigiero * If this slot starts beyond or at the end of the range so does 1093f4209439SMaciej S. Szmigiero * every next one 1094f4209439SMaciej S. Szmigiero */ 1095f4209439SMaciej S. Szmigiero return iter->slot->base_gfn < end; 1096f4209439SMaciej S. Szmigiero } 1097f4209439SMaciej S. Szmigiero 1098f4209439SMaciej S. Szmigiero /* Iterate over each memslot at least partially intersecting [start, end) range */ 1099f4209439SMaciej S. Szmigiero #define kvm_for_each_memslot_in_gfn_range(iter, slots, start, end) \ 1100f4209439SMaciej S. Szmigiero for (kvm_memslot_iter_start(iter, slots, start); \ 1101f4209439SMaciej S. Szmigiero kvm_memslot_iter_is_valid(iter, end); \ 1102f4209439SMaciej S. Szmigiero kvm_memslot_iter_next(iter)) 1103f4209439SMaciej S. Szmigiero 110474d0727cSTakuya Yoshikawa /* 110574d0727cSTakuya Yoshikawa * KVM_SET_USER_MEMORY_REGION ioctl allows the following operations: 110674d0727cSTakuya Yoshikawa * - create a new memory slot 110774d0727cSTakuya Yoshikawa * - delete an existing memory slot 110874d0727cSTakuya Yoshikawa * - modify an existing memory slot 110974d0727cSTakuya Yoshikawa * -- move it in the guest physical memory space 111074d0727cSTakuya Yoshikawa * -- just change its flags 111174d0727cSTakuya Yoshikawa * 111274d0727cSTakuya Yoshikawa * Since flags can be changed by some of these operations, the following 111374d0727cSTakuya Yoshikawa * differentiation is the best we can do for __kvm_set_memory_region(): 111474d0727cSTakuya Yoshikawa */ 111574d0727cSTakuya Yoshikawa enum kvm_mr_change { 111674d0727cSTakuya Yoshikawa KVM_MR_CREATE, 111774d0727cSTakuya Yoshikawa KVM_MR_DELETE, 111874d0727cSTakuya Yoshikawa KVM_MR_MOVE, 111974d0727cSTakuya Yoshikawa KVM_MR_FLAGS_ONLY, 112074d0727cSTakuya Yoshikawa }; 112174d0727cSTakuya Yoshikawa 1122edf88417SAvi Kivity int kvm_set_memory_region(struct kvm *kvm, 112309170a49SPaolo Bonzini const struct kvm_userspace_memory_region *mem); 1124edf88417SAvi Kivity int __kvm_set_memory_region(struct kvm *kvm, 112509170a49SPaolo Bonzini const struct kvm_userspace_memory_region *mem); 1126e96c81eeSSean Christopherson void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot); 112715248258SSean Christopherson void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen); 1128f7784b8eSMarcelo Tosatti int kvm_arch_prepare_memory_region(struct kvm *kvm, 1129537a17b3SSean Christopherson const struct kvm_memory_slot *old, 1130537a17b3SSean Christopherson struct kvm_memory_slot *new, 11317b6195a9STakuya Yoshikawa enum kvm_mr_change change); 1132f7784b8eSMarcelo Tosatti void kvm_arch_commit_memory_region(struct kvm *kvm, 11339d4c197cSSean Christopherson struct kvm_memory_slot *old, 1134f36f3f28SPaolo Bonzini const struct kvm_memory_slot *new, 11358482644aSTakuya Yoshikawa enum kvm_mr_change change); 11362df72e9bSMarcelo Tosatti /* flush all memory translations */ 11372df72e9bSMarcelo Tosatti void kvm_arch_flush_shadow_all(struct kvm *kvm); 11382df72e9bSMarcelo Tosatti /* flush memory translations pointing to 'slot' */ 11392df72e9bSMarcelo Tosatti void kvm_arch_flush_shadow_memslot(struct kvm *kvm, 11402df72e9bSMarcelo Tosatti struct kvm_memory_slot *slot); 1141a983fb23SMarcelo Tosatti 1142d9ef13c2SPaolo Bonzini int gfn_to_page_many_atomic(struct kvm_memory_slot *slot, gfn_t gfn, 1143d9ef13c2SPaolo Bonzini struct page **pages, int nr_pages); 114448987781SXiao Guangrong 1145edf88417SAvi Kivity struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); 114605da4558SMarcelo Tosatti unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); 1147ba6a3541SPaolo Bonzini unsigned long gfn_to_hva_prot(struct kvm *kvm, gfn_t gfn, bool *writable); 11484d8b81abSXiao Guangrong unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn); 114964d83126SChristoffer Dall unsigned long gfn_to_hva_memslot_prot(struct kvm_memory_slot *slot, gfn_t gfn, 115064d83126SChristoffer Dall bool *writable); 1151edf88417SAvi Kivity void kvm_release_page_clean(struct page *page); 1152edf88417SAvi Kivity void kvm_release_page_dirty(struct page *page); 115335149e21SAnthony Liguori 1154ba049e93SDan Williams kvm_pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); 1155ba049e93SDan Williams kvm_pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault, 1156612819c3SMarcelo Tosatti bool *writable); 11578283e36aSBen Gardon kvm_pfn_t gfn_to_pfn_memslot(const struct kvm_memory_slot *slot, gfn_t gfn); 11588283e36aSBen Gardon kvm_pfn_t gfn_to_pfn_memslot_atomic(const struct kvm_memory_slot *slot, gfn_t gfn); 11598283e36aSBen Gardon kvm_pfn_t __gfn_to_pfn_memslot(const struct kvm_memory_slot *slot, gfn_t gfn, 1160c8b88b33SPeter Xu bool atomic, bool interruptible, bool *async, 1161c8b88b33SPeter Xu bool write_fault, bool *writable, hva_t *hva); 1162037d92dcSXiao Guangrong 1163ba049e93SDan Williams void kvm_release_pfn_clean(kvm_pfn_t pfn); 1164f7a6509fSDavid Hildenbrand void kvm_release_pfn_dirty(kvm_pfn_t pfn); 1165ba049e93SDan Williams void kvm_set_pfn_dirty(kvm_pfn_t pfn); 1166ba049e93SDan Williams void kvm_set_pfn_accessed(kvm_pfn_t pfn); 116735149e21SAnthony Liguori 1168357a18adSDavid Woodhouse void kvm_release_pfn(kvm_pfn_t pfn, bool dirty); 1169edf88417SAvi Kivity int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, 1170edf88417SAvi Kivity int len); 1171edf88417SAvi Kivity int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); 11724e335d9eSPaolo Bonzini int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, 1173e03b644fSGleb Natapov void *data, unsigned long len); 11740958f0ceSVitaly Kuznetsov int kvm_read_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, 11750958f0ceSVitaly Kuznetsov void *data, unsigned int offset, 11760958f0ceSVitaly Kuznetsov unsigned long len); 1177edf88417SAvi Kivity int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, 1178edf88417SAvi Kivity int offset, int len); 1179edf88417SAvi Kivity int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, 1180edf88417SAvi Kivity unsigned long len); 11814e335d9eSPaolo Bonzini int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, 118249c7754cSGleb Natapov void *data, unsigned long len); 11834e335d9eSPaolo Bonzini int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, 11847a86dab8SJim Mattson void *data, unsigned int offset, 11857a86dab8SJim Mattson unsigned long len); 11864e335d9eSPaolo Bonzini int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, 11878f964525SAndrew Honig gpa_t gpa, unsigned long len); 1188cac0f1b7SSteven Price 118953f98558SAndrew Jones #define __kvm_get_guest(kvm, gfn, offset, v) \ 119053f98558SAndrew Jones ({ \ 119153f98558SAndrew Jones unsigned long __addr = gfn_to_hva(kvm, gfn); \ 119253f98558SAndrew Jones typeof(v) __user *__uaddr = (typeof(__uaddr))(__addr + offset); \ 119353f98558SAndrew Jones int __ret = -EFAULT; \ 119453f98558SAndrew Jones \ 119553f98558SAndrew Jones if (!kvm_is_error_hva(__addr)) \ 119653f98558SAndrew Jones __ret = get_user(v, __uaddr); \ 119753f98558SAndrew Jones __ret; \ 119853f98558SAndrew Jones }) 119953f98558SAndrew Jones 120053f98558SAndrew Jones #define kvm_get_guest(kvm, gpa, v) \ 120153f98558SAndrew Jones ({ \ 120253f98558SAndrew Jones gpa_t __gpa = gpa; \ 120353f98558SAndrew Jones struct kvm *__kvm = kvm; \ 120453f98558SAndrew Jones \ 120553f98558SAndrew Jones __kvm_get_guest(__kvm, __gpa >> PAGE_SHIFT, \ 120653f98558SAndrew Jones offset_in_page(__gpa), v); \ 120753f98558SAndrew Jones }) 120853f98558SAndrew Jones 12094d2d4ce0SAndrew Jones #define __kvm_put_guest(kvm, gfn, offset, v) \ 1210cac0f1b7SSteven Price ({ \ 1211cac0f1b7SSteven Price unsigned long __addr = gfn_to_hva(kvm, gfn); \ 12124d2d4ce0SAndrew Jones typeof(v) __user *__uaddr = (typeof(__uaddr))(__addr + offset); \ 1213cac0f1b7SSteven Price int __ret = -EFAULT; \ 1214cac0f1b7SSteven Price \ 1215cac0f1b7SSteven Price if (!kvm_is_error_hva(__addr)) \ 12164d2d4ce0SAndrew Jones __ret = put_user(v, __uaddr); \ 1217cac0f1b7SSteven Price if (!__ret) \ 1218cac0f1b7SSteven Price mark_page_dirty(kvm, gfn); \ 1219cac0f1b7SSteven Price __ret; \ 1220cac0f1b7SSteven Price }) 1221cac0f1b7SSteven Price 12224d2d4ce0SAndrew Jones #define kvm_put_guest(kvm, gpa, v) \ 1223cac0f1b7SSteven Price ({ \ 1224cac0f1b7SSteven Price gpa_t __gpa = gpa; \ 1225cac0f1b7SSteven Price struct kvm *__kvm = kvm; \ 12264d2d4ce0SAndrew Jones \ 1227cac0f1b7SSteven Price __kvm_put_guest(__kvm, __gpa >> PAGE_SHIFT, \ 12284d2d4ce0SAndrew Jones offset_in_page(__gpa), v); \ 1229cac0f1b7SSteven Price }) 1230cac0f1b7SSteven Price 1231edf88417SAvi Kivity int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); 1232edf88417SAvi Kivity struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); 123333e94154SYaowei Bai bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); 1234995decb6SVitaly Kuznetsov bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn); 1235f9b84e19SSean Christopherson unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn); 12368283e36aSBen Gardon void mark_page_dirty_in_slot(struct kvm *kvm, const struct kvm_memory_slot *memslot, gfn_t gfn); 1237edf88417SAvi Kivity void mark_page_dirty(struct kvm *kvm, gfn_t gfn); 1238edf88417SAvi Kivity 12398e73485cSPaolo Bonzini struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu); 12408e73485cSPaolo Bonzini struct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn); 1241ba049e93SDan Williams kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn); 1242ba049e93SDan Williams kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn); 1243e45adf66SKarimAllah Ahmed int kvm_vcpu_map(struct kvm_vcpu *vcpu, gpa_t gpa, struct kvm_host_map *map); 1244e45adf66SKarimAllah Ahmed void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, bool dirty); 12458e73485cSPaolo Bonzini unsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn); 12468e73485cSPaolo Bonzini unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *writable); 12478e73485cSPaolo Bonzini int kvm_vcpu_read_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, void *data, int offset, 12488e73485cSPaolo Bonzini int len); 12498e73485cSPaolo Bonzini int kvm_vcpu_read_guest_atomic(struct kvm_vcpu *vcpu, gpa_t gpa, void *data, 12508e73485cSPaolo Bonzini unsigned long len); 12518e73485cSPaolo Bonzini int kvm_vcpu_read_guest(struct kvm_vcpu *vcpu, gpa_t gpa, void *data, 12528e73485cSPaolo Bonzini unsigned long len); 12538e73485cSPaolo Bonzini int kvm_vcpu_write_guest_page(struct kvm_vcpu *vcpu, gfn_t gfn, const void *data, 12548e73485cSPaolo Bonzini int offset, int len); 12558e73485cSPaolo Bonzini int kvm_vcpu_write_guest(struct kvm_vcpu *vcpu, gpa_t gpa, const void *data, 12568e73485cSPaolo Bonzini unsigned long len); 12578e73485cSPaolo Bonzini void kvm_vcpu_mark_page_dirty(struct kvm_vcpu *vcpu, gfn_t gfn); 12588e73485cSPaolo Bonzini 1259982ed0deSDavid Woodhouse /** 126052491a38SMichal Luczaj * kvm_gpc_init - initialize gfn_to_pfn_cache. 126152491a38SMichal Luczaj * 126252491a38SMichal Luczaj * @gpc: struct gfn_to_pfn_cache object. 1263982ed0deSDavid Woodhouse * @kvm: pointer to kvm instance. 1264982ed0deSDavid Woodhouse * @vcpu: vCPU to be used for marking pages dirty and to be woken on 1265982ed0deSDavid Woodhouse * invalidation. 1266d0d96121SSean Christopherson * @usage: indicates if the resulting host physical PFN is used while 1267d0d96121SSean Christopherson * the @vcpu is IN_GUEST_MODE (in which case invalidation of 1268d0d96121SSean Christopherson * the cache from MMU notifiers---but not for KVM memslot 1269d0d96121SSean Christopherson * changes!---will also force @vcpu to exit the guest and 1270d0d96121SSean Christopherson * refresh the cache); and/or if the PFN used directly 1271d0d96121SSean Christopherson * by KVM (and thus needs a kernel virtual mapping). 1272*8c82a0b3SMichal Luczaj * 1273*8c82a0b3SMichal Luczaj * This sets up a gfn_to_pfn_cache by initializing locks and assigning the 1274*8c82a0b3SMichal Luczaj * immutable attributes. Note, the cache must be zero-allocated (or zeroed by 1275*8c82a0b3SMichal Luczaj * the caller before init). 1276*8c82a0b3SMichal Luczaj */ 1277*8c82a0b3SMichal Luczaj void kvm_gpc_init(struct gfn_to_pfn_cache *gpc, struct kvm *kvm, 1278*8c82a0b3SMichal Luczaj struct kvm_vcpu *vcpu, enum pfn_cache_usage usage); 1279*8c82a0b3SMichal Luczaj 1280*8c82a0b3SMichal Luczaj /** 1281*8c82a0b3SMichal Luczaj * kvm_gpc_activate - prepare a cached kernel mapping and HPA for a given guest 1282*8c82a0b3SMichal Luczaj * physical address. 1283*8c82a0b3SMichal Luczaj * 1284*8c82a0b3SMichal Luczaj * @gpc: struct gfn_to_pfn_cache object. 1285982ed0deSDavid Woodhouse * @gpa: guest physical address to map. 1286982ed0deSDavid Woodhouse * @len: sanity check; the range being access must fit a single page. 1287982ed0deSDavid Woodhouse * 1288982ed0deSDavid Woodhouse * @return: 0 for success. 1289982ed0deSDavid Woodhouse * -EINVAL for a mapping which would cross a page boundary. 1290982ed0deSDavid Woodhouse * -EFAULT for an untranslatable guest physical address. 1291982ed0deSDavid Woodhouse * 1292*8c82a0b3SMichal Luczaj * This primes a gfn_to_pfn_cache and links it into the @gpc->kvm's list for 1293aba3caefSMichal Luczaj * invalidations to be processed. Callers are required to use kvm_gpc_check() 1294aba3caefSMichal Luczaj * to ensure that the cache is valid before accessing the target page. 1295982ed0deSDavid Woodhouse */ 1296*8c82a0b3SMichal Luczaj int kvm_gpc_activate(struct gfn_to_pfn_cache *gpc, gpa_t gpa, unsigned long len); 1297982ed0deSDavid Woodhouse 1298982ed0deSDavid Woodhouse /** 1299aba3caefSMichal Luczaj * kvm_gpc_check - check validity of a gfn_to_pfn_cache. 1300982ed0deSDavid Woodhouse * 1301982ed0deSDavid Woodhouse * @kvm: pointer to kvm instance. 1302982ed0deSDavid Woodhouse * @gpc: struct gfn_to_pfn_cache object. 1303982ed0deSDavid Woodhouse * @gpa: current guest physical address to map. 1304982ed0deSDavid Woodhouse * @len: sanity check; the range being access must fit a single page. 1305982ed0deSDavid Woodhouse * 1306982ed0deSDavid Woodhouse * @return: %true if the cache is still valid and the address matches. 1307982ed0deSDavid Woodhouse * %false if the cache is not valid. 1308982ed0deSDavid Woodhouse * 1309982ed0deSDavid Woodhouse * Callers outside IN_GUEST_MODE context should hold a read lock on @gpc->lock 1310982ed0deSDavid Woodhouse * while calling this function, and then continue to hold the lock until the 1311982ed0deSDavid Woodhouse * access is complete. 1312982ed0deSDavid Woodhouse * 1313982ed0deSDavid Woodhouse * Callers in IN_GUEST_MODE may do so without locking, although they should 1314982ed0deSDavid Woodhouse * still hold a read lock on kvm->scru for the memslot checks. 1315982ed0deSDavid Woodhouse */ 1316aba3caefSMichal Luczaj bool kvm_gpc_check(struct kvm *kvm, struct gfn_to_pfn_cache *gpc, gpa_t gpa, 1317aba3caefSMichal Luczaj unsigned long len); 1318982ed0deSDavid Woodhouse 1319982ed0deSDavid Woodhouse /** 1320aba3caefSMichal Luczaj * kvm_gpc_refresh - update a previously initialized cache. 1321982ed0deSDavid Woodhouse * 1322982ed0deSDavid Woodhouse * @kvm: pointer to kvm instance. 1323982ed0deSDavid Woodhouse * @gpc: struct gfn_to_pfn_cache object. 1324982ed0deSDavid Woodhouse * @gpa: updated guest physical address to map. 1325982ed0deSDavid Woodhouse * @len: sanity check; the range being access must fit a single page. 1326982ed0deSDavid Woodhouse * 1327982ed0deSDavid Woodhouse * @return: 0 for success. 1328982ed0deSDavid Woodhouse * -EINVAL for a mapping which would cross a page boundary. 1329982ed0deSDavid Woodhouse * -EFAULT for an untranslatable guest physical address. 1330982ed0deSDavid Woodhouse * 1331982ed0deSDavid Woodhouse * This will attempt to refresh a gfn_to_pfn_cache. Note that a successful 1332982ed0deSDavid Woodhouse * returm from this function does not mean the page can be immediately 1333982ed0deSDavid Woodhouse * accessed because it may have raced with an invalidation. Callers must 1334982ed0deSDavid Woodhouse * still lock and check the cache status, as this function does not return 1335982ed0deSDavid Woodhouse * with the lock still held to permit access. 1336982ed0deSDavid Woodhouse */ 1337aba3caefSMichal Luczaj int kvm_gpc_refresh(struct kvm *kvm, struct gfn_to_pfn_cache *gpc, gpa_t gpa, 1338aba3caefSMichal Luczaj unsigned long len); 1339982ed0deSDavid Woodhouse 1340982ed0deSDavid Woodhouse /** 1341aba3caefSMichal Luczaj * kvm_gpc_unmap - temporarily unmap a gfn_to_pfn_cache. 1342982ed0deSDavid Woodhouse * 1343982ed0deSDavid Woodhouse * @kvm: pointer to kvm instance. 1344982ed0deSDavid Woodhouse * @gpc: struct gfn_to_pfn_cache object. 1345982ed0deSDavid Woodhouse * 1346cf1d88b3SDavid Woodhouse * This unmaps the referenced page. The cache is left in the invalid state 1347cf1d88b3SDavid Woodhouse * but at least the mapping from GPA to userspace HVA will remain cached 1348cf1d88b3SDavid Woodhouse * and can be reused on a subsequent refresh. 1349982ed0deSDavid Woodhouse */ 1350aba3caefSMichal Luczaj void kvm_gpc_unmap(struct kvm *kvm, struct gfn_to_pfn_cache *gpc); 1351982ed0deSDavid Woodhouse 1352982ed0deSDavid Woodhouse /** 135352491a38SMichal Luczaj * kvm_gpc_deactivate - deactivate and unlink a gfn_to_pfn_cache. 1354982ed0deSDavid Woodhouse * 1355982ed0deSDavid Woodhouse * @gpc: struct gfn_to_pfn_cache object. 1356982ed0deSDavid Woodhouse * 1357*8c82a0b3SMichal Luczaj * This removes a cache from the VM's list to be processed on MMU notifier 1358982ed0deSDavid Woodhouse * invocation. 1359982ed0deSDavid Woodhouse */ 1360*8c82a0b3SMichal Luczaj void kvm_gpc_deactivate(struct gfn_to_pfn_cache *gpc); 1361982ed0deSDavid Woodhouse 136220b7035cSJan H. Schönherr void kvm_sigset_activate(struct kvm_vcpu *vcpu); 136320b7035cSJan H. Schönherr void kvm_sigset_deactivate(struct kvm_vcpu *vcpu); 136420b7035cSJan H. Schönherr 136591b99ea7SSean Christopherson void kvm_vcpu_halt(struct kvm_vcpu *vcpu); 1366fac42688SSean Christopherson bool kvm_vcpu_block(struct kvm_vcpu *vcpu); 13673217f7c2SChristoffer Dall void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu); 13683217f7c2SChristoffer Dall void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu); 1369178f02ffSRadim Krčmář bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu); 1370b6d33834SChristoffer Dall void kvm_vcpu_kick(struct kvm_vcpu *vcpu); 1371fa93384fSDan Carpenter int kvm_vcpu_yield_to(struct kvm_vcpu *target); 1372199b5763SLongpeng(Mike) void kvm_vcpu_on_spin(struct kvm_vcpu *vcpu, bool usermode_vcpu_not_eligible); 1373a4ee1ca4SXiao Guangrong 1374edf88417SAvi Kivity void kvm_flush_remote_tlbs(struct kvm *kvm); 13757053df4eSVitaly Kuznetsov 13766926f95aSSean Christopherson #ifdef KVM_ARCH_NR_OBJS_PER_MEMORY_CACHE 13776926f95aSSean Christopherson int kvm_mmu_topup_memory_cache(struct kvm_mmu_memory_cache *mc, int min); 1378837f66c7SDavid Matlack int __kvm_mmu_topup_memory_cache(struct kvm_mmu_memory_cache *mc, int capacity, int min); 13796926f95aSSean Christopherson int kvm_mmu_memory_cache_nr_free_objects(struct kvm_mmu_memory_cache *mc); 13806926f95aSSean Christopherson void kvm_mmu_free_memory_cache(struct kvm_mmu_memory_cache *mc); 13816926f95aSSean Christopherson void *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc); 13826926f95aSSean Christopherson #endif 13836926f95aSSean Christopherson 138420ec3ebdSChao Peng void kvm_mmu_invalidate_begin(struct kvm *kvm, unsigned long start, 1385edb298c6SMaxim Levitsky unsigned long end); 138620ec3ebdSChao Peng void kvm_mmu_invalidate_end(struct kvm *kvm, unsigned long start, 1387edb298c6SMaxim Levitsky unsigned long end); 1388edb298c6SMaxim Levitsky 1389edf88417SAvi Kivity long kvm_arch_dev_ioctl(struct file *filp, 1390edf88417SAvi Kivity unsigned int ioctl, unsigned long arg); 1391edf88417SAvi Kivity long kvm_arch_vcpu_ioctl(struct file *filp, 1392edf88417SAvi Kivity unsigned int ioctl, unsigned long arg); 13931499fa80SSouptick Joarder vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf); 1394edf88417SAvi Kivity 1395784aa3d7SAlexander Graf int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext); 1396edf88417SAvi Kivity 13973b0f1d01SKai Huang void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm, 1398ba0513b5SMario Smarduch struct kvm_memory_slot *slot, 1399ba0513b5SMario Smarduch gfn_t gfn_offset, 1400ba0513b5SMario Smarduch unsigned long mask); 14010dff0846SSean Christopherson void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *memslot); 1402ba0513b5SMario Smarduch 14030dff0846SSean Christopherson #ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT 14040dff0846SSean Christopherson void kvm_arch_flush_remote_tlbs_memslot(struct kvm *kvm, 14056c9dd6d2SPaolo Bonzini const struct kvm_memory_slot *memslot); 14060dff0846SSean Christopherson #else /* !CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT */ 14070dff0846SSean Christopherson int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log); 14080dff0846SSean Christopherson int kvm_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log, 14092a49f61dSSean Christopherson int *is_dirty, struct kvm_memory_slot **memslot); 14100dff0846SSean Christopherson #endif 1411edf88417SAvi Kivity 1412aa2fbe6dSYang Zhang int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, 1413aa2fbe6dSYang Zhang bool line_status); 1414e5d83c74SPaolo Bonzini int kvm_vm_ioctl_enable_cap(struct kvm *kvm, 1415e5d83c74SPaolo Bonzini struct kvm_enable_cap *cap); 1416edf88417SAvi Kivity long kvm_arch_vm_ioctl(struct file *filp, 1417edf88417SAvi Kivity unsigned int ioctl, unsigned long arg); 1418ed51862fSAlexander Graf long kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl, 1419ed51862fSAlexander Graf unsigned long arg); 1420edf88417SAvi Kivity 1421edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); 1422edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu); 1423edf88417SAvi Kivity 1424edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, 1425edf88417SAvi Kivity struct kvm_translation *tr); 1426edf88417SAvi Kivity 1427edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); 1428edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs); 1429edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, 1430edf88417SAvi Kivity struct kvm_sregs *sregs); 1431edf88417SAvi Kivity int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, 1432edf88417SAvi Kivity struct kvm_sregs *sregs); 143362d9f0dbSMarcelo Tosatti int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, 143462d9f0dbSMarcelo Tosatti struct kvm_mp_state *mp_state); 143562d9f0dbSMarcelo Tosatti int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, 143662d9f0dbSMarcelo Tosatti struct kvm_mp_state *mp_state); 1437d0bfb940SJan Kiszka int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, 1438d0bfb940SJan Kiszka struct kvm_guest_debug *dbg); 14391b94f6f8STianjia Zhang int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu); 1440edf88417SAvi Kivity 1441edf88417SAvi Kivity int kvm_arch_init(void *opaque); 1442edf88417SAvi Kivity void kvm_arch_exit(void); 1443edf88417SAvi Kivity 1444e790d9efSRadim Krčmář void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu); 1445e790d9efSRadim Krčmář 1446edf88417SAvi Kivity void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu); 1447edf88417SAvi Kivity void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu); 1448897cc38eSSean Christopherson int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id); 1449e529ef66SSean Christopherson int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu); 145031928aa5SDominik Dingel void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu); 1451edf88417SAvi Kivity void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); 1452edf88417SAvi Kivity 14532fdef3a2SSergey Senozhatsky #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER 14542fdef3a2SSergey Senozhatsky int kvm_arch_pm_notifier(struct kvm *kvm, unsigned long state); 14552fdef3a2SSergey Senozhatsky #endif 14562fdef3a2SSergey Senozhatsky 1457741cbbaeSPaolo Bonzini #ifdef __KVM_HAVE_ARCH_VCPU_DEBUGFS 1458d56f5136SPaolo Bonzini void kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu, struct dentry *debugfs_dentry); 1459e36de87dSVineeth Pillai #else 1460e36de87dSVineeth Pillai static inline void kvm_create_vcpu_debugfs(struct kvm_vcpu *vcpu) {} 1461741cbbaeSPaolo Bonzini #endif 1462235539b4SLuiz Capitulino 146313a34e06SRadim Krčmář int kvm_arch_hardware_enable(void); 146413a34e06SRadim Krčmář void kvm_arch_hardware_disable(void); 1465b9904085SSean Christopherson int kvm_arch_hardware_setup(void *opaque); 1466edf88417SAvi Kivity void kvm_arch_hardware_unsetup(void); 1467b9904085SSean Christopherson int kvm_arch_check_processor_compat(void *opaque); 1468edf88417SAvi Kivity int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); 1469199b5763SLongpeng(Mike) bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu); 1470b6d33834SChristoffer Dall int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu); 147117e433b5SWanpeng Li bool kvm_arch_dy_runnable(struct kvm_vcpu *vcpu); 147252acd22fSWanpeng Li bool kvm_arch_dy_has_pending_interrupt(struct kvm_vcpu *vcpu); 1473d970a325SPaolo Bonzini int kvm_arch_post_init_vm(struct kvm *kvm); 1474d970a325SPaolo Bonzini void kvm_arch_pre_destroy_vm(struct kvm *kvm); 14753165af73SPeter Xu int kvm_arch_create_vm_debugfs(struct kvm *kvm); 1476edf88417SAvi Kivity 1477d89f5effSJan Kiszka #ifndef __KVM_HAVE_ARCH_VM_ALLOC 1478d1e5b0e9SMarc Orr /* 1479d1e5b0e9SMarc Orr * All architectures that want to use vzalloc currently also 1480d1e5b0e9SMarc Orr * need their own kvm_arch_alloc_vm implementation. 1481d1e5b0e9SMarc Orr */ 1482d89f5effSJan Kiszka static inline struct kvm *kvm_arch_alloc_vm(void) 1483d89f5effSJan Kiszka { 1484d89f5effSJan Kiszka return kzalloc(sizeof(struct kvm), GFP_KERNEL); 1485d89f5effSJan Kiszka } 148678b497f2SJuergen Gross #endif 1487d89f5effSJan Kiszka 148878b497f2SJuergen Gross static inline void __kvm_arch_free_vm(struct kvm *kvm) 148978b497f2SJuergen Gross { 149078b497f2SJuergen Gross kvfree(kvm); 149178b497f2SJuergen Gross } 149278b497f2SJuergen Gross 149378b497f2SJuergen Gross #ifndef __KVM_HAVE_ARCH_VM_FREE 1494d89f5effSJan Kiszka static inline void kvm_arch_free_vm(struct kvm *kvm) 1495d89f5effSJan Kiszka { 149678b497f2SJuergen Gross __kvm_arch_free_vm(kvm); 1497d89f5effSJan Kiszka } 1498d89f5effSJan Kiszka #endif 1499d89f5effSJan Kiszka 1500b08660e5STianyu Lan #ifndef __KVM_HAVE_ARCH_FLUSH_REMOTE_TLB 1501b08660e5STianyu Lan static inline int kvm_arch_flush_remote_tlb(struct kvm *kvm) 1502b08660e5STianyu Lan { 1503b08660e5STianyu Lan return -ENOTSUPP; 1504b08660e5STianyu Lan } 1505b08660e5STianyu Lan #endif 1506b08660e5STianyu Lan 1507e0f0bbc5SAlex Williamson #ifdef __KVM_HAVE_ARCH_NONCOHERENT_DMA 1508e0f0bbc5SAlex Williamson void kvm_arch_register_noncoherent_dma(struct kvm *kvm); 1509e0f0bbc5SAlex Williamson void kvm_arch_unregister_noncoherent_dma(struct kvm *kvm); 1510e0f0bbc5SAlex Williamson bool kvm_arch_has_noncoherent_dma(struct kvm *kvm); 1511e0f0bbc5SAlex Williamson #else 1512e0f0bbc5SAlex Williamson static inline void kvm_arch_register_noncoherent_dma(struct kvm *kvm) 1513e0f0bbc5SAlex Williamson { 1514e0f0bbc5SAlex Williamson } 1515e0f0bbc5SAlex Williamson 1516e0f0bbc5SAlex Williamson static inline void kvm_arch_unregister_noncoherent_dma(struct kvm *kvm) 1517e0f0bbc5SAlex Williamson { 1518e0f0bbc5SAlex Williamson } 1519e0f0bbc5SAlex Williamson 1520e0f0bbc5SAlex Williamson static inline bool kvm_arch_has_noncoherent_dma(struct kvm *kvm) 1521e0f0bbc5SAlex Williamson { 1522e0f0bbc5SAlex Williamson return false; 1523e0f0bbc5SAlex Williamson } 1524e0f0bbc5SAlex Williamson #endif 15255544eb9bSPaolo Bonzini #ifdef __KVM_HAVE_ARCH_ASSIGNED_DEVICE 15265544eb9bSPaolo Bonzini void kvm_arch_start_assignment(struct kvm *kvm); 15275544eb9bSPaolo Bonzini void kvm_arch_end_assignment(struct kvm *kvm); 15285544eb9bSPaolo Bonzini bool kvm_arch_has_assigned_device(struct kvm *kvm); 15295544eb9bSPaolo Bonzini #else 15305544eb9bSPaolo Bonzini static inline void kvm_arch_start_assignment(struct kvm *kvm) 15315544eb9bSPaolo Bonzini { 15325544eb9bSPaolo Bonzini } 15335544eb9bSPaolo Bonzini 15345544eb9bSPaolo Bonzini static inline void kvm_arch_end_assignment(struct kvm *kvm) 15355544eb9bSPaolo Bonzini { 15365544eb9bSPaolo Bonzini } 15375544eb9bSPaolo Bonzini 1538742ab6dfSPeter Zijlstra static __always_inline bool kvm_arch_has_assigned_device(struct kvm *kvm) 15395544eb9bSPaolo Bonzini { 15405544eb9bSPaolo Bonzini return false; 15415544eb9bSPaolo Bonzini } 15425544eb9bSPaolo Bonzini #endif 1543e0f0bbc5SAlex Williamson 1544da4ad88cSDavidlohr Bueso static inline struct rcuwait *kvm_arch_vcpu_get_wait(struct kvm_vcpu *vcpu) 1545b6d33834SChristoffer Dall { 15462246f8b5SAlexander Graf #ifdef __KVM_HAVE_ARCH_WQP 1547da4ad88cSDavidlohr Bueso return vcpu->arch.waitp; 15482246f8b5SAlexander Graf #else 1549da4ad88cSDavidlohr Bueso return &vcpu->wait; 1550b6d33834SChristoffer Dall #endif 15512246f8b5SAlexander Graf } 1552b6d33834SChristoffer Dall 1553d92a5d1cSSean Christopherson /* 1554d92a5d1cSSean Christopherson * Wake a vCPU if necessary, but don't do any stats/metadata updates. Returns 1555d92a5d1cSSean Christopherson * true if the vCPU was blocking and was awakened, false otherwise. 1556d92a5d1cSSean Christopherson */ 1557d92a5d1cSSean Christopherson static inline bool __kvm_vcpu_wake_up(struct kvm_vcpu *vcpu) 1558d92a5d1cSSean Christopherson { 1559d92a5d1cSSean Christopherson return !!rcuwait_wake_up(kvm_arch_vcpu_get_wait(vcpu)); 1560d92a5d1cSSean Christopherson } 1561d92a5d1cSSean Christopherson 1562d92a5d1cSSean Christopherson static inline bool kvm_vcpu_is_blocking(struct kvm_vcpu *vcpu) 1563d92a5d1cSSean Christopherson { 1564d92a5d1cSSean Christopherson return rcuwait_active(kvm_arch_vcpu_get_wait(vcpu)); 1565d92a5d1cSSean Christopherson } 1566d92a5d1cSSean Christopherson 156701c94e64SEric Auger #ifdef __KVM_HAVE_ARCH_INTC_INITIALIZED 156801c94e64SEric Auger /* 156901c94e64SEric Auger * returns true if the virtual interrupt controller is initialized and 157001c94e64SEric Auger * ready to accept virtual IRQ. On some architectures the virtual interrupt 157101c94e64SEric Auger * controller is dynamically instantiated and this is not always true. 157201c94e64SEric Auger */ 157301c94e64SEric Auger bool kvm_arch_intc_initialized(struct kvm *kvm); 157401c94e64SEric Auger #else 157501c94e64SEric Auger static inline bool kvm_arch_intc_initialized(struct kvm *kvm) 157601c94e64SEric Auger { 157701c94e64SEric Auger return true; 157801c94e64SEric Auger } 157901c94e64SEric Auger #endif 158001c94e64SEric Auger 1581e1bfc245SSean Christopherson #ifdef CONFIG_GUEST_PERF_EVENTS 1582e1bfc245SSean Christopherson unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu *vcpu); 1583e1bfc245SSean Christopherson 1584e1bfc245SSean Christopherson void kvm_register_perf_callbacks(unsigned int (*pt_intr_handler)(void)); 1585e1bfc245SSean Christopherson void kvm_unregister_perf_callbacks(void); 1586e1bfc245SSean Christopherson #else 1587e1bfc245SSean Christopherson static inline void kvm_register_perf_callbacks(void *ign) {} 1588e1bfc245SSean Christopherson static inline void kvm_unregister_perf_callbacks(void) {} 1589e1bfc245SSean Christopherson #endif /* CONFIG_GUEST_PERF_EVENTS */ 1590e1bfc245SSean Christopherson 1591e08b9637SCarsten Otte int kvm_arch_init_vm(struct kvm *kvm, unsigned long type); 1592edf88417SAvi Kivity void kvm_arch_destroy_vm(struct kvm *kvm); 1593ad8ba2cdSSheng Yang void kvm_arch_sync_events(struct kvm *kvm); 1594edf88417SAvi Kivity 15953d80840dSMarcelo Tosatti int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); 1596edf88417SAvi Kivity 1597b14b2690SSean Christopherson struct page *kvm_pfn_to_refcounted_page(kvm_pfn_t pfn); 1598284dc493SSean Christopherson bool kvm_is_zone_device_page(struct page *page); 1599c77fb9dcSXiantao Zhang 160062c476c7SBen-Ami Yassour struct kvm_irq_ack_notifier { 160162c476c7SBen-Ami Yassour struct hlist_node link; 160262c476c7SBen-Ami Yassour unsigned gsi; 160362c476c7SBen-Ami Yassour void (*irq_acked)(struct kvm_irq_ack_notifier *kian); 160462c476c7SBen-Ami Yassour }; 160562c476c7SBen-Ami Yassour 16069957c86dSPaul Mackerras int kvm_irq_map_gsi(struct kvm *kvm, 16079957c86dSPaul Mackerras struct kvm_kernel_irq_routing_entry *entries, int gsi); 16089957c86dSPaul Mackerras int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin); 16098ba918d4SPaul Mackerras 1610aa2fbe6dSYang Zhang int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, 1611aa2fbe6dSYang Zhang bool line_status); 1612bd2b53b2SMichael S. Tsirkin int kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm, 1613aa2fbe6dSYang Zhang int irq_source_id, int level, bool line_status); 1614b97e6de9SPaolo Bonzini int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e, 1615b97e6de9SPaolo Bonzini struct kvm *kvm, int irq_source_id, 1616b97e6de9SPaolo Bonzini int level, bool line_status); 1617c7c9c56cSYang Zhang bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin); 1618ba1aefcdSAndrey Smetanin void kvm_notify_acked_gsi(struct kvm *kvm, int gsi); 161944882eedSMarcelo Tosatti void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin); 16203de42dc0SXiantao Zhang void kvm_register_irq_ack_notifier(struct kvm *kvm, 16213de42dc0SXiantao Zhang struct kvm_irq_ack_notifier *kian); 1622fa40a821SMarcelo Tosatti void kvm_unregister_irq_ack_notifier(struct kvm *kvm, 1623fa40a821SMarcelo Tosatti struct kvm_irq_ack_notifier *kian); 16245550af4dSSheng Yang int kvm_request_irq_source_id(struct kvm *kvm); 16255550af4dSSheng Yang void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); 1626cdc238ebSYi Wang bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args); 162762c476c7SBen-Ami Yassour 16289d4cba7fSPaul Mackerras /* 1629a54d8066SMaciej S. Szmigiero * Returns a pointer to the memslot if it contains gfn. 16300f22af94SDavid Matlack * Otherwise returns NULL. 16310f22af94SDavid Matlack */ 16320f22af94SDavid Matlack static inline struct kvm_memory_slot * 1633a54d8066SMaciej S. Szmigiero try_get_memslot(struct kvm_memory_slot *slot, gfn_t gfn) 16340f22af94SDavid Matlack { 1635a54d8066SMaciej S. Szmigiero if (!slot) 16360f22af94SDavid Matlack return NULL; 16370f22af94SDavid Matlack 16380f22af94SDavid Matlack if (gfn >= slot->base_gfn && gfn < slot->base_gfn + slot->npages) 16390f22af94SDavid Matlack return slot; 16400f22af94SDavid Matlack else 16410f22af94SDavid Matlack return NULL; 16420f22af94SDavid Matlack } 16430f22af94SDavid Matlack 16440f22af94SDavid Matlack /* 1645a54d8066SMaciej S. Szmigiero * Returns a pointer to the memslot that contains gfn. Otherwise returns NULL. 16460577d1abSSean Christopherson * 1647c928bfc2SMaciej S. Szmigiero * With "approx" set returns the memslot also when the address falls 1648c928bfc2SMaciej S. Szmigiero * in a hole. In that case one of the memslots bordering the hole is 1649c928bfc2SMaciej S. Szmigiero * returned. 16509d4cba7fSPaul Mackerras */ 16519d4cba7fSPaul Mackerras static inline struct kvm_memory_slot * 1652a54d8066SMaciej S. Szmigiero search_memslots(struct kvm_memslots *slots, gfn_t gfn, bool approx) 16539d4cba7fSPaul Mackerras { 16540f22af94SDavid Matlack struct kvm_memory_slot *slot; 1655a54d8066SMaciej S. Szmigiero struct rb_node *node; 1656a54d8066SMaciej S. Szmigiero int idx = slots->node_idx; 16579d4cba7fSPaul Mackerras 1658a54d8066SMaciej S. Szmigiero slot = NULL; 1659a54d8066SMaciej S. Szmigiero for (node = slots->gfn_tree.rb_node; node; ) { 1660a54d8066SMaciej S. Szmigiero slot = container_of(node, struct kvm_memory_slot, gfn_node[idx]); 1661a54d8066SMaciej S. Szmigiero if (gfn >= slot->base_gfn) { 1662a54d8066SMaciej S. Szmigiero if (gfn < slot->base_gfn + slot->npages) 16630f22af94SDavid Matlack return slot; 1664a54d8066SMaciej S. Szmigiero node = node->rb_right; 1665a54d8066SMaciej S. Szmigiero } else 1666a54d8066SMaciej S. Szmigiero node = node->rb_left; 1667c928bfc2SMaciej S. Szmigiero } 1668d4ae84a0SIgor Mammedov 1669a54d8066SMaciej S. Szmigiero return approx ? slot : NULL; 16709d4cba7fSPaul Mackerras } 16719d4cba7fSPaul Mackerras 16729d4cba7fSPaul Mackerras static inline struct kvm_memory_slot * 1673c928bfc2SMaciej S. Szmigiero ____gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn, bool approx) 16749d4cba7fSPaul Mackerras { 16750f22af94SDavid Matlack struct kvm_memory_slot *slot; 16760f22af94SDavid Matlack 1677a54d8066SMaciej S. Szmigiero slot = (struct kvm_memory_slot *)atomic_long_read(&slots->last_used_slot); 1678a54d8066SMaciej S. Szmigiero slot = try_get_memslot(slot, gfn); 16790f22af94SDavid Matlack if (slot) 16800f22af94SDavid Matlack return slot; 16810f22af94SDavid Matlack 1682a54d8066SMaciej S. Szmigiero slot = search_memslots(slots, gfn, approx); 16830f22af94SDavid Matlack if (slot) { 1684a54d8066SMaciej S. Szmigiero atomic_long_set(&slots->last_used_slot, (unsigned long)slot); 16850f22af94SDavid Matlack return slot; 16860f22af94SDavid Matlack } 16870f22af94SDavid Matlack 16880f22af94SDavid Matlack return NULL; 16899d4cba7fSPaul Mackerras } 16909d4cba7fSPaul Mackerras 1691c928bfc2SMaciej S. Szmigiero /* 1692c928bfc2SMaciej S. Szmigiero * __gfn_to_memslot() and its descendants are here to allow arch code to inline 1693c928bfc2SMaciej S. Szmigiero * the lookups in hot paths. gfn_to_memslot() itself isn't here as an inline 1694c928bfc2SMaciej S. Szmigiero * because that would bloat other code too much. 1695c928bfc2SMaciej S. Szmigiero */ 1696c928bfc2SMaciej S. Szmigiero static inline struct kvm_memory_slot * 1697c928bfc2SMaciej S. Szmigiero __gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn) 1698c928bfc2SMaciej S. Szmigiero { 1699c928bfc2SMaciej S. Szmigiero return ____gfn_to_memslot(slots, gfn, false); 1700c928bfc2SMaciej S. Szmigiero } 1701c928bfc2SMaciej S. Szmigiero 170266a03505SGavin Shan static inline unsigned long 17038ca6f063SBen Gardon __gfn_to_hva_memslot(const struct kvm_memory_slot *slot, gfn_t gfn) 170466a03505SGavin Shan { 1705da27a83fSPaolo Bonzini /* 1706da27a83fSPaolo Bonzini * The index was checked originally in search_memslots. To avoid 1707da27a83fSPaolo Bonzini * that a malicious guest builds a Spectre gadget out of e.g. page 1708da27a83fSPaolo Bonzini * table walks, do not let the processor speculate loads outside 1709da27a83fSPaolo Bonzini * the guest's registered memslots. 1710da27a83fSPaolo Bonzini */ 17114422829eSPaolo Bonzini unsigned long offset = gfn - slot->base_gfn; 17124422829eSPaolo Bonzini offset = array_index_nospec(offset, slot->npages); 1713da27a83fSPaolo Bonzini return slot->userspace_addr + offset * PAGE_SIZE; 171466a03505SGavin Shan } 171566a03505SGavin Shan 17160ee8dcb8SXiao Guangrong static inline int memslot_id(struct kvm *kvm, gfn_t gfn) 17170ee8dcb8SXiao Guangrong { 17180ee8dcb8SXiao Guangrong return gfn_to_memslot(kvm, gfn)->id; 17190ee8dcb8SXiao Guangrong } 17200ee8dcb8SXiao Guangrong 1721d19a748bSTakuya Yoshikawa static inline gfn_t 1722d19a748bSTakuya Yoshikawa hva_to_gfn_memslot(unsigned long hva, struct kvm_memory_slot *slot) 1723887c08acSXiao Guangrong { 1724d19a748bSTakuya Yoshikawa gfn_t gfn_offset = (hva - slot->userspace_addr) >> PAGE_SHIFT; 1725d19a748bSTakuya Yoshikawa 1726d19a748bSTakuya Yoshikawa return slot->base_gfn + gfn_offset; 1727887c08acSXiao Guangrong } 1728887c08acSXiao Guangrong 1729edf88417SAvi Kivity static inline gpa_t gfn_to_gpa(gfn_t gfn) 1730edf88417SAvi Kivity { 1731edf88417SAvi Kivity return (gpa_t)gfn << PAGE_SHIFT; 1732edf88417SAvi Kivity } 1733edf88417SAvi Kivity 1734c30a358dSJoerg Roedel static inline gfn_t gpa_to_gfn(gpa_t gpa) 1735c30a358dSJoerg Roedel { 1736c30a358dSJoerg Roedel return (gfn_t)(gpa >> PAGE_SHIFT); 1737c30a358dSJoerg Roedel } 1738c30a358dSJoerg Roedel 1739ba049e93SDan Williams static inline hpa_t pfn_to_hpa(kvm_pfn_t pfn) 174062c476c7SBen-Ami Yassour { 174162c476c7SBen-Ami Yassour return (hpa_t)pfn << PAGE_SHIFT; 174262c476c7SBen-Ami Yassour } 174362c476c7SBen-Ami Yassour 1744dfeec843SHeiko Carstens static inline bool kvm_is_error_gpa(struct kvm *kvm, gpa_t gpa) 1745dfeec843SHeiko Carstens { 1746dfeec843SHeiko Carstens unsigned long hva = gfn_to_hva(kvm, gpa_to_gfn(gpa)); 1747dfeec843SHeiko Carstens 1748dfeec843SHeiko Carstens return kvm_is_error_hva(hva); 1749dfeec843SHeiko Carstens } 1750dfeec843SHeiko Carstens 1751edf88417SAvi Kivity enum kvm_stat_kind { 1752edf88417SAvi Kivity KVM_STAT_VM, 1753edf88417SAvi Kivity KVM_STAT_VCPU, 1754edf88417SAvi Kivity }; 1755edf88417SAvi Kivity 1756536a6f88SJanosch Frank struct kvm_stat_data { 1757536a6f88SJanosch Frank struct kvm *kvm; 1758bc9e9e67SJing Zhang const struct _kvm_stats_desc *desc; 1759edf88417SAvi Kivity enum kvm_stat_kind kind; 1760edf88417SAvi Kivity }; 176109cbcef6SMilan Pandurov 1762cb082bfaSJing Zhang struct _kvm_stats_desc { 1763cb082bfaSJing Zhang struct kvm_stats_desc desc; 1764cb082bfaSJing Zhang char name[KVM_STATS_NAME_SIZE]; 1765cb082bfaSJing Zhang }; 1766cb082bfaSJing Zhang 1767f95937ccSJing Zhang #define STATS_DESC_COMMON(type, unit, base, exp, sz, bsz) \ 1768cb082bfaSJing Zhang .flags = type | unit | base | \ 1769cb082bfaSJing Zhang BUILD_BUG_ON_ZERO(type & ~KVM_STATS_TYPE_MASK) | \ 1770cb082bfaSJing Zhang BUILD_BUG_ON_ZERO(unit & ~KVM_STATS_UNIT_MASK) | \ 1771cb082bfaSJing Zhang BUILD_BUG_ON_ZERO(base & ~KVM_STATS_BASE_MASK), \ 1772cb082bfaSJing Zhang .exponent = exp, \ 1773f95937ccSJing Zhang .size = sz, \ 1774f95937ccSJing Zhang .bucket_size = bsz 1775cb082bfaSJing Zhang 1776f95937ccSJing Zhang #define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \ 1777cb082bfaSJing Zhang { \ 1778cb082bfaSJing Zhang { \ 1779f95937ccSJing Zhang STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \ 1780cb082bfaSJing Zhang .offset = offsetof(struct kvm_vm_stat, generic.stat) \ 1781cb082bfaSJing Zhang }, \ 1782cb082bfaSJing Zhang .name = #stat, \ 1783cb082bfaSJing Zhang } 1784f95937ccSJing Zhang #define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \ 1785cb082bfaSJing Zhang { \ 1786cb082bfaSJing Zhang { \ 1787f95937ccSJing Zhang STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \ 1788cb082bfaSJing Zhang .offset = offsetof(struct kvm_vcpu_stat, generic.stat) \ 1789cb082bfaSJing Zhang }, \ 1790cb082bfaSJing Zhang .name = #stat, \ 1791cb082bfaSJing Zhang } 1792f95937ccSJing Zhang #define VM_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \ 1793cb082bfaSJing Zhang { \ 1794cb082bfaSJing Zhang { \ 1795f95937ccSJing Zhang STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \ 1796cb082bfaSJing Zhang .offset = offsetof(struct kvm_vm_stat, stat) \ 1797cb082bfaSJing Zhang }, \ 1798cb082bfaSJing Zhang .name = #stat, \ 1799cb082bfaSJing Zhang } 1800f95937ccSJing Zhang #define VCPU_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \ 1801cb082bfaSJing Zhang { \ 1802cb082bfaSJing Zhang { \ 1803f95937ccSJing Zhang STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \ 1804cb082bfaSJing Zhang .offset = offsetof(struct kvm_vcpu_stat, stat) \ 1805cb082bfaSJing Zhang }, \ 1806cb082bfaSJing Zhang .name = #stat, \ 1807cb082bfaSJing Zhang } 1808cb082bfaSJing Zhang /* SCOPE: VM, VM_GENERIC, VCPU, VCPU_GENERIC */ 1809f95937ccSJing Zhang #define STATS_DESC(SCOPE, stat, type, unit, base, exp, sz, bsz) \ 1810f95937ccSJing Zhang SCOPE##_STATS_DESC(stat, type, unit, base, exp, sz, bsz) 1811cb082bfaSJing Zhang 1812cb082bfaSJing Zhang #define STATS_DESC_CUMULATIVE(SCOPE, name, unit, base, exponent) \ 1813f95937ccSJing Zhang STATS_DESC(SCOPE, name, KVM_STATS_TYPE_CUMULATIVE, \ 1814f95937ccSJing Zhang unit, base, exponent, 1, 0) 1815cb082bfaSJing Zhang #define STATS_DESC_INSTANT(SCOPE, name, unit, base, exponent) \ 1816f95937ccSJing Zhang STATS_DESC(SCOPE, name, KVM_STATS_TYPE_INSTANT, \ 1817f95937ccSJing Zhang unit, base, exponent, 1, 0) 1818cb082bfaSJing Zhang #define STATS_DESC_PEAK(SCOPE, name, unit, base, exponent) \ 1819f95937ccSJing Zhang STATS_DESC(SCOPE, name, KVM_STATS_TYPE_PEAK, \ 1820f95937ccSJing Zhang unit, base, exponent, 1, 0) 1821f95937ccSJing Zhang #define STATS_DESC_LINEAR_HIST(SCOPE, name, unit, base, exponent, sz, bsz) \ 1822f95937ccSJing Zhang STATS_DESC(SCOPE, name, KVM_STATS_TYPE_LINEAR_HIST, \ 1823f95937ccSJing Zhang unit, base, exponent, sz, bsz) 1824f95937ccSJing Zhang #define STATS_DESC_LOG_HIST(SCOPE, name, unit, base, exponent, sz) \ 1825f95937ccSJing Zhang STATS_DESC(SCOPE, name, KVM_STATS_TYPE_LOG_HIST, \ 1826f95937ccSJing Zhang unit, base, exponent, sz, 0) 1827cb082bfaSJing Zhang 1828cb082bfaSJing Zhang /* Cumulative counter, read/write */ 1829cb082bfaSJing Zhang #define STATS_DESC_COUNTER(SCOPE, name) \ 1830cb082bfaSJing Zhang STATS_DESC_CUMULATIVE(SCOPE, name, KVM_STATS_UNIT_NONE, \ 1831cb082bfaSJing Zhang KVM_STATS_BASE_POW10, 0) 1832cb082bfaSJing Zhang /* Instantaneous counter, read only */ 1833cb082bfaSJing Zhang #define STATS_DESC_ICOUNTER(SCOPE, name) \ 1834cb082bfaSJing Zhang STATS_DESC_INSTANT(SCOPE, name, KVM_STATS_UNIT_NONE, \ 1835cb082bfaSJing Zhang KVM_STATS_BASE_POW10, 0) 1836cb082bfaSJing Zhang /* Peak counter, read/write */ 1837cb082bfaSJing Zhang #define STATS_DESC_PCOUNTER(SCOPE, name) \ 1838cb082bfaSJing Zhang STATS_DESC_PEAK(SCOPE, name, KVM_STATS_UNIT_NONE, \ 1839cb082bfaSJing Zhang KVM_STATS_BASE_POW10, 0) 1840cb082bfaSJing Zhang 18411b870fa5SPaolo Bonzini /* Instantaneous boolean value, read only */ 18421b870fa5SPaolo Bonzini #define STATS_DESC_IBOOLEAN(SCOPE, name) \ 18431b870fa5SPaolo Bonzini STATS_DESC_INSTANT(SCOPE, name, KVM_STATS_UNIT_BOOLEAN, \ 18441b870fa5SPaolo Bonzini KVM_STATS_BASE_POW10, 0) 18451b870fa5SPaolo Bonzini /* Peak (sticky) boolean value, read/write */ 18461b870fa5SPaolo Bonzini #define STATS_DESC_PBOOLEAN(SCOPE, name) \ 18471b870fa5SPaolo Bonzini STATS_DESC_PEAK(SCOPE, name, KVM_STATS_UNIT_BOOLEAN, \ 18481b870fa5SPaolo Bonzini KVM_STATS_BASE_POW10, 0) 18491b870fa5SPaolo Bonzini 1850cb082bfaSJing Zhang /* Cumulative time in nanosecond */ 1851cb082bfaSJing Zhang #define STATS_DESC_TIME_NSEC(SCOPE, name) \ 1852cb082bfaSJing Zhang STATS_DESC_CUMULATIVE(SCOPE, name, KVM_STATS_UNIT_SECONDS, \ 1853cb082bfaSJing Zhang KVM_STATS_BASE_POW10, -9) 1854f95937ccSJing Zhang /* Linear histogram for time in nanosecond */ 1855f95937ccSJing Zhang #define STATS_DESC_LINHIST_TIME_NSEC(SCOPE, name, sz, bsz) \ 1856f95937ccSJing Zhang STATS_DESC_LINEAR_HIST(SCOPE, name, KVM_STATS_UNIT_SECONDS, \ 1857f95937ccSJing Zhang KVM_STATS_BASE_POW10, -9, sz, bsz) 1858f95937ccSJing Zhang /* Logarithmic histogram for time in nanosecond */ 1859f95937ccSJing Zhang #define STATS_DESC_LOGHIST_TIME_NSEC(SCOPE, name, sz) \ 1860f95937ccSJing Zhang STATS_DESC_LOG_HIST(SCOPE, name, KVM_STATS_UNIT_SECONDS, \ 1861f95937ccSJing Zhang KVM_STATS_BASE_POW10, -9, sz) 1862cb082bfaSJing Zhang 1863fcfe1baeSJing Zhang #define KVM_GENERIC_VM_STATS() \ 18643cc4e148SJing Zhang STATS_DESC_COUNTER(VM_GENERIC, remote_tlb_flush), \ 18653cc4e148SJing Zhang STATS_DESC_COUNTER(VM_GENERIC, remote_tlb_flush_requests) 1866fcfe1baeSJing Zhang 1867ce55c049SJing Zhang #define KVM_GENERIC_VCPU_STATS() \ 1868ce55c049SJing Zhang STATS_DESC_COUNTER(VCPU_GENERIC, halt_successful_poll), \ 1869ce55c049SJing Zhang STATS_DESC_COUNTER(VCPU_GENERIC, halt_attempted_poll), \ 1870ce55c049SJing Zhang STATS_DESC_COUNTER(VCPU_GENERIC, halt_poll_invalid), \ 1871ce55c049SJing Zhang STATS_DESC_COUNTER(VCPU_GENERIC, halt_wakeup), \ 1872ce55c049SJing Zhang STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_poll_success_ns), \ 187387bcc5faSJing Zhang STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_poll_fail_ns), \ 18748ccba534SJing Zhang STATS_DESC_TIME_NSEC(VCPU_GENERIC, halt_wait_ns), \ 18758ccba534SJing Zhang STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_poll_success_hist, \ 18768ccba534SJing Zhang HALT_POLL_HIST_COUNT), \ 18778ccba534SJing Zhang STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_poll_fail_hist, \ 18788ccba534SJing Zhang HALT_POLL_HIST_COUNT), \ 18798ccba534SJing Zhang STATS_DESC_LOGHIST_TIME_NSEC(VCPU_GENERIC, halt_wait_hist, \ 1880c3858335SJing Zhang HALT_POLL_HIST_COUNT), \ 18811b870fa5SPaolo Bonzini STATS_DESC_IBOOLEAN(VCPU_GENERIC, blocking) 1882ce55c049SJing Zhang 188376f7c879SHollis Blanchard extern struct dentry *kvm_debugfs_dir; 1884f95937ccSJing Zhang 1885cb082bfaSJing Zhang ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header, 1886cb082bfaSJing Zhang const struct _kvm_stats_desc *desc, 1887cb082bfaSJing Zhang void *stats, size_t size_stats, 1888cb082bfaSJing Zhang char __user *user_buffer, size_t size, loff_t *offset); 1889f95937ccSJing Zhang 1890f95937ccSJing Zhang /** 1891f95937ccSJing Zhang * kvm_stats_linear_hist_update() - Update bucket value for linear histogram 1892f95937ccSJing Zhang * statistics data. 1893f95937ccSJing Zhang * 1894f95937ccSJing Zhang * @data: start address of the stats data 1895f95937ccSJing Zhang * @size: the number of bucket of the stats data 1896f95937ccSJing Zhang * @value: the new value used to update the linear histogram's bucket 1897f95937ccSJing Zhang * @bucket_size: the size (width) of a bucket 1898f95937ccSJing Zhang */ 1899f95937ccSJing Zhang static inline void kvm_stats_linear_hist_update(u64 *data, size_t size, 1900f95937ccSJing Zhang u64 value, size_t bucket_size) 1901f95937ccSJing Zhang { 1902f95937ccSJing Zhang size_t index = div64_u64(value, bucket_size); 1903f95937ccSJing Zhang 1904f95937ccSJing Zhang index = min(index, size - 1); 1905f95937ccSJing Zhang ++data[index]; 1906f95937ccSJing Zhang } 1907f95937ccSJing Zhang 1908f95937ccSJing Zhang /** 1909f95937ccSJing Zhang * kvm_stats_log_hist_update() - Update bucket value for logarithmic histogram 1910f95937ccSJing Zhang * statistics data. 1911f95937ccSJing Zhang * 1912f95937ccSJing Zhang * @data: start address of the stats data 1913f95937ccSJing Zhang * @size: the number of bucket of the stats data 1914f95937ccSJing Zhang * @value: the new value used to update the logarithmic histogram's bucket 1915f95937ccSJing Zhang */ 1916f95937ccSJing Zhang static inline void kvm_stats_log_hist_update(u64 *data, size_t size, u64 value) 1917f95937ccSJing Zhang { 1918f95937ccSJing Zhang size_t index = fls64(value); 1919f95937ccSJing Zhang 1920f95937ccSJing Zhang index = min(index, size - 1); 1921f95937ccSJing Zhang ++data[index]; 1922f95937ccSJing Zhang } 1923f95937ccSJing Zhang 1924f95937ccSJing Zhang #define KVM_STATS_LINEAR_HIST_UPDATE(array, value, bsize) \ 1925f95937ccSJing Zhang kvm_stats_linear_hist_update(array, ARRAY_SIZE(array), value, bsize) 1926f95937ccSJing Zhang #define KVM_STATS_LOG_HIST_UPDATE(array, value) \ 1927f95937ccSJing Zhang kvm_stats_log_hist_update(array, ARRAY_SIZE(array), value) 1928f95937ccSJing Zhang 1929f95937ccSJing Zhang 1930fcfe1baeSJing Zhang extern const struct kvm_stats_header kvm_vm_stats_header; 1931fcfe1baeSJing Zhang extern const struct _kvm_stats_desc kvm_vm_stats_desc[]; 1932ce55c049SJing Zhang extern const struct kvm_stats_header kvm_vcpu_stats_header; 1933ce55c049SJing Zhang extern const struct _kvm_stats_desc kvm_vcpu_stats_desc[]; 1934d4c9ff2dSFeng(Eric) Liu 193536c1ed82SMarc Zyngier #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER) 193620ec3ebdSChao Peng static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq) 1937e930bffeSAndrea Arcangeli { 193820ec3ebdSChao Peng if (unlikely(kvm->mmu_invalidate_in_progress)) 1939e930bffeSAndrea Arcangeli return 1; 1940e930bffeSAndrea Arcangeli /* 194120ec3ebdSChao Peng * Ensure the read of mmu_invalidate_in_progress happens before 194220ec3ebdSChao Peng * the read of mmu_invalidate_seq. This interacts with the 194320ec3ebdSChao Peng * smp_wmb() in mmu_notifier_invalidate_range_end to make sure 194420ec3ebdSChao Peng * that the caller either sees the old (non-zero) value of 194520ec3ebdSChao Peng * mmu_invalidate_in_progress or the new (incremented) value of 194620ec3ebdSChao Peng * mmu_invalidate_seq. 194720ec3ebdSChao Peng * 194820ec3ebdSChao Peng * PowerPC Book3s HV KVM calls this under a per-page lock rather 194920ec3ebdSChao Peng * than under kvm->mmu_lock, for scalability, so can't rely on 195020ec3ebdSChao Peng * kvm->mmu_lock to keep things ordered. 1951e930bffeSAndrea Arcangeli */ 1952a355aa54SPaul Mackerras smp_rmb(); 195320ec3ebdSChao Peng if (kvm->mmu_invalidate_seq != mmu_seq) 1954e930bffeSAndrea Arcangeli return 1; 1955e930bffeSAndrea Arcangeli return 0; 1956e930bffeSAndrea Arcangeli } 19574a42d848SDavid Stevens 195820ec3ebdSChao Peng static inline int mmu_invalidate_retry_hva(struct kvm *kvm, 19594a42d848SDavid Stevens unsigned long mmu_seq, 19604a42d848SDavid Stevens unsigned long hva) 19614a42d848SDavid Stevens { 19624a42d848SDavid Stevens lockdep_assert_held(&kvm->mmu_lock); 19634a42d848SDavid Stevens /* 196420ec3ebdSChao Peng * If mmu_invalidate_in_progress is non-zero, then the range maintained 196520ec3ebdSChao Peng * by kvm_mmu_notifier_invalidate_range_start contains all addresses 196620ec3ebdSChao Peng * that might be being invalidated. Note that it may include some false 19674a42d848SDavid Stevens * positives, due to shortcuts when handing concurrent invalidations. 19684a42d848SDavid Stevens */ 196920ec3ebdSChao Peng if (unlikely(kvm->mmu_invalidate_in_progress) && 197020ec3ebdSChao Peng hva >= kvm->mmu_invalidate_range_start && 197120ec3ebdSChao Peng hva < kvm->mmu_invalidate_range_end) 19724a42d848SDavid Stevens return 1; 197320ec3ebdSChao Peng if (kvm->mmu_invalidate_seq != mmu_seq) 19744a42d848SDavid Stevens return 1; 19754a42d848SDavid Stevens return 0; 19764a42d848SDavid Stevens } 1977e930bffeSAndrea Arcangeli #endif 1978e930bffeSAndrea Arcangeli 1979a725d56aSAlexander Graf #ifdef CONFIG_HAVE_KVM_IRQ_ROUTING 1980399ec807SAvi Kivity 1981ddc9cfb7SWanpeng Li #define KVM_MAX_IRQ_ROUTES 4096 /* might need extension/rework in the future */ 1982399ec807SAvi Kivity 19835c0aea0eSDavid Hildenbrand bool kvm_arch_can_set_irq_routing(struct kvm *kvm); 1984399ec807SAvi Kivity int kvm_set_irq_routing(struct kvm *kvm, 1985399ec807SAvi Kivity const struct kvm_irq_routing_entry *entries, 1986399ec807SAvi Kivity unsigned nr, 1987399ec807SAvi Kivity unsigned flags); 1988c63cf538SRadim Krčmář int kvm_set_routing_entry(struct kvm *kvm, 1989c63cf538SRadim Krčmář struct kvm_kernel_irq_routing_entry *e, 1990e8cde093SAlexander Graf const struct kvm_irq_routing_entry *ue); 1991399ec807SAvi Kivity void kvm_free_irq_routing(struct kvm *kvm); 1992399ec807SAvi Kivity 1993399ec807SAvi Kivity #else 1994399ec807SAvi Kivity 1995399ec807SAvi Kivity static inline void kvm_free_irq_routing(struct kvm *kvm) {} 1996399ec807SAvi Kivity 1997399ec807SAvi Kivity #endif 1998399ec807SAvi Kivity 1999297e2105SPaul Mackerras int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi); 2000297e2105SPaul Mackerras 2001721eecbfSGregory Haskins #ifdef CONFIG_HAVE_KVM_EVENTFD 2002721eecbfSGregory Haskins 2003d34e6b17SGregory Haskins void kvm_eventfd_init(struct kvm *kvm); 2004914daba8SAlexander Graf int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args); 2005914daba8SAlexander Graf 2006297e2105SPaul Mackerras #ifdef CONFIG_HAVE_KVM_IRQFD 2007d4db2935SAlex Williamson int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args); 2008721eecbfSGregory Haskins void kvm_irqfd_release(struct kvm *kvm); 20099957c86dSPaul Mackerras void kvm_irq_routing_update(struct kvm *); 2010914daba8SAlexander Graf #else 2011914daba8SAlexander Graf static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args) 2012914daba8SAlexander Graf { 2013914daba8SAlexander Graf return -EINVAL; 2014914daba8SAlexander Graf } 2015914daba8SAlexander Graf 2016914daba8SAlexander Graf static inline void kvm_irqfd_release(struct kvm *kvm) {} 2017914daba8SAlexander Graf #endif 2018721eecbfSGregory Haskins 2019721eecbfSGregory Haskins #else 2020721eecbfSGregory Haskins 2021d34e6b17SGregory Haskins static inline void kvm_eventfd_init(struct kvm *kvm) {} 2022bd2b53b2SMichael S. Tsirkin 2023d4db2935SAlex Williamson static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args) 2024721eecbfSGregory Haskins { 2025721eecbfSGregory Haskins return -EINVAL; 2026721eecbfSGregory Haskins } 2027721eecbfSGregory Haskins 2028721eecbfSGregory Haskins static inline void kvm_irqfd_release(struct kvm *kvm) {} 2029bd2b53b2SMichael S. Tsirkin 203027923eb1SAlexander Graf #ifdef CONFIG_HAVE_KVM_IRQCHIP 20319957c86dSPaul Mackerras static inline void kvm_irq_routing_update(struct kvm *kvm) 2032bd2b53b2SMichael S. Tsirkin { 2033bd2b53b2SMichael S. Tsirkin } 203427923eb1SAlexander Graf #endif 2035bd2b53b2SMichael S. Tsirkin 2036d34e6b17SGregory Haskins static inline int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args) 2037d34e6b17SGregory Haskins { 2038d34e6b17SGregory Haskins return -ENOSYS; 2039d34e6b17SGregory Haskins } 2040721eecbfSGregory Haskins 2041721eecbfSGregory Haskins #endif /* CONFIG_HAVE_KVM_EVENTFD */ 2042721eecbfSGregory Haskins 204307646749SSebastian Ott void kvm_arch_irq_routing_update(struct kvm *kvm); 204407646749SSebastian Ott 2045df06dae3SSean Christopherson static inline void __kvm_make_request(int req, struct kvm_vcpu *vcpu) 2046a8eeb04aSAvi Kivity { 20472e4682baSPaolo Bonzini /* 20482e4682baSPaolo Bonzini * Ensure the rest of the request is published to kvm_check_request's 20492e4682baSPaolo Bonzini * caller. Paired with the smp_mb__after_atomic in kvm_check_request. 20502e4682baSPaolo Bonzini */ 20512e4682baSPaolo Bonzini smp_wmb(); 205286dafed5SKarimAllah Ahmed set_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests); 2053a8eeb04aSAvi Kivity } 2054a8eeb04aSAvi Kivity 2055df06dae3SSean Christopherson static __always_inline void kvm_make_request(int req, struct kvm_vcpu *vcpu) 2056df06dae3SSean Christopherson { 2057df06dae3SSean Christopherson /* 2058df06dae3SSean Christopherson * Request that don't require vCPU action should never be logged in 2059df06dae3SSean Christopherson * vcpu->requests. The vCPU won't clear the request, so it will stay 2060df06dae3SSean Christopherson * logged indefinitely and prevent the vCPU from entering the guest. 2061df06dae3SSean Christopherson */ 2062df06dae3SSean Christopherson BUILD_BUG_ON(!__builtin_constant_p(req) || 2063df06dae3SSean Christopherson (req & KVM_REQUEST_NO_ACTION)); 2064df06dae3SSean Christopherson 2065df06dae3SSean Christopherson __kvm_make_request(req, vcpu); 2066df06dae3SSean Christopherson } 2067df06dae3SSean Christopherson 20682fa6e1e1SRadim Krčmář static inline bool kvm_request_pending(struct kvm_vcpu *vcpu) 20692fa6e1e1SRadim Krčmář { 20702fa6e1e1SRadim Krčmář return READ_ONCE(vcpu->requests); 20712fa6e1e1SRadim Krčmář } 20722fa6e1e1SRadim Krčmář 207372875d8aSRadim Krčmář static inline bool kvm_test_request(int req, struct kvm_vcpu *vcpu) 207472875d8aSRadim Krčmář { 207586dafed5SKarimAllah Ahmed return test_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests); 207672875d8aSRadim Krčmář } 207772875d8aSRadim Krčmář 207872875d8aSRadim Krčmář static inline void kvm_clear_request(int req, struct kvm_vcpu *vcpu) 207972875d8aSRadim Krčmář { 208086dafed5SKarimAllah Ahmed clear_bit(req & KVM_REQUEST_MASK, (void *)&vcpu->requests); 208172875d8aSRadim Krčmář } 208272875d8aSRadim Krčmář 2083a8eeb04aSAvi Kivity static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) 2084a8eeb04aSAvi Kivity { 208572875d8aSRadim Krčmář if (kvm_test_request(req, vcpu)) { 208672875d8aSRadim Krčmář kvm_clear_request(req, vcpu); 20872e4682baSPaolo Bonzini 20882e4682baSPaolo Bonzini /* 20892e4682baSPaolo Bonzini * Ensure the rest of the request is visible to kvm_check_request's 20902e4682baSPaolo Bonzini * caller. Paired with the smp_wmb in kvm_make_request. 20912e4682baSPaolo Bonzini */ 20922e4682baSPaolo Bonzini smp_mb__after_atomic(); 20930719837cSAvi Kivity return true; 20940719837cSAvi Kivity } else { 20950719837cSAvi Kivity return false; 20960719837cSAvi Kivity } 2097a8eeb04aSAvi Kivity } 2098a8eeb04aSAvi Kivity 20998b415dcdSGeoff Levand extern bool kvm_rebooting; 21008b415dcdSGeoff Levand 2101ec76d819SSuraj Jitindar Singh extern unsigned int halt_poll_ns; 2102ec76d819SSuraj Jitindar Singh extern unsigned int halt_poll_ns_grow; 210349113d36SNir Weiner extern unsigned int halt_poll_ns_grow_start; 2104ec76d819SSuraj Jitindar Singh extern unsigned int halt_poll_ns_shrink; 2105ec76d819SSuraj Jitindar Singh 2106852b6d57SScott Wood struct kvm_device { 21078538cb22SSteven Price const struct kvm_device_ops *ops; 2108852b6d57SScott Wood struct kvm *kvm; 2109852b6d57SScott Wood void *private; 211007f0a7bdSScott Wood struct list_head vm_node; 2111852b6d57SScott Wood }; 2112852b6d57SScott Wood 2113852b6d57SScott Wood /* create, destroy, and name are mandatory */ 2114852b6d57SScott Wood struct kvm_device_ops { 2115852b6d57SScott Wood const char *name; 2116a28ebea2SChristoffer Dall 2117a28ebea2SChristoffer Dall /* 2118a28ebea2SChristoffer Dall * create is called holding kvm->lock and any operations not suitable 2119a28ebea2SChristoffer Dall * to do while holding the lock should be deferred to init (see 2120a28ebea2SChristoffer Dall * below). 2121a28ebea2SChristoffer Dall */ 2122852b6d57SScott Wood int (*create)(struct kvm_device *dev, u32 type); 2123852b6d57SScott Wood 2124852b6d57SScott Wood /* 2125023e9fddSChristoffer Dall * init is called after create if create is successful and is called 2126023e9fddSChristoffer Dall * outside of holding kvm->lock. 2127023e9fddSChristoffer Dall */ 2128023e9fddSChristoffer Dall void (*init)(struct kvm_device *dev); 2129023e9fddSChristoffer Dall 2130023e9fddSChristoffer Dall /* 2131852b6d57SScott Wood * Destroy is responsible for freeing dev. 2132852b6d57SScott Wood * 2133852b6d57SScott Wood * Destroy may be called before or after destructors are called 2134852b6d57SScott Wood * on emulated I/O regions, depending on whether a reference is 2135852b6d57SScott Wood * held by a vcpu or other kvm component that gets destroyed 2136852b6d57SScott Wood * after the emulated I/O. 2137852b6d57SScott Wood */ 2138852b6d57SScott Wood void (*destroy)(struct kvm_device *dev); 2139852b6d57SScott Wood 21402bde9b3eSCédric Le Goater /* 21412bde9b3eSCédric Le Goater * Release is an alternative method to free the device. It is 21422bde9b3eSCédric Le Goater * called when the device file descriptor is closed. Once 21432bde9b3eSCédric Le Goater * release is called, the destroy method will not be called 21442bde9b3eSCédric Le Goater * anymore as the device is removed from the device list of 21452bde9b3eSCédric Le Goater * the VM. kvm->lock is held. 21462bde9b3eSCédric Le Goater */ 21472bde9b3eSCédric Le Goater void (*release)(struct kvm_device *dev); 21482bde9b3eSCédric Le Goater 2149852b6d57SScott Wood int (*set_attr)(struct kvm_device *dev, struct kvm_device_attr *attr); 2150852b6d57SScott Wood int (*get_attr)(struct kvm_device *dev, struct kvm_device_attr *attr); 2151852b6d57SScott Wood int (*has_attr)(struct kvm_device *dev, struct kvm_device_attr *attr); 2152852b6d57SScott Wood long (*ioctl)(struct kvm_device *dev, unsigned int ioctl, 2153852b6d57SScott Wood unsigned long arg); 2154a1cd3f08SCédric Le Goater int (*mmap)(struct kvm_device *dev, struct vm_area_struct *vma); 2155852b6d57SScott Wood }; 2156852b6d57SScott Wood 2157852b6d57SScott Wood void kvm_device_get(struct kvm_device *dev); 2158852b6d57SScott Wood void kvm_device_put(struct kvm_device *dev); 2159852b6d57SScott Wood struct kvm_device *kvm_device_from_filp(struct file *filp); 21608538cb22SSteven Price int kvm_register_device_ops(const struct kvm_device_ops *ops, u32 type); 2161571ee1b6SWanpeng Li void kvm_unregister_device_ops(u32 type); 2162852b6d57SScott Wood 21635df554adSScott Wood extern struct kvm_device_ops kvm_mpic_ops; 2164ea2f83a7SAndre Przywara extern struct kvm_device_ops kvm_arm_vgic_v2_ops; 2165a0675c25SAndre Przywara extern struct kvm_device_ops kvm_arm_vgic_v3_ops; 21665df554adSScott Wood 21674c088493SRaghavendra K T #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT 21684c088493SRaghavendra K T 21694c088493SRaghavendra K T static inline void kvm_vcpu_set_in_spin_loop(struct kvm_vcpu *vcpu, bool val) 21704c088493SRaghavendra K T { 21714c088493SRaghavendra K T vcpu->spin_loop.in_spin_loop = val; 21724c088493SRaghavendra K T } 21734c088493SRaghavendra K T static inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val) 21744c088493SRaghavendra K T { 21754c088493SRaghavendra K T vcpu->spin_loop.dy_eligible = val; 21764c088493SRaghavendra K T } 21774c088493SRaghavendra K T 21784c088493SRaghavendra K T #else /* !CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */ 21794c088493SRaghavendra K T 21804c088493SRaghavendra K T static inline void kvm_vcpu_set_in_spin_loop(struct kvm_vcpu *vcpu, bool val) 21814c088493SRaghavendra K T { 21824c088493SRaghavendra K T } 21834c088493SRaghavendra K T 21844c088493SRaghavendra K T static inline void kvm_vcpu_set_dy_eligible(struct kvm_vcpu *vcpu, bool val) 21854c088493SRaghavendra K T { 21864c088493SRaghavendra K T } 21874c088493SRaghavendra K T #endif /* CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */ 21881a02b270SEric Auger 2189c36b7150SPaolo Bonzini static inline bool kvm_is_visible_memslot(struct kvm_memory_slot *memslot) 2190c36b7150SPaolo Bonzini { 2191c36b7150SPaolo Bonzini return (memslot && memslot->id < KVM_USER_MEM_SLOTS && 2192c36b7150SPaolo Bonzini !(memslot->flags & KVM_MEMSLOT_INVALID)); 2193c36b7150SPaolo Bonzini } 2194c36b7150SPaolo Bonzini 21957495e22bSPaolo Bonzini struct kvm_vcpu *kvm_get_running_vcpu(void); 2196fcd07f9aSChristian Borntraeger struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void); 21977495e22bSPaolo Bonzini 21981a02b270SEric Auger #ifdef CONFIG_HAVE_KVM_IRQ_BYPASS 219914717e20SAlex Williamson bool kvm_arch_has_irq_bypass(void); 22001a02b270SEric Auger int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *, 22011a02b270SEric Auger struct irq_bypass_producer *); 22021a02b270SEric Auger void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *, 22031a02b270SEric Auger struct irq_bypass_producer *); 22041a02b270SEric Auger void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *); 22051a02b270SEric Auger void kvm_arch_irq_bypass_start(struct irq_bypass_consumer *); 2206f70c20aaSFeng Wu int kvm_arch_update_irqfd_routing(struct kvm *kvm, unsigned int host_irq, 2207f70c20aaSFeng Wu uint32_t guest_irq, bool set); 2208515a0c79SLongpeng(Mike) bool kvm_arch_irqfd_route_changed(struct kvm_kernel_irq_routing_entry *, 2209515a0c79SLongpeng(Mike) struct kvm_kernel_irq_routing_entry *); 22101a02b270SEric Auger #endif /* CONFIG_HAVE_KVM_IRQ_BYPASS */ 221135181e86SHaozhong Zhang 22123491caf2SChristian Borntraeger #ifdef CONFIG_HAVE_KVM_INVALID_WAKEUPS 22133491caf2SChristian Borntraeger /* If we wakeup during the poll time, was it a sucessful poll? */ 22143491caf2SChristian Borntraeger static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu) 22153491caf2SChristian Borntraeger { 22163491caf2SChristian Borntraeger return vcpu->valid_wakeup; 22173491caf2SChristian Borntraeger } 22183491caf2SChristian Borntraeger 22193491caf2SChristian Borntraeger #else 22203491caf2SChristian Borntraeger static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu) 22213491caf2SChristian Borntraeger { 22223491caf2SChristian Borntraeger return true; 22233491caf2SChristian Borntraeger } 22243491caf2SChristian Borntraeger #endif /* CONFIG_HAVE_KVM_INVALID_WAKEUPS */ 22253491caf2SChristian Borntraeger 2226cdd6ad3aSChristian Borntraeger #ifdef CONFIG_HAVE_KVM_NO_POLL 2227cdd6ad3aSChristian Borntraeger /* Callback that tells if we must not poll */ 2228cdd6ad3aSChristian Borntraeger bool kvm_arch_no_poll(struct kvm_vcpu *vcpu); 2229cdd6ad3aSChristian Borntraeger #else 2230cdd6ad3aSChristian Borntraeger static inline bool kvm_arch_no_poll(struct kvm_vcpu *vcpu) 2231cdd6ad3aSChristian Borntraeger { 2232cdd6ad3aSChristian Borntraeger return false; 2233cdd6ad3aSChristian Borntraeger } 2234cdd6ad3aSChristian Borntraeger #endif /* CONFIG_HAVE_KVM_NO_POLL */ 2235cdd6ad3aSChristian Borntraeger 22365cb0944cSPaolo Bonzini #ifdef CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL 22375cb0944cSPaolo Bonzini long kvm_arch_vcpu_async_ioctl(struct file *filp, 22385cb0944cSPaolo Bonzini unsigned int ioctl, unsigned long arg); 22395cb0944cSPaolo Bonzini #else 22405cb0944cSPaolo Bonzini static inline long kvm_arch_vcpu_async_ioctl(struct file *filp, 22415cb0944cSPaolo Bonzini unsigned int ioctl, 22425cb0944cSPaolo Bonzini unsigned long arg) 22435cb0944cSPaolo Bonzini { 22445cb0944cSPaolo Bonzini return -ENOIOCTLCMD; 22455cb0944cSPaolo Bonzini } 22465cb0944cSPaolo Bonzini #endif /* CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL */ 22475cb0944cSPaolo Bonzini 2248e649b3f0SEiichi Tsukata void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, 2249e649b3f0SEiichi Tsukata unsigned long start, unsigned long end); 2250f75e4924SSebastian Ott 2251683412ccSMingwei Zhang void kvm_arch_guest_memory_reclaimed(struct kvm *kvm); 2252683412ccSMingwei Zhang 2253bd2a6394SChristoffer Dall #ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE 2254bd2a6394SChristoffer Dall int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu); 2255bd2a6394SChristoffer Dall #else 2256bd2a6394SChristoffer Dall static inline int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) 2257bd2a6394SChristoffer Dall { 2258bd2a6394SChristoffer Dall return 0; 2259bd2a6394SChristoffer Dall } 2260bd2a6394SChristoffer Dall #endif /* CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE */ 2261bd2a6394SChristoffer Dall 2262c57c8046SJunaid Shahid typedef int (*kvm_vm_thread_fn_t)(struct kvm *kvm, uintptr_t data); 2263c57c8046SJunaid Shahid 2264c57c8046SJunaid Shahid int kvm_vm_create_worker_thread(struct kvm *kvm, kvm_vm_thread_fn_t thread_fn, 2265c57c8046SJunaid Shahid uintptr_t data, const char *name, 2266c57c8046SJunaid Shahid struct task_struct **thread_ptr); 2267c57c8046SJunaid Shahid 2268935ace2fSThomas Gleixner #ifdef CONFIG_KVM_XFER_TO_GUEST_WORK 2269935ace2fSThomas Gleixner static inline void kvm_handle_signal_exit(struct kvm_vcpu *vcpu) 2270935ace2fSThomas Gleixner { 2271935ace2fSThomas Gleixner vcpu->run->exit_reason = KVM_EXIT_INTR; 2272935ace2fSThomas Gleixner vcpu->stat.signal_exits++; 2273935ace2fSThomas Gleixner } 2274935ace2fSThomas Gleixner #endif /* CONFIG_KVM_XFER_TO_GUEST_WORK */ 2275935ace2fSThomas Gleixner 2276fb04a1edSPeter Xu /* 227743a063caSYosry Ahmed * If more than one page is being (un)accounted, @virt must be the address of 227843a063caSYosry Ahmed * the first page of a block of pages what were allocated together (i.e 227943a063caSYosry Ahmed * accounted together). 228043a063caSYosry Ahmed * 228143a063caSYosry Ahmed * kvm_account_pgtable_pages() is thread-safe because mod_lruvec_page_state() 228243a063caSYosry Ahmed * is thread-safe. 228343a063caSYosry Ahmed */ 228443a063caSYosry Ahmed static inline void kvm_account_pgtable_pages(void *virt, int nr) 228543a063caSYosry Ahmed { 228643a063caSYosry Ahmed mod_lruvec_page_state(virt_to_page(virt), NR_SECONDARY_PAGETABLE, nr); 228743a063caSYosry Ahmed } 228843a063caSYosry Ahmed 228943a063caSYosry Ahmed /* 2290fb04a1edSPeter Xu * This defines how many reserved entries we want to keep before we 2291fb04a1edSPeter Xu * kick the vcpu to the userspace to avoid dirty ring full. This 2292fb04a1edSPeter Xu * value can be tuned to higher if e.g. PML is enabled on the host. 2293fb04a1edSPeter Xu */ 2294fb04a1edSPeter Xu #define KVM_DIRTY_RING_RSVD_ENTRIES 64 2295fb04a1edSPeter Xu 2296fb04a1edSPeter Xu /* Max number of entries allowed for each kvm dirty ring */ 2297fb04a1edSPeter Xu #define KVM_DIRTY_RING_MAX_ENTRIES 65536 2298fb04a1edSPeter Xu 2299bfd99ff5SAvi Kivity #endif 2300