diff options
Diffstat (limited to 'fs/proc/task_mmu.c')
| -rw-r--r-- | fs/proc/task_mmu.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 541583510cfb..4648c7f63ae2 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1027,11 +1027,15 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,  		};  		if (type == CLEAR_REFS_MM_HIWATER_RSS) { +			if (down_write_killable(&mm->mmap_sem)) { +				count = -EINTR; +				goto out_mm; +			} +  			/*  			 * Writing 5 to /proc/pid/clear_refs resets the peak  			 * resident set size to this mm's current rss value.  			 */ -			down_write(&mm->mmap_sem);  			reset_mm_hiwater_rss(mm);  			up_write(&mm->mmap_sem);  			goto out_mm; @@ -1043,7 +1047,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,  				if (!(vma->vm_flags & VM_SOFTDIRTY))  					continue;  				up_read(&mm->mmap_sem); -				down_write(&mm->mmap_sem); +				if (down_write_killable(&mm->mmap_sem)) { +					count = -EINTR; +					goto out_mm; +				}  				for (vma = mm->mmap; vma; vma = vma->vm_next) {  					vma->vm_flags &= ~VM_SOFTDIRTY;  					vma_set_page_prot(vma);  |