KVM: arm64: Refactor kvm_arch_commit_memory_region()
authorRicardo Koller <ricarkol@google.com>
Wed, 26 Apr 2023 17:23:25 +0000 (17:23 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Tue, 16 May 2023 17:39:18 +0000 (17:39 +0000)
Refactor kvm_arch_commit_memory_region() as a preparation for a future
commit to look cleaner and more understandable. Also, it looks more
like its x86 counterpart (in kvm_mmu_slot_apply_flags()).

Signed-off-by: Ricardo Koller <ricarkol@google.com>
Reviewed-by: Shaoqin Huang <shahuang@redhat.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
Link: https://lore.kernel.org/r/20230426172330.1439644-8-ricarkol@google.com
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/mmu.c

index f2d30486f7558acfc1c25769445d19c007454c2a..8df15a1744492d2831dc322631186bc9721a6769 100644 (file)
@@ -1794,20 +1794,32 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
                                   const struct kvm_memory_slot *new,
                                   enum kvm_mr_change change)
 {
+       bool log_dirty_pages = new && new->flags & KVM_MEM_LOG_DIRTY_PAGES;
+
        /*
         * At this point memslot has been committed and there is an
         * allocated dirty_bitmap[], dirty pages will be tracked while the
         * memory slot is write protected.
         */
-       if (change != KVM_MR_DELETE && new->flags & KVM_MEM_LOG_DIRTY_PAGES) {
+       if (log_dirty_pages) {
+
+               if (change == KVM_MR_DELETE)
+                       return;
+
                /*
-                * If we're with initial-all-set, we don't need to write
-                * protect any pages because they're all reported as dirty.
-                * Huge pages and normal pages will be write protect gradually.
+                * Pages are write-protected on either of these two
+                * cases:
+                *
+                * 1. with initial-all-set: gradually with CLEAR ioctls,
                 */
-               if (!kvm_dirty_log_manual_protect_and_init_set(kvm)) {
-                       kvm_mmu_wp_memory_region(kvm, new->id);
-               }
+               if (kvm_dirty_log_manual_protect_and_init_set(kvm))
+                       return;
+               /*
+                * or
+                * 2. without initial-all-set: all in one shot when
+                *    enabling dirty logging.
+                */
+               kvm_mmu_wp_memory_region(kvm, new->id);
        }
 }