Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
C
criu
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhul
criu
Commits
79dfbe6c
Commit
79dfbe6c
authored
Jul 05, 2013
by
Pavel Emelyanov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tcp: Switch to use rst memory allocator on repair off
Signed-off-by:
Pavel Emelyanov
<
xemul@parallels.com
>
parent
e458d20c
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
39 additions
and
56 deletions
+39
-56
cr-restore.c
cr-restore.c
+13
-7
restorer.h
include/restorer.h
+2
-2
sk-inet.h
include/sk-inet.h
+8
-3
restorer.c
pie/restorer.c
+4
-9
sk-tcp.c
sk-tcp.c
+12
-35
No files found.
cr-restore.c
View file @
79dfbe6c
...
...
@@ -2002,6 +2002,9 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
int
siginfo_nr
=
0
;
int
*
siginfo_priv_nr
;
void
*
tcp_socks_mem
;
unsigned
long
tcp_socks
;
unsigned
long
vdso_rt_vma_size
=
0
;
unsigned
long
vdso_rt_size
=
0
;
...
...
@@ -2068,12 +2071,18 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
ret
=
0
;
}
tcp_socks
=
rst_mem_cpos
();
tcp_socks_mem
=
rst_mem_alloc
(
rst_tcp_socks_len
());
if
(
!
tcp_socks_mem
)
goto
err
;
memcpy
(
tcp_socks_mem
,
rst_tcp_socks
,
rst_tcp_socks_len
());
restore_bootstrap_len
=
restorer_len
+
restore_task_vma_len
+
restore_thread_vma_len
+
SHMEMS_SIZE
+
TASK_ENTRIES_SIZE
+
self_vmas_len
+
vmas_len
+
rst_tcp_socks_size
+
rst_mem_len
;
/*
...
...
@@ -2172,10 +2181,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
goto
err
;
mem
+=
vmas_len
;
if
(
rst_
tcp_socks
_remap
(
mem
))
if
(
rst_
mem
_remap
(
mem
))
goto
err
;
task_args
->
rst_tcp_socks
=
mem
;
task_args
->
rst_tcp_socks_size
=
rst_tcp_socks_size
;
task_args
->
timer_n
=
posix_timers_nr
;
task_args
->
posix_timers
=
rst_mem_raddr
(
posix_timers_info_chunk
);
...
...
@@ -2183,9 +2190,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
task_args
->
siginfo_nr
=
siginfo_nr
;
task_args
->
siginfo
=
rst_mem_raddr
(
siginfo_chunk
);
mem
+=
rst_tcp_socks_size
;
if
(
rst_mem_remap
(
mem
))
goto
err
;
task_args
->
tcp_socks_nr
=
rst_tcp_socks_nr
;
task_args
->
tcp_socks
=
rst_mem_raddr
(
tcp_socks
);
/*
* Arguments for task restoration.
...
...
include/restorer.h
View file @
79dfbe6c
...
...
@@ -146,8 +146,8 @@ struct task_restore_core_args {
int
nr_rlim
;
struct
rlimit
rlims
[
RLIM_NLIMITS
];
struct
rst_tcp_sock
*
rst_
tcp_socks
;
int
rst_tcp_socks_size
;
struct
rst_tcp_sock
*
tcp_socks
;
int
tcp_socks_nr
;
struct
vdso_symtable
vdso_sym_rt
;
/* runtime vdso symbols */
unsigned
long
vdso_rt_parked_at
;
/* safe place to keep vdso */
...
...
include/sk-inet.h
View file @
79dfbe6c
...
...
@@ -49,6 +49,14 @@ struct rst_tcp_sock {
bool
reuseaddr
;
};
extern
struct
rst_tcp_sock
*
rst_tcp_socks
;
extern
int
rst_tcp_socks_nr
;
static
inline
unsigned
long
rst_tcp_socks_len
(
void
)
{
return
rst_tcp_socks_nr
*
sizeof
(
struct
rst_tcp_sock
);
}
static
inline
void
tcp_repair_off
(
int
fd
)
{
int
aux
=
0
,
ret
;
...
...
@@ -70,9 +78,6 @@ int restore_one_tcp(int sk, struct inet_sk_info *si);
void
show_tcp_stream
(
int
fd
);
int
check_tcp
(
void
);
extern
int
rst_tcp_socks_size
;
extern
int
rst_tcp_socks_remap
(
void
*
addr
);
extern
int
rst_tcp_socks_add
(
int
fd
,
bool
reuseaddr
);
#endif
/* __CR_SK_INET_H__ */
pie/restorer.c
View file @
79dfbe6c
...
...
@@ -384,17 +384,12 @@ static void rst_tcp_repair_off(struct rst_tcp_sock *rts)
pr_perror
(
"Failed to restore of SO_REUSEADDR on socket (%d)"
,
ret
);
}
static
void
rst_tcp_socks_all
(
struct
rst_tcp_sock
*
arr
,
int
size
)
static
void
rst_tcp_socks_all
(
struct
task_restore_core_args
*
ta
)
{
int
i
;
if
(
size
==
0
)
return
;
for
(
i
=
0
;
arr
[
i
].
sk
>=
0
;
i
++
)
rst_tcp_repair_off
(
arr
+
i
);
sys_munmap
(
arr
,
size
);
for
(
i
=
0
;
i
<
ta
->
tcp_socks_nr
;
i
++
)
rst_tcp_repair_off
(
&
ta
->
tcp_socks
[
i
]);
}
static
int
vma_remap
(
unsigned
long
src
,
unsigned
long
dst
,
unsigned
long
len
)
...
...
@@ -885,7 +880,7 @@ long __export_restore_task(struct task_restore_core_args *args)
goto
core_restore_end
;
}
rst_tcp_socks_all
(
args
->
rst_tcp_socks
,
args
->
rst_tcp_socks_size
);
rst_tcp_socks_all
(
args
);
/*
* Writing to last-pid is CAP_SYS_ADMIN protected,
...
...
sk-tcp.c
View file @
79dfbe6c
...
...
@@ -18,6 +18,7 @@
#include "netfilter.h"
#include "image.h"
#include "namespaces.h"
#include "xmalloc.h"
#include "config.h"
#include "protobuf.h"
...
...
@@ -555,47 +556,23 @@ err:
* rst_tcp_socks contains sockets in repair mode,
* which will be off in restorer before resuming.
*/
static
struct
rst_tcp_sock
*
rst_tcp_socks
=
NULL
;
static
int
rst_tcp_socks_num
=
0
;
int
rst_tcp_socks_size
=
0
;
struct
rst_tcp_sock
*
rst_tcp_socks
=
NULL
;
int
rst_tcp_socks_nr
=
0
;
int
rst_tcp_socks_
remap
(
void
*
addr
)
int
rst_tcp_socks_
add
(
int
fd
,
bool
reuse
addr
)
{
void
*
ret
;
if
(
!
rst_tcp_socks
)
{
BUG_ON
(
rst_tcp_socks_size
);
return
0
;
}
rst_tcp_socks
[
rst_tcp_socks_num
].
sk
=
-
1
;
struct
rst_tcp_sock
*
cur
;
ret
=
mmap
(
addr
,
rst_tcp_socks_size
,
PROT_READ
|
PROT_WRITE
,
MAP_PRIVATE
|
MAP_ANONYMOUS
|
MAP_FIXED
,
-
1
,
0
);
if
(
ret
!=
addr
)
{
pr_perror
(
"mmap() failed"
);
rst_tcp_socks_nr
++
;
rst_tcp_socks
=
xrealloc
(
rst_tcp_socks
,
rst_tcp_socks_len
());
if
(
!
rst_tcp_socks
)
return
-
1
;
}
memcpy
(
addr
,
rst_tcp_socks
,
rst_tcp_socks_size
);
return
0
;
}
int
rst_tcp_socks_add
(
int
fd
,
bool
reuseaddr
)
{
/* + 2 = ( new one + guard (-1) ) */
if
((
rst_tcp_socks_num
+
2
)
*
sizeof
(
struct
rst_tcp_sock
)
>
rst_tcp_socks_size
)
{
rst_tcp_socks_size
+=
PAGE_SIZE
;
rst_tcp_socks
=
xrealloc
(
rst_tcp_socks
,
rst_tcp_socks_size
);
if
(
rst_tcp_socks
==
NULL
)
return
-
1
;
}
pr_debug
(
"Schedule %d socket for repair off
\n
"
,
fd
);
rst_tcp_socks
[
rst_tcp_socks_num
].
sk
=
fd
;
rst_tcp_socks
[
rst_tcp_socks_num
].
reuseaddr
=
reuseaddr
;
rst_tcp_socks_num
++
;
cur
=
&
rst_tcp_socks
[
rst_tcp_socks_nr
-
1
];
cur
->
sk
=
fd
;
cur
->
reuseaddr
=
reuseaddr
;
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment