mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-23 18:19:39 +00:00
dump: Reformat vma dumping a little
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
parent
c3051512f3
commit
f212e6fe37
1 changed files with 53 additions and 42 deletions
95
cr-dump.c
95
cr-dump.c
|
|
@ -440,6 +440,52 @@ static struct shmem_info* shmem_find(unsigned long shmid)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int add_shmem_area(pid_t pid, struct vma_entry *vma)
|
||||
{
|
||||
struct shmem_info *si;
|
||||
unsigned long size = vma->pgoff + (vma->end - vma->start);
|
||||
|
||||
si = shmem_find(vma->shmid);
|
||||
if (si) {
|
||||
if (si->size < size)
|
||||
si->size = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
nr_shmems++;
|
||||
if (nr_shmems * sizeof(*si) == SHMEMS_SIZE) {
|
||||
pr_err("OOM storing shmems\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
si = &shmems[nr_shmems - 1];
|
||||
si->size = size;
|
||||
si->pid = pid;
|
||||
si->start = vma->start;
|
||||
si->end = vma->end;
|
||||
si->shmid = vma->shmid;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_filemap(pid_t pid, struct vma_entry *vma, int file_fd,
|
||||
const struct cr_fdset *fdset)
|
||||
{
|
||||
struct fd_parms p = {
|
||||
.fd_name = vma->start,
|
||||
.id = FD_ID_INVALID,
|
||||
.pid = pid,
|
||||
.type = FDINFO_MAP,
|
||||
};
|
||||
|
||||
if ((vma->prot & PROT_WRITE) && vma_entry_is(vma, VMA_FILE_SHARED))
|
||||
p.flags = O_RDWR;
|
||||
else
|
||||
p.flags = O_RDONLY;
|
||||
|
||||
return dump_one_reg_file(&p, file_fd, fdset, 0);
|
||||
}
|
||||
|
||||
static int dump_task_mappings(pid_t pid, const struct list_head *vma_area_list,
|
||||
const struct cr_fdset *cr_fdset)
|
||||
{
|
||||
|
|
@ -461,49 +507,14 @@ static int dump_task_mappings(pid_t pid, const struct list_head *vma_area_list,
|
|||
|
||||
pr_info_vma(vma_area);
|
||||
|
||||
if (vma_entry_is(vma, VMA_ANON_SHARED)) {
|
||||
struct shmem_info *si;
|
||||
unsigned long size = vma->pgoff + (vma->end - vma->start);
|
||||
if (vma_entry_is(vma, VMA_ANON_SHARED))
|
||||
ret = add_shmem_area(pid, vma);
|
||||
else if (vma_entry_is(vma, VMA_FILE_PRIVATE) ||
|
||||
vma_entry_is(vma, VMA_FILE_SHARED))
|
||||
ret = dump_filemap(pid, vma, vma_area->vm_file_fd, cr_fdset);
|
||||
|
||||
si = shmem_find(vma_area->vma.shmid);
|
||||
if (si) {
|
||||
if (si->size < size)
|
||||
si->size = size;
|
||||
continue;
|
||||
}
|
||||
|
||||
nr_shmems++;
|
||||
if (nr_shmems * sizeof(*si) == SHMEMS_SIZE) {
|
||||
pr_err("OOM storing shmems\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
si = &shmems[nr_shmems - 1];
|
||||
si->size = size;
|
||||
si->pid = pid;
|
||||
si->start = vma->start;
|
||||
si->end = vma->end;
|
||||
si->shmid = vma_area->vma.shmid;
|
||||
|
||||
} else if (vma_entry_is(vma, VMA_FILE_PRIVATE) ||
|
||||
vma_entry_is(vma, VMA_FILE_SHARED)) {
|
||||
struct fd_parms p = {
|
||||
.fd_name = vma->start,
|
||||
.id = FD_ID_INVALID,
|
||||
.pid = pid,
|
||||
.type = FDINFO_MAP,
|
||||
};
|
||||
|
||||
if (vma->prot & PROT_WRITE &&
|
||||
vma_entry_is(vma, VMA_FILE_SHARED))
|
||||
p.flags = O_RDWR;
|
||||
else
|
||||
p.flags = O_RDONLY;
|
||||
|
||||
ret = dump_one_reg_file(&p, vma_area->vm_file_fd, cr_fdset, 0);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue