diff options
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/kvm_main.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 2b0974a14835..0a360c26cc34 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/spinlock.h> | 45 | #include <linux/spinlock.h> |
46 | #include <linux/compat.h> | 46 | #include <linux/compat.h> |
47 | #include <linux/srcu.h> | 47 | #include <linux/srcu.h> |
48 | #include <linux/hugetlb.h> | ||
48 | 49 | ||
49 | #include <asm/processor.h> | 50 | #include <asm/processor.h> |
50 | #include <asm/io.h> | 51 | #include <asm/io.h> |
@@ -867,6 +868,30 @@ int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) | |||
867 | } | 868 | } |
868 | EXPORT_SYMBOL_GPL(kvm_is_visible_gfn); | 869 | EXPORT_SYMBOL_GPL(kvm_is_visible_gfn); |
869 | 870 | ||
871 | unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn) | ||
872 | { | ||
873 | struct vm_area_struct *vma; | ||
874 | unsigned long addr, size; | ||
875 | |||
876 | size = PAGE_SIZE; | ||
877 | |||
878 | addr = gfn_to_hva(kvm, gfn); | ||
879 | if (kvm_is_error_hva(addr)) | ||
880 | return PAGE_SIZE; | ||
881 | |||
882 | down_read(¤t->mm->mmap_sem); | ||
883 | vma = find_vma(current->mm, addr); | ||
884 | if (!vma) | ||
885 | goto out; | ||
886 | |||
887 | size = vma_kernel_pagesize(vma); | ||
888 | |||
889 | out: | ||
890 | up_read(¤t->mm->mmap_sem); | ||
891 | |||
892 | return size; | ||
893 | } | ||
894 | |||
870 | int memslot_id(struct kvm *kvm, gfn_t gfn) | 895 | int memslot_id(struct kvm *kvm, gfn_t gfn) |
871 | { | 896 | { |
872 | int i; | 897 | int i; |