diff options
Diffstat (limited to 'mm/rmap.c')
| -rw-r--r-- | mm/rmap.c | 18 | 
1 files changed, 15 insertions, 3 deletions
diff --git a/mm/rmap.c b/mm/rmap.c index bf03149f495..7df7984d476 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -884,7 +884,7 @@ static int page_mkclean_one(struct page *page, struct vm_area_struct *vma,  		pte_t entry;  		flush_cache_page(vma, address, pte_pfn(*pte)); -		entry = ptep_clear_flush_notify(vma, address, pte); +		entry = ptep_clear_flush(vma, address, pte);  		entry = pte_wrprotect(entry);  		entry = pte_mkclean(entry);  		set_pte_at(mm, address, pte, entry); @@ -892,6 +892,9 @@ static int page_mkclean_one(struct page *page, struct vm_area_struct *vma,  	}  	pte_unmap_unlock(pte, ptl); + +	if (ret) +		mmu_notifier_invalidate_page(mm, address);  out:  	return ret;  } @@ -1212,7 +1215,7 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,  	/* Nuke the page table entry. */  	flush_cache_page(vma, address, page_to_pfn(page)); -	pteval = ptep_clear_flush_notify(vma, address, pte); +	pteval = ptep_clear_flush(vma, address, pte);  	/* Move the dirty bit to the physical page now the pte is gone. */  	if (pte_dirty(pteval)) @@ -1274,6 +1277,8 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,  out_unmap:  	pte_unmap_unlock(pte, ptl); +	if (ret != SWAP_FAIL) +		mmu_notifier_invalidate_page(mm, address);  out:  	return ret; @@ -1338,6 +1343,8 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount,  	spinlock_t *ptl;  	struct page *page;  	unsigned long address; +	unsigned long mmun_start;	/* For mmu_notifiers */ +	unsigned long mmun_end;		/* For mmu_notifiers */  	unsigned long end;  	int ret = SWAP_AGAIN;  	int locked_vma = 0; @@ -1361,6 +1368,10 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount,  	if (!pmd_present(*pmd))  		return ret; +	mmun_start = address; +	mmun_end   = end; +	mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end); +  	/*  	 * If we can acquire the mmap_sem for read, and vma is VM_LOCKED,  	 * keep the sem while scanning the cluster for mlocking pages. @@ -1394,7 +1405,7 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount,  		/* Nuke the page table entry. */  		flush_cache_page(vma, address, pte_pfn(*pte)); -		pteval = ptep_clear_flush_notify(vma, address, pte); +		pteval = ptep_clear_flush(vma, address, pte);  		/* If nonlinear, store the file page offset in the pte. */  		if (page->index != linear_page_index(vma, address)) @@ -1410,6 +1421,7 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount,  		(*mapcount)--;  	}  	pte_unmap_unlock(pte - 1, ptl); +	mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);  	if (locked_vma)  		up_read(&vma->vm_mm->mmap_sem);  	return ret;  |