Commit fab5f12f authored by Pavel Emelyanov's avatar Pavel Emelyanov

dump: Open pagemap only once

When dumping pages we use 3 commands for parasite -- prep,
dump (per-vma) and fini. Open the pagemap file in prep,
insteam of in each per-vma dump.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 6a5ac971
...@@ -122,6 +122,7 @@ static inline int should_dump_page(VmaEntry *vmae, u64 pme) ...@@ -122,6 +122,7 @@ static inline int should_dump_page(VmaEntry *vmae, u64 pme)
} }
static int fd_pages = -1; static int fd_pages = -1;
static int fd_pagemap = -1;
static int dump_pages_init() static int dump_pages_init()
{ {
...@@ -129,6 +130,13 @@ static int dump_pages_init() ...@@ -129,6 +130,13 @@ static int dump_pages_init()
if (fd_pages < 0) if (fd_pages < 0)
return fd_pages; return fd_pages;
fd_pagemap = sys_open("/proc/self/pagemap", O_RDONLY, 0);
if (fd_pagemap < 0) {
sys_write_msg("Can't open self pagemap");
sys_close(fd_pages);
return fd_pagemap;
}
return 0; return 0;
} }
...@@ -159,7 +167,7 @@ static int dump_pages(struct parasite_dump_pages_args *args) ...@@ -159,7 +167,7 @@ static int dump_pages(struct parasite_dump_pages_args *args)
unsigned long nrpages, pfn, length; unsigned long nrpages, pfn, length;
unsigned long prot_old, prot_new; unsigned long prot_old, prot_new;
u64 *map, off; u64 *map, off;
int ret = -1, fd; int ret = -1;
args->nrpages_dumped = 0; args->nrpages_dumped = 0;
args->nrpages_skipped = 0; args->nrpages_skipped = 0;
...@@ -179,30 +187,20 @@ static int dump_pages(struct parasite_dump_pages_args *args) ...@@ -179,30 +187,20 @@ static int dump_pages(struct parasite_dump_pages_args *args)
goto err; goto err;
} }
fd = sys_open("/proc/self/pagemap", O_RDONLY, 0);
if (fd < 0) {
sys_write_msg("Can't open self pagemap");
ret = fd;
goto err_free;
}
off = pfn * sizeof(*map); off = pfn * sizeof(*map);
off = sys_lseek(fd, off, SEEK_SET); off = sys_lseek(fd_pagemap, off, SEEK_SET);
if (off != pfn * sizeof(*map)) { if (off != pfn * sizeof(*map)) {
sys_write_msg("Can't seek pagemap"); sys_write_msg("Can't seek pagemap");
ret = off; ret = off;
goto err_close; goto err_free;
} }
ret = sys_read(fd, map, length); ret = sys_read(fd_pagemap, map, length);
if (ret != length) { if (ret != length) {
sys_write_msg("Can't read self pagemap"); sys_write_msg("Can't read self pagemap");
goto err_free; goto err_free;
} }
sys_close(fd);
fd = fd_pages;
/* /*
* Try to change page protection if needed so we would * Try to change page protection if needed so we would
* be able to dump contents. * be able to dump contents.
...@@ -230,10 +228,10 @@ static int dump_pages(struct parasite_dump_pages_args *args) ...@@ -230,10 +228,10 @@ static int dump_pages(struct parasite_dump_pages_args *args)
*/ */
vaddr = (unsigned long)args->vma_entry.start + pfn * PAGE_SIZE; vaddr = (unsigned long)args->vma_entry.start + pfn * PAGE_SIZE;
ret = sys_write_safe(fd, &vaddr, sizeof(vaddr)); ret = sys_write_safe(fd_pages, &vaddr, sizeof(vaddr));
if (ret) if (ret)
return ret; return ret;
ret = sys_write_safe(fd, (void *)vaddr, PAGE_SIZE); ret = sys_write_safe(fd_pages, (void *)vaddr, PAGE_SIZE);
if (ret) if (ret)
return ret; return ret;
...@@ -260,15 +258,16 @@ err_free: ...@@ -260,15 +258,16 @@ err_free:
brk_free(length); brk_free(length);
err: err:
return ret; return ret;
err_close:
sys_close(fd);
goto err_free;
} }
static int dump_pages_fini(void) static int dump_pages_fini(void)
{ {
return sys_close(fd_pages); int ret;
ret = sys_close(fd_pagemap);
ret |= sys_close(fd_pages);
return ret;
} }
static int dump_sigact(struct parasite_dump_sa_args *da) static int dump_sigact(struct parasite_dump_sa_args *da)
......
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