mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-22 09:58:09 +00:00
v2 page-read: rework open_page_read to use in shmem restore
Signed-off-by: Tikhomirov Pavel <snorcht@gmail.com> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
parent
1153f225ff
commit
670d1ce856
@ -67,7 +67,7 @@ static int cr_dedup_one_pagemap(int pid)
|
|||||||
struct page_read * prp;
|
struct page_read * prp;
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
|
|
||||||
ret = open_page_read(pid, &pr, O_RDWR);
|
ret = open_page_read(pid, &pr, O_RDWR, false);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto exit;
|
goto exit;
|
||||||
|
@ -340,7 +340,7 @@ static int restore_priv_vma_content(pid_t pid)
|
|||||||
vma = list_first_entry(vmas, struct vma_area, list);
|
vma = list_first_entry(vmas, struct vma_area, list);
|
||||||
|
|
||||||
ret = open_page_read(pid, &pr,
|
ret = open_page_read(pid, &pr,
|
||||||
opts.auto_dedup ? O_RDWR : O_RSTR);
|
opts.auto_dedup ? O_RDWR : O_RSTR, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -68,8 +68,8 @@ struct page_read {
|
|||||||
unsigned id; /* for logging */
|
unsigned id; /* for logging */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int open_page_read(int pid, struct page_read *, int flags);
|
extern int open_page_read(int pid, struct page_read *, int flags, bool shmem);
|
||||||
extern int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags);
|
extern int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags, bool shmem);
|
||||||
extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov);
|
extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov);
|
||||||
extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn);
|
extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn);
|
||||||
|
|
||||||
|
14
page-read.c
14
page-read.c
@ -195,7 +195,7 @@ static int try_open_parent(int dfd, int pid, struct page_read *pr, int flags)
|
|||||||
if (!parent)
|
if (!parent)
|
||||||
goto err_cl;
|
goto err_cl;
|
||||||
|
|
||||||
if (open_page_read_at(pfd, pid, parent, flags)) {
|
if (open_page_read_at(pfd, pid, parent, flags, false)) {
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
goto err_free;
|
goto err_free;
|
||||||
xfree(parent);
|
xfree(parent);
|
||||||
@ -214,15 +214,15 @@ err_cl:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags)
|
int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags, bool shmem)
|
||||||
{
|
{
|
||||||
pr->pe = NULL;
|
pr->pe = NULL;
|
||||||
pr->bunch.iov_len = 0;
|
pr->bunch.iov_len = 0;
|
||||||
pr->bunch.iov_base = NULL;
|
pr->bunch.iov_base = NULL;
|
||||||
|
|
||||||
pr->fd = open_image_at(dfd, CR_FD_PAGEMAP, O_RSTR, (long)pid);
|
pr->fd = open_image_at(dfd, shmem ? CR_FD_SHMEM_PAGEMAP : CR_FD_PAGEMAP, O_RSTR, (long)pid);
|
||||||
if (pr->fd < 0) {
|
if (pr->fd < 0) {
|
||||||
pr->fd_pg = open_image_at(dfd, CR_FD_PAGES_OLD, flags, pid);
|
pr->fd_pg = open_image_at(dfd, shmem ? CR_FD_SHM_PAGES_OLD : CR_FD_PAGES_OLD, flags, pid);
|
||||||
if (pr->fd_pg < 0)
|
if (pr->fd_pg < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -233,7 +233,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags)
|
|||||||
} else {
|
} else {
|
||||||
static unsigned ids = 1;
|
static unsigned ids = 1;
|
||||||
|
|
||||||
if (try_open_parent(dfd, pid, pr, flags)) {
|
if (!shmem && try_open_parent(dfd, pid, pr, flags)) {
|
||||||
close(pr->fd);
|
close(pr->fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -258,7 +258,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int open_page_read(int pid, struct page_read *pr, int flags)
|
int open_page_read(int pid, struct page_read *pr, int flags, bool shmem)
|
||||||
{
|
{
|
||||||
return open_page_read_at(get_service_fd(IMG_FD_OFF), pid, pr, flags);
|
return open_page_read_at(get_service_fd(IMG_FD_OFF), pid, pr, flags, shmem);
|
||||||
}
|
}
|
||||||
|
@ -656,7 +656,7 @@ static int open_page_local_xfer(struct page_xfer *xfer, int fd_type, long id)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = open_page_read_at(pfd, id, xfer->parent, O_RDWR);
|
ret = open_page_read_at(pfd, id, xfer->parent, O_RDWR, false);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_perror("Can't dedup old image format");
|
pr_perror("Can't dedup old image format");
|
||||||
xfree(xfer->parent);
|
xfree(xfer->parent);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user