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
c443b03e
Commit
c443b03e
authored
Sep 29, 2014
by
Pavel Emelyanov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rst: Rework the rst_info referencing
Signed-off-by:
Pavel Emelyanov
<
xemul@parallels.com
>
parent
3c7d01f6
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
71 additions
and
63 deletions
+71
-63
cgroup.c
cgroup.c
+5
-5
cr-restore.c
cr-restore.c
+28
-28
files.c
files.c
+17
-17
pstree.h
include/pstree.h
+6
-2
mem.c
mem.c
+1
-1
pstree.c
pstree.c
+13
-9
tty.c
tty.c
+1
-1
No files found.
cgroup.c
View file @
c443b03e
...
@@ -968,22 +968,22 @@ int prepare_task_cgroup(struct pstree_item *me)
...
@@ -968,22 +968,22 @@ int prepare_task_cgroup(struct pstree_item *me)
CgSetEntry
*
se
;
CgSetEntry
*
se
;
u32
current_cgset
;
u32
current_cgset
;
if
(
!
me
->
rst
->
cg_set
)
if
(
!
rsti
(
me
)
->
cg_set
)
return
0
;
return
0
;
if
(
me
->
parent
)
if
(
me
->
parent
)
current_cgset
=
me
->
parent
->
rst
->
cg_set
;
current_cgset
=
rsti
(
me
->
parent
)
->
cg_set
;
else
else
current_cgset
=
root_cg_set
;
current_cgset
=
root_cg_set
;
if
(
me
->
rst
->
cg_set
==
current_cgset
)
{
if
(
rsti
(
me
)
->
cg_set
==
current_cgset
)
{
pr_info
(
"Cgroups %d inherited from parent
\n
"
,
current_cgset
);
pr_info
(
"Cgroups %d inherited from parent
\n
"
,
current_cgset
);
return
0
;
return
0
;
}
}
se
=
find_rst_set_by_id
(
me
->
rst
->
cg_set
);
se
=
find_rst_set_by_id
(
rsti
(
me
)
->
cg_set
);
if
(
!
se
)
{
if
(
!
se
)
{
pr_err
(
"No set %d found
\n
"
,
me
->
rst
->
cg_set
);
pr_err
(
"No set %d found
\n
"
,
rsti
(
me
)
->
cg_set
);
return
-
1
;
return
-
1
;
}
}
...
...
cr-restore.c
View file @
c443b03e
...
@@ -339,7 +339,7 @@ static int restore_priv_vma_content(pid_t pid)
...
@@ -339,7 +339,7 @@ static int restore_priv_vma_content(pid_t pid)
{
{
struct
vma_area
*
vma
;
struct
vma_area
*
vma
;
int
ret
=
0
;
int
ret
=
0
;
struct
list_head
*
vmas
=
&
current
->
rst
->
vmas
.
h
;
struct
list_head
*
vmas
=
&
rsti
(
current
)
->
vmas
.
h
;
unsigned
int
nr_restored
=
0
;
unsigned
int
nr_restored
=
0
;
unsigned
int
nr_shared
=
0
;
unsigned
int
nr_shared
=
0
;
...
@@ -491,7 +491,7 @@ static int prepare_mappings(int pid)
...
@@ -491,7 +491,7 @@ static int prepare_mappings(int pid)
void
*
old_premmapped_addr
=
NULL
;
void
*
old_premmapped_addr
=
NULL
;
unsigned
long
old_premmapped_len
,
pstart
=
0
;
unsigned
long
old_premmapped_len
,
pstart
=
0
;
vmas
=
&
current
->
rst
->
vmas
;
vmas
=
&
rsti
(
current
)
->
vmas
;
if
(
vmas
->
nr
==
0
)
/* Zombie */
if
(
vmas
->
nr
==
0
)
/* Zombie */
goto
out
;
goto
out
;
...
@@ -500,7 +500,7 @@ static int prepare_mappings(int pid)
...
@@ -500,7 +500,7 @@ static int prepare_mappings(int pid)
* See comments in map_private_vma.
* See comments in map_private_vma.
*/
*/
if
(
current
->
parent
)
if
(
current
->
parent
)
parent_vmas
=
&
current
->
parent
->
rst
->
vmas
.
h
;
parent_vmas
=
&
rsti
(
current
->
parent
)
->
vmas
.
h
;
else
else
parent_vmas
=
&
empty
;
parent_vmas
=
&
empty
;
...
@@ -511,10 +511,10 @@ static int prepare_mappings(int pid)
...
@@ -511,10 +511,10 @@ static int prepare_mappings(int pid)
return
-
1
;
return
-
1
;
}
}
old_premmapped_addr
=
current
->
rst
->
premmapped_addr
;
old_premmapped_addr
=
rsti
(
current
)
->
premmapped_addr
;
old_premmapped_len
=
current
->
rst
->
premmapped_len
;
old_premmapped_len
=
rsti
(
current
)
->
premmapped_len
;
current
->
rst
->
premmapped_addr
=
addr
;
rsti
(
current
)
->
premmapped_addr
=
addr
;
current
->
rst
->
premmapped_len
=
vmas
->
priv_size
;
rsti
(
current
)
->
premmapped_len
=
vmas
->
priv_size
;
pvma
=
list_first_entry
(
parent_vmas
,
struct
vma_area
,
list
);
pvma
=
list_first_entry
(
parent_vmas
,
struct
vma_area
,
list
);
...
@@ -556,7 +556,7 @@ out:
...
@@ -556,7 +556,7 @@ out:
static
int
unmap_guard_pages
()
static
int
unmap_guard_pages
()
{
{
struct
vma_area
*
vma
;
struct
vma_area
*
vma
;
struct
list_head
*
vmas
=
&
current
->
rst
->
vmas
.
h
;
struct
list_head
*
vmas
=
&
rsti
(
current
)
->
vmas
.
h
;
list_for_each_entry
(
vma
,
vmas
,
list
)
{
list_for_each_entry
(
vma
,
vmas
,
list
)
{
if
(
!
vma_priv
(
vma
->
e
))
if
(
!
vma_priv
(
vma
->
e
))
...
@@ -579,7 +579,7 @@ static int open_vmas(int pid)
...
@@ -579,7 +579,7 @@ static int open_vmas(int pid)
{
{
struct
vma_area
*
vma
;
struct
vma_area
*
vma
;
int
ret
=
0
;
int
ret
=
0
;
struct
list_head
*
vmas
=
&
current
->
rst
->
vmas
.
h
;
struct
list_head
*
vmas
=
&
rsti
(
current
)
->
vmas
.
h
;
list_for_each_entry
(
vma
,
vmas
,
list
)
{
list_for_each_entry
(
vma
,
vmas
,
list
)
{
if
(
!
(
vma_area_is
(
vma
,
VMA_AREA_REGULAR
)))
if
(
!
(
vma_area_is
(
vma
,
VMA_AREA_REGULAR
)))
...
@@ -989,9 +989,9 @@ static void maybe_clone_parent(struct pstree_item *item,
...
@@ -989,9 +989,9 @@ static void maybe_clone_parent(struct pstree_item *item,
* versions of the kernels, but we treat 3.11 as a base, so at
* versions of the kernels, but we treat 3.11 as a base, so at
* least warn a user about potential problems.
* least warn a user about potential problems.
*/
*/
item
->
rst
->
clone_flags
|=
CLONE_PARENT
;
rsti
(
item
)
->
clone_flags
|=
CLONE_PARENT
;
root_as_sibling
=
1
;
root_as_sibling
=
1
;
if
(
item
->
rst
->
clone_flags
&
CLONE_NEWPID
)
if
(
rsti
(
item
)
->
clone_flags
&
CLONE_NEWPID
)
pr_warn
(
"Set CLONE_PARENT | CLONE_NEWPID but it might cause restore problem,"
pr_warn
(
"Set CLONE_PARENT | CLONE_NEWPID but it might cause restore problem,"
"because not all kernels support such clone flags combinations!
\n
"
);
"because not all kernels support such clone flags combinations!
\n
"
);
}
else
if
(
opts
.
restore_detach
)
{
}
else
if
(
opts
.
restore_detach
)
{
...
@@ -1024,10 +1024,10 @@ static inline int fork_with_pid(struct pstree_item *item)
...
@@ -1024,10 +1024,10 @@ static inline int fork_with_pid(struct pstree_item *item)
return
-
1
;
return
-
1
;
item
->
state
=
ca
.
core
->
tc
->
task_state
;
item
->
state
=
ca
.
core
->
tc
->
task_state
;
item
->
rst
->
cg_set
=
ca
.
core
->
tc
->
cg_set
;
rsti
(
item
)
->
cg_set
=
ca
.
core
->
tc
->
cg_set
;
if
(
item
->
state
==
TASK_DEAD
)
if
(
item
->
state
==
TASK_DEAD
)
item
->
parent
->
rst
->
nr_zombies
++
;
rsti
(
item
->
parent
)
->
nr_zombies
++
;
else
if
(
!
task_alive
(
item
))
{
else
if
(
!
task_alive
(
item
))
{
pr_err
(
"Unknown task state %d
\n
"
,
item
->
state
);
pr_err
(
"Unknown task state %d
\n
"
,
item
->
state
);
return
-
1
;
return
-
1
;
...
@@ -1040,14 +1040,14 @@ static inline int fork_with_pid(struct pstree_item *item)
...
@@ -1040,14 +1040,14 @@ static inline int fork_with_pid(struct pstree_item *item)
* Helper entry will not get moved around and thus
* Helper entry will not get moved around and thus
* will live in the parent's cgset.
* will live in the parent's cgset.
*/
*/
item
->
rst
->
cg_set
=
item
->
parent
->
rst
->
cg_set
;
rsti
(
item
)
->
cg_set
=
rsti
(
item
->
parent
)
->
cg_set
;
ca
.
core
=
NULL
;
ca
.
core
=
NULL
;
}
}
ret
=
-
1
;
ret
=
-
1
;
ca
.
item
=
item
;
ca
.
item
=
item
;
ca
.
clone_flags
=
item
->
rst
->
clone_flags
;
ca
.
clone_flags
=
rsti
(
item
)
->
clone_flags
;
BUG_ON
(
ca
.
clone_flags
&
CLONE_VM
);
BUG_ON
(
ca
.
clone_flags
&
CLONE_VM
);
...
@@ -1282,10 +1282,10 @@ static void restore_pgid(void)
...
@@ -1282,10 +1282,10 @@ static void restore_pgid(void)
* group (-j option).
* group (-j option).
*/
*/
leader
=
current
->
rst
->
pgrp_leader
;
leader
=
rsti
(
current
)
->
pgrp_leader
;
if
(
leader
)
{
if
(
leader
)
{
BUG_ON
(
my_pgid
!=
leader
->
pid
.
virt
);
BUG_ON
(
my_pgid
!=
leader
->
pid
.
virt
);
futex_wait_until
(
&
leader
->
rst
->
pgrp_set
,
1
);
futex_wait_until
(
&
rsti
(
leader
)
->
pgrp_set
,
1
);
}
}
}
}
...
@@ -1296,7 +1296,7 @@ static void restore_pgid(void)
...
@@ -1296,7 +1296,7 @@ static void restore_pgid(void)
}
}
if
(
my_pgid
==
current
->
pid
.
virt
)
if
(
my_pgid
==
current
->
pid
.
virt
)
futex_set_and_wake
(
&
current
->
rst
->
pgrp_set
,
1
);
futex_set_and_wake
(
&
rsti
(
current
)
->
pgrp_set
,
1
);
}
}
static
int
mount_proc
(
void
)
static
int
mount_proc
(
void
)
...
@@ -1396,7 +1396,7 @@ static int restore_task_with_children(void *_arg)
...
@@ -1396,7 +1396,7 @@ static int restore_task_with_children(void *_arg)
close_safe
(
&
ca
->
fd
);
close_safe
(
&
ca
->
fd
);
if
(
current
->
state
!=
TASK_HELPER
)
{
if
(
current
->
state
!=
TASK_HELPER
)
{
ret
=
clone_service_fd
(
current
->
rst
->
service_fd_id
);
ret
=
clone_service_fd
(
rsti
(
current
)
->
service_fd_id
);
if
(
ret
)
if
(
ret
)
goto
err
;
goto
err
;
}
}
...
@@ -1585,7 +1585,7 @@ static int attach_to_tasks(bool root_seized, enum trace_flags *flag)
...
@@ -1585,7 +1585,7 @@ static int attach_to_tasks(bool root_seized, enum trace_flags *flag)
return
-
1
;
return
-
1
;
}
}
ret
=
ptrace_stop_pie
(
pid
,
item
->
rst
->
breakpoint
,
flag
);
ret
=
ptrace_stop_pie
(
pid
,
rsti
(
item
)
->
breakpoint
,
flag
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
-
1
;
return
-
1
;
}
}
...
@@ -1626,7 +1626,7 @@ static void finalize_restore(int status)
...
@@ -1626,7 +1626,7 @@ static void finalize_restore(int status)
if
(
ctl
==
NULL
)
if
(
ctl
==
NULL
)
goto
detach
;
goto
detach
;
parasite_unmap
(
ctl
,
(
unsigned
long
)
item
->
rst
->
munmap_restorer
);
parasite_unmap
(
ctl
,
(
unsigned
long
)
rsti
(
item
)
->
munmap_restorer
);
xfree
(
ctl
);
xfree
(
ctl
);
...
@@ -2236,7 +2236,7 @@ static int prepare_creds(int pid, struct task_restore_args *args)
...
@@ -2236,7 +2236,7 @@ static int prepare_creds(int pid, struct task_restore_args *args)
static
int
prepare_mm
(
pid_t
pid
,
struct
task_restore_args
*
args
)
static
int
prepare_mm
(
pid_t
pid
,
struct
task_restore_args
*
args
)
{
{
int
exe_fd
,
i
,
ret
=
-
1
;
int
exe_fd
,
i
,
ret
=
-
1
;
MmEntry
*
mm
=
current
->
rst
->
mm
;
MmEntry
*
mm
=
rsti
(
current
)
->
mm
;
args
->
mm
=
*
mm
;
args
->
mm
=
*
mm
;
args
->
mm
.
n_mm_saved_auxv
=
0
;
args
->
mm
.
n_mm_saved_auxv
=
0
;
...
@@ -2568,7 +2568,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
...
@@ -2568,7 +2568,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
#endif
#endif
struct
vm_area_list
self_vmas
;
struct
vm_area_list
self_vmas
;
struct
vm_area_list
*
vmas
=
&
current
->
rst
->
vmas
;
struct
vm_area_list
*
vmas
=
&
rsti
(
current
)
->
vmas
;
int
i
;
int
i
;
pr_info
(
"Restore via sigreturn
\n
"
);
pr_info
(
"Restore via sigreturn
\n
"
);
...
@@ -2683,7 +2683,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
...
@@ -2683,7 +2683,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
*/
*/
restore_thread_exec_start
=
restorer_sym
(
exec_mem_hint
,
__export_restore_thread
);
restore_thread_exec_start
=
restorer_sym
(
exec_mem_hint
,
__export_restore_thread
);
restore_task_exec_start
=
restorer_sym
(
exec_mem_hint
,
__export_restore_task
);
restore_task_exec_start
=
restorer_sym
(
exec_mem_hint
,
__export_restore_task
);
current
->
rst
->
munmap_restorer
=
restorer_sym
(
exec_mem_hint
,
__export_unmap
);
rsti
(
current
)
->
munmap_restorer
=
restorer_sym
(
exec_mem_hint
,
__export_unmap
);
exec_mem_hint
+=
restorer_len
;
exec_mem_hint
+=
restorer_len
;
...
@@ -2717,7 +2717,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
...
@@ -2717,7 +2717,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
if
(
rst_mem_remap
(
mem
))
if
(
rst_mem_remap
(
mem
))
goto
err
;
goto
err
;
task_args
->
breakpoint
=
&
current
->
rst
->
breakpoint
;
task_args
->
breakpoint
=
&
rsti
(
current
)
->
breakpoint
;
task_args
->
task_entries
=
rst_mem_remap_ptr
(
task_entries_pos
,
RM_SHREMAP
);
task_args
->
task_entries
=
rst_mem_remap_ptr
(
task_entries_pos
,
RM_SHREMAP
);
task_args
->
rst_mem
=
mem
;
task_args
->
rst_mem
=
mem
;
...
@@ -2729,8 +2729,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
...
@@ -2729,8 +2729,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
task_args
->
vdso_rt_size
=
vdso_rt_size
;
task_args
->
vdso_rt_size
=
vdso_rt_size
;
#endif
#endif
task_args
->
premmapped_addr
=
(
unsigned
long
)
current
->
rst
->
premmapped_addr
;
task_args
->
premmapped_addr
=
(
unsigned
long
)
rsti
(
current
)
->
premmapped_addr
;
task_args
->
premmapped_len
=
current
->
rst
->
premmapped_len
;
task_args
->
premmapped_len
=
rsti
(
current
)
->
premmapped_len
;
task_args
->
shmems
=
rst_mem_remap_ptr
(
rst_shmems
,
RM_SHREMAP
);
task_args
->
shmems
=
rst_mem_remap_ptr
(
rst_shmems
,
RM_SHREMAP
);
task_args
->
nr_shmems
=
nr_shmems
;
task_args
->
nr_shmems
=
nr_shmems
;
...
@@ -2882,7 +2882,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
...
@@ -2882,7 +2882,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
* Now prepare run-time data for threads restore.
* Now prepare run-time data for threads restore.
*/
*/
task_args
->
nr_threads
=
current
->
nr_threads
;
task_args
->
nr_threads
=
current
->
nr_threads
;
task_args
->
nr_zombies
=
current
->
rst
->
nr_zombies
;
task_args
->
nr_zombies
=
rsti
(
current
)
->
nr_zombies
;
task_args
->
clone_restore_fn
=
(
void
*
)
restore_thread_exec_start
;
task_args
->
clone_restore_fn
=
(
void
*
)
restore_thread_exec_start
;
task_args
->
thread_args
=
thread_args
;
task_args
->
thread_args
=
thread_args
;
...
...
files.c
View file @
c443b03e
...
@@ -591,7 +591,7 @@ int prepare_fd_pid(struct pstree_item *item)
...
@@ -591,7 +591,7 @@ int prepare_fd_pid(struct pstree_item *item)
int
ret
=
0
;
int
ret
=
0
;
struct
cr_img
*
img
;
struct
cr_img
*
img
;
pid_t
pid
=
item
->
pid
.
virt
;
pid_t
pid
=
item
->
pid
.
virt
;
struct
rst_info
*
rst_info
=
item
->
rst
;
struct
rst_info
*
rst_info
=
rsti
(
item
)
;
INIT_LIST_HEAD
(
&
rst_info
->
fds
);
INIT_LIST_HEAD
(
&
rst_info
->
fds
);
INIT_LIST_HEAD
(
&
rst_info
->
eventpoll
);
INIT_LIST_HEAD
(
&
rst_info
->
eventpoll
);
...
@@ -608,7 +608,7 @@ int prepare_fd_pid(struct pstree_item *item)
...
@@ -608,7 +608,7 @@ int prepare_fd_pid(struct pstree_item *item)
if
(
item
->
ids
==
NULL
)
/* zombie */
if
(
item
->
ids
==
NULL
)
/* zombie */
return
0
;
return
0
;
if
(
item
->
rst
->
fdt
&&
item
->
rst
->
fdt
->
pid
!=
item
->
pid
.
virt
)
if
(
rsti
(
item
)
->
fdt
&&
rsti
(
item
)
->
fdt
->
pid
!=
item
->
pid
.
virt
)
return
0
;
return
0
;
img
=
open_image
(
CR_FD_FDINFO
,
O_RSTR
,
item
->
ids
->
files_id
);
img
=
open_image
(
CR_FD_FDINFO
,
O_RSTR
,
item
->
ids
->
files_id
);
...
@@ -951,8 +951,8 @@ int prepare_fds(struct pstree_item *me)
...
@@ -951,8 +951,8 @@ int prepare_fds(struct pstree_item *me)
close_pid_proc
();
/* flush any proc cached fds we may have */
close_pid_proc
();
/* flush any proc cached fds we may have */
if
(
me
->
rst
->
fdt
)
{
if
(
rsti
(
me
)
->
fdt
)
{
struct
fdt
*
fdt
=
me
->
rst
->
fdt
;
struct
fdt
*
fdt
=
rsti
(
me
)
->
fdt
;
/*
/*
* Wait all tasks, who share a current fd table.
* Wait all tasks, who share a current fd table.
...
@@ -975,7 +975,7 @@ int prepare_fds(struct pstree_item *me)
...
@@ -975,7 +975,7 @@ int prepare_fds(struct pstree_item *me)
continue
;
continue
;
}
}
ret
=
open_fdinfos
(
me
->
pid
.
virt
,
&
me
->
rst
->
fds
,
state
);
ret
=
open_fdinfos
(
me
->
pid
.
virt
,
&
rsti
(
me
)
->
fds
,
state
);
if
(
ret
)
if
(
ret
)
break
;
break
;
...
@@ -983,7 +983,7 @@ int prepare_fds(struct pstree_item *me)
...
@@ -983,7 +983,7 @@ int prepare_fds(struct pstree_item *me)
* Now handle TTYs. Slaves are delayed to be sure masters
* Now handle TTYs. Slaves are delayed to be sure masters
* are already opened.
* are already opened.
*/
*/
ret
=
open_fdinfos
(
me
->
pid
.
virt
,
&
me
->
rst
->
tty_slaves
,
state
);
ret
=
open_fdinfos
(
me
->
pid
.
virt
,
&
rsti
(
me
)
->
tty_slaves
,
state
);
if
(
ret
)
if
(
ret
)
break
;
break
;
...
@@ -992,13 +992,13 @@ int prepare_fds(struct pstree_item *me)
...
@@ -992,13 +992,13 @@ int prepare_fds(struct pstree_item *me)
* to be already restored, thus we store them in a separate
* to be already restored, thus we store them in a separate
* list and restore at the very end.
* list and restore at the very end.
*/
*/
ret
=
open_fdinfos
(
me
->
pid
.
virt
,
&
me
->
rst
->
eventpoll
,
state
);
ret
=
open_fdinfos
(
me
->
pid
.
virt
,
&
rsti
(
me
)
->
eventpoll
,
state
);
if
(
ret
)
if
(
ret
)
break
;
break
;
}
}
if
(
me
->
rst
->
fdt
)
if
(
rsti
(
me
)
->
fdt
)
futex_inc_and_wake
(
&
me
->
rst
->
fdt
->
fdt_lock
);
futex_inc_and_wake
(
&
rsti
(
me
)
->
fdt
->
fdt_lock
);
out:
out:
close_service_fd
(
CR_PROC_FD_OFF
);
close_service_fd
(
CR_PROC_FD_OFF
);
tty_fini_fds
();
tty_fini_fds
();
...
@@ -1032,7 +1032,7 @@ static int fchroot(int fd)
...
@@ -1032,7 +1032,7 @@ static int fchroot(int fd)
int
restore_fs
(
struct
pstree_item
*
me
)
int
restore_fs
(
struct
pstree_item
*
me
)
{
{
int
dd_root
,
dd_cwd
,
ret
,
err
=
-
1
;
int
dd_root
,
dd_cwd
,
ret
,
err
=
-
1
;
struct
rst_info
*
ri
=
me
->
rst
;
struct
rst_info
*
ri
=
rsti
(
me
)
;
/*
/*
* First -- open both descriptors. We will not
* First -- open both descriptors. We will not
...
@@ -1084,7 +1084,7 @@ out:
...
@@ -1084,7 +1084,7 @@ out:
int
prepare_fs_pid
(
struct
pstree_item
*
item
)
int
prepare_fs_pid
(
struct
pstree_item
*
item
)
{
{
pid_t
pid
=
item
->
pid
.
virt
;
pid_t
pid
=
item
->
pid
.
virt
;
struct
rst_info
*
ri
=
item
->
rst
;
struct
rst_info
*
ri
=
rsti
(
item
)
;
struct
cr_img
*
img
;
struct
cr_img
*
img
;
FsEntry
*
fe
;
FsEntry
*
fe
;
...
@@ -1135,21 +1135,21 @@ int shared_fdt_prepare(struct pstree_item *item)
...
@@ -1135,21 +1135,21 @@ int shared_fdt_prepare(struct pstree_item *item)
struct
pstree_item
*
parent
=
item
->
parent
;
struct
pstree_item
*
parent
=
item
->
parent
;
struct
fdt
*
fdt
;
struct
fdt
*
fdt
;
if
(
!
parent
->
rst
->
fdt
)
{
if
(
!
rsti
(
parent
)
->
fdt
)
{
fdt
=
shmalloc
(
sizeof
(
*
item
->
rst
->
fdt
));
fdt
=
shmalloc
(
sizeof
(
*
rsti
(
item
)
->
fdt
));
if
(
fdt
==
NULL
)
if
(
fdt
==
NULL
)
return
-
1
;
return
-
1
;
parent
->
rst
->
fdt
=
fdt
;
rsti
(
parent
)
->
fdt
=
fdt
;
futex_init
(
&
fdt
->
fdt_lock
);
futex_init
(
&
fdt
->
fdt_lock
);
fdt
->
nr
=
1
;
fdt
->
nr
=
1
;
fdt
->
pid
=
parent
->
pid
.
virt
;
fdt
->
pid
=
parent
->
pid
.
virt
;
}
else
}
else
fdt
=
parent
->
rst
->
fdt
;
fdt
=
rsti
(
parent
)
->
fdt
;
item
->
rst
->
fdt
=
fdt
;
rsti
(
item
)
->
fdt
=
fdt
;
item
->
rst
->
service_fd_id
=
fdt
->
nr
;
rsti
(
item
)
->
service_fd_id
=
fdt
->
nr
;
fdt
->
nr
++
;
fdt
->
nr
++
;
if
(
pid_rst_prio
(
item
->
pid
.
virt
,
fdt
->
pid
))
if
(
pid_rst_prio
(
item
->
pid
.
virt
,
fdt
->
pid
))
fdt
->
pid
=
item
->
pid
.
virt
;
fdt
->
pid
=
item
->
pid
.
virt
;
...
...
include/pstree.h
View file @
c443b03e
...
@@ -28,10 +28,14 @@ struct pstree_item {
...
@@ -28,10 +28,14 @@ struct pstree_item {
struct
pid
*
threads
;
/* array of threads */
struct
pid
*
threads
;
/* array of threads */
CoreEntry
**
core
;
CoreEntry
**
core
;
TaskKobjIdsEntry
*
ids
;
TaskKobjIdsEntry
*
ids
;
struct
rst_info
rst
[
0
];
};
};
/* See alloc_pstree_item() for details */
static
inline
struct
rst_info
*
rsti
(
struct
pstree_item
*
i
)
{
return
(
struct
rst_info
*
)(
i
+
1
);
}
/* ids is alocated and initialized for all alive tasks */
/* ids is alocated and initialized for all alive tasks */
static
inline
int
shared_fdtable
(
struct
pstree_item
*
item
)
static
inline
int
shared_fdtable
(
struct
pstree_item
*
item
)
{
{
...
...
mem.c
View file @
c443b03e
...
@@ -386,7 +386,7 @@ int prepare_mm_pid(struct pstree_item *i)
...
@@ -386,7 +386,7 @@ int prepare_mm_pid(struct pstree_item *i)
pid_t
pid
=
i
->
pid
.
virt
;
pid_t
pid
=
i
->
pid
.
virt
;
int
ret
=
-
1
,
vn
=
0
;
int
ret
=
-
1
,
vn
=
0
;
struct
cr_img
*
img
;
struct
cr_img
*
img
;
struct
rst_info
*
ri
=
i
->
rst
;
struct
rst_info
*
ri
=
rsti
(
i
)
;
img
=
open_image
(
CR_FD_MM
,
O_RSTR
|
O_OPT
,
pid
);
img
=
open_image
(
CR_FD_MM
,
O_RSTR
|
O_OPT
,
pid
);
if
(
!
img
)
{
if
(
!
img
)
{
...
...
pstree.c
View file @
c443b03e
...
@@ -168,11 +168,15 @@ struct pstree_item *__alloc_pstree_item(bool rst)
...
@@ -168,11 +168,15 @@ struct pstree_item *__alloc_pstree_item(bool rst)
if
(
!
item
)
if
(
!
item
)
return
NULL
;
return
NULL
;
}
else
{
}
else
{
item
=
shmalloc
(
sizeof
(
*
item
)
+
sizeof
(
item
->
rst
[
0
]));
int
sz
;
sz
=
sizeof
(
*
item
)
+
sizeof
(
struct
rst_info
);
item
=
shmalloc
(
sz
);
if
(
!
item
)
if
(
!
item
)
return
NULL
;
return
NULL
;
memset
(
item
,
0
,
sizeof
(
*
item
)
+
sizeof
(
item
->
rst
[
0
]));
vm_area_list_init
(
&
item
->
rst
[
0
].
vmas
);
memset
(
item
,
0
,
sz
);
vm_area_list_init
(
&
rsti
(
item
)
->
vmas
);
}
}
INIT_LIST_HEAD
(
&
item
->
children
);
INIT_LIST_HEAD
(
&
item
->
children
);
...
@@ -461,7 +465,7 @@ static int prepare_pstree_ids(void)
...
@@ -461,7 +465,7 @@ static int prepare_pstree_ids(void)
helper
->
pid
.
virt
=
item
->
sid
;
helper
->
pid
.
virt
=
item
->
sid
;
helper
->
state
=
TASK_HELPER
;
helper
->
state
=
TASK_HELPER
;
helper
->
parent
=
root_item
;
helper
->
parent
=
root_item
;
helper
->
rst
->
clone_flags
=
CLONE_FILES
|
CLONE_FS
;
rsti
(
helper
)
->
clone_flags
=
CLONE_FILES
|
CLONE_FS
;
list_add_tail
(
&
helper
->
sibling
,
&
helpers
);
list_add_tail
(
&
helper
->
sibling
,
&
helpers
);
task_entries
->
nr_helpers
++
;
task_entries
->
nr_helpers
++
;
...
@@ -562,7 +566,7 @@ static int prepare_pstree_ids(void)
...
@@ -562,7 +566,7 @@ static int prepare_pstree_ids(void)
}
}
if
(
gleader
)
{
if
(
gleader
)
{
item
->
rst
->
pgrp_leader
=
gleader
;
rsti
(
item
)
->
pgrp_leader
=
gleader
;
continue
;
continue
;
}
}
...
@@ -582,10 +586,10 @@ static int prepare_pstree_ids(void)
...
@@ -582,10 +586,10 @@ static int prepare_pstree_ids(void)
helper
->
pid
.
virt
=
item
->
pgid
;
helper
->
pid
.
virt
=
item
->
pgid
;
helper
->
state
=
TASK_HELPER
;
helper
->
state
=
TASK_HELPER
;
helper
->
parent
=
item
;
helper
->
parent
=
item
;
helper
->
rst
->
clone_flags
=
CLONE_FILES
|
CLONE_FS
;
rsti
(
helper
)
->
clone_flags
=
CLONE_FILES
|
CLONE_FS
;
list_add
(
&
helper
->
sibling
,
&
item
->
children
);
list_add
(
&
helper
->
sibling
,
&
item
->
children
);
task_entries
->
nr_helpers
++
;
task_entries
->
nr_helpers
++
;
item
->
rst
->
pgrp_leader
=
helper
;
rsti
(
item
)
->
pgrp_leader
=
helper
;
pr_info
(
"Add a helper %d for restoring PGID %d
\n
"
,
pr_info
(
"Add a helper %d for restoring PGID %d
\n
"
,
helper
->
pid
.
virt
,
helper
->
pgid
);
helper
->
pid
.
virt
,
helper
->
pgid
);
...
@@ -669,7 +673,7 @@ static int prepare_pstree_kobj_ids(void)
...
@@ -669,7 +673,7 @@ static int prepare_pstree_kobj_ids(void)
}
}
set_mask:
set_mask:
item
->
rst
->
clone_flags
=
cflags
;
rsti
(
item
)
->
clone_flags
=
cflags
;
if
(
parent
)
if
(
parent
)
/*
/*
* Mount namespaces are setns()-ed at
* Mount namespaces are setns()-ed at
...
@@ -677,7 +681,7 @@ set_mask:
...
@@ -677,7 +681,7 @@ set_mask:
* no need in creating it with its own
* no need in creating it with its own
* temporary namespace
* temporary namespace
*/
*/
item
->
rst
->
clone_flags
&=
~
CLONE_NEWNS
;
rsti
(
item
)
->
clone_flags
&=
~
CLONE_NEWNS
;
cflags
&=
CLONE_ALLNS
;
cflags
&=
CLONE_ALLNS
;
...
...
tty.c
View file @
c443b03e
...
@@ -764,7 +764,7 @@ static int tty_find_restoring_task(struct tty_info *info)
...
@@ -764,7 +764,7 @@ static int tty_find_restoring_task(struct tty_info *info)
pr_info
(
"Set a control terminal %x to %d
\n
"
,
pr_info
(
"Set a control terminal %x to %d
\n
"
,
info
->
tfe
->
id
,
info
->
tie
->
sid
);
info
->
tfe
->
id
,
info
->
tie
->
sid
);
return
prepare_ctl_tty
(
item
->
pid
.
virt
,
return
prepare_ctl_tty
(
item
->
pid
.
virt
,
item
->
rst
,
rsti
(
item
)
,
info
->
tfe
->
id
);
info
->
tfe
->
id
);
}
}
...
...
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