]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: x86: Don't assume old/new memslots are non-NULL at memslot commit
authorSean Christopherson <seanjc@google.com>
Mon, 6 Dec 2021 19:54:20 +0000 (20:54 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 8 Dec 2021 09:24:26 +0000 (04:24 -0500)
Play nice with a NULL @old or @new when handling memslot updates so that
common KVM can pass NULL for one or the other in CREATE and DELETE cases
instead of having to synthesize a dummy memslot.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Message-Id: <2eb7788adbdc2bc9a9c5f86844dd8ee5c8428732.1638817640.git.maciej.szmigiero@oracle.com>

arch/x86/kvm/x86.c

index f862c514c2c0d7a02a9b4f2be0cd73ca6bb6b368..aaf89c001c5c85da09fd7413568369ea1b4906fe 100644 (file)
@@ -11709,13 +11709,15 @@ static void kvm_mmu_slot_apply_flags(struct kvm *kvm,
                                     const struct kvm_memory_slot *new,
                                     enum kvm_mr_change change)
 {
-       bool log_dirty_pages = new->flags & KVM_MEM_LOG_DIRTY_PAGES;
+       u32 old_flags = old ? old->flags : 0;
+       u32 new_flags = new ? new->flags : 0;
+       bool log_dirty_pages = new_flags & KVM_MEM_LOG_DIRTY_PAGES;
 
        /*
         * Update CPU dirty logging if dirty logging is being toggled.  This
         * applies to all operations.
         */
-       if ((old->flags ^ new->flags) & KVM_MEM_LOG_DIRTY_PAGES)
+       if ((old_flags ^ new_flags) & KVM_MEM_LOG_DIRTY_PAGES)
                kvm_mmu_update_cpu_dirty_logging(kvm, log_dirty_pages);
 
        /*
@@ -11733,7 +11735,7 @@ static void kvm_mmu_slot_apply_flags(struct kvm *kvm,
         * MOVE/DELETE: The old mappings will already have been cleaned up by
         *              kvm_arch_flush_shadow_memslot().
         */
-       if ((change != KVM_MR_FLAGS_ONLY) || (new->flags & KVM_MEM_READONLY))
+       if ((change != KVM_MR_FLAGS_ONLY) || (new_flags & KVM_MEM_READONLY))
                return;
 
        /*
@@ -11741,7 +11743,7 @@ static void kvm_mmu_slot_apply_flags(struct kvm *kvm,
         * other flag is LOG_DIRTY_PAGES, i.e. something is wrong if dirty
         * logging isn't being toggled on or off.
         */
-       if (WARN_ON_ONCE(!((old->flags ^ new->flags) & KVM_MEM_LOG_DIRTY_PAGES)))
+       if (WARN_ON_ONCE(!((old_flags ^ new_flags) & KVM_MEM_LOG_DIRTY_PAGES)))
                return;
 
        if (!log_dirty_pages) {