KVM: Add parameter "kvm" to kvm_cpu_dirty_log_size() and its callers
authorYan Zhao <yan.y.zhao@intel.com>
Mon, 13 Jan 2025 03:08:41 +0000 (11:08 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 14 Mar 2025 18:20:53 +0000 (14:20 -0400)
Add a parameter "kvm" to kvm_cpu_dirty_log_size() and down to its callers:
kvm_dirty_ring_get_rsvd_entries(), kvm_dirty_ring_alloc().

This is a preparation to make cpu_dirty_log_size a per-VM value rather than
a system-wide value.

No function changes expected.

Signed-off-by: Yan Zhao <yan.y.zhao@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/mmu.c
include/linux/kvm_dirty_ring.h
virt/kvm/dirty_ring.c
virt/kvm/kvm_main.c

index 3c208291154c36ffb11817281ba699ca27de310a..a0c736c1109153195f1be8892873a48305ebd88c 100644 (file)
@@ -1311,7 +1311,7 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm,
                kvm_mmu_write_protect_pt_masked(kvm, slot, gfn_offset, mask);
 }
 
-int kvm_cpu_dirty_log_size(void)
+int kvm_cpu_dirty_log_size(struct kvm *kvm)
 {
        return kvm_x86_ops.cpu_dirty_log_size;
 }
index 4862c98d80d36fe72711997d2b370be208a0f08b..da4d9b5f58f199cafa168f86156bd1c2b083ff0c 100644 (file)
@@ -32,7 +32,7 @@ struct kvm_dirty_ring {
  * If CONFIG_HAVE_HVM_DIRTY_RING not defined, kvm_dirty_ring.o should
  * not be included as well, so define these nop functions for the arch.
  */
-static inline u32 kvm_dirty_ring_get_rsvd_entries(void)
+static inline u32 kvm_dirty_ring_get_rsvd_entries(struct kvm *kvm)
 {
        return 0;
 }
@@ -42,7 +42,7 @@ static inline bool kvm_use_dirty_bitmap(struct kvm *kvm)
        return true;
 }
 
-static inline int kvm_dirty_ring_alloc(struct kvm_dirty_ring *ring,
+static inline int kvm_dirty_ring_alloc(struct kvm *kvm, struct kvm_dirty_ring *ring,
                                       int index, u32 size)
 {
        return 0;
@@ -71,11 +71,12 @@ static inline void kvm_dirty_ring_free(struct kvm_dirty_ring *ring)
 
 #else /* CONFIG_HAVE_KVM_DIRTY_RING */
 
-int kvm_cpu_dirty_log_size(void);
+int kvm_cpu_dirty_log_size(struct kvm *kvm);
 bool kvm_use_dirty_bitmap(struct kvm *kvm);
 bool kvm_arch_allow_write_without_running_vcpu(struct kvm *kvm);
-u32 kvm_dirty_ring_get_rsvd_entries(void);
-int kvm_dirty_ring_alloc(struct kvm_dirty_ring *ring, int index, u32 size);
+u32 kvm_dirty_ring_get_rsvd_entries(struct kvm *kvm);
+int kvm_dirty_ring_alloc(struct kvm *kvm, struct kvm_dirty_ring *ring,
+                        int index, u32 size);
 
 /*
  * called with kvm->slots_lock held, returns the number of
index 7bc74969a819afb5198fc2dfb7c9e83b80f967e0..d14ffc7513eee967bc92be35108a51daa3a73e31 100644 (file)
 #include <trace/events/kvm.h>
 #include "kvm_mm.h"
 
-int __weak kvm_cpu_dirty_log_size(void)
+int __weak kvm_cpu_dirty_log_size(struct kvm *kvm)
 {
        return 0;
 }
 
-u32 kvm_dirty_ring_get_rsvd_entries(void)
+u32 kvm_dirty_ring_get_rsvd_entries(struct kvm *kvm)
 {
-       return KVM_DIRTY_RING_RSVD_ENTRIES + kvm_cpu_dirty_log_size();
+       return KVM_DIRTY_RING_RSVD_ENTRIES + kvm_cpu_dirty_log_size(kvm);
 }
 
 bool kvm_use_dirty_bitmap(struct kvm *kvm)
@@ -74,14 +74,15 @@ static void kvm_reset_dirty_gfn(struct kvm *kvm, u32 slot, u64 offset, u64 mask)
        KVM_MMU_UNLOCK(kvm);
 }
 
-int kvm_dirty_ring_alloc(struct kvm_dirty_ring *ring, int index, u32 size)
+int kvm_dirty_ring_alloc(struct kvm *kvm, struct kvm_dirty_ring *ring,
+                        int index, u32 size)
 {
        ring->dirty_gfns = vzalloc(size);
        if (!ring->dirty_gfns)
                return -ENOMEM;
 
        ring->size = size / sizeof(struct kvm_dirty_gfn);
-       ring->soft_limit = ring->size - kvm_dirty_ring_get_rsvd_entries();
+       ring->soft_limit = ring->size - kvm_dirty_ring_get_rsvd_entries(kvm);
        ring->dirty_index = 0;
        ring->reset_index = 0;
        ring->index = index;
index 622b5a99078a3b17d97ce363db7e141f7ee92c5d..549537da306208e24f884bbd33d1f8848e51fe6e 100644 (file)
@@ -4108,7 +4108,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, unsigned long id)
                goto vcpu_free_run_page;
 
        if (kvm->dirty_ring_size) {
-               r = kvm_dirty_ring_alloc(&vcpu->dirty_ring,
+               r = kvm_dirty_ring_alloc(kvm, &vcpu->dirty_ring,
                                         id, kvm->dirty_ring_size);
                if (r)
                        goto arch_vcpu_destroy;
@@ -4847,7 +4847,7 @@ static int kvm_vm_ioctl_enable_dirty_log_ring(struct kvm *kvm, u32 size)
                return -EINVAL;
 
        /* Should be bigger to keep the reserved entries, or a page */
-       if (size < kvm_dirty_ring_get_rsvd_entries() *
+       if (size < kvm_dirty_ring_get_rsvd_entries(kvm) *
            sizeof(struct kvm_dirty_gfn) || size < PAGE_SIZE)
                return -EINVAL;