Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}