From f3bee6d584a48a5a30c09a71ad9c33f2665dea0c Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Wed, 17 Sep 2014 19:10:00 +0400 Subject: [PATCH] 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 --- cr-dump.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/cr-dump.c b/cr-dump.c index 91336e824..86b079b26 100644 --- a/cr-dump.c +++ b/cr-dump.c @@ -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);