mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
[PATCH] mm: update_hiwaters just in time
update_mem_hiwater has attracted various criticisms, in particular from those concerned with mm scalability. Originally it was called whenever rss or total_vm got raised. Then many of those callsites were replaced by a timer tick call from account_system_time. Now Frank van Maarseveen reports that to be found inadequate. How about this? Works for Frank. Replace update_mem_hiwater, a poor combination of two unrelated ops, by macros update_hiwater_rss and update_hiwater_vm. Don't attempt to keep mm->hiwater_rss up to date at timer tick, nor every time we raise rss (usually by 1): those are hot paths. Do the opposite, update only when about to lower rss (usually by many), or just before final accounting in do_exit. Handle mm->hiwater_vm in the same way, though it's much less of an issue. Demand that whoever collects these hiwater statistics do the work of taking the maximum with rss or total_vm. And there has been no collector of these hiwater statistics in the tree. The new convention needs an example, so match Frank's usage by adding a VmPeak line above VmSize to /proc/<pid>/status, and also a VmHWM line above VmRSS (High-Water-Mark or High-Water-Memory). There was a particular anomaly during mremap move, that hiwater_vm might be captured too high. A fleeting such anomaly remains, but it's quickly corrected now, whereas before it would stick. What locking? None: if the app is racy then these statistics will be racy, it's not worth any overhead to make them exact. But whenever it suits, hiwater_vm is updated under exclusive mmap_sem, and hiwater_rss under page_table_lock (for now) or with preemption disabled (later on): without going to any trouble, minimize the time between reading current values and updating, to minimize those occasions when a racing thread bumps a count up and back down in between. Signed-off-by: Hugh Dickins <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
861f2fb8e7
commit
365e9c87a9
14 changed files with 64 additions and 42 deletions
12
mm/mremap.c
12
mm/mremap.c
|
|
@ -167,6 +167,7 @@ static unsigned long move_vma(struct vm_area_struct *vma,
|
|||
unsigned long new_pgoff;
|
||||
unsigned long moved_len;
|
||||
unsigned long excess = 0;
|
||||
unsigned long hiwater_vm;
|
||||
int split = 0;
|
||||
|
||||
/*
|
||||
|
|
@ -205,9 +206,15 @@ static unsigned long move_vma(struct vm_area_struct *vma,
|
|||
}
|
||||
|
||||
/*
|
||||
* if we failed to move page tables we still do total_vm increment
|
||||
* since do_munmap() will decrement it by old_len == new_len
|
||||
* If we failed to move page tables we still do total_vm increment
|
||||
* since do_munmap() will decrement it by old_len == new_len.
|
||||
*
|
||||
* Since total_vm is about to be raised artificially high for a
|
||||
* moment, we need to restore high watermark afterwards: if stats
|
||||
* are taken meanwhile, total_vm and hiwater_vm appear too high.
|
||||
* If this were a serious issue, we'd add a flag to do_munmap().
|
||||
*/
|
||||
hiwater_vm = mm->hiwater_vm;
|
||||
mm->total_vm += new_len >> PAGE_SHIFT;
|
||||
vm_stat_account(mm, vma->vm_flags, vma->vm_file, new_len>>PAGE_SHIFT);
|
||||
|
||||
|
|
@ -216,6 +223,7 @@ static unsigned long move_vma(struct vm_area_struct *vma,
|
|||
vm_unacct_memory(excess >> PAGE_SHIFT);
|
||||
excess = 0;
|
||||
}
|
||||
mm->hiwater_vm = hiwater_vm;
|
||||
|
||||
/* Restore VM_ACCOUNT if one or two pieces of vma left */
|
||||
if (excess) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue