Commit 740305be authored by Fyodor Bocharov's avatar Fyodor Bocharov Committed by Pavel Emelyanov

proc_parse: collect longest shared vma size

To dedup anon shared memory we need to know its longest size so we could
create page cache of appropriate size when dumping pages.
Signed-off-by: 's avatarFyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: 's avatarEugene Batalov <eabatalov89@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent f960e432
......@@ -13,6 +13,7 @@ struct vm_area_list {
unsigned int nr_aios;
unsigned long priv_size; /* nr of pages in private VMAs */
unsigned long priv_longest; /* nr of pages in longest private VMA */
unsigned long shared_longest; /* nr of pages in longest shared VMA */
};
#define VM_AREA_LIST(name) struct vm_area_list name = { .h = LIST_HEAD_INIT(name.h), .nr = 0, }
......@@ -23,6 +24,7 @@ static inline void vm_area_list_init(struct vm_area_list *vml)
vml->nr = 0;
vml->priv_size = 0;
vml->priv_longest = 0;
vml->shared_longest = 0;
}
struct file_desc;
......
......@@ -633,6 +633,12 @@ static int vma_list_add(struct vma_area *vma_area,
pages = vma_area_len(vma_area) / PAGE_SIZE;
vma_area_list->priv_size += pages;
vma_area_list->priv_longest = max(vma_area_list->priv_longest, pages);
} else if (vma_area_is(vma_area, VMA_ANON_SHARED)) {
unsigned long pages;
pages = vma_area_len(vma_area) / PAGE_SIZE;
vma_area_list->shared_longest =
max(vma_area_list->shared_longest, pages);
}
*prev_vfi = *vfi;
......@@ -658,6 +664,7 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list,
vma_area_list->nr_aios = 0;
vma_area_list->priv_longest = 0;
vma_area_list->priv_size = 0;
vma_area_list->shared_longest = 0;
INIT_LIST_HEAD(&vma_area_list->h);
f.fd = open_proc(pid, "smaps");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment