mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-03 15:55:53 +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:
committed by
Pavel Emelyanov
parent
11b525f30e
commit
84e84cbb65
34
proc_parse.c
34
proc_parse.c
@@ -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;
|
||||||
|
|
||||||
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)) {
|
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
|
|||||||
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
|
|||||||
}
|
}
|
||||||
|
|
||||||
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
|
|||||||
}
|
}
|
||||||
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;
|
||||||
|
Reference in New Issue
Block a user