diff options
Diffstat (limited to 'mm/mmap.c')
| -rw-r--r-- | mm/mmap.c | 18 | 
1 files changed, 10 insertions, 8 deletions
| diff --git a/mm/mmap.c b/mm/mmap.c index 924839fac0e6..9efdc021ad22 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2555,9 +2555,11 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,  	struct vm_area_struct *new;  	int err; -	if (is_vm_hugetlb_page(vma) && (addr & -					~(huge_page_mask(hstate_vma(vma))))) -		return -EINVAL; +	if (vma->vm_ops && vma->vm_ops->split) { +		err = vma->vm_ops->split(vma, addr); +		if (err) +			return err; +	}  	new = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);  	if (!new) @@ -3017,20 +3019,20 @@ void exit_mmap(struct mm_struct *mm)  	/* Use -1 here to ensure all VMAs in the mm are unmapped */  	unmap_vmas(&tlb, vma, 0, -1); -	set_bit(MMF_OOM_SKIP, &mm->flags); -	if (unlikely(tsk_is_oom_victim(current))) { +	if (unlikely(mm_is_oom_victim(mm))) {  		/*  		 * Wait for oom_reap_task() to stop working on this  		 * mm. Because MMF_OOM_SKIP is already set before  		 * calling down_read(), oom_reap_task() will not run  		 * on this "mm" post up_write().  		 * -		 * tsk_is_oom_victim() cannot be set from under us -		 * either because current->mm is already set to NULL +		 * mm_is_oom_victim() cannot be set from under us +		 * either because victim->mm is already set to NULL  		 * under task_lock before calling mmput and oom_mm is -		 * set not NULL by the OOM killer only if current->mm +		 * set not NULL by the OOM killer only if victim->mm  		 * is found not NULL while holding the task_lock.  		 */ +		set_bit(MMF_OOM_SKIP, &mm->flags);  		down_write(&mm->mmap_sem);  		up_write(&mm->mmap_sem);  	} |