Commit 91f797f6 authored by Pavel Emelyanov's avatar Pavel Emelyanov

restore: Move posix-timers out of sigreturn_restore

The sigreturn_restore is the place when we prepare the restorer
layout and jump to it. Reading and decoding images should be done
earlier. The new rst-malloc engine allows for that.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent ed88f2df
...@@ -83,6 +83,7 @@ static int restore_task_with_children(void *); ...@@ -83,6 +83,7 @@ static int restore_task_with_children(void *);
static int sigreturn_restore(pid_t pid, CoreEntry *core); static int sigreturn_restore(pid_t pid, CoreEntry *core);
static int prepare_restorer_blob(void); static int prepare_restorer_blob(void);
static int prepare_rlimits(int pid); static int prepare_rlimits(int pid);
static int prepare_posix_timers(int pid);
static VM_AREA_LIST(rst_vmas); /* XXX .longest is NOT tracked for this guy */ static VM_AREA_LIST(rst_vmas); /* XXX .longest is NOT tracked for this guy */
...@@ -725,6 +726,9 @@ static int restore_one_alive_task(int pid, CoreEntry *core) ...@@ -725,6 +726,9 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (open_vmas(pid)) if (open_vmas(pid))
return -1; return -1;
if (prepare_posix_timers(pid))
return -1;
if (prepare_rlimits(pid) < 0) if (prepare_rlimits(pid) < 0)
return -1; return -1;
...@@ -1801,13 +1805,16 @@ static int cmp_posix_timer_proc_id(const void *p1, const void *p2) ...@@ -1801,13 +1805,16 @@ static int cmp_posix_timer_proc_id(const void *p1, const void *p2)
return ((struct restore_posix_timer *)p1)->spt.it_id - ((struct restore_posix_timer *)p2)->spt.it_id; return ((struct restore_posix_timer *)p1)->spt.it_id - ((struct restore_posix_timer *)p2)->spt.it_id;
} }
static int open_posix_timers_image(int pid, unsigned long *rpt, int *nr) static unsigned long posix_timers_cpos;
static unsigned int posix_timers_nr;
static int prepare_posix_timers(int pid)
{ {
int fd; int fd;
int ret = -1; int ret = -1;
struct restore_posix_timer *t; struct restore_posix_timer *t;
*rpt = rst_mem_cpos(RM_PRIVATE); posix_timers_cpos = rst_mem_cpos(RM_PRIVATE);
fd = open_image(CR_FD_POSIX_TIMERS, O_RSTR, pid); fd = open_image(CR_FD_POSIX_TIMERS, O_RSTR, pid);
if (fd < 0) { if (fd < 0) {
if (errno == ENOENT) /* backward compatibility */ if (errno == ENOENT) /* backward compatibility */
...@@ -1833,12 +1840,14 @@ static int open_posix_timers_image(int pid, unsigned long *rpt, int *nr) ...@@ -1833,12 +1840,14 @@ static int open_posix_timers_image(int pid, unsigned long *rpt, int *nr)
goto out; goto out;
posix_timer_entry__free_unpacked(pte, NULL); posix_timer_entry__free_unpacked(pte, NULL);
(*nr)++; posix_timers_nr++;
} }
out: out:
if (*nr > 0) if (posix_timers_nr > 0)
qsort(rst_mem_remap_ptr(*rpt, RM_PRIVATE), *nr, qsort(rst_mem_remap_ptr(posix_timers_cpos, RM_PRIVATE),
sizeof(struct restore_posix_timer), cmp_posix_timer_proc_id); posix_timers_nr,
sizeof(struct restore_posix_timer),
cmp_posix_timer_proc_id);
close_safe(&fd); close_safe(&fd);
return ret; return ret;
...@@ -2158,9 +2167,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2158,9 +2167,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
unsigned long vdso_rt_size = 0; unsigned long vdso_rt_size = 0;
unsigned long vdso_rt_delta = 0; unsigned long vdso_rt_delta = 0;
unsigned long posix_timers_info_chunk;
int posix_timers_nr = 0;
struct vm_area_list self_vmas; struct vm_area_list self_vmas;
int i; int i;
...@@ -2205,10 +2211,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2205,10 +2211,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
goto err_nv; goto err_nv;
} }
ret = open_posix_timers_image(pid, &posix_timers_info_chunk, &posix_timers_nr);
if (ret < 0)
goto err_nv;
tcp_socks = rst_mem_cpos(RM_PRIVATE); tcp_socks = rst_mem_cpos(RM_PRIVATE);
tcp_socks_mem = rst_mem_alloc(rst_tcp_socks_len(), RM_PRIVATE); tcp_socks_mem = rst_mem_alloc(rst_tcp_socks_len(), RM_PRIVATE);
if (!tcp_socks_mem) if (!tcp_socks_mem)
...@@ -2333,7 +2335,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2333,7 +2335,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
task_args->tgt_vmas = rst_mem_remap_ptr(tgt_vmas, RM_PRIVATE); task_args->tgt_vmas = rst_mem_remap_ptr(tgt_vmas, RM_PRIVATE);
task_args->timer_n = posix_timers_nr; task_args->timer_n = posix_timers_nr;
task_args->posix_timers = rst_mem_remap_ptr(posix_timers_info_chunk, RM_PRIVATE); task_args->posix_timers = rst_mem_remap_ptr(posix_timers_cpos, RM_PRIVATE);
task_args->siginfo_nr = siginfo_nr; task_args->siginfo_nr = siginfo_nr;
task_args->siginfo = rst_mem_remap_ptr(siginfo_chunk, RM_PRIVATE); task_args->siginfo = rst_mem_remap_ptr(siginfo_chunk, RM_PRIVATE);
......
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