diff options
| author | Petr Cermak <petrcermak@chromium.org> | 2015-02-12 18:01:00 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-12 21:54:12 -0500 |
| commit | 695f055936938c674473ea071ca7359a863551e7 (patch) | |
| tree | 8975abce255f8d638fa1291beb62803e2d611004 /fs/proc | |
| parent | d170cf4674768db22b66a1be4be7877d3b2c3874 (diff) | |
fs/proc/task_mmu.c: add user-space support for resetting mm->hiwater_rss (peak RSS)
Peak resident size of a process can be reset back to the process's
current rss value by writing "5" to /proc/pid/clear_refs. The driving
use-case for this would be getting the peak RSS value, which can be
retrieved from the VmHWM field in /proc/pid/status, per benchmark
iteration or test scenario.
[akpm@linux-foundation.org: clarify behaviour in documentation]
Signed-off-by: Petr Cermak <petrcermak@chromium.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Primiano Tucci <primiano@chromium.org>
Cc: Petr Cermak <petrcermak@chromium.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc')
| -rw-r--r-- | fs/proc/task_mmu.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 0e36c1e49fe3..1359a911d194 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
| @@ -732,6 +732,7 @@ enum clear_refs_types { | |||
| 732 | CLEAR_REFS_ANON, | 732 | CLEAR_REFS_ANON, |
| 733 | CLEAR_REFS_MAPPED, | 733 | CLEAR_REFS_MAPPED, |
| 734 | CLEAR_REFS_SOFT_DIRTY, | 734 | CLEAR_REFS_SOFT_DIRTY, |
| 735 | CLEAR_REFS_MM_HIWATER_RSS, | ||
| 735 | CLEAR_REFS_LAST, | 736 | CLEAR_REFS_LAST, |
| 736 | }; | 737 | }; |
| 737 | 738 | ||
| @@ -907,6 +908,18 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, | |||
| 907 | .mm = mm, | 908 | .mm = mm, |
| 908 | .private = &cp, | 909 | .private = &cp, |
| 909 | }; | 910 | }; |
| 911 | |||
| 912 | if (type == CLEAR_REFS_MM_HIWATER_RSS) { | ||
| 913 | /* | ||
| 914 | * Writing 5 to /proc/pid/clear_refs resets the peak | ||
| 915 | * resident set size to this mm's current rss value. | ||
| 916 | */ | ||
| 917 | down_write(&mm->mmap_sem); | ||
| 918 | reset_mm_hiwater_rss(mm); | ||
| 919 | up_write(&mm->mmap_sem); | ||
| 920 | goto out_mm; | ||
| 921 | } | ||
| 922 | |||
| 910 | down_read(&mm->mmap_sem); | 923 | down_read(&mm->mmap_sem); |
| 911 | if (type == CLEAR_REFS_SOFT_DIRTY) { | 924 | if (type == CLEAR_REFS_SOFT_DIRTY) { |
| 912 | for (vma = mm->mmap; vma; vma = vma->vm_next) { | 925 | for (vma = mm->mmap; vma; vma = vma->vm_next) { |
| @@ -928,6 +941,7 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, | |||
| 928 | mmu_notifier_invalidate_range_end(mm, 0, -1); | 941 | mmu_notifier_invalidate_range_end(mm, 0, -1); |
| 929 | flush_tlb_mm(mm); | 942 | flush_tlb_mm(mm); |
| 930 | up_read(&mm->mmap_sem); | 943 | up_read(&mm->mmap_sem); |
| 944 | out_mm: | ||
| 931 | mmput(mm); | 945 | mmput(mm); |
| 932 | } | 946 | } |
| 933 | put_task_struct(task); | 947 | put_task_struct(task); |
