It is used to set disallowed large page on the specified level, can be
used in later patch

Signed-off-by: Xiao Guangrong <xiaoguangr...@linux.vnet.ibm.com>
---
 arch/x86/kvm/x86.c |   53 ++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 91dd9f4..52b4e97 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6917,12 +6917,45 @@ void kvm_arch_free_memslot(struct kvm_memory_slot *free,
        }
 }
 
+static void memslot_set_lpage_disallowed(struct kvm_memory_slot *slot,
+                                        unsigned long npages,
+                                        int lpage_size, int lpages)
+{
+       struct kvm_lpage_info *lpage_info;
+       unsigned long ugfn;
+       int level = lpage_size + 1;
+
+       WARN_ON(!lpage_size);
+
+       lpage_info = slot->arch.lpage_info[lpage_size - 1];
+
+       if (slot->base_gfn & (KVM_PAGES_PER_HPAGE(level) - 1))
+               lpage_info[0].write_count = 1;
+
+       if ((slot->base_gfn + npages) & (KVM_PAGES_PER_HPAGE(level) - 1))
+               lpage_info[lpages - 1].write_count = 1;
+
+       ugfn = slot->userspace_addr >> PAGE_SHIFT;
+
+       /*
+        * If the gfn and userspace address are not aligned wrt each
+        * other, or if explicitly asked to, disable large page
+        * support for this slot
+        */
+       if ((slot->base_gfn ^ ugfn) & (KVM_PAGES_PER_HPAGE(level) - 1) ||
+             !kvm_largepages_enabled()) {
+               unsigned long j;
+
+               for (j = 0; j < lpages; ++j)
+                       lpage_info[j].write_count = 1;
+       }
+}
+
 int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
 {
        int i;
 
        for (i = 0; i < KVM_NR_PAGE_SIZES; ++i) {
-               unsigned long ugfn;
                int lpages;
                int level = i + 1;
 
@@ -6941,23 +6974,7 @@ int kvm_arch_create_memslot(struct kvm_memory_slot 
*slot, unsigned long npages)
                if (!slot->arch.lpage_info[i - 1])
                        goto out_free;
 
-               if (slot->base_gfn & (KVM_PAGES_PER_HPAGE(level) - 1))
-                       slot->arch.lpage_info[i - 1][0].write_count = 1;
-               if ((slot->base_gfn + npages) & (KVM_PAGES_PER_HPAGE(level) - 
1))
-                       slot->arch.lpage_info[i - 1][lpages - 1].write_count = 
1;
-               ugfn = slot->userspace_addr >> PAGE_SHIFT;
-               /*
-                * If the gfn and userspace address are not aligned wrt each
-                * other, or if explicitly asked to, disable large page
-                * support for this slot
-                */
-               if ((slot->base_gfn ^ ugfn) & (KVM_PAGES_PER_HPAGE(level) - 1) 
||
-                   !kvm_largepages_enabled()) {
-                       unsigned long j;
-
-                       for (j = 0; j < lpages; ++j)
-                               slot->arch.lpage_info[i - 1][j].write_count = 1;
-               }
+               memslot_set_lpage_disallowed(slot, npages, i, lpages);
        }
 
        return 0;
-- 
1.7.7.6

--
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