Merge d5660df4a5
("Merge branch 'akpm' (patches from Andrew)") into android-mainline
steps on the way to 5.10-rc1 Change-Id: Iddc84c25b6a9d71fa8542b927d6f69c364131c3d Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
45
mm/mmap.c
45
mm/mmap.c
@@ -143,7 +143,7 @@ static void __remove_shared_vm_struct(struct vm_area_struct *vma,
|
||||
struct file *file, struct address_space *mapping)
|
||||
{
|
||||
if (vma->vm_flags & VM_DENYWRITE)
|
||||
atomic_inc(&file_inode(file)->i_writecount);
|
||||
allow_write_access(file);
|
||||
if (vma->vm_flags & VM_SHARED)
|
||||
mapping_unmap_writable(mapping);
|
||||
|
||||
@@ -474,8 +474,12 @@ static __always_inline void vma_rb_erase_ignore(struct vm_area_struct *vma,
|
||||
{
|
||||
/*
|
||||
* All rb_subtree_gap values must be consistent prior to erase,
|
||||
* with the possible exception of the "next" vma being erased if
|
||||
* next->vm_start was reduced.
|
||||
* with the possible exception of
|
||||
*
|
||||
* a. the "next" vma being erased if next->vm_start was reduced in
|
||||
* __vma_adjust() -> __vma_unlink()
|
||||
* b. the vma being erased in detach_vmas_to_be_unmapped() ->
|
||||
* vma_rb_erase()
|
||||
*/
|
||||
validate_mm_rb(root, ignore);
|
||||
|
||||
@@ -485,13 +489,7 @@ static __always_inline void vma_rb_erase_ignore(struct vm_area_struct *vma,
|
||||
static __always_inline void vma_rb_erase(struct vm_area_struct *vma,
|
||||
struct rb_root *root)
|
||||
{
|
||||
/*
|
||||
* All rb_subtree_gap values must be consistent prior to erase,
|
||||
* with the possible exception of the vma being erased.
|
||||
*/
|
||||
validate_mm_rb(root, vma);
|
||||
|
||||
__vma_rb_erase(vma, root);
|
||||
vma_rb_erase_ignore(vma, root, vma);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -623,7 +621,7 @@ static void __vma_link_file(struct vm_area_struct *vma)
|
||||
if (vma->vm_flags & VM_DENYWRITE)
|
||||
atomic_dec(&file_inode(file)->i_writecount);
|
||||
if (vma->vm_flags & VM_SHARED)
|
||||
atomic_inc(&mapping->i_mmap_writable);
|
||||
mapping_allow_writable(mapping);
|
||||
|
||||
flush_dcache_mmap_lock(mapping);
|
||||
vma_interval_tree_insert(vma, &mapping->i_mmap);
|
||||
@@ -677,7 +675,7 @@ static void __insert_vm_struct(struct mm_struct *mm, struct vm_area_struct *vma)
|
||||
mm->map_count++;
|
||||
}
|
||||
|
||||
static __always_inline void __vma_unlink_common(struct mm_struct *mm,
|
||||
static __always_inline void __vma_unlink(struct mm_struct *mm,
|
||||
struct vm_area_struct *vma,
|
||||
struct vm_area_struct *ignore)
|
||||
{
|
||||
@@ -760,7 +758,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
||||
* vma expands, overlapping part of the next:
|
||||
* mprotect case 5 shifting the boundary up.
|
||||
*/
|
||||
adjust_next = (end - next->vm_start) >> PAGE_SHIFT;
|
||||
adjust_next = (end - next->vm_start);
|
||||
exporter = next;
|
||||
importer = vma;
|
||||
VM_WARN_ON(expand != importer);
|
||||
@@ -770,7 +768,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
||||
* split_vma inserting another: so it must be
|
||||
* mprotect case 4 shifting the boundary down.
|
||||
*/
|
||||
adjust_next = -((vma->vm_end - end) >> PAGE_SHIFT);
|
||||
adjust_next = -(vma->vm_end - end);
|
||||
exporter = vma;
|
||||
importer = next;
|
||||
VM_WARN_ON(expand != importer);
|
||||
@@ -825,7 +823,7 @@ again:
|
||||
anon_vma_interval_tree_pre_update_vma(next);
|
||||
}
|
||||
|
||||
if (root) {
|
||||
if (file) {
|
||||
flush_dcache_mmap_lock(mapping);
|
||||
vma_interval_tree_remove(vma, root);
|
||||
if (adjust_next)
|
||||
@@ -842,11 +840,11 @@ again:
|
||||
}
|
||||
vma->vm_pgoff = pgoff;
|
||||
if (adjust_next) {
|
||||
next->vm_start += adjust_next << PAGE_SHIFT;
|
||||
next->vm_pgoff += adjust_next;
|
||||
next->vm_start += adjust_next;
|
||||
next->vm_pgoff += adjust_next >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
if (root) {
|
||||
if (file) {
|
||||
if (adjust_next)
|
||||
vma_interval_tree_insert(next, root);
|
||||
vma_interval_tree_insert(vma, root);
|
||||
@@ -859,7 +857,7 @@ again:
|
||||
* us to remove next before dropping the locks.
|
||||
*/
|
||||
if (remove_next != 3)
|
||||
__vma_unlink_common(mm, next, next);
|
||||
__vma_unlink(mm, next, next);
|
||||
else
|
||||
/*
|
||||
* vma is not before next if they've been
|
||||
@@ -870,7 +868,7 @@ again:
|
||||
* "next" (which is stored in post-swap()
|
||||
* "vma").
|
||||
*/
|
||||
__vma_unlink_common(mm, next, vma);
|
||||
__vma_unlink(mm, next, vma);
|
||||
if (file)
|
||||
__remove_shared_vm_struct(next, file, mapping);
|
||||
} else if (insert) {
|
||||
@@ -897,10 +895,9 @@ again:
|
||||
anon_vma_interval_tree_post_update_vma(next);
|
||||
anon_vma_unlock_write(anon_vma);
|
||||
}
|
||||
if (mapping)
|
||||
i_mmap_unlock_write(mapping);
|
||||
|
||||
if (root) {
|
||||
if (file) {
|
||||
i_mmap_unlock_write(mapping);
|
||||
uprobe_mmap(vma);
|
||||
|
||||
if (adjust_next)
|
||||
@@ -3246,7 +3243,7 @@ int insert_vm_struct(struct mm_struct *mm, struct vm_area_struct *vma)
|
||||
* By setting it to reflect the virtual start address of the
|
||||
* vma, merges and splits can happen in a seamless way, just
|
||||
* using the existing file pgoff checks and manipulations.
|
||||
* Similarly in do_mmap and in do_brk.
|
||||
* Similarly in do_mmap and in do_brk_flags.
|
||||
*/
|
||||
if (vma_is_anonymous(vma)) {
|
||||
BUG_ON(vma->anon_vma);
|
||||
|
Reference in New Issue
Block a user