[CRIU] [PATCH v2 03/11] pstree/pid: add helper to get free pids in pidns and all it's ancestors

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Tue May 30 00:30:31 PDT 2017


v2: handle get_free_pids returns 0 as error, remove unneeded iter var in
get_free_pids

Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
 criu/include/pstree.h |  2 +-
 criu/namespaces.c     | 19 ++++---------------
 criu/pstree.c         | 22 +++++++++++++++++++++-
 3 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/criu/include/pstree.h b/criu/include/pstree.h
index 892a1cd..bae5ce6 100644
--- a/criu/include/pstree.h
+++ b/criu/include/pstree.h
@@ -88,7 +88,7 @@ static inline bool task_alive(struct pstree_item *i)
 	return is_alive_state(i->pid->state);
 }
 
-extern int get_free_pid(struct ns_id *ns);
+extern int get_free_pids(struct ns_id *ns, pid_t *pids);
 extern void free_pstree_item(struct pstree_item *item);
 extern void free_pstree(struct pstree_item *root_item);
 extern struct pstree_item *__alloc_pstree_item(bool rst, int level);
diff --git a/criu/namespaces.c b/criu/namespaces.c
index 3473ab1..dc3be34 100644
--- a/criu/namespaces.c
+++ b/criu/namespaces.c
@@ -2526,25 +2526,14 @@ int set_user_ns(u32 id)
 static int do_reserve_pid_ns_helpers(struct ns_id *ns, void *oarg)
 {
 	struct pstree_item *helper;
-	struct ns_id *iter = ns;
 	pid_t pid[MAX_NS_NESTING], *p;
-	int i, level;
+	int level;
 
-	for (i = MAX_NS_NESTING-1; iter && i >= 0; i--, iter = iter->parent) {
-		pid[i] = get_free_pid(iter);
-		if (pid[i] < 0) {
-			pr_err("Can't find free pid\n");
-			return -1;
-		}
-	}
-
-	if (iter) {
-		pr_err("Too many pids levels\n");
+	level = get_free_pids(ns, pid);
+	if (level <= 0)
 		return -1;
-	}
 
-	p = &pid[++i];
-	level = MAX_NS_NESTING - i;
+	p = &pid[MAX_NS_NESTING - level];
 	helper = lookup_create_item(p, level, ns->id);
 	if (helper == NULL)
 		return -1;
diff --git a/criu/pstree.c b/criu/pstree.c
index 83bb966..30e6957 100644
--- a/criu/pstree.c
+++ b/criu/pstree.c
@@ -833,7 +833,7 @@ static int read_pstree_image(pid_t *pid_max)
 }
 
 #define RESERVED_PIDS		300
-int get_free_pid(struct ns_id *ns)
+static int get_free_pid(struct ns_id *ns)
 {
 	struct pid *prev, *next;
 	struct ns_id *i = ns;
@@ -863,6 +863,26 @@ int get_free_pid(struct ns_id *ns)
 	return -1;
 }
 
+int get_free_pids(struct ns_id *ns, pid_t *pids)
+{
+	int i;
+
+	for (i = MAX_NS_NESTING-1; ns && i >= 0; i--, ns = ns->parent) {
+		pids[i] = get_free_pid(ns);
+		if (pids[i] < 0) {
+			pr_err("Can't find free pid\n");
+			return -1;
+		}
+	}
+
+	if (ns) {
+		pr_err("Too many pids levels\n");
+		return -1;
+	}
+
+	return MAX_NS_NESTING - i - 1;
+}
+
 static int prepare_pstree_ids(void)
 {
 	struct pstree_item *item, *child, *helper, *tmp;
-- 
2.9.3



More information about the CRIU mailing list