2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-31 22:35:33 +00:00

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: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
Andrey Vagin
2013-05-21 14:37:52 +04:00
committed by Pavel Emelyanov
parent 11b525f30e
commit 84e84cbb65

View File

@@ -166,11 +166,14 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
goto err;
}
while (fgets(buf, BUF_SIZE, smaps)) {
while (1) {
int num;
char file_path[6];
bool eof;
if (!is_vma_range_fmt(buf)) {
eof = (fgets(buf, BUF_SIZE, smaps) == NULL);
if (!eof && !is_vma_range_fmt(buf)) {
if (!strncmp(buf, "Nonlinear", 9)) {
BUG_ON(!vma_area);
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
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();
if (!vma_area)
goto err;
@@ -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) {
goto done;
continue;
} else if (strstr(buf, "[vsyscall]")) {
vma_area->vma.status |= VMA_AREA_VSYSCALL;
} 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
}
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;