mm: rename __mlock_vma_pages_range() to populate_vma_page_range()

__mlock_vma_pages_range() doesn't necessarily mlock pages.  It depends on
vma flags.  The same codepath is used for MAP_POPULATE.

Let's rename __mlock_vma_pages_range() to populate_vma_page_range().

This patch also drops mlock_vma_pages_range() references from
documentation.  It has gone in cea10a19b7 ("mm: directly use
__mlock_vma_pages_range() in find_extend_vma()").

Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Acked-by: David Rientjes <rientjes@google.com>
Cc: Michel Lespinasse <walken@google.com>
Cc: Rik van Riel <riel@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Kirill A. Shutemov 2015-04-14 15:44:39 -07:00 committed by Linus Torvalds
parent 84d33df279
commit fc05f56621
4 changed files with 16 additions and 26 deletions

View File

@ -317,7 +317,7 @@ If the VMA passes some filtering as described in "Filtering Special Vmas"
below, mlock_fixup() will attempt to merge the VMA with its neighbors or split below, mlock_fixup() will attempt to merge the VMA with its neighbors or split
off a subset of the VMA if the range does not cover the entire VMA. Once the off a subset of the VMA if the range does not cover the entire VMA. Once the
VMA has been merged or split or neither, mlock_fixup() will call VMA has been merged or split or neither, mlock_fixup() will call
__mlock_vma_pages_range() to fault in the pages via get_user_pages() and to populate_vma_page_range() to fault in the pages via get_user_pages() and to
mark the pages as mlocked via mlock_vma_page(). mark the pages as mlocked via mlock_vma_page().
Note that the VMA being mlocked might be mapped with PROT_NONE. In this case, Note that the VMA being mlocked might be mapped with PROT_NONE. In this case,
@ -327,7 +327,7 @@ fault path or in vmscan.
Also note that a page returned by get_user_pages() could be truncated or Also note that a page returned by get_user_pages() could be truncated or
migrated out from under us, while we're trying to mlock it. To detect this, migrated out from under us, while we're trying to mlock it. To detect this,
__mlock_vma_pages_range() checks page_mapping() after acquiring the page lock. populate_vma_page_range() checks page_mapping() after acquiring the page lock.
If the page is still associated with its mapping, we'll go ahead and call If the page is still associated with its mapping, we'll go ahead and call
mlock_vma_page(). If the mapping is gone, we just unlock the page and move on. mlock_vma_page(). If the mapping is gone, we just unlock the page and move on.
In the worst case, this will result in a page mapped in a VM_LOCKED VMA In the worst case, this will result in a page mapped in a VM_LOCKED VMA
@ -392,7 +392,7 @@ ignored for munlock.
If the VMA is VM_LOCKED, mlock_fixup() again attempts to merge or split off the If the VMA is VM_LOCKED, mlock_fixup() again attempts to merge or split off the
specified range. The range is then munlocked via the function specified range. The range is then munlocked via the function
__mlock_vma_pages_range() - the same function used to mlock a VMA range - populate_vma_page_range() - the same function used to mlock a VMA range -
passing a flag to indicate that munlock() is being performed. passing a flag to indicate that munlock() is being performed.
Because the VMA access protections could have been changed to PROT_NONE after Because the VMA access protections could have been changed to PROT_NONE after
@ -402,7 +402,7 @@ get_user_pages() was enhanced to accept a flag to ignore the permissions when
fetching the pages - all of which should be resident as a result of previous fetching the pages - all of which should be resident as a result of previous
mlocking. mlocking.
For munlock(), __mlock_vma_pages_range() unlocks individual pages by calling For munlock(), populate_vma_page_range() unlocks individual pages by calling
munlock_vma_page(). munlock_vma_page() unconditionally clears the PG_mlocked munlock_vma_page(). munlock_vma_page() unconditionally clears the PG_mlocked
flag using TestClearPageMlocked(). As with mlock_vma_page(), flag using TestClearPageMlocked(). As with mlock_vma_page(),
munlock_vma_page() use the Test*PageMlocked() function to handle the case where munlock_vma_page() use the Test*PageMlocked() function to handle the case where
@ -463,21 +463,11 @@ populate the page table.
To mlock a range of memory under the unevictable/mlock infrastructure, the To mlock a range of memory under the unevictable/mlock infrastructure, the
mmap() handler and task address space expansion functions call mmap() handler and task address space expansion functions call
mlock_vma_pages_range() specifying the vma and the address range to mlock. populate_vma_page_range() specifying the vma and the address range to mlock.
mlock_vma_pages_range() filters VMAs like mlock_fixup(), as described above in
"Filtering Special VMAs". It will clear the VM_LOCKED flag, which will have
already been set by the caller, in filtered VMAs. Thus these VMA's need not be
visited for munlock when the region is unmapped.
For "normal" VMAs, mlock_vma_pages_range() calls __mlock_vma_pages_range() to The callers of populate_vma_page_range() will have already added the memory range
fault/allocate the pages and mlock them. Again, like mlock_fixup(),
mlock_vma_pages_range() downgrades the mmap semaphore to read mode before
attempting to fault/allocate and mlock the pages and "upgrades" the semaphore
back to write mode before returning.
The callers of mlock_vma_pages_range() will have already added the memory range
to be mlocked to the task's "locked_vm". To account for filtered VMAs, to be mlocked to the task's "locked_vm". To account for filtered VMAs,
mlock_vma_pages_range() returns the number of pages NOT mlocked. All of the populate_vma_page_range() returns the number of pages NOT mlocked. All of the
callers then subtract a non-negative return value from the task's locked_vm. A callers then subtract a non-negative return value from the task's locked_vm. A
negative return value represent an error - for example, from get_user_pages() negative return value represent an error - for example, from get_user_pages()
attempting to fault in a VMA with PROT_NONE access. In this case, we leave the attempting to fault in a VMA with PROT_NONE access. In this case, we leave the

View File

@ -240,7 +240,7 @@ void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma,
struct vm_area_struct *prev, struct rb_node *rb_parent); struct vm_area_struct *prev, struct rb_node *rb_parent);
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
extern long __mlock_vma_pages_range(struct vm_area_struct *vma, extern long populate_vma_page_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end, int *nonblocking); unsigned long start, unsigned long end, int *nonblocking);
extern void munlock_vma_pages_range(struct vm_area_struct *vma, extern void munlock_vma_pages_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end); unsigned long start, unsigned long end);

