[CRIU] [PATCH] pstree: Relax parent finding fast path
Pavel Emelyanov
xemul at virtuozzo.com
Fri May 13 06:33:37 PDT 2016
When we didn't have tree with pids, the search for parent
item was optimized. Nowadays we can just use one rbtree
lookup.
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
criu/pstree.c | 35 ++++++++++-------------------------
1 file changed, 10 insertions(+), 25 deletions(-)
diff --git a/criu/pstree.c b/criu/pstree.c
index 5c0d30e..00e6204 100644
--- a/criu/pstree.c
+++ b/criu/pstree.c
@@ -478,7 +478,7 @@ static int read_pstree_image(void)
{
int ret = 0, i;
struct cr_img *img;
- struct pstree_item *pi, *parent = NULL;
+ struct pstree_item *pi;
pr_info("Reading image tree\n");
@@ -524,37 +524,22 @@ static int read_pstree_image(void)
root_item = pi;
pi->parent = NULL;
} else {
- /*
- * Fast path -- if the pstree image is not edited, the
- * parent of any item should have already being restored
- * and sit among the last item's ancestors.
- */
- while (parent) {
- if (parent->pid.virt == e->ppid)
- break;
- parent = parent->parent;
- }
-
- if (parent == NULL) {
- for_each_pstree_item(parent) {
- if (parent->pid.virt == e->ppid)
- break;
- }
+ struct pid *pid;
+ struct pstree_item *parent;
- if (parent == NULL) {
- pr_err("Can't find a parent for %d\n", pi->pid.virt);
- pstree_entry__free_unpacked(e, NULL);
- xfree(pi);
- goto err;
- }
+ pid = pstree_pid_by_virt(e->ppid);
+ if (!pid || pid->state == TASK_UNDEF || pid->state == TASK_THREAD) {
+ pr_err("Can't find a parent for %d\n", pi->pid.virt);
+ pstree_entry__free_unpacked(e, NULL);
+ xfree(pi);
+ goto err;
}
+ parent = container_of(pid, struct pstree_item, pid);
pi->parent = parent;
list_add(&pi->sibling, &parent->children);
}
- parent = pi;
-
pi->nr_threads = e->n_threads;
pi->threads = xmalloc(e->n_threads * sizeof(struct pid));
if (!pi->threads)
--
2.5.0
More information about the CRIU
mailing list