[CRIU] [PATCH 10/12] posix-timer: Add reading image and put it to shared memory

Pavel Emelyanov xemul at parallels.com
Thu May 30 07:02:53 EDT 2013


On 05/30/2013 03:36 AM, Pavel Tikhomirov wrote:
> 
> Signed-off-by: Pavel Tikhomirov <snorcht at gmail.com>
> ---
>  cr-restore.c |   77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 75 insertions(+), 2 deletions(-)
> 
> diff --git a/cr-restore.c b/cr-restore.c
> index edd3f0d..c5905b8 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -1503,6 +1503,53 @@ static inline int posix_timer_restore_and_fix(PosixTimerEntry *pte,
>  	return 0;
>  }
>  
> +static int open_posix_timers_image(int pid, struct restore_posix_timer **rpt,
> +				unsigned long *size, int *nr)
> +{
> +	int fd;
> +	int ret = -1;
> +
> +	fd = open_image(CR_FD_POSIX_TIMERS, O_RSTR, pid);

This image can be missing in images dir if crtools v0.5 and earlier generated one.
You should handle this case.

> +	if (fd < 0)
> +		return fd;
> +
> +	while (1) {
> +		PosixTimerEntry *pte;
> +		struct restore_posix_timer info;

This variable is excessive, you can posix_timer_restore_and_fix() right into the rpt.

> +
> +		ret = pb_read_one_eof(fd, &pte, PB_POSIX_TIMERS);
> +		if (ret <= 0) {
> +			goto out;
> +		}
> +		ret = posix_timer_restore_and_fix(pte, &info);
> +		if (ret < 0)
> +			goto out;
> +
> +		if ((*nr + 1) * sizeof(struct restore_posix_timer) > *size) {
> +			unsigned long new_size = *size + PAGE_SIZE;
> +
> +			if (*rpt == NULL)
> +				*rpt = mmap(NULL, new_size, PROT_READ | PROT_WRITE,
> +					MAP_PRIVATE | MAP_ANON, 0, 0);
> +			else
> +				*rpt = mremap(*rpt, *size, new_size, MREMAP_MAYMOVE);
> +			if (*rpt == MAP_FAILED) {
> +				pr_perror("Can't allocate memory for posix timers");
> +				ret = -1;
> +				goto out;
> +			}
> +
> +			*size = new_size;
> +		}
> +		memcpy(*rpt + *nr, &info, sizeof(info));
> +		posix_timer_entry__free_unpacked(pte, NULL);
> +		(*nr)++;
> +	}
> +out:
> +	close_safe(&fd);
> +	return ret;
> +}
> +
>  static inline int verify_cap_size(CredsEntry *ce)
>  {
>  	return ((ce->n_cap_inh == CR_CAP_SIZE) && (ce->n_cap_eff == CR_CAP_SIZE) &&
> @@ -1844,6 +1891,10 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  	unsigned long vdso_rt_size = 0;
>  	unsigned long vdso_rt_delta = 0;
>  
> +	struct restore_posix_timer *posix_timers_info_chunk = NULL;
> +	int posix_timers_nr = 0;
> +	unsigned long posix_timers_size = 0;
> +
>  	struct vm_area_list self_vmas;
>  	int i;
>  
> @@ -1896,13 +1947,22 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  		siginfo_priv_nr[i] = ret;
>  	}
>  
> +	ret = open_posix_timers_image(pid, &posix_timers_info_chunk,
> +			&posix_timers_size, &posix_timers_nr);
> +	if (ret < 0) {
> +		if (errno != ENOENT) /* backward compatibility */
> +			goto err;
> +		ret = 0;
> +	}
> +
>  	restore_bootstrap_len = restorer_len +
>  				restore_task_vma_len +
>  				restore_thread_vma_len +
>  				SHMEMS_SIZE + TASK_ENTRIES_SIZE +
>  				self_vmas_len + vmas_len +
>  				rst_tcp_socks_size +
> -				siginfo_size;
> +				siginfo_size +
> +				posix_timers_size;
>  
>  	/*
>  	 * Figure out how much memory runtime vdso will need.
> @@ -1978,6 +2038,19 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  	task_args->siginfo = siginfo_chunk;
>  	siginfo_chunk += task_args->siginfo_nr;
>  
> +	mem += siginfo_size;
> +	if (posix_timers_info_chunk) {
> +		posix_timers_info_chunk = mremap(posix_timers_info_chunk,
> +			posix_timers_size, posix_timers_size,
> +			MREMAP_FIXED | MREMAP_MAYMOVE, mem);
> +		if(posix_timers_info_chunk == MAP_FAILED) {
> +			pr_perror("mremap");
> +			goto err;
> +		}
> +	}
> +	task_args->timer_n = posix_timers_nr;
> +	task_args->posix_timers = posix_timers_info_chunk;
> +
>  	/*
>  	 * Get a reference to shared memory area which is
>  	 * used to signal if shmem restoration complete
> @@ -1989,7 +2062,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>  	 * address.
>  	 */
>  
> -	mem += siginfo_size;
> +	mem += posix_timers_size;
>  	ret = shmem_remap(rst_shmems, mem, SHMEMS_SIZE);
>  	if (ret < 0)
>  		goto err;
> 




More information about the CRIU mailing list