mm: convert page_mapped_in_vma() to use page_vma_mapped_walk()
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Fri, 24 Feb 2017 22:58:10 +0000 (14:58 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 25 Feb 2017 01:46:55 +0000 (17:46 -0800)
For consistency, it worth converting all page_check_address() to
page_vma_mapped_walk(), so we could drop the former.

Link: http://lkml.kernel.org/r/20170129173858.45174-11-kirill.shutemov@linux.intel.com
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: Hillf Danton <hillf.zj@alibaba-inc.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/page_vma_mapped.c
mm/rmap.c

index dc1a54826cf24bf9aa495446a09eababc9b936b7..a23001a22c151886919d3c24508d64ed1a7c8c16 100644 (file)
@@ -186,3 +186,33 @@ next_pte:  do {
                }
        }
 }
+
+/**
+ * page_mapped_in_vma - check whether a page is really mapped in a VMA
+ * @page: the page to test
+ * @vma: the VMA to test
+ *
+ * Returns 1 if the page is mapped into the page tables of the VMA, 0
+ * if the page is not mapped into the page tables of this VMA.  Only
+ * valid for normal file or anonymous VMAs.
+ */
+int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma)
+{
+       struct page_vma_mapped_walk pvmw = {
+               .page = page,
+               .vma = vma,
+               .flags = PVMW_SYNC,
+       };
+       unsigned long start, end;
+
+       start = __vma_address(page, vma);
+       end = start + PAGE_SIZE * (hpage_nr_pages(page) - 1);
+
+       if (unlikely(end < vma->vm_start || start >= vma->vm_end))
+               return 0;
+       pvmw.address = max(start, vma->vm_start);
+       if (!page_vma_mapped_walk(&pvmw))
+               return 0;
+       page_vma_mapped_walk_done(&pvmw);
+       return 1;
+}
index 11668fb881d8fa969f70cbae56d512c80aef284a..80525820aada966ccf61eccc34e35adb9d3db37a 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -756,32 +756,6 @@ check:
        return NULL;
 }
 
-/**
- * page_mapped_in_vma - check whether a page is really mapped in a VMA
- * @page: the page to test
- * @vma: the VMA to test
- *
- * Returns 1 if the page is mapped into the page tables of the VMA, 0
- * if the page is not mapped into the page tables of this VMA.  Only
- * valid for normal file or anonymous VMAs.
- */
-int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma)
-{
-       unsigned long address;
-       pte_t *pte;
-       spinlock_t *ptl;
-
-       address = __vma_address(page, vma);
-       if (unlikely(address < vma->vm_start || address >= vma->vm_end))
-               return 0;
-       pte = page_check_address(page, vma->vm_mm, address, &ptl, 1);
-       if (!pte)                       /* the page is not in this mm */
-               return 0;
-       pte_unmap_unlock(pte, ptl);
-
-       return 1;
-}
-
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 /*
  * Check that @page is mapped at @address into @mm. In contrast to