Commit 8092d77b authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Cyrill Gorcunov

dump: Rework task stats parsing and dumping

Move the /proc/pid/stat parsing before anything in dump_one_task (prepare
for zombies dumping) and cleanup the rest of the code accordingly.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent f1347e1d
...@@ -431,29 +431,10 @@ err: ...@@ -431,29 +431,10 @@ err:
#define assign_reg(dst, src, e) dst.e = (__typeof__(dst.e))src.e #define assign_reg(dst, src, e) dst.e = (__typeof__(dst.e))src.e
#define assign_array(dst, src, e) memcpy(&dst.e, &src.e, sizeof(dst.e)) #define assign_array(dst, src, e) memcpy(&dst.e, &src.e, sizeof(dst.e))
static struct proc_pid_stat pps_buf; static int get_task_sigmask(pid_t pid, int pid_dir, u64 *task_sigset)
static int get_task_stat(pid_t pid, int pid_dir, u8 *comm, u32 *flags,
u64 *start_code, u64 *end_code,
u64 *start_data, u64 *end_data,
u64 *start_stack, u64 *start_brk,
u64 *task_sigset)
{ {
FILE *file = NULL; FILE *file;
int ret; int ret = -1;
ret = parse_pid_stat(pid, pid_dir, &pps_buf);
if (ret < 0)
goto err;
strncpy((char *)comm, pps_buf.comm, TASK_COMM_LEN);
*flags = pps_buf.flags;
*start_code = pps_buf.start_code;
*end_code = pps_buf.end_code;
*start_data = pps_buf.start_data;
*end_data = pps_buf.end_data;
*start_stack = pps_buf.start_stack;
*start_brk = pps_buf.start_brk;
/* /*
* Now signals. * Now signals.
...@@ -468,13 +449,13 @@ static int get_task_stat(pid_t pid, int pid_dir, u8 *comm, u32 *flags, ...@@ -468,13 +449,13 @@ static int get_task_stat(pid_t pid, int pid_dir, u8 *comm, u32 *flags,
if (!strncmp(loc_buf, "SigBlk:", 7)) { if (!strncmp(loc_buf, "SigBlk:", 7)) {
char *end; char *end;
*task_sigset = strtol(&loc_buf[8], &end, 16); *task_sigset = strtol(&loc_buf[8], &end, 16);
ret = 0;
break; break;
} }
} }
fclose(file);
err: err:
if (file)
fclose(file);
return ret; return ret;
} }
...@@ -576,7 +557,8 @@ err: ...@@ -576,7 +557,8 @@ err:
return ret; return ret;
} }
static int dump_task_core_seized(pid_t pid, int pid_dir, struct cr_fdset *cr_fdset) static int dump_task_core_seized(pid_t pid, int pid_dir, struct proc_pid_stat *stat,
struct cr_fdset *cr_fdset)
{ {
struct core_entry *core = xzalloc(sizeof(*core)); struct core_entry *core = xzalloc(sizeof(*core));
int fd_core = cr_fdset->fds[CR_FD_CORE]; int fd_core = cr_fdset->fds[CR_FD_CORE];
...@@ -604,16 +586,16 @@ static int dump_task_core_seized(pid_t pid, int pid_dir, struct cr_fdset *cr_fds ...@@ -604,16 +586,16 @@ static int dump_task_core_seized(pid_t pid, int pid_dir, struct cr_fdset *cr_fds
goto err_free; goto err_free;
pr_info("OK\n"); pr_info("OK\n");
pr_info("Obtainting task stat ... "); strncpy((char *)core->task_comm, stat->comm, TASK_COMM_LEN);
ret = get_task_stat(pid, pid_dir, core->task_comm, core->task_flags = stat->flags;
&core->task_flags, core->mm_start_code = stat->start_code;
&core->mm_start_code, core->mm_end_code = stat->end_code;
&core->mm_end_code, core->mm_start_data = stat->start_data;
&core->mm_start_data, core->mm_end_data = stat->end_data;
&core->mm_end_data, core->mm_start_stack = stat->start_stack;
&core->mm_start_stack, core->mm_start_brk = stat->start_brk;
&core->mm_start_brk,
&core->task_sigset); ret = get_task_sigmask(pid, pid_dir, &core->task_sigset);
if (ret) if (ret)
goto err_free; goto err_free;
pr_info("OK\n"); pr_info("OK\n");
...@@ -1038,6 +1020,8 @@ err: ...@@ -1038,6 +1020,8 @@ err:
return ret; return ret;
} }
static struct proc_pid_stat pps_buf;
static int dump_one_task(pid_t pid, struct cr_fdset *cr_fdset) static int dump_one_task(pid_t pid, struct cr_fdset *cr_fdset)
{ {
LIST_HEAD(vma_area_list); LIST_HEAD(vma_area_list);
...@@ -1055,6 +1039,11 @@ static int dump_one_task(pid_t pid, struct cr_fdset *cr_fdset) ...@@ -1055,6 +1039,11 @@ static int dump_one_task(pid_t pid, struct cr_fdset *cr_fdset)
goto err; goto err;
} }
pr_info("Obtainting task stat ... ");
ret = parse_pid_stat(pid, pid_dir, &pps_buf);
if (ret < 0)
goto err;
ret = collect_mappings(pid, pid_dir, &vma_area_list); ret = collect_mappings(pid, pid_dir, &vma_area_list);
if (ret) { if (ret) {
pr_err("Collect mappings (pid: %d) failed with %d\n", pid, ret); pr_err("Collect mappings (pid: %d) failed with %d\n", pid, ret);
...@@ -1068,7 +1057,7 @@ static int dump_one_task(pid_t pid, struct cr_fdset *cr_fdset) ...@@ -1068,7 +1057,7 @@ static int dump_one_task(pid_t pid, struct cr_fdset *cr_fdset)
goto err; goto err;
} }
ret = dump_task_core_seized(pid, pid_dir, cr_fdset); ret = dump_task_core_seized(pid, pid_dir, &pps_buf, cr_fdset);
if (ret) { if (ret) {
pr_err("Dump core (pid: %d) failed with %d\n", pid, ret); pr_err("Dump core (pid: %d) failed with %d\n", pid, ret);
goto err; goto err;
......
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