mm: add zap_vma_ptes(): a library function to unmap driver ptes
zap_vma_ptes() is intended to be used by drivers to unmap ptes assigned to the driver private vmas. This interface is similar to zap_page_range() but is less general & less likely to be abused. Needed by the GRU driver. Signed-off-by: Jack Steiner <steiner@sgi.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
f718cd4add
commit
c627f9cc04
@ -744,6 +744,8 @@ struct zap_details {
|
|||||||
struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
|
struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
|
||||||
pte_t pte);
|
pte_t pte);
|
||||||
|
|
||||||
|
int zap_vma_ptes(struct vm_area_struct *vma, unsigned long address,
|
||||||
|
unsigned long size);
|
||||||
unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
|
unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
|
||||||
unsigned long size, struct zap_details *);
|
unsigned long size, struct zap_details *);
|
||||||
unsigned long unmap_vmas(struct mmu_gather **tlb,
|
unsigned long unmap_vmas(struct mmu_gather **tlb,
|
||||||
|
23
mm/memory.c
23
mm/memory.c
@ -994,6 +994,29 @@ unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
|
|||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zap_vma_ptes - remove ptes mapping the vma
|
||||||
|
* @vma: vm_area_struct holding ptes to be zapped
|
||||||
|
* @address: starting address of pages to zap
|
||||||
|
* @size: number of bytes to zap
|
||||||
|
*
|
||||||
|
* This function only unmaps ptes assigned to VM_PFNMAP vmas.
|
||||||
|
*
|
||||||
|
* The entire address range must be fully contained within the vma.
|
||||||
|
*
|
||||||
|
* Returns 0 if successful.
|
||||||
|
*/
|
||||||
|
int zap_vma_ptes(struct vm_area_struct *vma, unsigned long address,
|
||||||
|
unsigned long size)
|
||||||
|
{
|
||||||
|
if (address < vma->vm_start || address + size > vma->vm_end ||
|
||||||
|
!(vma->vm_flags & VM_PFNMAP))
|
||||||
|
return -1;
|
||||||
|
zap_page_range(vma, address, size, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(zap_vma_ptes);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do a quick page-table lookup for a single page.
|
* Do a quick page-table lookup for a single page.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user