Commit dc70fba1 authored by Pavel Emelyanov's avatar Pavel Emelyanov

restore: Prepare on-restorer tcp socks earlier

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Reviewed-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 8f169802
...@@ -538,6 +538,14 @@ static int restore_one_alive_task(int pid, CoreEntry *core) ...@@ -538,6 +538,14 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_proc_misc(pid, core->tc)) if (prepare_proc_misc(pid, core->tc))
return -1; return -1;
/*
* Get all the tcp sockets fds into rst memory -- restorer
* will turn repair off before going sigreturn
*/
if (prepare_tcp_socks(ta))
return -1;
return sigreturn_restore(pid, ta_cp, core); return sigreturn_restore(pid, ta_cp, core);
} }
...@@ -2688,13 +2696,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2688,13 +2696,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);
/*
* Get all the tcp sockets fds into rst memory -- restorer
* will turn repair off before going sigreturn
*/
if (rst_tcp_socks_prep())
goto err_nv;
/* /*
* Copy timerfd params for restorer args, we need to proceed * Copy timerfd params for restorer args, we need to proceed
* timer setting at the very late. * timer setting at the very late.
...@@ -2830,6 +2831,7 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2830,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);
#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 +2841,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2839,7 +2841,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
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(timerfd, rst_timerfd_nr, rst_timerfd_cpos);
remap_array(siginfo, siginfo_nr, siginfo_cpos); remap_array(siginfo, siginfo_nr, siginfo_cpos);
remap_array(tcp_socks, rst_tcp_socks_nr, rst_tcp_socks_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);
remap_array(zombies, n_zombies, zombies_pos); remap_array(zombies, n_zombies, zombies_pos);
......
...@@ -76,9 +76,8 @@ extern int restore_one_tcp(int sk, struct inet_sk_info *si); ...@@ -76,9 +76,8 @@ extern int restore_one_tcp(int sk, struct inet_sk_info *si);
extern int check_tcp(void); extern int check_tcp(void);
extern mutex_t *inet_get_reuseaddr_lock(struct inet_sk_info *ii); extern mutex_t *inet_get_reuseaddr_lock(struct inet_sk_info *ii);
int rst_tcp_socks_prep(void); struct task_restore_args;
extern unsigned long rst_tcp_socks_cpos; int prepare_tcp_socks(struct task_restore_args *);
extern unsigned int rst_tcp_socks_nr;
struct rst_tcp_sock { struct rst_tcp_sock {
int sk; int sk;
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "xmalloc.h" #include "xmalloc.h"
#include "config.h" #include "config.h"
#include "kerndat.h" #include "kerndat.h"
#include "restorer.h"
#include "rst-malloc.h" #include "rst-malloc.h"
#include "protobuf.h" #include "protobuf.h"
...@@ -670,14 +671,13 @@ err: ...@@ -670,14 +671,13 @@ err:
return -1; return -1;
} }
unsigned long rst_tcp_socks_cpos; int prepare_tcp_socks(struct task_restore_args *ta)
unsigned int rst_tcp_socks_nr = 0;
int rst_tcp_socks_prep(void)
{ {
struct inet_sk_info *ii; struct inet_sk_info *ii;
rst_tcp_socks_cpos = rst_mem_align_cpos(RM_PRIVATE); ta->tcp_socks = (struct rst_tcp_sock *) rst_mem_align_cpos(RM_PRIVATE);
ta->tcp_socks_n = 0;
list_for_each_entry(ii, &rst_tcp_repair_sockets, rlist) { list_for_each_entry(ii, &rst_tcp_repair_sockets, rlist) {
struct rst_tcp_sock *rs; struct rst_tcp_sock *rs;
...@@ -694,7 +694,7 @@ int rst_tcp_socks_prep(void) ...@@ -694,7 +694,7 @@ int rst_tcp_socks_prep(void)
rs->sk = ii->sk_fd; rs->sk = ii->sk_fd;
rs->reuseaddr = ii->ie->opts->reuseaddr; rs->reuseaddr = ii->ie->opts->reuseaddr;
rst_tcp_socks_nr++; ta->tcp_socks_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