diff options
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/kvm_main.c | 24 |
1 files changed, 2 insertions, 22 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index d2836788561e..0fc25aed79a8 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -102,28 +102,8 @@ static bool largepages_enabled = true; | |||
102 | 102 | ||
103 | bool kvm_is_mmio_pfn(pfn_t pfn) | 103 | bool kvm_is_mmio_pfn(pfn_t pfn) |
104 | { | 104 | { |
105 | if (pfn_valid(pfn)) { | 105 | if (pfn_valid(pfn)) |
106 | int reserved; | 106 | return PageReserved(pfn_to_page(pfn)); |
107 | struct page *tail = pfn_to_page(pfn); | ||
108 | struct page *head = compound_trans_head(tail); | ||
109 | reserved = PageReserved(head); | ||
110 | if (head != tail) { | ||
111 | /* | ||
112 | * "head" is not a dangling pointer | ||
113 | * (compound_trans_head takes care of that) | ||
114 | * but the hugepage may have been splitted | ||
115 | * from under us (and we may not hold a | ||
116 | * reference count on the head page so it can | ||
117 | * be reused before we run PageReferenced), so | ||
118 | * we've to check PageTail before returning | ||
119 | * what we just read. | ||
120 | */ | ||
121 | smp_rmb(); | ||
122 | if (PageTail(tail)) | ||
123 | return reserved; | ||
124 | } | ||
125 | return PageReserved(tail); | ||
126 | } | ||
127 | 107 | ||
128 | return true; | 108 | return true; |
129 | } | 109 | } |