Commit 71d93a5a authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

shmem: Split some routines

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 3bdaf5a9
...@@ -457,12 +457,12 @@ static int shmem_wait_and_open(int pid, struct shmem_info *si, VmaEntry *vi) ...@@ -457,12 +457,12 @@ static int shmem_wait_and_open(int pid, struct shmem_info *si, VmaEntry *vi)
return 0; return 0;
} }
static int restore_shmem_content(void *addr, struct shmem_info *si) static int do_restore_shmem_content(void *addr, unsigned long size, unsigned long shmid)
{ {
int ret = 0; int ret = 0;
struct page_read pr; struct page_read pr;
ret = open_page_read(si->shmid, &pr, PR_SHMEM); ret = open_page_read(shmid, &pr, PR_SHMEM);
if (ret <= 0) if (ret <= 0)
return -1; return -1;
...@@ -477,7 +477,7 @@ static int restore_shmem_content(void *addr, struct shmem_info *si) ...@@ -477,7 +477,7 @@ static int restore_shmem_content(void *addr, struct shmem_info *si)
vaddr = (unsigned long)decode_pointer(pr.pe->vaddr); vaddr = (unsigned long)decode_pointer(pr.pe->vaddr);
nr_pages = pr.pe->nr_pages; nr_pages = pr.pe->nr_pages;
if (vaddr + nr_pages * PAGE_SIZE > si->size) if (vaddr + nr_pages * PAGE_SIZE > size)
break; break;
pr.read_pages(&pr, vaddr, nr_pages, addr + vaddr, 0); pr.read_pages(&pr, vaddr, nr_pages, addr + vaddr, 0);
...@@ -487,6 +487,11 @@ static int restore_shmem_content(void *addr, struct shmem_info *si) ...@@ -487,6 +487,11 @@ static int restore_shmem_content(void *addr, struct shmem_info *si)
return ret; return ret;
} }
static int restore_shmem_content(void *addr, struct shmem_info *si)
{
return do_restore_shmem_content(addr, si->size, si->shmid);
}
static int open_shmem(int pid, struct vma_area *vma) static int open_shmem(int pid, struct vma_area *vma)
{ {
VmaEntry *vi = vma->e; VmaEntry *vi = vma->e;
...@@ -658,32 +663,18 @@ static int next_data_segment(int fd, unsigned long pfn, ...@@ -658,32 +663,18 @@ static int next_data_segment(int fd, unsigned long pfn,
return 0; return 0;
} }
static int dump_one_shmem(struct shmem_info *si) static int do_dump_one_shmem(int fd, void *addr, struct shmem_info *si)
{ {
struct page_pipe *pp; struct page_pipe *pp;
struct page_xfer xfer; struct page_xfer xfer;
int err, ret = -1, fd; int err, ret = -1;
void *addr = NULL;
unsigned long pfn, nrpages, next_data_pnf = 0, next_hole_pfn = 0; unsigned long pfn, nrpages, next_data_pnf = 0, next_hole_pfn = 0;
pr_info("Dumping shared memory %ld\n", si->shmid);
fd = open_proc(si->pid, "map_files/%lx-%lx", si->start, si->end);
if (fd < 0)
goto err;
addr = mmap(NULL, si->size, PROT_READ, MAP_SHARED, fd, 0);
if (addr == MAP_FAILED) {
pr_err("Can't map shmem 0x%lx (0x%lx-0x%lx)\n",
si->shmid, si->start, si->end);
goto err;
}
nrpages = (si->size + PAGE_SIZE - 1) / PAGE_SIZE; nrpages = (si->size + PAGE_SIZE - 1) / PAGE_SIZE;
pp = create_page_pipe((nrpages + 1) / 2, NULL, PP_CHUNK_MODE); pp = create_page_pipe((nrpages + 1) / 2, NULL, PP_CHUNK_MODE);
if (!pp) if (!pp)
goto err_unmap; goto err;
err = open_page_xfer(&xfer, CR_FD_SHMEM_PAGEMAP, si->shmid); err = open_page_xfer(&xfer, CR_FD_SHMEM_PAGEMAP, si->shmid);
if (err) if (err)
...@@ -735,10 +726,34 @@ err_xfer: ...@@ -735,10 +726,34 @@ err_xfer:
xfer.close(&xfer); xfer.close(&xfer);
err_pp: err_pp:
destroy_page_pipe(pp); destroy_page_pipe(pp);
err_unmap:
munmap(addr, si->size);
err: err:
close_safe(&fd); return ret;
}
static int dump_one_shmem(struct shmem_info *si)
{
int fd, ret = -1;
void *addr;
pr_info("Dumping shared memory %ld\n", si->shmid);
fd = open_proc(si->pid, "map_files/%lx-%lx", si->start, si->end);
if (fd < 0)
goto err;
addr = mmap(NULL, si->size, PROT_READ, MAP_SHARED, fd, 0);
if (addr == MAP_FAILED) {
pr_err("Can't map shmem 0x%lx (0x%lx-0x%lx)\n",
si->shmid, si->start, si->end);
goto errc;
}
ret = do_dump_one_shmem(fd, addr, si);
munmap(addr, si->size);
errc:
close(fd);
err:
return ret; return ret;
} }
......
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