void shmem_lock(struct file * file, int lock);
int shmem_zero_setup(struct vm_area_struct *);
-struct zap_details;
+/*
+ * Parameter block passed down to zap_pte_range in exceptional cases.
+ */
+struct zap_details {
+ struct vm_area_struct *nonlinear_vma; /* Check page->index if set */
+ struct address_space *check_mapping; /* Check page->mapping if set */
+ pgoff_t first_index; /* Lowest page->index to unmap */
+ pgoff_t last_index; /* Highest page->index to unmap */
+};
+
void zap_page_range(struct vm_area_struct *vma, unsigned long address,
unsigned long size, struct zap_details *);
int unmap_vmas(struct mmu_gather **tlbp, struct mm_struct *mm,
static long madvise_dontneed(struct vm_area_struct * vma,
unsigned long start, unsigned long end)
{
+ struct zap_details details;
+
if (vma->vm_flags & VM_LOCKED)
return -EINVAL;
- zap_page_range(vma, start, end - start, NULL);
+ if (unlikely(vma->vm_flags & VM_NONLINEAR)) {
+ details.check_mapping = NULL;
+ details.nonlinear_vma = vma;
+ details.first_index = 0;
+ details.last_index = ULONG_MAX;
+ zap_page_range(vma, start, end - start, &details);
+ } else
+ zap_page_range(vma, start, end - start, NULL);
return 0;
}
return -ENOMEM;
}
-/*
- * Parameter block passed down to zap_pte_range in exceptional cases.
- */
-struct zap_details {
- struct vm_area_struct *nonlinear_vma; /* Check page->index if set */
- struct address_space *check_mapping; /* Check page->mapping if set */
- pgoff_t first_index; /* Lowest page->index to unmap */
- pgoff_t last_index; /* Highest page->index to unmap */
-};
-
static void zap_pte_range(struct mmu_gather *tlb,
pmd_t *pmd, unsigned long address,
unsigned long size, struct zap_details *details)