[CRIU] [PATCH cr] [RFC] pstree: simplify access to pid, real_pid, born_sid

Andrew Vagin avagin at parallels.com
Fri Jun 1 07:39:05 EDT 2012


On Fri, Jun 01, 2012 at 03:33:56PM +0400, Andrey Vagin wrote:
> 
> New version of pstree_item looks like:
Sorry, here is the correct struct pstree_item:
  struct pstree_item {
         struct list_head        list;
         union {
                struct pid {
                        u32 real_pid;
                        u32 pid;
                } cpt_pid;      /* leader pid */
                struct {
                        union {
                                u32 born_sid;
                                u32 real_pid;
                        };
                        u32 pid;
                };
         };
         struct pstree_item      *parent;

> In this case we can use pi->pid instead of pi->pid.pid and so on...
> 
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  cr-dump.c         |   62 +++++++++++++++++++++++++-------------------------
>  cr-restore.c      |   66 ++++++++++++++++++++++++++--------------------------
>  cr-show.c         |    8 +++---
>  files.c           |    4 +-
>  include/crtools.h |   19 +++++++++------
>  5 files changed, 81 insertions(+), 78 deletions(-)
> 

> diff --git a/cr-dump.c b/cr-dump.c
> index 40e0d8c..2065c7c 100644
> --- a/cr-dump.c
> +++ b/cr-dump.c
> @@ -985,7 +985,7 @@ static int parse_threads(const struct pstree_item *item, struct pid **_t, int *_
>  	struct pid *t = NULL;
>  	int nr = 1;
>  
> -	dir = opendir_proc(item->pid.real_pid, "task");
> +	dir = opendir_proc(item->real_pid, "task");
>  	if (!dir)
>  		return -1;
>  
> @@ -1048,7 +1048,7 @@ static int parse_children(const struct pstree_item *item, u32 **_c, int *_n)
>  	int nr = 1, i;
>  
>  	for (i = 0; i < item->nr_threads; i++) {
> -		file = fopen_proc(item->pid.real_pid, "task/%d/children",
> +		file = fopen_proc(item->real_pid, "task/%d/children",
>  						item->threads[i].real_pid);
>  		if (!file)
>  			goto err;
> @@ -1092,8 +1092,8 @@ struct pstree_item *__alloc_pstree_item(bool rst)
>  	INIT_LIST_HEAD(&item->children);
>  	item->threads = NULL;
>  	item->nr_threads = 0;
> -	item->pid.pid = -1;
> -	item->pid.real_pid = -1;
> +	item->pid = -1;
> +	item->real_pid = -1;
>  
>  	return item;
>  }
> @@ -1114,7 +1114,7 @@ static int get_children(struct pstree_item *item)
>  			ret = -1;
>  			goto free;
>  		}
> -		c->pid.real_pid = ch[i];
> +		c->real_pid = ch[i];
>  		c->parent = item;
>  		list_add_tail(&c->list, &item->children);
>  	}
> @@ -1167,7 +1167,7 @@ static void pstree_switch_state(struct pstree_item *root_item, int st)
>  static pid_t item_ppid(const struct pstree_item *item)
>  {
>  	item = item->parent;
> -	return item ? item->pid.real_pid : -1;
> +	return item ? item->real_pid : -1;
>  }
>  
>  static int seize_threads(const struct pstree_item *item)
> @@ -1181,11 +1181,11 @@ static int seize_threads(const struct pstree_item *item)
>  
>  	for (i = 0; i < item->nr_threads; i++) {
>  		pid_t pid = item->threads[i].real_pid;
> -		if (item->pid.real_pid == pid)
> +		if (item->real_pid == pid)
>  			continue;
>  
>  		pr_info("\tSeizing %d's %d thread\n",
> -				item->pid.real_pid, pid);
> +				item->real_pid, pid);
>  		ret = seize_task(pid, item_ppid(item), NULL, NULL);
>  		if (ret < 0)
>  			goto err;
> @@ -1205,7 +1205,7 @@ static int seize_threads(const struct pstree_item *item)
>  
>  err:
>  	for (i--; i >= 0; i--) {
> -		if (item->pid.real_pid == item->threads[i].real_pid)
> +		if (item->real_pid == item->threads[i].real_pid)
>  			continue;
>  
>  		unseize_task(item->threads[i].real_pid, TASK_ALIVE);
> @@ -1261,20 +1261,20 @@ static int check_xids(struct pstree_item *root_item)
>  			continue;
>  
>  		/* Easing #1 and #2 for sids */
> -		if ((p->sid != p->pid.pid) && (p->sid != p->parent->sid)) {
> +		if ((p->sid != p->pid) && (p->sid != p->parent->sid)) {
>  			pr_err("SID mismatch on %d (%d/%d)\n",
> -					p->pid.pid, p->sid, p->parent->sid);
> +					p->pid, p->sid, p->parent->sid);
>  			return -1;
>  		}
>  
>  		/* Easing #2 for pgids */
>  		for_each_pstree_item(tmp)
> -			if (tmp->pid.pid == p->pgid)
> +			if (tmp->pid == p->pgid)
>  				break;
>  
>  		if (tmp == NULL) {
>  			pr_err("PGIG mismatch on %d (%d)\n",
> -					p->pid.pid, p->pgid);
> +					p->pid, p->pgid);
>  			return -1;
>  		}
>  	}
> @@ -1285,7 +1285,7 @@ static int check_xids(struct pstree_item *root_item)
>  static int collect_task(struct pstree_item *item)
>  {
>  	int ret;
> -	pid_t pid = item->pid.real_pid;
> +	pid_t pid = item->real_pid;
>  
>  	ret = seize_task(pid, item_ppid(item), &item->pgid, &item->sid);
>  	if (ret < 0)
> @@ -1309,7 +1309,7 @@ static int collect_task(struct pstree_item *item)
>  
>  	close_pid_proc();
>  
> -	pr_info("Collected %d in %d state\n", item->pid.real_pid, item->state);
> +	pr_info("Collected %d in %d state\n", item->real_pid, item->state);
>  	return 0;
>  
>  err_close:
> @@ -1331,7 +1331,7 @@ static int check_subtree(const struct pstree_item *item)
>  
>  	i = 0;
>  	list_for_each_entry(child, &item->children, list) {
> -		if (child->pid.real_pid != ch[i])
> +		if (child->real_pid != ch[i])
>  			break;
>  		i++;
>  		if (i > nr)
> @@ -1350,7 +1350,7 @@ static int check_subtree(const struct pstree_item *item)
>  static int collect_subtree(struct pstree_item *item, int leader_only)
>  {
>  	struct pstree_item *child;
> -	pid_t pid = item->pid.real_pid;
> +	pid_t pid = item->real_pid;
>  	int ret;
>  
>  	pr_info("Collecting tasks starting from %d\n", pid);
> @@ -1382,7 +1382,7 @@ static int collect_pstree(pid_t pid, const struct cr_options *opts)
>  		if (root_item == NULL)
>  			return -1;
>  
> -		root_item->pid.real_pid = pid;
> +		root_item->real_pid = pid;
>  		INIT_LIST_HEAD(&root_item->list);
>  
>  		ret = collect_subtree(root_item, opts->leader_only);
> @@ -1392,7 +1392,7 @@ static int collect_pstree(pid_t pid, const struct cr_options *opts)
>  			 * namespaces' reaper. Check this.
>  			 */
>  			if (opts->namespaces_flags & CLONE_NEWPID) {
> -				BUG_ON(root_item->pid.real_pid != 1);
> +				BUG_ON(root_item->real_pid != 1);
>  
>  				if (check_subtree(root_item))
>  					goto try_again;
> @@ -1429,7 +1429,7 @@ static int dump_pstree(struct pstree_item *root_item)
>  	int pstree_fd;
>  
>  	pr_info("\n");
> -	pr_info("Dumping pstree (pid: %d)\n", root_item->pid.real_pid);
> +	pr_info("Dumping pstree (pid: %d)\n", root_item->real_pid);
>  	pr_info("----------------------------------------\n");
>  
>  	ret = check_xids(root_item);
> @@ -1441,10 +1441,10 @@ static int dump_pstree(struct pstree_item *root_item)
>  		return -1;
>  
>  	for_each_pstree_item(item) {
> -		pr_info("Process: %d(%d)\n", item->pid.pid, item->pid.real_pid);
> +		pr_info("Process: %d(%d)\n", item->pid, item->real_pid);
>  
> -		e.pid		= item->pid.pid;
> -		e.ppid		= item->parent ? item->parent->pid.pid : 0;
> +		e.pid		= item->pid;
> +		e.ppid		= item->parent ? item->parent->pid : 0;
>  		e.pgid		= item->pgid;
>  		e.sid		= item->sid;
>  		e.nr_threads	= item->nr_threads;
> @@ -1526,7 +1526,7 @@ static int dump_one_zombie(const struct pstree_item *item,
>  	core->tc.task_state = TASK_DEAD;
>  	core->tc.exit_code = pps->exit_code;
>  
> -	fd_core = open_image(CR_FD_CORE, O_DUMP, item->pid.pid);
> +	fd_core = open_image(CR_FD_CORE, O_DUMP, item->pid);
>  	if (fd_core < 0)
>  		goto err_free;
>  
> @@ -1547,8 +1547,8 @@ static int dump_task_threads(struct parasite_ctl *parasite_ctl,
>  
>  	for (i = 0; i < item->nr_threads; i++) {
>  		/* Leader is already dumped */
> -		if (item->pid.real_pid == item->threads[i].real_pid) {
> -			item->threads[i].pid = item->pid.pid;
> +		if (item->real_pid == item->threads[i].real_pid) {
> +			item->threads[i].pid = item->pid;
>  			continue;
>  		}
>  
> @@ -1561,7 +1561,7 @@ static int dump_task_threads(struct parasite_ctl *parasite_ctl,
>  
>  static int dump_one_task(struct pstree_item *item)
>  {
> -	pid_t pid = item->pid.real_pid;
> +	pid_t pid = item->real_pid;
>  	LIST_HEAD(vma_area_list);
>  	struct parasite_ctl *parasite_ctl;
>  	int ret = -1;
> @@ -1591,7 +1591,7 @@ static int dump_one_task(struct pstree_item *item)
>  
>  	if (item->state == TASK_DEAD) {
>  		/* FIXME don't support zombie in pid name space*/
> -		item->pid.pid = item->pid.real_pid;
> +		item->pid = item->real_pid;
>  
>  		BUG_ON(!list_empty(&item->children));
>  		return dump_one_zombie(item, &pps_buf);
> @@ -1622,12 +1622,12 @@ static int dump_one_task(struct pstree_item *item)
>  		goto err_cure_fdset;
>  	}
>  
> -	item->pid.pid = misc.pid;
> +	item->pid = misc.pid;
>  	item->sid = misc.sid;
>  	item->pgid = misc.pgid;
>  
>  	ret = -1;
> -	cr_fdset = cr_task_fdset_open(item->pid.pid, O_DUMP);
> +	cr_fdset = cr_task_fdset_open(item->pid, O_DUMP);
>  	if (!cr_fdset)
>  		goto err_cure;
>  
> @@ -1749,7 +1749,7 @@ int cr_dump_tasks(pid_t pid, const struct cr_options *opts)
>  		goto err;
>  
>  	if (opts->namespaces_flags)
> -		if (dump_namespaces(&root_item->pid, opts->namespaces_flags) < 0)
> +		if (dump_namespaces(&root_item->cpt_pid, opts->namespaces_flags) < 0)
>  			goto err;
>  
>  	ret = cr_dump_shmem();
> diff --git a/cr-restore.c b/cr-restore.c
> index 406c924..5b74c8a 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -101,7 +101,7 @@ static int prepare_pstree(void)
>  		if (pi == NULL)
>  			break;
>  
> -		pi->pid.pid = e.pid;
> +		pi->pid = e.pid;
>  		if (e.pid > max_pid)
>  			max_pid = e.pid;
>  
> @@ -123,18 +123,18 @@ static int prepare_pstree(void)
>  			 * and sit among the last item's ancestors.
>  			 */
>  			while (parent) {
> -				if (parent->pid.pid == e.ppid)
> +				if (parent->pid == e.ppid)
>  					break;
>  				parent = parent->parent;
>  			}
>  
>  			if (parent == NULL)
>  				for_each_pstree_item(parent)
> -					if (parent->pid.pid == e.ppid)
> +					if (parent->pid == e.ppid)
>  						break;
>  
>  			if (parent == NULL) {
> -				pr_err("Can't find a parent for %d", pi->pid.pid);
> +				pr_err("Can't find a parent for %d", pi->pid);
>  				xfree(pi);
>  				break;
>  			}
> @@ -176,19 +176,19 @@ static int prepare_pstree_ids(void)
>  	LIST_HEAD(helpers);
>  
>  	list_for_each_entry(pi, &root_item->children, list) {
> -		if (pi->sid == root_item->sid || pi->sid == pi->pid.pid)
> +		if (pi->sid == root_item->sid || pi->sid == pi->pid)
>  			continue;
>  
>  		tmp = alloc_pstree_item();
>  		tmp->sid = pi->sid;
>  		tmp->pgid = pi->sid;
> -		tmp->pid.pid = pi->sid;
> +		tmp->pid = pi->sid;
>  		tmp->state = TASK_HELPER;
>  		tmp->parent = root_item;
>  		list_add_tail(&tmp->list, &helpers);
>  
>  		pr_info("Add a helper %d for restoring SID %d\n",
> -				tmp->pid.pid, tmp->sid);
> +				tmp->pid, tmp->sid);
>  
>  		ci = list_entry(pi->list.prev, struct pstree_item, list);
>  		pi = ci;
> @@ -196,11 +196,11 @@ static int prepare_pstree_ids(void)
>  		list_for_each_entry_safe_continue(ci, t, &root_item->children, list) {
>  			if (ci->sid != tmp->sid)
>  				continue;
> -			if (ci->sid == ci->pid.pid)
> +			if (ci->sid == ci->pid)
>  				continue;
>  
>  			pr_info("Attach %d to the temporary task %d\n",
> -				ci->pid.pid, tmp->pid.pid);
> +				ci->pid, tmp->pid);
>  
>  			ci->parent = tmp;
>  			list_move(&ci->list, &tmp->children);
> @@ -215,16 +215,16 @@ static int prepare_pstree_ids(void)
>  		if (pi->state == TASK_HELPER)
>  			continue;
>  
> -		if (pi->sid != pi->pid.pid) {
> +		if (pi->sid != pi->pid) {
>  
>  			if (pi->parent->sid == pi->sid)
>  				continue;
>  
>  			/* the task can for a child before and after setsid() */
>  			ci = pi->parent;
> -			while (ci && ci->pid.pid != pi->sid) {
> +			while (ci && ci->pid != pi->sid) {
>  				ci->born_sid = pi->sid;
> -				pr_info("%d was born with sid %d\n", ci->pid.pid, pi->sid);
> +				pr_info("%d was born with sid %d\n", ci->pid, pi->sid);
>  				ci = ci->parent;
>  			}
>  
> @@ -245,12 +245,12 @@ static int prepare_pstree_ids(void)
>  				continue;
>  
>  			ci->pgid = pi->pgid;
> -			ci->pid.pid = ++max_pid;
> +			ci->pid = ++max_pid;
>  			ci->parent = pi;
>  			list_move(&ci->list, &pi->children);
>  
>  			pr_info("Attach %d to the task %d\n",
> -					ci->pid.pid, pi->pid.pid);
> +					ci->pid, pi->pid);
>  
>  			break;
>  		}
> @@ -299,11 +299,11 @@ static int prepare_shared(void)
>  		return -1;
>  
>  	for_each_pstree_item(pi) {
> -		ret = prepare_shmem_pid(pi->pid.pid);
> +		ret = prepare_shmem_pid(pi->pid);
>  		if (ret < 0)
>  			break;
>  
> -		ret = prepare_fd_pid(pi->pid.pid, pi->rst);
> +		ret = prepare_fd_pid(pi->pid, pi->rst);
>  		if (ret < 0)
>  			break;
>  	}
> @@ -439,14 +439,14 @@ static int restore_one_alive_task(int pid)
>  		if (pi->state != TASK_HELPER)
>  			continue;
>  
> -		ret = waitpid(pi->pid.pid, &status, 0);
> +		ret = waitpid(pi->pid, &status, 0);
>  		if (ret == -1) {
> -			pr_err("waitpid(%d) failed\n", pi->pid.pid);
> +			pr_err("waitpid(%d) failed\n", pi->pid);
>  			return -1;
>  		}
>  
>  		if (!WIFEXITED(status) || WEXITSTATUS(status)) {
> -			pr_err("%d exited with non-zero code (%d,%d)", pi->pid.pid,
> +			pr_err("%d exited with non-zero code (%d,%d)", pi->pid,
>  				WEXITSTATUS(status), WTERMSIG(status));
>  			return -1;
>  		}
> @@ -625,7 +625,7 @@ static inline int fork_with_pid(struct pstree_item *item, unsigned long ns_clone
>  	char buf[32];
>  	struct cr_clone_arg ca;
>  	void *stack;
> -	pid_t pid = item->pid.pid;
> +	pid_t pid = item->pid;
>  
>  	pr_info("Forking task with %d pid (flags 0x%lx)\n", pid, ns_clone_flags);
>  
> @@ -681,7 +681,7 @@ static void sigchld_handler(int signal, siginfo_t *siginfo, void *data)
>  	list_for_each_entry(pi, &me->children, list) {
>  		if (pi->state != TASK_HELPER)
>  			continue;
> -		if (pi->pid.pid == siginfo->si_pid)
> +		if (pi->pid == siginfo->si_pid)
>  			return;
>  	}
>  
> @@ -718,8 +718,8 @@ static void restore_sid(void)
>  	 * we can call setpgid() on custom values.
>  	 */
>  
> -	if (me->pid.pid == me->sid) {
> -		pr_info("Restoring %d to %d sid\n", me->pid.pid, me->sid);
> +	if (me->pid == me->sid) {
> +		pr_info("Restoring %d to %d sid\n", me->pid, me->sid);
>  		sid = setsid();
>  		if (sid != me->sid) {
>  			pr_perror("Can't restore sid (%d)", sid);
> @@ -739,7 +739,7 @@ static void restore_pgid(void)
>  {
>  	pid_t pgid;
>  
> -	pr_info("Restoring %d to %d pgid\n", me->pid.pid, me->pgid);
> +	pr_info("Restoring %d to %d pgid\n", me->pid, me->pgid);
>  
>  	pgid = getpgrp();
>  	if (me->pgid == pgid)
> @@ -747,7 +747,7 @@ static void restore_pgid(void)
>  
>  	pr_info("\twill call setpgid, mine pgid is %d\n", pgid);
>  	if (setpgid(0, me->pgid) != 0) {
> -		pr_perror("Can't restore pgid (%d/%d->%d)", me->pid.pid, pgid, me->pgid);
> +		pr_perror("Can't restore pgid (%d/%d->%d)", me->pid, pgid, me->pgid);
>  		xid_fail();
>  	}
>  }
> @@ -777,8 +777,8 @@ static int restore_task_with_children(void *_arg)
>  	me = ca->item;
>  
>  	pid = getpid();
> -	if (me->pid.pid != pid) {
> -		pr_err("Pid %d do not match expected %d\n", pid, me->pid.pid);
> +	if (me->pid != pid) {
> +		pr_err("Pid %d do not match expected %d\n", pid, me->pid);
>  		exit(-1);
>  	}
>  
> @@ -796,7 +796,7 @@ static int restore_task_with_children(void *_arg)
>  		exit(1);
>  
>  	if (ca->clone_flags) {
> -		ret = prepare_namespace(me->pid.pid, ca->clone_flags);
> +		ret = prepare_namespace(me->pid, ca->clone_flags);
>  		if (ret)
>  			exit(-1);
>  	}
> @@ -810,7 +810,7 @@ static int restore_task_with_children(void *_arg)
>  	sigdelset(&blockmask, SIGCHLD);
>  	ret = sigprocmask(SIG_BLOCK, &blockmask, NULL);
>  	if (ret) {
> -		pr_perror("%d: Can't block signals", me->pid.pid);
> +		pr_perror("%d: Can't block signals", me->pid);
>  		exit(1);
>  	}
>  
> @@ -844,7 +844,7 @@ static int restore_task_with_children(void *_arg)
>  
>  	restore_pgid();
>  
> -	return restore_one_task(me->pid.pid);
> +	return restore_one_task(me->pid);
>  }
>  
>  static int restore_root_task(struct pstree_item *init, struct cr_options *opts)
> @@ -873,7 +873,7 @@ static int restore_root_task(struct pstree_item *init, struct cr_options *opts)
>  	 * this later.
>  	 */
>  
> -	if (init->pid.pid == 1) {
> +	if (init->pid == 1) {
>  		sprintf(proc_mountpoint, "/tmp/crtools-proc.XXXXXX");
>  		if (mkdtemp(proc_mountpoint) == NULL) {
>  			pr_err("mkdtemp failed %m");
> @@ -903,7 +903,7 @@ static int restore_root_task(struct pstree_item *init, struct cr_options *opts)
>  	ret = (int)futex_get(&task_entries->nr_in_progress);
>  
>  out:
> -	if (init->pid.pid == 1) {
> +	if (init->pid == 1) {
>  		int err;
>  		err = umount(proc_mountpoint);
>  		if (err == -1)
> @@ -918,7 +918,7 @@ out:
>  		pr_err("Someone can't be restored\n");
>  
>  		for_each_pstree_item(pi)
> -			kill(pi->pid.pid, SIGKILL);
> +			kill(pi->pid, SIGKILL);
>  
>  		return 1;
>  	}
> diff --git a/cr-show.c b/cr-show.c
> index f697bcc..973429c 100644
> --- a/cr-show.c
> +++ b/cr-show.c
> @@ -426,7 +426,7 @@ static int show_collect_pstree(int fd_pstree, struct list_head *collect)
>  			if (!item)
>  				return -1;
>  
> -			item->pid.pid = e.pid;
> +			item->pid = e.pid;
>  			item->nr_threads = e.nr_threads;
>  			item->threads = xzalloc(sizeof(u32) * e.nr_threads);
>  			if (!item->threads) {
> @@ -649,7 +649,7 @@ static int cr_show_all(struct cr_options *opts)
>  	show_sk_queues(fd, opts);
>  	close(fd);
>  
> -	pid = list_first_entry(&pstree_list, struct pstree_item, list)->pid.pid;
> +	pid = list_first_entry(&pstree_list, struct pstree_item, list)->pid;
>  	ret = try_show_namespaces(pid, opts);
>  	if (ret)
>  		goto out;
> @@ -657,7 +657,7 @@ static int cr_show_all(struct cr_options *opts)
>  	list_for_each_entry(item, &pstree_list, list) {
>  		struct cr_fdset *cr_fdset = NULL;
>  
> -		cr_fdset = cr_task_fdset_open(item->pid.pid, O_SHOW);
> +		cr_fdset = cr_task_fdset_open(item->pid, O_SHOW);
>  		if (!cr_fdset)
>  			goto out;
>  
> @@ -668,7 +668,7 @@ static int cr_show_all(struct cr_options *opts)
>  
>  			for (i = 0; i < item->nr_threads; i++) {
>  
> -				if (item->threads[i].pid == item->pid.pid)
> +				if (item->threads[i].pid == item->pid)
>  					continue;
>  
>  				fd_th = open_image_ro(CR_FD_CORE, item->threads[i]);
> diff --git a/files.c b/files.c
> index f30aee1..599281b 100644
> --- a/files.c
> +++ b/files.c
> @@ -663,7 +663,7 @@ int prepare_fds(struct pstree_item *me)
>  
>  	for (state = 0; state < FD_STATE_MAX; state++) {
>  		list_for_each_entry(fle, &me->rst->fds, ps_list) {
> -			ret = open_fdinfo(me->pid.pid, &fle->fe, state);
> +			ret = open_fdinfo(me->pid, &fle->fe, state);
>  			if (ret)
>  				goto done;
>  		}
> @@ -674,7 +674,7 @@ int prepare_fds(struct pstree_item *me)
>  		 * list and restore at the very end.
>  		 */
>  		list_for_each_entry(fle, &me->rst->eventpoll, ps_list) {
> -			ret = open_fdinfo(me->pid.pid, &fle->fe, state);
> +			ret = open_fdinfo(me->pid, &fle->fe, state);
>  			if (ret)
>  				goto done;
>  		}
> diff --git a/include/crtools.h b/include/crtools.h
> index 9b4d71a..a88ea0a 100644
> --- a/include/crtools.h
> +++ b/include/crtools.h
> @@ -175,17 +175,20 @@ struct rst_info {
>  	struct list_head	eventpoll;
>  };
>  
> -struct pid
> -{
> -	u32 real_pid;
> -	u32 pid;
> -};
> -
>  struct pstree_item {
>  	struct list_head	list;
>  	union {
> -		struct pid	pid;		/* leader pid */
> -		u32 born_sid;
> +		struct pid {
> +			u32 real_pid;
> +			u32 pid;
> +		} cpt_pid;	/* leader pid */
> +		struct {
> +			union {
> +				u32 born_sid;
> +				u32 real_pid;
> +			};
> +			u32 pid;
> +		};
>  	};
>  	struct pstree_item	*parent;
>  	struct list_head	children;	/* array of children */

> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://openvz.org/mailman/listinfo/criu



More information about the CRIU mailing list