diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 25 | 
1 files changed, 23 insertions, 2 deletions
| diff --git a/kernel/fork.c b/kernel/fork.c index a3795aaaab5c..50c90d368117 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -559,7 +559,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,  				atomic_dec(&inode->i_writecount);  			i_mmap_lock_write(mapping);  			if (tmp->vm_flags & VM_SHARED) -				atomic_inc(&mapping->i_mmap_writable); +				mapping_allow_writable(mapping);  			flush_dcache_mmap_lock(mapping);  			/* insert tmp into the share list, just after mpnt */  			vma_interval_tree_insert_after(tmp, mpnt, @@ -590,7 +590,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,  		mm->map_count++;  		if (!(tmp->vm_flags & VM_WIPEONFORK)) -			retval = copy_page_range(mm, oldmm, mpnt, tmp); +			retval = copy_page_range(tmp, mpnt);  		if (tmp->vm_ops && tmp->vm_ops->open)  			tmp->vm_ops->open(tmp); @@ -1812,6 +1812,25 @@ static __always_inline void delayed_free_task(struct task_struct *tsk)  		free_task(tsk);  } +static void copy_oom_score_adj(u64 clone_flags, struct task_struct *tsk) +{ +	/* Skip if kernel thread */ +	if (!tsk->mm) +		return; + +	/* Skip if spawning a thread or using vfork */ +	if ((clone_flags & (CLONE_VM | CLONE_THREAD | CLONE_VFORK)) != CLONE_VM) +		return; + +	/* We need to synchronize with __set_oom_adj */ +	mutex_lock(&oom_adj_mutex); +	set_bit(MMF_MULTIPROCESS, &tsk->mm->flags); +	/* Update the values in case they were changed after copy_signal */ +	tsk->signal->oom_score_adj = current->signal->oom_score_adj; +	tsk->signal->oom_score_adj_min = current->signal->oom_score_adj_min; +	mutex_unlock(&oom_adj_mutex); +} +  /*   * This creates a new process as a copy of the old one,   * but does not actually start it yet. @@ -2288,6 +2307,8 @@ static __latent_entropy struct task_struct *copy_process(  	trace_task_newtask(p, clone_flags);  	uprobe_copy_process(p, clone_flags); +	copy_oom_score_adj(clone_flags, p); +  	return p;  bad_fork_cancel_cgroup: |