Commit d149adbc authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

vdso: Speed up /proc/pid/maps parse

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: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 1e1d0dde
...@@ -229,19 +229,28 @@ err: ...@@ -229,19 +229,28 @@ err:
static int vdso_parse_maps(pid_t pid, struct vdso_symtable *s) static int vdso_parse_maps(pid_t pid, struct vdso_symtable *s)
{ {
int exit_code = -1; int exit_code = -1;
char buf[512]; char *buf;
FILE *maps; struct bfd f;
*s = (struct vdso_symtable)VDSO_SYMTABLE_INIT; *s = (struct vdso_symtable)VDSO_SYMTABLE_INIT;
maps = fopen_proc(pid, "maps"); f.fd = open_proc(pid, "maps");
if (!maps) if (f.fd < 0)
return -1; return -1;
while (fgets(buf, sizeof(buf), maps)) { if (bfdopenr(&f))
goto err;
while (1) {
unsigned long start, end; unsigned long start, end;
char *has_vdso, *has_vvar; char *has_vdso, *has_vvar;
buf = breadline(&f);
if (buf == NULL)
break;
if (IS_ERR(buf))
goto err;
has_vdso = strstr(buf, "[vdso]"); has_vdso = strstr(buf, "[vdso]");
if (!has_vdso) if (!has_vdso)
has_vvar = strstr(buf, "[vvar]"); has_vvar = strstr(buf, "[vvar]");
...@@ -275,7 +284,7 @@ static int vdso_parse_maps(pid_t pid, struct vdso_symtable *s) ...@@ -275,7 +284,7 @@ static int vdso_parse_maps(pid_t pid, struct vdso_symtable *s)
exit_code = 0; exit_code = 0;
err: err:
fclose(maps); bclose(&f);
return exit_code; return exit_code;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment