[CRIU] [PATCH 5/8] restorer/parasite-vdso: Don't move vvar if failed to move vdso
Dmitry Safonov
dima at arista.com
Fri Jul 26 01:01:11 MSK 2019
Also slight refactor.
Signed-off-by: Dmitry Safonov <dima at arista.com>
---
criu/pie/parasite-vdso.c | 51 +++++++++++++++++-----------------------
1 file changed, 22 insertions(+), 29 deletions(-)
diff --git a/criu/pie/parasite-vdso.c b/criu/pie/parasite-vdso.c
index 848883b4272f..be90090dee29 100644
--- a/criu/pie/parasite-vdso.c
+++ b/criu/pie/parasite-vdso.c
@@ -25,7 +25,7 @@
#define LOG_PREFIX "vdso: "
/* Updates @from on success */
-static int vdso_remap(char *who, unsigned long *from, unsigned long to, size_t size)
+static int remap_one(char *who, unsigned long *from, unsigned long to, size_t size)
{
unsigned long addr;
@@ -41,37 +41,38 @@ static int vdso_remap(char *who, unsigned long *from, unsigned long to, size_t s
return 0;
}
+static int park_at(struct vdso_maps *rt, unsigned long vdso, unsigned long vvar)
+{
+ int ret;
+
+ ret = remap_one("rt-vdso", &rt->vdso_start, vdso, rt->sym.vdso_size);
+
+ if (ret || !vvar)
+ return ret;
+
+ return remap_one("rt-vvar", &rt->vvar_start, vvar, rt->sym.vvar_size);
+}
+
/*
* Park runtime vDSO in some safe place where it can be accessible
* from the restorer
*/
-int vdso_do_park(struct vdso_maps *rt, unsigned long park_at,
- unsigned long park_size)
+int vdso_do_park(struct vdso_maps *rt, unsigned long addr, unsigned long space)
{
unsigned long vvar_size = rt->sym.vvar_size;
unsigned long vdso_size = rt->sym.vdso_size;
- unsigned long rt_vvar_park = park_at;
- unsigned long rt_vdso_park = park_at;
- int ret;
-
if (rt->vvar_start == VVAR_BAD_ADDR) {
- BUG_ON(vdso_size < park_size);
- return vdso_remap("rt-vdso", &rt->vdso_start,
- rt_vdso_park, vdso_size);
+ BUG_ON(vdso_size < space);
+ return park_at(rt, addr, 0);
}
- BUG_ON((vdso_size + vvar_size) < park_size);
+ BUG_ON((vdso_size + vvar_size) < space);
if (rt->sym.vdso_before_vvar)
- rt_vvar_park = park_at + vdso_size;
+ return park_at(rt, addr, addr + vvar_size);
else
- rt_vdso_park = park_at + vvar_size;
-
- ret = vdso_remap("rt-vdso", &rt->vdso_start, rt_vdso_park, vdso_size);
- ret |= vdso_remap("rt-vvar", &rt->vvar_start, rt_vvar_park, vvar_size);
-
- return ret;
+ return park_at(rt, addr + vdso_size, addr);
}
#ifndef CONFIG_COMPAT
@@ -147,7 +148,6 @@ static int remap_rt_vdso(VmaEntry *vma_vdso, VmaEntry *vma_vvar,
struct vdso_maps *rt)
{
void *remap_addr;
- int ret;
pr_info("Runtime vdso/vvar matches dumpee, remap inplace\n");
@@ -161,10 +161,8 @@ static int remap_rt_vdso(VmaEntry *vma_vdso, VmaEntry *vma_vvar,
return -1;
}
- if (!vma_vvar) {
- return vdso_remap("rt-vdso", &rt->vdso_start,
- vma_vdso->start, rt->sym.vdso_size);
- }
+ if (!vma_vvar)
+ return park_at(rt, vma_vdso->start, 0);
remap_addr = (void *)(uintptr_t)vma_vvar->start;
if (sys_munmap(remap_addr, vma_entry_len(vma_vvar))) {
@@ -172,12 +170,7 @@ static int remap_rt_vdso(VmaEntry *vma_vdso, VmaEntry *vma_vvar,
return -1;
}
- ret = vdso_remap("rt-vdso", &rt->vdso_start,
- vma_vdso->start, rt->sym.vdso_size);
- ret |= vdso_remap("rt-vvar", &rt->vvar_start,
- vma_vvar->start, rt->sym.vvar_size);
-
- return ret;
+ return park_at(rt, vma_vdso->start, vma_vvar->start);
}
/*
--
2.22.0
More information about the CRIU
mailing list