2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-29 13:28:27 +00:00

proc: Don't use FILE* for reading personality

It turned out, that fdopen (used in fopen_proc) always maps
a 4k buffer for reads and this buffer gets unmap-ed later
on fclose.

Taking into account the amount of proc files we read (~20
per task plus one file per opened file descriptor) this
mmap+munmap result in quite a lot of useless CPU time.

E.g. for a container of 20 tasks we have 1000 calls taking
~8% of total dump time.

So lets first stop doing this for simple cases -- one line
proc files.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
Pavel Emelyanov 2014-09-17 19:10:00 +04:00
parent d36c4058bc
commit f3bee6d584

View File

@ -579,26 +579,22 @@ err:
static int get_task_personality(pid_t pid, u32 *personality)
{
FILE *file = NULL;
int ret = -1;
int fd, ret = -1;
pr_info("Obtaining personality ... ");
file = fopen_proc(pid, "personality");
if (!file)
fd = open_proc(pid, "personality");
if (fd < 0)
goto err;
if (!fgets(loc_buf, sizeof(loc_buf), file)) {
pr_perror("Can't read task personality");
goto err;
ret = read(fd, loc_buf, sizeof(loc_buf));
close(fd);
if (ret >= 0) {
loc_buf[ret] = '\0';
*personality = atoi(loc_buf);
}
*personality = atoi(loc_buf);
ret = 0;
err:
if (file)
fclose(file);
return ret;
}
@ -720,7 +716,7 @@ static int dump_task_core_all(struct pstree_item *item,
pr_info("----------------------------------------\n");
ret = get_task_personality(pid, &core->tc->personality);
if (ret)
if (ret < 0)
goto err;
strncpy((char *)core->tc->comm, stat->comm, TASK_COMM_LEN);