[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