Commit dbbbba10 authored by Pavel Emelyanov's avatar Pavel Emelyanov

restore: Prepare on-restorer timerfds earlier

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Reviewed-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent dc70fba1
...@@ -545,6 +545,12 @@ static int restore_one_alive_task(int pid, CoreEntry *core) ...@@ -545,6 +545,12 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_tcp_socks(ta)) if (prepare_tcp_socks(ta))
return -1; return -1;
/*
* Copy timerfd params for restorer args, we need to proceed
* timer setting at the very late.
*/
if (prepare_timerfds(ta))
return -1;
return sigreturn_restore(pid, ta_cp, core); return sigreturn_restore(pid, ta_cp, core);
} }
...@@ -2696,13 +2702,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2696,13 +2702,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
BUILD_BUG_ON(sizeof(struct task_restore_args) & 1); BUILD_BUG_ON(sizeof(struct task_restore_args) & 1);
BUILD_BUG_ON(sizeof(struct thread_restore_args) & 1); BUILD_BUG_ON(sizeof(struct thread_restore_args) & 1);
/*
* Copy timerfd params for restorer args, we need to proceed
* timer setting at the very late.
*/
if (rst_timerfd_prep())
goto err_nv;
/* /*
* Read creds info for every thread and allocate memory * Read creds info for every thread and allocate memory
* needed so we can use this data inside restorer. * needed so we can use this data inside restorer.
...@@ -2832,6 +2831,7 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2832,6 +2831,7 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
task_args->vmas = rst_mem_remap_ptr((unsigned long)task_args->vmas, RM_PRIVATE); task_args->vmas = rst_mem_remap_ptr((unsigned long)task_args->vmas, RM_PRIVATE);
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);
#define remap_array(name, nr, cpos) do { \ #define remap_array(name, nr, cpos) do { \
task_args->name##_n = nr; \ task_args->name##_n = nr; \
...@@ -2839,7 +2839,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2839,7 +2839,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
} while (0) } while (0)
remap_array(posix_timers, posix_timers_nr, posix_timers_cpos); remap_array(posix_timers, posix_timers_nr, posix_timers_cpos);
remap_array(timerfd, rst_timerfd_nr, rst_timerfd_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);
......
...@@ -20,10 +20,8 @@ struct restore_timerfd { ...@@ -20,10 +20,8 @@ struct restore_timerfd {
extern const struct fdtype_ops timerfd_dump_ops; extern const struct fdtype_ops timerfd_dump_ops;
extern struct collect_image_info timerfd_cinfo; extern struct collect_image_info timerfd_cinfo;
int rst_timerfd_prep(void); struct task_restore_args;
extern unsigned long rst_timerfd_cpos; int prepare_timerfds(struct task_restore_args *);
extern unsigned int rst_timerfd_nr;
extern int check_timerfd(void); extern int check_timerfd(void);
extern int is_timerfd_link(char *link); extern int is_timerfd_link(char *link);
......
...@@ -37,9 +37,6 @@ struct timerfd_info { ...@@ -37,9 +37,6 @@ struct timerfd_info {
static LIST_HEAD(rst_timerfds); static LIST_HEAD(rst_timerfds);
unsigned long rst_timerfd_cpos;
unsigned int rst_timerfd_nr = 0;
int check_timerfd(void) int check_timerfd(void)
{ {
int fd, ret = -1; int fd, ret = -1;
...@@ -110,12 +107,14 @@ static int timerfd_post_open(struct file_desc *d, int fd) ...@@ -110,12 +107,14 @@ static int timerfd_post_open(struct file_desc *d, int fd)
return 0; return 0;
} }
int rst_timerfd_prep(void) int prepare_timerfds(struct task_restore_args *ta)
{ {
struct timerfd_info *ti; struct timerfd_info *ti;
struct restore_timerfd *t; struct restore_timerfd *t;
rst_timerfd_cpos = rst_mem_align_cpos(RM_PRIVATE); ta->timerfd = (struct restore_timerfd *)rst_mem_align_cpos(RM_PRIVATE);
ta->timerfd_n = 0;
list_for_each_entry(ti, &rst_timerfds, rlist) { list_for_each_entry(ti, &rst_timerfds, rlist) {
TimerfdEntry *tfe = ti->tfe; TimerfdEntry *tfe = ti->tfe;
...@@ -133,7 +132,7 @@ int rst_timerfd_prep(void) ...@@ -133,7 +132,7 @@ int rst_timerfd_prep(void)
t->val.it_value.tv_sec = (time_t)tfe->vsec; t->val.it_value.tv_sec = (time_t)tfe->vsec;
t->val.it_value.tv_nsec = (long)tfe->vnsec; t->val.it_value.tv_nsec = (long)tfe->vnsec;
rst_timerfd_nr++; ta->timerfd_n++;
} }
return 0; return 0;
......
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