[CRIU] [PATCH 04/10] restore: add a function to wait when other tasks finish a stage
Andrei Vagin
avagin at openvz.org
Thu Feb 9 00:10:24 PST 2017
From: Andrei Vagin <avagin at virtuozzo.com>
It is used now to close descriptors of mount namespaces
and will be used for network namespaces too.
Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
---
criu/cr-restore.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index e7babe9..48e8f1a 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -120,6 +120,7 @@ static int prepare_rlimits(int pid, struct task_restore_args *, CoreEntry *core)
static int prepare_posix_timers(int pid, struct task_restore_args *ta, CoreEntry *core);
static int prepare_signals(int pid, struct task_restore_args *, CoreEntry *core);
+static void restore_wait_other_tasks();
static int crtools_prepare_shared(void)
{
@@ -1468,7 +1469,7 @@ static int restore_task_with_children(void *_arg)
* Wait when all tasks passed the CR_STATE_FORKING stage.
* It means that all tasks entered into their namespaces.
*/
- futex_wait_while_gt(&task_entries->nr_in_progress, 1);
+ restore_wait_other_tasks();
fini_restore_mntns();
}
@@ -1512,6 +1513,19 @@ static inline int stage_participants(int next_stage)
return -1;
}
+static inline int stage_current_participants(int next_stage)
+{
+ switch (next_stage) {
+ case CR_STATE_FORKING:
+ return 1;
+ case CR_STATE_RESTORE:
+ return current->nr_threads;
+ }
+
+ BUG();
+ return -1;
+}
+
static int restore_wait_inprogress_tasks()
{
int ret;
@@ -1540,6 +1554,18 @@ static int restore_switch_stage(int next_stage)
return restore_wait_inprogress_tasks();
}
+/* Wait all tasks except the current one */
+static void restore_wait_other_tasks()
+{
+ int participants, stage;
+
+ stage = futex_get(&task_entries->start);
+ participants = stage_current_participants(stage);
+
+ futex_wait_while_gt(&task_entries->nr_in_progress,
+ participants);
+}
+
static int attach_to_tasks(bool root_seized)
{
struct pstree_item *item;
--
2.7.4
More information about the CRIU
mailing list