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 { ...@@ -13,6 +13,7 @@ struct vm_area_list {
unsigned int nr_aios; unsigned int nr_aios;
unsigned long priv_size; /* nr of pages in private VMAs */ unsigned long priv_size; /* nr of pages in private VMAs */
unsigned long priv_longest; /* nr of pages in longest private VMA */ 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, } #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) ...@@ -23,6 +24,7 @@ static inline void vm_area_list_init(struct vm_area_list *vml)
vml->nr = 0; vml->nr = 0;
vml->priv_size = 0; vml->priv_size = 0;
vml->priv_longest = 0; vml->priv_longest = 0;
vml->shared_longest = 0;
} }
struct file_desc; struct file_desc;
......
...@@ -633,6 +633,12 @@ static int vma_list_add(struct vma_area *vma_area, ...@@ -633,6 +633,12 @@ static int vma_list_add(struct vma_area *vma_area,
pages = vma_area_len(vma_area) / PAGE_SIZE; pages = vma_area_len(vma_area) / PAGE_SIZE;
vma_area_list->priv_size += pages; vma_area_list->priv_size += pages;
vma_area_list->priv_longest = max(vma_area_list->priv_longest, 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; *prev_vfi = *vfi;
...@@ -658,6 +664,7 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, ...@@ -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->nr_aios = 0;
vma_area_list->priv_longest = 0; vma_area_list->priv_longest = 0;
vma_area_list->priv_size = 0; vma_area_list->priv_size = 0;
vma_area_list->shared_longest = 0;
INIT_LIST_HEAD(&vma_area_list->h); INIT_LIST_HEAD(&vma_area_list->h);
f.fd = open_proc(pid, "smaps"); 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