Both __mmu_unsync_walk() and mmu_pages_clear_parents() have three line
code which clears a bit in the unsync child bitmap; the former places it
inside a loop block and uses a few goto statements to jump to it.

A new helper function, clear_unsync_child_bit(), makes the code cleaner.

Signed-off-by: Takuya Yoshikawa <yoshikawa_takuya...@lab.ntt.co.jp>
---
 arch/x86/kvm/mmu.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 8a1593f..9832bc9 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1809,6 +1809,13 @@ static int mmu_pages_add(struct kvm_mmu_pages *pvec, 
struct kvm_mmu_page *sp,
        return (pvec->nr == KVM_PAGE_ARRAY_NR);
 }
 
+static inline void clear_unsync_child_bit(struct kvm_mmu_page *sp, int idx)
+{
+       --sp->unsync_children;
+       WARN_ON((int)sp->unsync_children < 0);
+       __clear_bit(idx, sp->unsync_child_bitmap);
+}
+
 static int __mmu_unsync_walk(struct kvm_mmu_page *sp,
                           struct kvm_mmu_pages *pvec)
 {
@@ -1818,8 +1825,10 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp,
                struct kvm_mmu_page *child;
                u64 ent = sp->spt[i];
 
-               if (!is_shadow_present_pte(ent) || is_large_pte(ent))
-                       goto clear_child_bitmap;
+               if (!is_shadow_present_pte(ent) || is_large_pte(ent)) {
+                       clear_unsync_child_bit(sp, i);
+                       continue;
+               }
 
                child = page_header(ent & PT64_BASE_ADDR_MASK);
 
@@ -1828,28 +1837,21 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp,
                                return -ENOSPC;
 
                        ret = __mmu_unsync_walk(child, pvec);
-                       if (!ret)
-                               goto clear_child_bitmap;
-                       else if (ret > 0)
+                       if (!ret) {
+                               clear_unsync_child_bit(sp, i);
+                               continue;
+                       } else if (ret > 0) {
                                nr_unsync_leaf += ret;
-                       else
+                       } else
                                return ret;
                } else if (child->unsync) {
                        nr_unsync_leaf++;
                        if (mmu_pages_add(pvec, child, i))
                                return -ENOSPC;
                } else
-                        goto clear_child_bitmap;
-
-               continue;
-
-clear_child_bitmap:
-               __clear_bit(i, sp->unsync_child_bitmap);
-               sp->unsync_children--;
-               WARN_ON((int)sp->unsync_children < 0);
+                       clear_unsync_child_bit(sp, i);
        }
 
-
        return nr_unsync_leaf;
 }
 
@@ -2012,9 +2014,7 @@ static void mmu_pages_clear_parents(struct mmu_page_path 
*parents)
                if (!sp)
                        return;
 
-               --sp->unsync_children;
-               WARN_ON((int)sp->unsync_children < 0);
-               __clear_bit(idx, sp->unsync_child_bitmap);
+               clear_unsync_child_bit(sp, idx);
                level++;
        } while (level < PT64_ROOT_LEVEL-1 && !sp->unsync_children);
 }
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to