static int mlock_fixup(struct vm_area_struct * vma, unsigned long start, unsigned long end, unsigned int newflags) { struct mm_struct * mm = vma->vm_mm; int pages; int ret = 0; if (newflags == vma->vm_flags) goto out; if (start != vma->vm_start) { if (split_vma(mm, vma, start, 1)) { ret = -EAGAIN; goto out; } } if (end != vma->vm_end) { if (split_vma(mm, vma, end, 0)) { ret = -EAGAIN; goto out; } } /* * 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 * set VM_LOCKED, make_pages_present below will bring it back. */ vma->vm_flags = newflags; /* * Keep track of amount of locked VM. */ pages = (end - start) >> PAGE_SHIFT; if (newflags & VM_LOCKED) { pages = -pages; ret = make_pages_present(start, end); } vma->vm_mm->locked_vm -= pages; out: return ret; }
static int mlock_fixup(struct vm_area_struct * vma, unsigned long start, unsigned long end, unsigned int newflags) { struct mm_struct * mm = vma->vm_mm; int pages; int ret = 0; if (newflags == vma->vm_flags) goto out; if (start != vma->vm_start) { if (split_vma(mm, vma, start, 1)) { ret = -EAGAIN; goto out; } } if (end != vma->vm_end) { if (split_vma(mm, vma, end, 0)) { ret = -EAGAIN; goto out; } } spin_lock(&mm->page_table_lock); vma->vm_flags = newflags; spin_unlock(&mm->page_table_lock); /* * Keep track of amount of locked VM. */ pages = (end - start) >> PAGE_SHIFT; if (newflags & VM_LOCKED) { pages = -pages; ret = make_pages_present(start, end); } vma->vm_mm->locked_vm -= pages; out: return ret; }