[CRIU] [PATCH] img: Move sigactions into core
Andrei Vagin
avagin at virtuozzo.com
Mon Apr 24 17:03:50 PDT 2017
Applied, thanks!
On Wed, Apr 19, 2017 at 04:51:01PM +0300, Pavel Emelyanov wrote:
> Right now they all sit in a separate file. Since we
> don't support CLONE_SIGHAND (and don't plan to) it's
> much better to have them in core, all the more so
> by the time we dump/restore sigacts, the core entry
> is at hands already.
>
> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> ---
> criu/cr-dump.c | 2 +-
> criu/cr-restore.c | 57 +++++++++++++++++++++++++++++++++++++----
> criu/include/image-desc.h | 2 +-
> criu/include/parasite-syscall.h | 2 +-
> criu/parasite-syscall.c | 33 ++++++++++++++----------
> images/core.proto | 3 ++-
> 6 files changed, 77 insertions(+), 22 deletions(-)
>
> diff --git a/criu/cr-dump.c b/criu/cr-dump.c
> index 5f1f668..7115288 100644
> --- a/criu/cr-dump.c
> +++ b/criu/cr-dump.c
> @@ -1335,7 +1335,7 @@ static int dump_one_task(struct pstree_item *item)
> if (ret)
> goto err_cure;
>
> - ret = parasite_dump_sigacts_seized(parasite_ctl, cr_imgset);
> + ret = parasite_dump_sigacts_seized(parasite_ctl, item);
> if (ret) {
> pr_err("Can't dump sigactions (pid: %d) with parasite\n", pid);
> goto err_cure;
> diff --git a/criu/cr-restore.c b/criu/cr-restore.c
> index 7842e16..3da4b84 100644
> --- a/criu/cr-restore.c
> +++ b/criu/cr-restore.c
> @@ -424,6 +424,40 @@ static int restore_compat_sigaction(int sig, SaEntry *e)
> }
> #endif
>
> +static int prepare_sigactions_from_core(TaskCoreEntry *tc)
> +{
> + int sig, i;
> +
> + if (tc->n_sigactions != SIGMAX - 2) {
> + pr_err("Bad number of sigactions in the image (%d, want %d)\n",
> + (int)tc->n_sigactions, SIGMAX - 2);
> + return -1;
> + }
> +
> + pr_info("Restore on-core sigactions for %d\n", vpid(current));
> +
> + for (sig = 1, i = 0; sig <= SIGMAX; sig++) {
> + int ret;
> + SaEntry *e;
> + bool sigaction_is_compat;
> +
> + if (sig == SIGKILL || sig == SIGSTOP)
> + continue;
> +
> + e = tc->sigactions[i++];
> + sigaction_is_compat = e->has_compat_sigaction && e->compat_sigaction;
> + if (sigaction_is_compat)
> + ret = restore_compat_sigaction(sig, e);
> + else
> + ret = restore_native_sigaction(sig, e);
> +
> + if (ret < 0)
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> /* Returns number of restored signals, -1 or negative errno on fail */
> static int restore_one_sigaction(int sig, struct cr_img *img, int pid)
> {
> @@ -456,16 +490,13 @@ static int restore_one_sigaction(int sig, struct cr_img *img, int pid)
> return ret;
> }
>
> -static int prepare_sigactions(void)
> +static int prepare_sigactions_from_image(void)
> {
> int pid = vpid(current);
> struct cr_img *img;
> int sig, rst = 0;
> int ret = 0;
>
> - if (!task_alive(current))
> - return 0;
> -
> pr_info("Restore sigacts for %d\n", pid);
>
> img = open_image(CR_FD_SIGACT, O_RSTR, pid);
> @@ -487,10 +518,26 @@ static int prepare_sigactions(void)
> SIGMAX - 3 /* KILL, STOP and CHLD */);
>
> close_image(img);
> + return ret;
> +}
> +
> +static int prepare_sigactions(CoreEntry *core)
> +{
> + int ret;
> +
> + if (!task_alive(current))
> + return 0;
> +
> + if (core->tc->n_sigactions != 0)
> + ret = prepare_sigactions_from_core(core->tc);
> + else
> + ret = prepare_sigactions_from_image();
> +
> if (stack32) {
> free_compat_syscall_stack(stack32);
> stack32 = NULL;
> }
> +
> return ret;
> }
>
> @@ -1430,7 +1477,7 @@ static int restore_task_with_children(void *_arg)
> if (prepare_mappings(current))
> goto err;
>
> - if (prepare_sigactions() < 0)
> + if (prepare_sigactions(ca->core) < 0)
> goto err;
>
> if (fault_injected(FI_RESTORE_ROOT_ONLY)) {
> diff --git a/criu/include/image-desc.h b/criu/include/image-desc.h
> index 3fad408..fda5cac 100644
> --- a/criu/include/image-desc.h
> +++ b/criu/include/image-desc.h
> @@ -14,7 +14,6 @@ enum {
> CR_FD_CORE,
> CR_FD_IDS,
> CR_FD_MM,
> - CR_FD_SIGACT,
> CR_FD_CREDS,
> CR_FD_FS,
> _CR_FD_TASK_TO,
> @@ -89,6 +88,7 @@ enum {
> CR_FD_BINFMT_MISC_OLD,
> CR_FD_PAGES,
>
> + CR_FD_SIGACT,
> CR_FD_VMAS,
> CR_FD_PAGES_OLD,
> CR_FD_SHM_PAGES_OLD,
> diff --git a/criu/include/parasite-syscall.h b/criu/include/parasite-syscall.h
> index 0f923f3..72cd733 100644
> --- a/criu/include/parasite-syscall.h
> +++ b/criu/include/parasite-syscall.h
> @@ -22,7 +22,7 @@ struct rt_sigframe;
>
> struct parasite_ctl;
>
> -extern int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_imgset *cr_imgset);
> +extern int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct pstree_item *);
> extern int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct pstree_item *);
>
> struct proc_posix_timers_stat;
> diff --git a/criu/parasite-syscall.c b/criu/parasite-syscall.c
> index 30b0a5e..0e68aeb 100644
> --- a/criu/parasite-syscall.c
> +++ b/criu/parasite-syscall.c
> @@ -227,12 +227,12 @@ err_rth:
> return -1;
> }
>
> -int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_imgset *cr_imgset)
> +int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct pstree_item *item)
> {
> + TaskCoreEntry *tc = item->core[0]->tc;
> struct parasite_dump_sa_args *args;
> int ret, sig;
> - struct cr_img *img;
> - SaEntry se = SA_ENTRY__INIT;
> + SaEntry *sa, **psa;
>
> args = compel_parasite_args(ctl, struct parasite_dump_sa_args);
>
> @@ -240,7 +240,14 @@ int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_imgset *cr_
> if (ret < 0)
> return ret;
>
> - img = img_from_set(cr_imgset, CR_FD_SIGACT);
> + psa = xmalloc((SIGMAX - 2) * (sizeof(SaEntry *) + sizeof(SaEntry)));
> + if (!psa)
> + return -1;
> +
> + sa = (SaEntry *)(psa + SIGMAX - 2);
> +
> + tc->n_sigactions = SIGMAX - 2;
> + tc->sigactions = psa;
>
> for (sig = 1; sig <= SIGMAX; sig++) {
> int i = sig - 1;
> @@ -248,16 +255,16 @@ int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_imgset *cr_
> if (sig == SIGSTOP || sig == SIGKILL)
> continue;
>
> - ASSIGN_TYPED(se.sigaction, encode_pointer(args->sas[i].rt_sa_handler));
> - ASSIGN_TYPED(se.flags, args->sas[i].rt_sa_flags);
> - ASSIGN_TYPED(se.restorer, encode_pointer(args->sas[i].rt_sa_restorer));
> - BUILD_BUG_ON(sizeof(se.mask) != sizeof(args->sas[0].rt_sa_mask.sig));
> - memcpy(&se.mask, args->sas[i].rt_sa_mask.sig, sizeof(se.mask));
> - se.has_compat_sigaction = true;
> - se.compat_sigaction = !compel_mode_native(ctl);
> + sa_entry__init(sa);
> + ASSIGN_TYPED(sa->sigaction, encode_pointer(args->sas[i].rt_sa_handler));
> + ASSIGN_TYPED(sa->flags, args->sas[i].rt_sa_flags);
> + ASSIGN_TYPED(sa->restorer, encode_pointer(args->sas[i].rt_sa_restorer));
> + BUILD_BUG_ON(sizeof(sa->mask) != sizeof(args->sas[0].rt_sa_mask.sig));
> + memcpy(&sa->mask, args->sas[i].rt_sa_mask.sig, sizeof(sa->mask));
> + sa->has_compat_sigaction = true;
> + sa->compat_sigaction = !compel_mode_native(ctl);
>
> - if (pb_write_one(img, &se, PB_SIGACT) < 0)
> - return -1;
> + *(psa++) = sa++;
> }
>
> return 0;
> diff --git a/images/core.proto b/images/core.proto
> index 9c2254d..1f13d44 100644
> --- a/images/core.proto
> +++ b/images/core.proto
> @@ -8,7 +8,7 @@ import "core-ppc64.proto";
> import "rlimit.proto";
> import "timer.proto";
> import "creds.proto";
> -
> +import "sa.proto";
> import "siginfo.proto";
>
> import "opts.proto";
> @@ -45,6 +45,7 @@ message task_core_entry {
> optional uint32 loginuid = 13;
>
> optional int32 oom_score_adj = 14;
> + repeated sa_entry sigactions = 15;
> }
>
> message task_kobj_ids_entry {
> --
> 2.5.5
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list