[CRIU] [PATCH] vdso: Speed up /proc/pid/maps parse

Andrei Vagin avagin at virtuozzo.com
Fri Apr 21 16:55:52 PDT 2017


Accepted, thanks!

On Thu, Apr 13, 2017 at 06:30:16PM +0300, Pavel Emelyanov wrote:
> This file is parsed on each start, it's nicer to make it
> use bfd engine and save several syscalls and #PFs.
> 
> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> ---
>  criu/vdso.c | 21 +++++++++++++++------
>  1 file changed, 15 insertions(+), 6 deletions(-)
> 
> diff --git a/criu/vdso.c b/criu/vdso.c
> index 7708535..bbaba3f 100644
> --- a/criu/vdso.c
> +++ b/criu/vdso.c
> @@ -229,19 +229,28 @@ err:
>  static int vdso_parse_maps(pid_t pid, struct vdso_symtable *s)
>  {
>  	int exit_code = -1;
> -	char buf[512];
> -	FILE *maps;
> +	char *buf;
> +	struct bfd f;
>  
>  	*s = (struct vdso_symtable)VDSO_SYMTABLE_INIT;
>  
> -	maps = fopen_proc(pid, "maps");
> -	if (!maps)
> +	f.fd = open_proc(pid, "maps");
> +	if (f.fd < 0)
>  		return -1;
>  
> -	while (fgets(buf, sizeof(buf), maps)) {
> +	if (bfdopenr(&f))
> +		goto err;
> +
> +	while (1) {
>  		unsigned long start, end;
>  		char *has_vdso, *has_vvar;
>  
> +		buf = breadline(&f);
> +		if (buf == NULL)
> +			break;
> +		if (IS_ERR(buf))
> +			goto err;
> +
>  		has_vdso = strstr(buf, "[vdso]");
>  		if (!has_vdso)
>  			has_vvar = strstr(buf, "[vvar]");
> @@ -275,7 +284,7 @@ static int vdso_parse_maps(pid_t pid, struct vdso_symtable *s)
>  
>  	exit_code = 0;
>  err:
> -	fclose(maps);
> +	bclose(&f);
>  	return exit_code;
>  }
>  
> -- 
> 2.5.5
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list