[CRIU] Re: [PATCH cr] restore: add helper for getting a temporary
address of vma
Pavel Emelyanov
xemul at parallels.com
Thu Oct 18 11:29:56 EDT 2012
On 10/18/2012 07:26 PM, Andrey Vagin wrote:
>> For me it will be OK if you just use some #define or static inline helper
>> titled e.g. vma_premmaped_start(vma) that will look like "return vma->shimd".
>
> Pavel, is it what you want?
Yes, thanks.
> It will not be commit as this. This patch will be merged in other patches.
>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> cr-restore.c | 33 +++++++++++++++++++--------------
> include/image.h | 1 +
> restorer.c | 4 ++--
> 3 files changed, 22 insertions(+), 16 deletions(-)
>
> diff --git a/cr-restore.c b/cr-restore.c
> index c8cb690..2f6541f 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -208,7 +208,7 @@ static int map_private_vma(pid_t pid, struct vma_area *vma,
> p->vma.start == vma->vma.start) {
> pr_info("COW 0x%016lx-0x%016lx 0x%016lx vma\n",
> vma->vma.start, vma->vma.end, vma->vma.pgoff);
> - vma->vma.shmid = p->vma.shmid;
> + vma->vma.shmid = vma_entry_tmp_addr(&p->vma);
> break;
> }
>
> @@ -216,7 +216,7 @@ static int map_private_vma(pid_t pid, struct vma_area *vma,
>
> *pvma = list_entry(p->list.prev, struct vma_area, list);
>
> - if (!vma->vma.shmid) {
> + if (!vma_entry_tmp_addr(&vma->vma)) {
> void *addr;
>
> pr_info("Map 0x%016lx-0x%016lx 0x%016lx vma\n",
> @@ -287,7 +287,8 @@ static int restore_anon_vma_content(pid_t pid)
> return -1;
> }
>
> - p = (void *) (va - vma->vma.start + vma->vma.shmid);
> + p = (void *) (va - vma->vma.start +
> + vma_entry_tmp_addr(&vma->vma));
> if (memcmp(p, buf, PAGE_SIZE) == 0)
> continue;
>
> @@ -298,6 +299,7 @@ static int restore_anon_vma_content(pid_t pid)
> /* Remove pages, which were not shared with a child */
> list_for_each_entry(vma, &vma_list, list) {
> unsigned long size, i = 0;
> + void *addr = (void *) vma_entry_tmp_addr(&vma->vma);
>
> if (vma->ppage_bitmap == NULL)
> continue;
> @@ -310,7 +312,7 @@ static int restore_anon_vma_content(pid_t pid)
> if ( i >= size)
> break;
>
> - ret = madvise((void *)(vma->vma.shmid + PAGE_SIZE * i),
> + ret = madvise(addr + PAGE_SIZE * i,
> PAGE_SIZE, MADV_DONTNEED);
> if (ret < 0) {
> pr_perror("madvise failed\n");
> @@ -1476,6 +1478,7 @@ static int mark_target_vmas(struct list_head *self_vma_list)
> /* Some VMA may be merged, so they are should be splitted */
> while (&vma->list != self_vma_list) {
> struct vma_area *c, *n;
> + unsigned long caddr;
>
> c = NULL;
> len++;
> @@ -1483,6 +1486,7 @@ static int mark_target_vmas(struct list_head *self_vma_list)
> /* Try to find a first target vma */
> list_for_each_entry(n, &vma_list, list) {
> unsigned long start = vma->vma.start;
> + unsigned long naddr = vma_entry_tmp_addr(&n->vma);
>
> if (!vma_priv(&n->vma))
> continue;
> @@ -1490,10 +1494,11 @@ static int mark_target_vmas(struct list_head *self_vma_list)
> if (n->vma.flags & MAP_GROWSDOWN)
> start -= PAGE_SIZE; /* guard page */
>
> - if (n->vma.shmid >= start &&
> - n->vma.shmid < vma->vma.end &&
> - (c == NULL || c->vma.shmid > n->vma.shmid))
> + if (naddr >= start && naddr < vma->vma.end &&
> + (c == NULL || caddr > naddr)) {
> c = n;
> + caddr = naddr;
> + }
> }
>
> if (c == NULL) {
> @@ -1504,20 +1509,20 @@ static int mark_target_vmas(struct list_head *self_vma_list)
> }
>
> pr_debug("Mark VMA 0x%016lx-0x%016lx inside 0x%016lx-0x%016lx\n",
> - c->vma.shmid, c->vma.shmid + vma_area_len(c),
> + caddr, caddr + vma_area_len(c),
> vma->vma.start, vma->vma.end);
>
> /* A first part isn't a target VMA */
> - if (c->vma.shmid > vma->vma.start) {
> + if (caddr > vma->vma.start) {
> BUG_ON(c->vma.flags & MAP_GROWSDOWN);
> new = alloc_vma_area();
> if (new == NULL)
> return -1;
> memcpy(new, vma, sizeof(*vma));
>
> - vma->vma.start = c->vma.shmid;
> + vma->vma.start = caddr;
>
> - new->vma.end = c->vma.shmid;
> + new->vma.end = caddr;
> list_add(&new->list, &new_list);
> len++;
> }
> @@ -1526,15 +1531,15 @@ static int mark_target_vmas(struct list_head *self_vma_list)
> vma->vma.start -= PAGE_SIZE; /* guard page */
>
> /* Split a target VMA and handle a remaining part again */
> - if (c->vma.shmid + vma_area_len(c) < vma->vma.end) {
> + if (caddr + vma_area_len(c) < vma->vma.end) {
> new = alloc_vma_area();
> if (new == NULL)
> return -1;
> memcpy(new, vma, sizeof(*vma));
>
> - new->vma.start = c->vma.shmid + vma_area_len(c);
> + new->vma.start = caddr + vma_area_len(c);
>
> - vma->vma.end = c->vma.shmid + vma_area_len(c);
> + vma->vma.end = caddr + vma_area_len(c);
> vma->vma.status |= VMA_AREA_DEST;
> list_move_tail(&vma->list, &new_list);
>
> diff --git a/include/image.h b/include/image.h
> index 4fb4eab..616badc 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -95,6 +95,7 @@
>
> #define VMA_AREA_DEST (1 << 11)
>
> +#define vma_entry_tmp_addr(vma) ((vma)->shmid)
> #define vma_entry_is(vma, s) (((vma)->status & (s)) == (s))
> #define vma_entry_len(vma) ((vma)->end - (vma)->start)
>
> diff --git a/restorer.c b/restorer.c
> index 48aef03..3d21f83 100644
> --- a/restorer.c
> +++ b/restorer.c
> @@ -340,12 +340,12 @@ long __export_restore_task(struct task_restore_core_args *args)
> if (!vma_priv(vma_entry))
> continue;
>
> - va = sys_mremap(vma_entry->shmid,
> + va = sys_mremap(vma_entry_tmp_addr(vma_entry),
> vma_entry_len(vma_entry), vma_entry_len(vma_entry),
> MREMAP_MAYMOVE | MREMAP_FIXED, vma_entry->start);
> if (va != vma_entry->start) {
> pr_err("Unable to remap %lx -> %lx mapping with %lx\n",
> - vma_entry->shmid, vma_entry->start, va);
> + vma_entry_tmp_addr(vma_entry), vma_entry->start, va);
> goto core_restore_end;
> }
> }
>
More information about the CRIU
mailing list