mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-31 14:25:49 +00:00
ctrools: Rewrite task/threads stopping engine is back
This commit brings the former "Rewrite task/threads stopping engine" commit back. Handling it separately is too complex so better try to handle it in-place. Note some tests might fault, it's expected. --- Stopping tasks with STOP and proceeding with SEIZE is actually excessive -- the SEIZE if enough. Moreover, just killing a task with STOP is also racy, since task should be given some time to come to sleep before its proc can be parsed. Rewrite all this code to SEIZE task and all its threads from the very beginning. With this we can distinguish stopped task state and migrate it properly (not supported now, need to implement). This thing however has one BIG problem -- after we SEIZE-d a task we should seize it's threads, but we should do it in a loop -- reading /proc/pid/task and seizing them again and again, until the contents of this dir stops changing (not done now). Besides, after we seized a task and all its threads we cannot scan it's children list once -- task can get reparented to init and any task's child can call clone with CLONE_PARENT flag thus repopulating the children list of the already seized task (not done also) This patch is ugly, yes, but splitting it doesn't help to review it much, sorry :( Signed-off-by: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
This commit is contained in:
@@ -4,6 +4,12 @@
|
||||
#define PROC_TASK_COMM_LEN 32
|
||||
#define PROC_TASK_COMM_LEN_FMT "(%31s"
|
||||
|
||||
struct proc_pid_stat_small {
|
||||
int pid;
|
||||
char comm[PROC_TASK_COMM_LEN];
|
||||
char state;
|
||||
};
|
||||
|
||||
struct proc_pid_stat {
|
||||
int pid;
|
||||
char comm[PROC_TASK_COMM_LEN];
|
||||
@@ -72,6 +78,7 @@ struct proc_status_creds {
|
||||
};
|
||||
|
||||
extern int parse_pid_stat(pid_t pid, int pid_dir, struct proc_pid_stat *s);
|
||||
extern int parse_pid_stat_small(pid_t pid, int pid_dir, struct proc_pid_stat_small *s);
|
||||
extern int parse_maps(pid_t pid, int pid_dir, struct list_head *vma_area_list, bool use_map_files);
|
||||
extern int parse_pid_status(int pid_dir, struct proc_status_creds *);
|
||||
|
||||
|
Reference in New Issue
Block a user