Commit d10835c4 authored by Pavel Emelyanov's avatar Pavel Emelyanov

dump: Dont read prohibited kernel files

In particular, we won't be able to do memory tracking and
zero page detection.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Looks-good-to-me: Andrew Vagin <avagin@virtuozzo.com>
parent 2e2e1c13
...@@ -227,7 +227,13 @@ int kerndat_get_dirty_track(void) ...@@ -227,7 +227,13 @@ int kerndat_get_dirty_track(void)
* was at least once re-set. (this is to be removed in * was at least once re-set. (this is to be removed in
* a couple of kernel releases) * a couple of kernel releases)
*/ */
do_task_reset_dirty_track(getpid()); ret = do_task_reset_dirty_track(getpid());
if (ret < 0)
return ret;
if (ret == 1)
goto no_dt;
ret = -1;
pm2 = open("/proc/self/pagemap", O_RDONLY); pm2 = open("/proc/self/pagemap", O_RDONLY);
if (pm2 < 0) { if (pm2 < 0) {
pr_perror("Can't open pagemap file"); pr_perror("Can't open pagemap file");
...@@ -249,6 +255,7 @@ int kerndat_get_dirty_track(void) ...@@ -249,6 +255,7 @@ int kerndat_get_dirty_track(void)
pr_info("Dirty track supported on kernel\n"); pr_info("Dirty track supported on kernel\n");
kdat.has_dirty_track = true; kdat.has_dirty_track = true;
} else { } else {
no_dt:
pr_info("Dirty tracking support is OFF\n"); pr_info("Dirty tracking support is OFF\n");
if (opts.track_mem) { if (opts.track_mem) {
pr_err("Tracking memory is not available\n"); pr_err("Tracking memory is not available\n");
...@@ -317,7 +324,10 @@ static int init_zero_page_pfn() ...@@ -317,7 +324,10 @@ static int init_zero_page_pfn()
ret = vaddr_to_pfn((unsigned long)addr, &kdat.zero_page_pfn); ret = vaddr_to_pfn((unsigned long)addr, &kdat.zero_page_pfn);
munmap(addr, PAGE_SIZE); munmap(addr, PAGE_SIZE);
if (kdat.zero_page_pfn == 0) if (ret == 1) {
pr_info("Zero page detection failed, optimization turns off.\n");
ret = 0;
} else if (kdat.zero_page_pfn == 0)
ret = -1; ret = -1;
return ret; return ret;
......
...@@ -26,12 +26,16 @@ ...@@ -26,12 +26,16 @@
static int task_reset_dirty_track(int pid) static int task_reset_dirty_track(int pid)
{ {
int ret;
if (!opts.track_mem) if (!opts.track_mem)
return 0; return 0;
BUG_ON(!kdat.has_dirty_track); BUG_ON(!kdat.has_dirty_track);
return do_task_reset_dirty_track(pid); ret = do_task_reset_dirty_track(pid);
BUG_ON(ret == 1);
return ret;
} }
int do_task_reset_dirty_track(int pid) int do_task_reset_dirty_track(int pid)
...@@ -41,9 +45,9 @@ int do_task_reset_dirty_track(int pid) ...@@ -41,9 +45,9 @@ int do_task_reset_dirty_track(int pid)
pr_info("Reset %d's dirty tracking\n", pid); pr_info("Reset %d's dirty tracking\n", pid);
fd = open_proc_rw(pid, "clear_refs"); fd = __open_proc(pid, EACCES, O_RDWR, "clear_refs");
if (fd < 0) if (fd < 0)
return -1; return errno == EACCES ? 1 : -1;
ret = write(fd, cmd, sizeof(cmd)); ret = write(fd, cmd, sizeof(cmd));
close(fd); close(fd);
...@@ -251,8 +255,6 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl, ...@@ -251,8 +255,6 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
pr_info("Dumping pages (type: %d pid: %d)\n", CR_FD_PAGES, ctl->pid.real); pr_info("Dumping pages (type: %d pid: %d)\n", CR_FD_PAGES, ctl->pid.real);
pr_info("----------------------------------------\n"); pr_info("----------------------------------------\n");
BUG_ON(kdat.zero_page_pfn == 0);
timing_start(TIME_MEMDUMP); timing_start(TIME_MEMDUMP);
pr_debug(" Private vmas %lu/%lu pages\n", pr_debug(" Private vmas %lu/%lu pages\n",
......
...@@ -763,9 +763,9 @@ int vaddr_to_pfn(unsigned long vaddr, u64 *pfn) ...@@ -763,9 +763,9 @@ int vaddr_to_pfn(unsigned long vaddr, u64 *pfn)
int fd, ret = -1; int fd, ret = -1;
off_t off; off_t off;
fd = open_proc(getpid(), "pagemap"); fd = __open_proc(getpid(), EPERM, O_RDONLY, "pagemap");
if (fd < 0) if (fd < 0)
return -1; return errno == EPERM ? 1 : -1;
off = (vaddr / page_size()) * sizeof(u64); off = (vaddr / page_size()) * sizeof(u64);
if (lseek(fd, off, SEEK_SET) != off) { if (lseek(fd, off, SEEK_SET) != off) {
......
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