mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-18 00:58:31 +00:00
util: Add fd parameter to vaddr_to_pfn()
Expand vaddr_to_pfn() so it can read and translate to PFN from already opened fd. This can be used as optimization if one need to translate a couple of addresses and also to read other task's PFN. I'll use it in the next patch for reading other tasks's vdso's PFN. Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
parent
bcba8d9702
commit
55ffa83064
4 changed files with 20 additions and 9 deletions
|
|
@ -193,7 +193,7 @@ extern int read_fd_link(int lfd, char *buf, size_t size);
|
|||
#define USEC_PER_SEC 1000000L
|
||||
#define NSEC_PER_SEC 1000000000L
|
||||
|
||||
int vaddr_to_pfn(unsigned long vaddr, u64 *pfn);
|
||||
int vaddr_to_pfn(int fd, unsigned long vaddr, u64 *pfn);
|
||||
|
||||
/*
|
||||
* Check whether @str starts with @sub and report the
|
||||
|
|
|
|||
|
|
@ -354,7 +354,7 @@ static int init_zero_page_pfn()
|
|||
return -1;
|
||||
}
|
||||
|
||||
ret = vaddr_to_pfn((unsigned long)addr, &kdat.zero_page_pfn);
|
||||
ret = vaddr_to_pfn(-1, (unsigned long)addr, &kdat.zero_page_pfn);
|
||||
munmap(addr, PAGE_SIZE);
|
||||
|
||||
if (kdat.zero_page_pfn == 0)
|
||||
|
|
|
|||
23
criu/util.c
23
criu/util.c
|
|
@ -784,14 +784,23 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int vaddr_to_pfn(unsigned long vaddr, u64 *pfn)
|
||||
/*
|
||||
* Get PFN from pagemap file for virtual address vaddr.
|
||||
* Optionally if fd >= 0, it's used as pagemap file descriptor
|
||||
* (may be other task's pagemap)
|
||||
*/
|
||||
int vaddr_to_pfn(int fd, unsigned long vaddr, u64 *pfn)
|
||||
{
|
||||
int fd, ret = -1;
|
||||
int ret = -1;
|
||||
off_t off;
|
||||
bool close_fd = false;
|
||||
|
||||
fd = open_proc(PROC_SELF, "pagemap");
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
if (fd < 0) {
|
||||
fd = open_proc(PROC_SELF, "pagemap");
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
close_fd = true;
|
||||
}
|
||||
|
||||
off = (vaddr / page_size()) * sizeof(u64);
|
||||
ret = pread(fd, pfn, sizeof(*pfn), off);
|
||||
|
|
@ -803,7 +812,9 @@ int vaddr_to_pfn(unsigned long vaddr, u64 *pfn)
|
|||
ret = 0;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
if (close_fd)
|
||||
close(fd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -493,7 +493,7 @@ int vdso_init_dump(void)
|
|||
|
||||
if (kdat.pmap != PM_FULL)
|
||||
pr_info("VDSO detection turned off\n");
|
||||
else if (vaddr_to_pfn(vdso_maps.vdso_start, &vdso_pfn))
|
||||
else if (vaddr_to_pfn(-1, vdso_maps.vdso_start, &vdso_pfn))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue