diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 33 | 
1 files changed, 6 insertions, 27 deletions
diff --git a/mm/memory.c b/mm/memory.c index 6953d3926e0..9b8a01d941c 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -305,6 +305,7 @@ int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)  	if (batch->nr == batch->max) {  		if (!tlb_next_batch(tlb))  			return 0; +		batch = tlb->active;  	}  	VM_BUG_ON(batch->nr > batch->max); @@ -1112,11 +1113,13 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,  	int force_flush = 0;  	int rss[NR_MM_COUNTERS];  	spinlock_t *ptl; +	pte_t *start_pte;  	pte_t *pte;  again:  	init_rss_vec(rss); -	pte = pte_offset_map_lock(mm, pmd, addr, &ptl); +	start_pte = pte_offset_map_lock(mm, pmd, addr, &ptl); +	pte = start_pte;  	arch_enter_lazy_mmu_mode();  	do {  		pte_t ptent = *pte; @@ -1196,7 +1199,7 @@ again:  	add_mm_rss_vec(mm, rss);  	arch_leave_lazy_mmu_mode(); -	pte_unmap_unlock(pte - 1, ptl); +	pte_unmap_unlock(start_pte, ptl);  	/*  	 * mmu_gather ran out of room to batch pages, we break out of @@ -1296,7 +1299,7 @@ static unsigned long unmap_page_range(struct mmu_gather *tlb,  /**   * unmap_vmas - unmap a range of memory covered by a list of vma's - * @tlbp: address of the caller's struct mmu_gather + * @tlb: address of the caller's struct mmu_gather   * @vma: the starting vma   * @start_addr: virtual address at which to start unmapping   * @end_addr: virtual address at which to end unmapping @@ -2796,30 +2799,6 @@ void unmap_mapping_range(struct address_space *mapping,  }  EXPORT_SYMBOL(unmap_mapping_range); -int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end) -{ -	struct address_space *mapping = inode->i_mapping; - -	/* -	 * If the underlying filesystem is not going to provide -	 * a way to truncate a range of blocks (punch a hole) - -	 * we should return failure right now. -	 */ -	if (!inode->i_op->truncate_range) -		return -ENOSYS; - -	mutex_lock(&inode->i_mutex); -	down_write(&inode->i_alloc_sem); -	unmap_mapping_range(mapping, offset, (end - offset), 1); -	truncate_inode_pages_range(mapping, offset, end); -	unmap_mapping_range(mapping, offset, (end - offset), 1); -	inode->i_op->truncate_range(inode, offset, end); -	up_write(&inode->i_alloc_sem); -	mutex_unlock(&inode->i_mutex); - -	return 0; -} -  /*   * We enter with non-exclusive mmap_sem (to exclude vma changes,   * but allow concurrent faults), and pte mapped but not yet locked.  |