Commit ea8b5dab authored by Fyodor Bocharov's avatar Fyodor Bocharov Committed by Pavel Emelyanov

page-read/xfer: add ability to open image hierarchy for shmem

In order to restore deduplicated anonymous shared memory we need
to open it's parent pagemap images. Code that opens parent pagemap
images already exists for anonymous private memory. All we need to do
is to remove couple of checks from existing code. Also we need to rename
pid to id because now we can pass either pid or shmid and the actual
meaning depends on pr_flags.
Signed-off-by: 's avatarFyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: 's avatarEugene Batalov <eabatalov89@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 740305be
......@@ -85,8 +85,9 @@ struct page_read {
* 0 -- no images
* 1 -- opened
*/
extern int open_page_read(int pid, struct page_read *, int pr_flags);
extern int open_page_read_at(int dfd, int pid, struct page_read *pr, int pr_flags);
extern int open_page_read(int id, struct page_read *, int pr_flags);
extern int open_page_read_at(int dfd, int id, struct page_read *pr,
int pr_flags);
extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov);
extern void iovec2pagemap(struct iovec *iov, PagemapEntry *pe);
......
......@@ -279,9 +279,10 @@ static int open_page_local_xfer(struct page_xfer *xfer, int fd_type, long id)
* to exist in parent (either pagemap or hole)
*/
xfer->parent = NULL;
if (fd_type == CR_FD_PAGEMAP) {
if (fd_type == CR_FD_PAGEMAP || fd_type == CR_FD_SHMEM_PAGEMAP) {
int ret;
int pfd;
int pr_flags = (fd_type == CR_FD_PAGEMAP) ? PR_TASK : PR_SHMEM;
pfd = openat(get_service_fd(IMG_FD_OFF), CR_PARENT_LINK, O_RDONLY);
if (pfd < 0 && errno == ENOENT)
......@@ -293,7 +294,7 @@ static int open_page_local_xfer(struct page_xfer *xfer, int fd_type, long id)
return -1;
}
ret = open_page_read_at(pfd, id, xfer->parent, PR_TASK);
ret = open_page_read_at(pfd, id, xfer->parent, pr_flags);
if (ret <= 0) {
pr_perror("No parent image found, though parent directory is set");
xfree(xfer->parent);
......
......@@ -406,7 +406,7 @@ free_pagemaps:
return -1;
}
int open_page_read_at(int dfd, int pid, struct page_read *pr, int pr_flags)
int open_page_read_at(int dfd, int id, struct page_read *pr, int pr_flags)
{
int flags, i_typ;
static unsigned ids = 1;
......@@ -438,7 +438,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int pr_flags)
pr->bunch.iov_base = NULL;
pr->pmes = NULL;
pr->pmi = open_image_at(dfd, i_typ, O_RSTR, (long)pid);
pr->pmi = open_image_at(dfd, i_typ, O_RSTR, (long)id);
if (!pr->pmi)
return -1;
......@@ -447,7 +447,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int pr_flags)
return 0;
}
if ((i_typ != CR_FD_SHMEM_PAGEMAP) && try_open_parent(dfd, pid, pr, pr_flags)) {
if (try_open_parent(dfd, id, pr, pr_flags)) {
close_image(pr->pmi);
return -1;
}
......@@ -476,7 +476,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int pr_flags)
return 1;
}
int open_page_read(int pid, struct page_read *pr, int pr_flags)
int open_page_read(int id, struct page_read *pr, int pr_flags)
{
return open_page_read_at(get_service_fd(IMG_FD_OFF), pid, pr, pr_flags);
return open_page_read_at(get_service_fd(IMG_FD_OFF), id, pr, pr_flags);
}
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