[CRIU] [PATCH 05/10] pstree: add curr_sid/pgid updating them on fork/setsid/setpgid
Kirill Tkhai
ktkhai at virtuozzo.com
Tue Jul 4 12:32:59 MSK 2017
On 04.07.2017 12:08, Pavel Tikhomirov wrote:
> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
> ---
> criu/cr-restore.c | 33 +++++++++++++++++++++++++++++++++
> criu/include/rst_info.h | 3 +++
> 2 files changed, 36 insertions(+)
>
> diff --git a/criu/cr-restore.c b/criu/cr-restore.c
> index 3ce27fd..4083f2a 100644
> --- a/criu/cr-restore.c
> +++ b/criu/cr-restore.c
> @@ -1386,6 +1386,34 @@ static inline int fork_with_pid(struct pstree_item *item)
> pid_t pid = vpid(item);
> struct ns_id *pid_ns;
>
> + if (!item->parent) {
> + pid_t real_sid, real_pgid;
> +
> + real_sid = getsid(0);
> + if (real_sid == -1) {
> + pr_perror("%d: Fail to getsid\n", vpid(item));
> + return -1;
> + }
> +
> + real_pgid = getpgid(0);
> + if (real_pgid == -1) {
> + pr_perror("%d: Fail to getpgid\n", vpid(item));
> + return -1;
> + }
> +
> + rsti(item)->curr_sid = real_sid;
> + rsti(item)->curr_pgid = real_pgid;
> + } else {
> + rsti(item)->curr_sid = rsti(item->parent)->curr_sid;
> + rsti(item)->curr_pgid = rsti(item->parent)->curr_pgid;
> + }
> +
> + /* Check we are born with the right sid */
> + if (item->born_sid != -1)
> + BUG_ON(item->born_sid != rsti(item)->curr_sid);
> + else if (!is_session_leader(item))
> + BUG_ON(vsid(item) != rsti(item)->curr_sid);
> +
fork_with_pid() is already fat.. I'd suggested to move this to separate function.
> if (item->pid->state != TASK_HELPER) {
> if (open_core(pid, &ca.core))
> return -1;
> @@ -1541,6 +1569,8 @@ static void restore_sid(void)
> pr_perror("Can't restore sid (%d)", sid);
> exit(1);
> }
> + rsti(current)->curr_sid = vpid(current);
> + rsti(current)->curr_pgid = vpid(current);
> } else {
> sid = getsid(getpid());
> if (sid != last_level_pid(current->sid)) {
> @@ -1552,6 +1582,8 @@ static void restore_sid(void)
> exit(1);
> }
> }
> +
> + BUG_ON(rsti(current)->curr_sid != vsid(current));
> }
>
> static void restore_pgid(void)
> @@ -1598,6 +1630,7 @@ static void restore_pgid(void)
> pr_perror("Can't restore pgid (%d/%d->%d)", vpid(current), pgid, vpgid(current));
> exit(1);
> }
> + rsti(current)->curr_pgid = vpid(current);
>
> if (my_pgid == last_level_pid(current->pid))
> futex_set_and_wake(&rsti(current)->pgrp_set, 1);
> diff --git a/criu/include/rst_info.h b/criu/include/rst_info.h
> index f9840d1..c1f8fdf 100644
> --- a/criu/include/rst_info.h
> +++ b/criu/include/rst_info.h
> @@ -65,6 +65,9 @@ struct rst_info {
> bool has_thp_enabled;
>
> void *breakpoint;
> +
> + int curr_sid;
> + int curr_pgid;
> };
>
> extern struct task_entries *task_entries;
>
More information about the CRIU
mailing list