]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/vfio/vfio_iommu_type1.c
Merge tag 'modules-for-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux
[linux.git] / drivers / vfio / vfio_iommu_type1.c
index d864277ea16f31627ca776769297788995840400..2ada8e6cdb88967750adad2badbc14248bed6052 100644 (file)
@@ -294,31 +294,13 @@ static int vfio_lock_acct(struct vfio_dma *dma, long npage, bool async)
  * Some mappings aren't backed by a struct page, for example an mmap'd
  * MMIO range for our own or another device.  These use a different
  * pfn conversion and shouldn't be tracked as locked pages.
+ * For compound pages, any driver that sets the reserved bit in head
+ * page needs to set the reserved bit in all subpages to be safe.
  */
 static bool is_invalid_reserved_pfn(unsigned long pfn)
 {
-       if (pfn_valid(pfn)) {
-               bool reserved;
-               struct page *tail = pfn_to_page(pfn);
-               struct page *head = compound_head(tail);
-               reserved = !!(PageReserved(head));
-               if (head != tail) {
-                       /*
-                        * "head" is not a dangling pointer
-                        * (compound_head takes care of that)
-                        * but the hugepage may have been split
-                        * from under us (and we may not hold a
-                        * reference count on the head page so it can
-                        * be reused before we run PageReferenced), so
-                        * we've to check PageTail before returning
-                        * what we just read.
-                        */
-                       smp_rmb();
-                       if (PageTail(tail))
-                               return reserved;
-               }
-               return PageReserved(tail);
-       }
+       if (pfn_valid(pfn))
+               return PageReserved(pfn_to_page(pfn));
 
        return true;
 }