Commit 55ffa830 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

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: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent bcba8d97
...@@ -193,7 +193,7 @@ extern int read_fd_link(int lfd, char *buf, size_t size); ...@@ -193,7 +193,7 @@ extern int read_fd_link(int lfd, char *buf, size_t size);
#define USEC_PER_SEC 1000000L #define USEC_PER_SEC 1000000L
#define NSEC_PER_SEC 1000000000L #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 * Check whether @str starts with @sub and report the
......
...@@ -354,7 +354,7 @@ static int init_zero_page_pfn() ...@@ -354,7 +354,7 @@ static int init_zero_page_pfn()
return -1; 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); munmap(addr, PAGE_SIZE);
if (kdat.zero_page_pfn == 0) if (kdat.zero_page_pfn == 0)
......
...@@ -784,14 +784,23 @@ out: ...@@ -784,14 +784,23 @@ out:
return ret; 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; off_t off;
bool close_fd = false;
fd = open_proc(PROC_SELF, "pagemap"); if (fd < 0) {
if (fd < 0) fd = open_proc(PROC_SELF, "pagemap");
return -1; if (fd < 0)
return -1;
close_fd = true;
}
off = (vaddr / page_size()) * sizeof(u64); off = (vaddr / page_size()) * sizeof(u64);
ret = pread(fd, pfn, sizeof(*pfn), off); ret = pread(fd, pfn, sizeof(*pfn), off);
...@@ -803,7 +812,9 @@ int vaddr_to_pfn(unsigned long vaddr, u64 *pfn) ...@@ -803,7 +812,9 @@ int vaddr_to_pfn(unsigned long vaddr, u64 *pfn)
ret = 0; ret = 0;
} }
close(fd); if (close_fd)
close(fd);
return ret; return ret;
} }
......
...@@ -493,7 +493,7 @@ int vdso_init_dump(void) ...@@ -493,7 +493,7 @@ int vdso_init_dump(void)
if (kdat.pmap != PM_FULL) if (kdat.pmap != PM_FULL)
pr_info("VDSO detection turned off\n"); 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 -1;
return 0; return 0;
......
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