Commit 84e84cbb authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

proc: add vma_area in a list after parsing all parameters

The size of vma can be changed after parsing flags. For example we need
to add a guard page for vma with MAP_GROWSDOWN.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 11b525f3
...@@ -166,11 +166,14 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file ...@@ -166,11 +166,14 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
goto err; goto err;
} }
while (fgets(buf, BUF_SIZE, smaps)) { while (1) {
int num; int num;
char file_path[6]; char file_path[6];
bool eof;
eof = (fgets(buf, BUF_SIZE, smaps) == NULL);
if (!is_vma_range_fmt(buf)) { if (!eof && !is_vma_range_fmt(buf)) {
if (!strncmp(buf, "Nonlinear", 9)) { if (!strncmp(buf, "Nonlinear", 9)) {
BUG_ON(!vma_area); BUG_ON(!vma_area);
pr_err("Nonlinear mapping found %016"PRIx64"-%016"PRIx64"\n", pr_err("Nonlinear mapping found %016"PRIx64"-%016"PRIx64"\n",
...@@ -190,6 +193,21 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file ...@@ -190,6 +193,21 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
continue; continue;
} }
if (vma_area) {
list_add_tail(&vma_area->list, &vma_area_list->h);
vma_area_list->nr++;
if (privately_dump_vma(vma_area)) {
unsigned long pages;
pages = vma_area_len(vma_area) / PAGE_SIZE;
vma_area_list->priv_size += pages;
vma_area_list->longest = max(vma_area_list->longest, pages);
}
}
if (eof)
break;
vma_area = alloc_vma_area(); vma_area = alloc_vma_area();
if (!vma_area) if (!vma_area)
goto err; goto err;
...@@ -255,7 +273,7 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file ...@@ -255,7 +273,7 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
} }
if (vma_area->vma.status != 0) { if (vma_area->vma.status != 0) {
goto done; continue;
} else if (strstr(buf, "[vsyscall]")) { } else if (strstr(buf, "[vsyscall]")) {
vma_area->vma.status |= VMA_AREA_VSYSCALL; vma_area->vma.status |= VMA_AREA_VSYSCALL;
} else if (strstr(buf, "[vdso]")) { } else if (strstr(buf, "[vdso]")) {
...@@ -317,16 +335,6 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file ...@@ -317,16 +335,6 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
} }
vma_area->vma.flags |= MAP_ANONYMOUS; vma_area->vma.flags |= MAP_ANONYMOUS;
} }
done:
list_add_tail(&vma_area->list, &vma_area_list->h);
vma_area_list->nr++;
if (privately_dump_vma(vma_area)) {
unsigned long pages;
pages = vma_area_len(vma_area) / PAGE_SIZE;
vma_area_list->priv_size += pages;
vma_area_list->longest = max(vma_area_list->longest, pages);
}
} }
vma_area = NULL; vma_area = NULL;
......
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