View File

@ -206,13 +206,13 @@ out:
} }
/** /**
* __mlock_vma_pages_range() - mlock a range of pages in the vma. * populate_vma_page_range() - populate a range of pages in the vma.
* @vma: target vma * @vma: target vma
* @start: start address * @start: start address
* @end: end address * @end: end address
* @nonblocking: * @nonblocking:
* *
* This takes care of making the pages present too. * This takes care of mlocking the pages too if VM_LOCKED is set.
* *
* return 0 on success, negative error code on error. * return 0 on success, negative error code on error.
* *
@ -224,7 +224,7 @@ out:
* If @nonblocking is non-NULL, it must held for read only and may be * If @nonblocking is non-NULL, it must held for read only and may be
* released. If it's released, *@nonblocking will be set to 0. * released. If it's released, *@nonblocking will be set to 0.
*/ */
long __mlock_vma_pages_range(struct vm_area_struct *vma, long populate_vma_page_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end, int *nonblocking) unsigned long start, unsigned long end, int *nonblocking)
{ {
struct mm_struct *mm = vma->vm_mm; struct mm_struct *mm = vma->vm_mm;
@ -596,7 +596,7 @@ success:
/* /*
* vm_flags is protected by the mmap_sem held in write mode. * vm_flags is protected by the mmap_sem held in write mode.
* It's okay if try_to_unmap_one unmaps a page just after we * It's okay if try_to_unmap_one unmaps a page just after we
* set VM_LOCKED, __mlock_vma_pages_range will bring it back. * set VM_LOCKED, populate_vma_page_range will bring it back.
*/ */
if (lock) if (lock)
@ -702,11 +702,11 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors)
if (nstart < vma->vm_start) if (nstart < vma->vm_start)
nstart = vma->vm_start; nstart = vma->vm_start;
/* /*
* Now fault in a range of pages. __mlock_vma_pages_range() * Now fault in a range of pages. populate_vma_page_range()
* double checks the vma flags, so that it won't mlock pages * double checks the vma flags, so that it won't mlock pages
* if the vma was already munlocked. * if the vma was already munlocked.
*/ */
ret = __mlock_vma_pages_range(vma, nstart, nend, &locked); ret = populate_vma_page_range(vma, nstart, nend, &locked);
if (ret < 0) { if (ret < 0) {
if (ignore_errors) { if (ignore_errors) {
ret = 0; ret = 0;

View File

@ -2316,7 +2316,7 @@ find_extend_vma(struct mm_struct *mm, unsigned long addr)
if (!prev || expand_stack(prev, addr)) if (!prev || expand_stack(prev, addr))
return NULL; return NULL;
if (prev->vm_flags & VM_LOCKED) if (prev->vm_flags & VM_LOCKED)
__mlock_vma_pages_range(prev, addr, prev->vm_end, NULL); populate_vma_page_range(prev, addr, prev->vm_end, NULL);
return prev; return prev;
} }
#else #else
@ -2351,7 +2351,7 @@ find_extend_vma(struct mm_struct *mm, unsigned long addr)
if (expand_stack(vma, addr)) if (expand_stack(vma, addr))
return NULL; return NULL;
if (vma->vm_flags & VM_LOCKED) if (vma->vm_flags & VM_LOCKED)
__mlock_vma_pages_range(vma, addr, start, NULL); populate_vma_page_range(vma, addr, start, NULL);
return vma; return vma;
} }
#endif #endif