[CRIU] [PATCH] restore: Parse self maps via bfd
Andrei Vagin
avagin at virtuozzo.com
Fri Apr 21 16:58:15 PDT 2017
Accepted, thanks!
On Fri, Apr 14, 2017 at 07:56:58PM +0300, Pavel Emelyanov wrote:
> When injecting the restorer blob criu parses /proc/self/maps
> file to find out the hole for the blob itself. It happens
> every time and the maps file for criu is now HUGE (~12k),
> so it's much more efficient to use bfd for it rather than
> glibc's fopen.
>
> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> ---
> criu/proc_parse.c | 30 +++++++++++++++++++++---------
> 1 file changed, 21 insertions(+), 9 deletions(-)
>
> diff --git a/criu/proc_parse.c b/criu/proc_parse.c
> index 5e9780a..19a010e 100644
> --- a/criu/proc_parse.c
> +++ b/criu/proc_parse.c
> @@ -422,20 +422,30 @@ static int vma_get_mapfile(const char *fname, struct vma_area *vma, DIR *mfd,
>
> int parse_self_maps_lite(struct vm_area_list *vms)
> {
> - FILE *maps;
> struct vma_area *prev = NULL;
> + struct bfd maps;
> + char *buf;
>
> vm_area_list_init(vms);
>
> - maps = fopen_proc(PROC_SELF, "maps");
> - if (maps == NULL)
> + maps.fd = open_proc(PROC_SELF, "maps");
> + if (maps.fd < 0)
> return -1;
>
> - while (fgets(buf, BUF_SIZE, maps) != NULL) {
> + if (bfdopenr(&maps))
> + return -1;
> +
> + while (1) {
> struct vma_area *vma;
> char *end;
> unsigned long s, e;
>
> + buf = breadline(&maps);
> + if (!buf)
> + break;
> + if (IS_ERR(buf))
> + goto err;
> +
> s = strtoul(buf, &end, 16);
> e = strtoul(end + 1, NULL, 16);
>
> @@ -448,10 +458,8 @@ int parse_self_maps_lite(struct vm_area_list *vms)
> prev->e->end = e;
> else {
> vma = alloc_vma_area();
> - if (!vma) {
> - fclose(maps);
> - return -1;
> - }
> + if (!vma)
> + goto err;
>
> vma->e->start = s;
> vma->e->end = e;
> @@ -463,8 +471,12 @@ int parse_self_maps_lite(struct vm_area_list *vms)
> pr_debug("Parsed %"PRIx64"-%"PRIx64" vma\n", prev->e->start, prev->e->end);
> }
>
> - fclose(maps);
> + bclose(&maps);
> return 0;
> +
> +err:
> + bclose(&maps);
> + return -1;
> }
>
> #ifdef CONFIG_VDSO
> --
> 2.5.5
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list