net_sched: make traffic control network namespace aware
[pandora-kernel.git] / mm / rmap.c
index 23ecd0a..fcd593c 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -329,18 +329,6 @@ vma_address(struct page *page, struct vm_area_struct *vma)
                /* page should be within @vma mapping range */
                return -EFAULT;
        }
-       if (unlikely(vma->vm_flags & VM_LOCK_RMAP)) {
-               /*
-                * This VMA is being unlinked or is not yet linked into the
-                * VMA tree.  Do not try to follow this rmap.  This race
-                * condition can result in page_referenced() ignoring a
-                * reference or in try_to_unmap() failing to unmap a page.
-                * The VMA cannot be freed under us because we hold the
-                * anon_vma->lock, which the munmap code takes while
-                * unlinking the anon_vmas from the VMA.
-                */
-               return -EFAULT;
-       }
        return address;
 }
 
@@ -613,9 +601,6 @@ int page_referenced(struct page *page,
        int referenced = 0;
        int we_locked = 0;
 
-       if (TestClearPageReferenced(page))
-               referenced++;
-
        *vm_flags = 0;
        if (page_mapped(page) && page_rmapping(page)) {
                if (!is_locked && (!PageAnon(page) || PageKsm(page))) {
@@ -715,6 +700,30 @@ int page_mkclean(struct page *page)
 }
 EXPORT_SYMBOL_GPL(page_mkclean);
 
+/**
+ * page_move_anon_rmap - move a page to our anon_vma
+ * @page:      the page to move to our anon_vma
+ * @vma:       the vma the page belongs to
+ * @address:   the user virtual address mapped
+ *
+ * When a page belongs exclusively to one process after a COW event,
+ * that page can be moved into the anon_vma that belongs to just that
+ * process, so the rmap code will not search the parent or sibling
+ * processes.
+ */
+void page_move_anon_rmap(struct page *page,
+       struct vm_area_struct *vma, unsigned long address)
+{
+       struct anon_vma *anon_vma = vma->anon_vma;
+
+       VM_BUG_ON(!PageLocked(page));
+       VM_BUG_ON(!anon_vma);
+       VM_BUG_ON(page->index != linear_page_index(vma, address));
+
+       anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
+       page->mapping = (struct address_space *) anon_vma;
+}
+
 /**
  * __page_set_anon_rmap - setup new anonymous rmap
  * @page:      the page to add the mapping to