diff options
Diffstat (limited to 'mm/oom_kill.c')
| -rw-r--r-- | mm/oom_kill.c | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index c86fbd1b590e..29f855551efe 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -550,7 +550,6 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)  	 */  	set_bit(MMF_UNSTABLE, &mm->flags); -	tlb_gather_mmu(&tlb, mm, 0, -1);  	for (vma = mm->mmap ; vma; vma = vma->vm_next) {  		if (!can_madv_dontneed_vma(vma))  			continue; @@ -565,11 +564,13 @@ static bool __oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)  		 * we do not want to block exit_mmap by keeping mm ref  		 * count elevated without a good reason.  		 */ -		if (vma_is_anonymous(vma) || !(vma->vm_flags & VM_SHARED)) +		if (vma_is_anonymous(vma) || !(vma->vm_flags & VM_SHARED)) { +			tlb_gather_mmu(&tlb, mm, vma->vm_start, vma->vm_end);  			unmap_page_range(&tlb, vma, vma->vm_start, vma->vm_end,  					 NULL); +			tlb_finish_mmu(&tlb, vma->vm_start, vma->vm_end); +		}  	} -	tlb_finish_mmu(&tlb, 0, -1);  	pr_info("oom_reaper: reaped process %d (%s), now anon-rss:%lukB, file-rss:%lukB, shmem-rss:%lukB\n",  			task_pid_nr(tsk), tsk->comm,  			K(get_mm_counter(mm, MM_ANONPAGES)), @@ -682,8 +683,10 @@ static void mark_oom_victim(struct task_struct *tsk)  		return;  	/* oom_mm is bound to the signal struct life time. */ -	if (!cmpxchg(&tsk->signal->oom_mm, NULL, mm)) +	if (!cmpxchg(&tsk->signal->oom_mm, NULL, mm)) {  		mmgrab(tsk->signal->oom_mm); +		set_bit(MMF_OOM_VICTIM, &mm->flags); +	}  	/*  	 * Make sure that the task is woken up from uninterruptible sleep  |