|
@@ -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 (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
|
|
* Writing 5 to /proc/pid/clear_refs resets the peak
|
|
* resident set size to this mm's current rss value.
|
|
* resident set size to this mm's current rss value.
|
|
*/
|
|
*/
|
|
- down_write(&mm->mmap_sem);
|
|
|
|
reset_mm_hiwater_rss(mm);
|
|
reset_mm_hiwater_rss(mm);
|
|
up_write(&mm->mmap_sem);
|
|
up_write(&mm->mmap_sem);
|
|
goto out_mm;
|
|
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))
|
|
if (!(vma->vm_flags & VM_SOFTDIRTY))
|
|
continue;
|
|
continue;
|
|
up_read(&mm->mmap_sem);
|
|
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) {
|
|
for (vma = mm->mmap; vma; vma = vma->vm_next) {
|
|
vma->vm_flags &= ~VM_SOFTDIRTY;
|
|
vma->vm_flags &= ~VM_SOFTDIRTY;
|
|
vma_set_page_prot(vma);
|
|
vma_set_page_prot(vma);
|