Commit b9f781de authored by Pavel Emelyanov's avatar Pavel Emelyanov

restore: Prepare on-restorer posix timers earlier

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Reviewed-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent dbbbba10
...@@ -114,7 +114,7 @@ static int restore_task_with_children(void *); ...@@ -114,7 +114,7 @@ static int restore_task_with_children(void *);
static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core); static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core);
static int prepare_restorer_blob(void); static int prepare_restorer_blob(void);
static int prepare_rlimits(int pid, CoreEntry *core); static int prepare_rlimits(int pid, CoreEntry *core);
static int prepare_posix_timers(int pid, CoreEntry *core); static int prepare_posix_timers(int pid, struct task_restore_args *ta, CoreEntry *core);
static int prepare_signals(int pid, CoreEntry *core); static int prepare_signals(int pid, CoreEntry *core);
static unsigned long helpers_pos = 0; static unsigned long helpers_pos = 0;
...@@ -520,7 +520,7 @@ static int restore_one_alive_task(int pid, CoreEntry *core) ...@@ -520,7 +520,7 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_signals(pid, core)) if (prepare_signals(pid, core))
return -1; return -1;
if (prepare_posix_timers(pid, core)) if (prepare_posix_timers(pid, ta, core))
return -1; return -1;
if (prepare_rlimits(pid, core) < 0) if (prepare_rlimits(pid, core) < 0)
...@@ -2093,11 +2093,10 @@ static int cmp_posix_timer_proc_id(const void *p1, const void *p2) ...@@ -2093,11 +2093,10 @@ 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 unsigned long posix_timers_cpos; static void sort_posix_timers(struct task_restore_args *ta)
static unsigned int posix_timers_nr;
static void sort_posix_timers(void)
{ {
void *tmem;
/* /*
* This is required for restorer's create_posix_timers(), * This is required for restorer's create_posix_timers(),
* it will probe them one-by-one for the desired ID, since * it will probe them one-by-one for the desired ID, since
...@@ -2105,18 +2104,19 @@ static void sort_posix_timers(void) ...@@ -2105,18 +2104,19 @@ static void sort_posix_timers(void)
* with given ID. * with given ID.
*/ */
if (posix_timers_nr > 0) if (ta->posix_timers_n > 0) {
qsort(rst_mem_remap_ptr(posix_timers_cpos, RM_PRIVATE), tmem = rst_mem_remap_ptr((unsigned long)ta->posix_timers, RM_PRIVATE);
posix_timers_nr, qsort(tmem, ta->posix_timers_n,
sizeof(struct restore_posix_timer), sizeof(struct restore_posix_timer),
cmp_posix_timer_proc_id); cmp_posix_timer_proc_id);
}
} }
/* /*
* Legacy posix timers restoration from CR_FD_POSIX_TIMERS * Legacy posix timers restoration from CR_FD_POSIX_TIMERS
*/ */
static int prepare_posix_timers_from_fd(int pid) static int prepare_posix_timers_from_fd(int pid, struct task_restore_args *ta)
{ {
struct cr_img *img; struct cr_img *img;
int ret = -1; int ret = -1;
...@@ -2126,6 +2126,7 @@ static int prepare_posix_timers_from_fd(int pid) ...@@ -2126,6 +2126,7 @@ static int prepare_posix_timers_from_fd(int pid)
if (!img) if (!img)
return -1; return -1;
ta->posix_timers_n = 0;
while (1) { while (1) {
PosixTimerEntry *pte; PosixTimerEntry *pte;
...@@ -2142,29 +2143,29 @@ static int prepare_posix_timers_from_fd(int pid) ...@@ -2142,29 +2143,29 @@ static int prepare_posix_timers_from_fd(int pid)
break; break;
posix_timer_entry__free_unpacked(pte, NULL); posix_timer_entry__free_unpacked(pte, NULL);
posix_timers_nr++; ta->posix_timers_n++;
} }
close_image(img); close_image(img);
if (!ret) if (!ret)
sort_posix_timers(); sort_posix_timers(ta);
return ret; return ret;
} }
static int prepare_posix_timers(int pid, CoreEntry *core) static int prepare_posix_timers(int pid, struct task_restore_args *ta, CoreEntry *core)
{ {
int i, ret = -1; int i, ret = -1;
TaskTimersEntry *tte = core->tc->timers; TaskTimersEntry *tte = core->tc->timers;
struct restore_posix_timer *t; struct restore_posix_timer *t;
posix_timers_cpos = rst_mem_align_cpos(RM_PRIVATE); ta->posix_timers = (struct restore_posix_timer *)rst_mem_align_cpos(RM_PRIVATE);
if (!tte) if (!tte)
return prepare_posix_timers_from_fd(pid); return prepare_posix_timers_from_fd(pid, ta);
posix_timers_nr = tte->n_posix; ta->posix_timers_n = tte->n_posix;
for (i = 0; i < posix_timers_nr; i++) { for (i = 0; i < ta->posix_timers_n; i++) {
t = rst_mem_alloc(sizeof(struct restore_posix_timer), RM_PRIVATE); t = rst_mem_alloc(sizeof(struct restore_posix_timer), RM_PRIVATE);
if (!t) if (!t)
goto out; goto out;
...@@ -2174,7 +2175,7 @@ static int prepare_posix_timers(int pid, CoreEntry *core) ...@@ -2174,7 +2175,7 @@ static int prepare_posix_timers(int pid, CoreEntry *core)
} }
ret = 0; ret = 0;
sort_posix_timers(); sort_posix_timers(ta);
out: out:
return ret; return ret;
} }
...@@ -2832,13 +2833,13 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2832,13 +2833,13 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
task_args->rings = rst_mem_remap_ptr((unsigned long)task_args->rings, RM_PRIVATE); task_args->rings = rst_mem_remap_ptr((unsigned long)task_args->rings, RM_PRIVATE);
task_args->tcp_socks = rst_mem_remap_ptr((unsigned long)task_args->tcp_socks, RM_PRIVATE); task_args->tcp_socks = rst_mem_remap_ptr((unsigned long)task_args->tcp_socks, RM_PRIVATE);
task_args->timerfd = rst_mem_remap_ptr((unsigned long)task_args->timerfd, RM_PRIVATE); task_args->timerfd = rst_mem_remap_ptr((unsigned long)task_args->timerfd, RM_PRIVATE);
task_args->posix_timers = rst_mem_remap_ptr((unsigned long)task_args->posix_timers, RM_PRIVATE);
#define remap_array(name, nr, cpos) do { \ #define remap_array(name, nr, cpos) do { \
task_args->name##_n = nr; \ task_args->name##_n = nr; \
task_args->name = rst_mem_remap_ptr(cpos, RM_PRIVATE); \ task_args->name = rst_mem_remap_ptr(cpos, RM_PRIVATE); \
} while (0) } while (0)
remap_array(posix_timers, posix_timers_nr, posix_timers_cpos);
remap_array(siginfo, siginfo_nr, siginfo_cpos); remap_array(siginfo, siginfo_nr, siginfo_cpos);
remap_array(rlims, rlims_nr, rlims_cpos); remap_array(rlims, rlims_nr, rlims_cpos);
remap_array(helpers, n_helpers, helpers_pos); remap_array(helpers, n_helpers, helpers_pos);
......
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