On Mon, Oct 14, 2013 at 6:31 PM, Colin Cross <ccross@xxxxxxxxxxx> wrote: > In many userspace applications, and especially in VM based > applications like Android uses heavily, there are multiple different > allocators in use. At a minimum there is libc malloc and the stack, > and in many cases there are libc malloc, the stack, direct syscalls to > mmap anonymous memory, and multiple VM heaps (one for small objects, > one for big objects, etc.). Each of these layers usually has its own > tools to inspect its usage; malloc by compiling a debug version, the > VM through heap inspection tools, and for direct syscalls there is > usually no way to track them. > > On Android we heavily use a set of tools that use an extended version > of the logic covered in Documentation/vm/pagemap.txt to walk all pages > mapped in userspace and slice their usage by process, shared (COW) vs. > unique mappings, backing, etc. This can account for real physical > memory usage even in cases like fork without exec (which Android uses > heavily to share as many private COW pages as possible between > processes), Kernel SamePage Merging, and clean zero pages. It > produces a measurement of the pages that only exist in that process > (USS, for unique), and a measurement of the physical memory usage of > that process with the cost of shared pages being evenly split between > processes that share them (PSS). > > If all anonymous memory is indistinguishable then figuring out the > real physical memory usage (PSS) of each heap requires either a pagemap > walking tool that can understand the heap debugging of every layer, or > for every layer's heap debugging tools to implement the pagemap > walking logic, in which case it is hard to get a consistent view of > memory across the whole system. > > This patch adds a field to /proc/pid/maps and /proc/pid/smaps to > show a userspace-provided name for anonymous vmas. The names of > named anonymous vmas are shown in /proc/pid/maps and /proc/pid/smaps > as [anon:<name>]. > > Userspace can set the name for a region of memory by calling > prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, start, len, (unsigned long)name); > Setting the name to NULL clears it. > > The name is stored in a user pointer in the shared union in > vm_area_struct that points to a null terminated string inside > the user process. vmas that point to the same address and are > otherwise mergeable will be merged, but vmas that point to > equivalent strings at different addresses will not be merged. > > The idea to store a userspace pointer to reduce the complexity > within mm (at the expense of the complexity of reading > /proc/pid/mem) came from Dave Hansen. This results in no > runtime overhead in the mm subsystem other than comparing > the anon_name pointers when considering vma merging. The pointer > is stored in a union with fields that are only used on file-backed > mappings, so it does not increase memory usage. > > Signed-off-by: Colin Cross <ccross@xxxxxxxxxxx> > --- > > v2: updates the commit message to explain in more detail why the > patch is useful. > v3: renames vma_get_anon_name to vma_anon_name > replaces logic in seq_print_vma_name with access_process_vm > removes Name: entry from smaps, it's already on the header line > changes the prctl option number to match what is currently in > use on Android > > Documentation/filesystems/proc.txt | 2 ++ > fs/proc/task_mmu.c | 22 +++++++++++++++ > include/linux/mm.h | 5 +++- > include/linux/mm_types.h | 15 +++++++++++ > include/uapi/linux/prctl.h | 3 +++ > kernel/sys.c | 24 +++++++++++++++++ > mm/madvise.c | 55 +++++++++++++++++++++++++++++++++++--- > mm/mempolicy.c | 2 +- > mm/mlock.c | 3 ++- > mm/mmap.c | 44 +++++++++++++++++------------- > mm/mprotect.c | 3 ++- > 11 files changed, 152 insertions(+), 26 deletions(-) > <snip> > diff --git a/mm/mempolicy.c b/mm/mempolicy.c > index 7431001..7cca5e6 100644 > --- a/mm/mempolicy.c > +++ b/mm/mempolicy.c > @@ -728,7 +728,7 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, > ((vmstart - vma->vm_start) >> PAGE_SHIFT); > prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags, > vma->anon_vma, vma->vm_file, pgoff, > - new_pol); > + new_pol, vma_anon_name(name)); Dumb typo here that snuck back in, this should be vma_anon_name(vma). -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>