KVM: use kvm_memslots whenever possible
authorPaolo Bonzini <pbonzini@redhat.com>
Sun, 17 May 2015 14:20:07 +0000 (16:20 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 26 May 2015 10:40:08 +0000 (12:40 +0200)
kvm_memslots provides lockdep checking.  Use it consistently instead of
explicit dereferencing of kvm->memslots.

Reviewed-by: Radim Krcmar <rkrcmar@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/arm/kvm/mmu.c
arch/mips/kvm/mips.c
arch/powerpc/kvm/book3s_64_mmu_hv.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_pr.c
arch/s390/kvm/kvm-s390.c
arch/x86/kvm/x86.c
virt/kvm/kvm_main.c

index 1d5accbd3dcf2ae771e7ba9475c8607846a05a0d..6f0f8f3ac7df90fb4bf052ebff58ab1405945f14 100644 (file)
@@ -1155,7 +1155,8 @@ static void stage2_wp_range(struct kvm *kvm, phys_addr_t addr, phys_addr_t end)
  */
 void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot)
 {
-       struct kvm_memory_slot *memslot = id_to_memslot(kvm->memslots, slot);
+       struct kvm_memslots *slots = kvm_memslots(kvm);
+       struct kvm_memory_slot *memslot = id_to_memslot(slots, slot);
        phys_addr_t start = memslot->base_gfn << PAGE_SHIFT;
        phys_addr_t end = (memslot->base_gfn + memslot->npages) << PAGE_SHIFT;
 
index a8e660a444743ef67b58b00bf085ff57edc8c445..bc5ddd973b44a776074b776205a532e61c35600b 100644 (file)
@@ -968,6 +968,7 @@ out:
 /* Get (and clear) the dirty memory log for a memory slot. */
 int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
 {
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
        unsigned long ga, ga_end;
        int is_dirty = 0;
@@ -982,7 +983,8 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
 
        /* If nothing is dirty, don't bother messing with page tables. */
        if (is_dirty) {
-               memslot = id_to_memslot(kvm->memslots, log->slot);
+               slots = kvm_memslots(kvm);
+               memslot = id_to_memslot(slots, log->slot);
 
                ga = memslot->base_gfn << PAGE_SHIFT;
                ga_end = ga + (memslot->npages << PAGE_SHIFT);
index 1a4acf8bf4f4b7a790c16dc0286c4c8bc9380edf..dab68b7af3f280225288c68f8d09eee753d85824 100644 (file)
@@ -650,7 +650,7 @@ static void kvmppc_rmap_reset(struct kvm *kvm)
        int srcu_idx;
 
        srcu_idx = srcu_read_lock(&kvm->srcu);
-       slots = kvm->memslots;
+       slots = kvm_memslots(kvm);
        kvm_for_each_memslot(memslot, slots) {
                /*
                 * This assumes it is acceptable to lose reference and
index df81caab738339c5b8dfe7c2def731bb9ba640d1..6aff5a99049256d8e04b8a3cf6b2106191b3c80d 100644 (file)
@@ -2321,6 +2321,7 @@ static int kvm_vm_ioctl_get_smmu_info_hv(struct kvm *kvm,
 static int kvm_vm_ioctl_get_dirty_log_hv(struct kvm *kvm,
                                         struct kvm_dirty_log *log)
 {
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
        int r;
        unsigned long n;
@@ -2331,7 +2332,8 @@ static int kvm_vm_ioctl_get_dirty_log_hv(struct kvm *kvm,
        if (log->slot >= KVM_USER_MEM_SLOTS)
                goto out;
 
-       memslot = id_to_memslot(kvm->memslots, log->slot);
+       slots = kvm_memslots(kvm);
+       memslot = id_to_memslot(slots, log->slot);
        r = -ENOENT;
        if (!memslot->dirty_bitmap)
                goto out;
@@ -2384,6 +2386,7 @@ static void kvmppc_core_commit_memory_region_hv(struct kvm *kvm,
                                const struct kvm_memory_slot *old)
 {
        unsigned long npages = mem->memory_size >> PAGE_SHIFT;
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
 
        if (npages && old->npages) {
@@ -2393,7 +2396,8 @@ static void kvmppc_core_commit_memory_region_hv(struct kvm *kvm,
                 * since the rmap array starts out as all zeroes,
                 * i.e. no pages are dirty.
                 */
-               memslot = id_to_memslot(kvm->memslots, mem->slot);
+               slots = kvm_memslots(kvm);
+               memslot = id_to_memslot(slots, mem->slot);
                kvmppc_hv_get_dirty_log(kvm, memslot, NULL);
        }
 }
index f57383941d0368e64ab99cc200e70e1ee4e92f53..c01dfc798c66ac3741f55c6af1f48fa91c86f079 100644 (file)
@@ -1530,6 +1530,7 @@ out:
 static int kvm_vm_ioctl_get_dirty_log_pr(struct kvm *kvm,
                                         struct kvm_dirty_log *log)
 {
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
        struct kvm_vcpu *vcpu;
        ulong ga, ga_end;
@@ -1545,7 +1546,8 @@ static int kvm_vm_ioctl_get_dirty_log_pr(struct kvm *kvm,
 
        /* If nothing is dirty, don't bother messing with page tables. */
        if (is_dirty) {
-               memslot = id_to_memslot(kvm->memslots, log->slot);
+               slots = kvm_memslots(kvm);
+               memslot = id_to_memslot(slots, log->slot);
 
                ga = memslot->base_gfn << PAGE_SHIFT;
                ga_end = ga + (memslot->npages << PAGE_SHIFT);
index d461f8a15c0750409f05b3a7aa58713aea343c7d..a05107e9b2bf7133a319727b84bee2a105632bcf 100644 (file)
@@ -236,6 +236,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
 {
        int r;
        unsigned long n;
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
        int is_dirty = 0;
 
@@ -245,7 +246,8 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
        if (log->slot >= KVM_USER_MEM_SLOTS)
                goto out;
 
-       memslot = id_to_memslot(kvm->memslots, log->slot);
+       slots = kvm_memslots(kvm);
+       memslot = id_to_memslot(slots, log->slot);
        r = -ENOENT;
        if (!memslot->dirty_bitmap)
                goto out;
index d42d8ace90f1f5ae54b4f77dd28977aa38c37f5b..8918e23e0e8edcbaf9312bfc637aab8253ab1f4b 100644 (file)
@@ -7782,6 +7782,7 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
                                const struct kvm_memory_slot *old,
                                enum kvm_mr_change change)
 {
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *new;
        int nr_mmu_pages = 0;
 
@@ -7803,7 +7804,8 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
                kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
 
        /* It's OK to get 'new' slot here as it has already been installed */
-       new = id_to_memslot(kvm->memslots, mem->slot);
+       slots = kvm_memslots(kvm);
+       new = id_to_memslot(slots, mem->slot);
 
        /*
         * Dirty logging tracks sptes in 4k granularity, meaning that large
index e299763ef744d616aa3557dc5fb246a2b10351f0..42df724071c098c0a18780c89b00ab8f68e612f0 100644 (file)
@@ -734,7 +734,7 @@ static int check_memory_region_flags(struct kvm_userspace_memory_region *mem)
 static struct kvm_memslots *install_new_memslots(struct kvm *kvm,
                struct kvm_memslots *slots)
 {
-       struct kvm_memslots *old_memslots = kvm->memslots;
+       struct kvm_memslots *old_memslots = kvm_memslots(kvm);
 
        /*
         * Set the low bit in the generation, which disables SPTE caching
@@ -799,7 +799,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
        if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
                goto out;
 
-       slot = id_to_memslot(kvm->memslots, mem->slot);
+       slot = id_to_memslot(kvm_memslots(kvm), mem->slot);
        base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
        npages = mem->memory_size >> PAGE_SHIFT;
 
@@ -842,7 +842,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
        if ((change == KVM_MR_CREATE) || (change == KVM_MR_MOVE)) {
                /* Check for overlaps */
                r = -EEXIST;
-               kvm_for_each_memslot(slot, kvm->memslots) {
+               kvm_for_each_memslot(slot, kvm_memslots(kvm)) {
                        if ((slot->id >= KVM_USER_MEM_SLOTS) ||
                            (slot->id == mem->slot))
                                continue;
@@ -873,7 +873,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
        slots = kvm_kvzalloc(sizeof(struct kvm_memslots));
        if (!slots)
                goto out_free;
-       memcpy(slots, kvm->memslots, sizeof(struct kvm_memslots));
+       memcpy(slots, kvm_memslots(kvm), sizeof(struct kvm_memslots));
 
        if ((change == KVM_MR_DELETE) || (change == KVM_MR_MOVE)) {
                slot = id_to_memslot(slots, mem->slot);
@@ -966,6 +966,7 @@ static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
 int kvm_get_dirty_log(struct kvm *kvm,
                        struct kvm_dirty_log *log, int *is_dirty)
 {
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
        int r, i;
        unsigned long n;
@@ -975,7 +976,8 @@ int kvm_get_dirty_log(struct kvm *kvm,
        if (log->slot >= KVM_USER_MEM_SLOTS)
                goto out;
 
-       memslot = id_to_memslot(kvm->memslots, log->slot);
+       slots = kvm_memslots(kvm);
+       memslot = id_to_memslot(slots, log->slot);
        r = -ENOENT;
        if (!memslot->dirty_bitmap)
                goto out;
@@ -1024,6 +1026,7 @@ EXPORT_SYMBOL_GPL(kvm_get_dirty_log);
 int kvm_get_dirty_log_protect(struct kvm *kvm,
                        struct kvm_dirty_log *log, bool *is_dirty)
 {
+       struct kvm_memslots *slots;
        struct kvm_memory_slot *memslot;
        int r, i;
        unsigned long n;
@@ -1034,7 +1037,8 @@ int kvm_get_dirty_log_protect(struct kvm *kvm,
        if (log->slot >= KVM_USER_MEM_SLOTS)
                goto out;
 
-       memslot = id_to_memslot(kvm->memslots, log->slot);
+       slots = kvm_memslots(kvm);
+       memslot = id_to_memslot(slots, log->slot);
 
        dirty_bitmap = memslot->dirty_bitmap;
        r = -ENOENT;