[CRIU] [PATCH] criu: pagemap-cache -- Drop off greedy mode
Cyrill Gorcunov
gorcunov at openvz.org
Thu May 5 13:55:15 PDT 2016
It never worked properly before and correct
implementation requires interactions with
parasite page fetching. So simply zap it
for a while.
Reported-by: Pavel Emelyanov <xemul at virtuozzo.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
criu/pagemap-cache.c | 38 ++++++++++++++++++--------------------
1 file changed, 18 insertions(+), 20 deletions(-)
diff --git a/criu/pagemap-cache.c b/criu/pagemap-cache.c
index e38bc3fb6b16..28bd8caa1f97 100644
--- a/criu/pagemap-cache.c
+++ b/criu/pagemap-cache.c
@@ -48,9 +48,19 @@ int pmc_init(pmc_t *pmc, pid_t pid, const struct list_head *vma_head, size_t siz
goto err;
if (kdat.pmap == PM_DISABLED) {
- pmc->fd = -1;
- pr_warn("No pagemap for %d available, "
- "switching to greedy mode\n", pid);
+ /*
+ * FIXME We might need to implement greedy
+ * mode via reading all pages available inside
+ * parasite.
+ *
+ * Actually since linux-4.4 the pagemap file
+ * is available for usernamespace with hiding
+ * PFNs but providing page attributes, so other
+ * option simply require kernel 4.4 and above
+ * for usernamespace support.
+ */
+ pr_err("No pagemap for %d available\n", pid);
+ goto err;
} else {
pmc->fd = open_proc(pid, "pagemap");
if (pmc->fd < 0)
@@ -130,24 +140,12 @@ static int pmc_fill_cache(pmc_t *pmc, const struct vma_area *vma)
size_map = PAGEMAP_LEN(pmc->end - pmc->start);
BUG_ON(pmc->map_len < size_map);
+ BUG_ON(pmc->fd < 0);
- if (unlikely(pmc->fd < 0)) {
- u64 pme = PME_PRESENT;
- size_t i;
-
- /*
- * We don't have access to the dumpee pagemap so fill
- * everything as present. It's better than refuse
- * to dump because it simply disables optimisation.
- */
- for (i = 0; i < (size_map / sizeof(pme)); i++)
- pmc->map[i] = pme;
- } else {
- if (pread(pmc->fd, pmc->map, size_map, PAGEMAP_PFN_OFF(pmc->start)) != size_map) {
- pmc_zap(pmc);
- pr_perror("Can't read %d's pagemap file", pmc->pid);
- return -1;
- }
+ if (pread(pmc->fd, pmc->map, size_map, PAGEMAP_PFN_OFF(pmc->start)) != size_map) {
+ pmc_zap(pmc);
+ pr_perror("Can't read %d's pagemap file", pmc->pid);
+ return -1;
}
return 0;
--
2.5.5
More information about the CRIU
mailing list