[CRIU] [PATCH 07/12] restore: map taks_args and thread_args earlier
Andrey Vagin
avagin at openvz.org
Tue Dec 18 01:36:10 EST 2012
A task_args saves a number of shared pending signals and
thread_args save a number of private pendign signals.
All signal images should be read for determing a size of siginfo-s.
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
cr-restore.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/cr-restore.c b/cr-restore.c
index cb4d943..1b39f97 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -1630,6 +1630,20 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
current->nr_threads,
KBYTES(restore_thread_vma_len));
+ /* VMA we need to run task_restore code */
+ mem = mmap(NULL,
+ restore_task_vma_len + restore_thread_vma_len,
+ PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANON, 0, 0);
+ if (mem == MAP_FAILED) {
+ pr_err("Can't mmap section for restore code\n");
+ goto err;
+ }
+
+ memzero(mem, restore_task_vma_len + restore_thread_vma_len);
+ task_args = mem;
+ thread_args = mem + restore_task_vma_len;
+
restore_bootstrap_len = restorer_len +
restore_task_vma_len +
restore_thread_vma_len +
@@ -1673,16 +1687,14 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
exec_mem_hint += restorer_len;
/* VMA we need to run task_restore code */
- mem = mmap((void *)exec_mem_hint,
+ mem = mremap(mem, restore_task_vma_len + restore_thread_vma_len,
restore_task_vma_len + restore_thread_vma_len,
- PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANON | MAP_FIXED, 0, 0);
+ MREMAP_FIXED | MREMAP_MAYMOVE, (void *)exec_mem_hint);
if (mem != (void *)exec_mem_hint) {
pr_err("Can't mmap section for restore code\n");
goto err;
}
- memzero(mem, restore_task_vma_len + restore_thread_vma_len);
task_args = mem;
thread_args = mem + restore_task_vma_len;
--
1.7.11.7
More information about the CRIU
mailing list