[CRIU] [PATCH] mnt: Shorten the mntns dumping loop

Pavel arsbum at mail.ru
Mon Sep 22 05:26:44 PDT 2014


We currently have all mouninfo-s from all mnt namespaces collected
in one big list. On dump we scan through it to find the namespaces
we need to dump.

This can be optimized by walking the list of namespaces instead.

Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
 include/namespaces.h |  1 +
 mount.c              | 14 ++++++--------
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/include/namespaces.h b/include/namespaces.h
index 350b8b4..ccf55f8 100644
--- a/include/namespaces.h
+++ b/include/namespaces.h
@@ -18,6 +18,7 @@ struct ns_id {
 	futex_t created; /* boolean */
 	union {
 		struct {
+			struct mount_info *mntinfo_list;
 			struct mount_info *mntinfo_tree;
 		} mnt;
 	};
diff --git a/mount.c b/mount.c
index fb3fe6b..685f340 100644
--- a/mount.c
+++ b/mount.c
@@ -975,7 +975,7 @@ struct mount_info *collect_mntinfo(struct ns_id *ns)
 {
 	struct mount_info *pm;
 
-	pm = parse_mountinfo(ns->pid, ns);
+	ns->mnt.mntinfo_list = pm = parse_mountinfo(ns->pid, ns);
 	if (!pm) {
 		pr_err("Can't parse %d's mountinfo\n", ns->pid);
 		return NULL;
@@ -2133,15 +2133,14 @@ int collect_mnt_namespaces(void)
 
 int dump_mnt_namespaces(void)
 {
-	struct ns_id *nsid = NULL;
-	struct mount_info *m;
+	struct ns_id *nsid;
 	int n = 0;
 
 	if (!(root_ns_mask & CLONE_NEWNS))
 		return 0;
 
-	for (m = mntinfo; m; m = m->next) {
-		if (m->nsid == nsid)
+	for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) {
+		if (nsid->nd != &mnt_ns_desc)
 			continue;
 
 		if (++n == 2 && check_mnt_id()) {
@@ -2150,11 +2149,10 @@ int dump_mnt_namespaces(void)
 			return -1;
 		}
 
-		if (dump_mnt_ns(m->nsid, m))
+		if (dump_mnt_ns(nsid, nsid->mnt.mntinfo_list))
 			return -1;
-
-		nsid = m->nsid;
 	}
+
 	return 0;
 }
 
-- 
1.8.4.2



More information about the CRIU mailing list