Commit c56574b4 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Cyrill Gorcunov

dump: Obtain task brk via misc dump command

Right now we do syscall_seized for this, but we have the misc dumping command
and the core is (after patch #3) dump after parasite, so we can get brk from
the misc dump, thus avoiding one more switch to parasite.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 583a7fe8
...@@ -665,7 +665,7 @@ static int dump_task_core(struct core_entry *core, struct cr_fdset *fdset) ...@@ -665,7 +665,7 @@ static int dump_task_core(struct core_entry *core, struct cr_fdset *fdset)
} }
static int dump_task_core_all(pid_t pid, int pid_dir, struct proc_pid_stat *stat, static int dump_task_core_all(pid_t pid, int pid_dir, struct proc_pid_stat *stat,
struct cr_fdset *cr_fdset) struct parasite_dump_misc *misc, struct cr_fdset *cr_fdset)
{ {
struct core_entry *core = xzalloc(sizeof(*core)); struct core_entry *core = xzalloc(sizeof(*core));
int ret = -1; int ret = -1;
...@@ -704,6 +704,8 @@ static int dump_task_core_all(pid_t pid, int pid_dir, struct proc_pid_stat *stat ...@@ -704,6 +704,8 @@ static int dump_task_core_all(pid_t pid, int pid_dir, struct proc_pid_stat *stat
core->tc.mm_env_start = stat->env_start; core->tc.mm_env_start = stat->env_start;
core->tc.mm_env_end = stat->env_end; core->tc.mm_env_end = stat->env_end;
core->tc.mm_brk = misc->brk;
pr_info("Obtainting sigmask ... "); pr_info("Obtainting sigmask ... ");
ret = get_task_sigmask(pid, pid_dir, &core->tc.blk_sigset); ret = get_task_sigmask(pid, pid_dir, &core->tc.blk_sigset);
if (ret) if (ret)
...@@ -716,13 +718,6 @@ static int dump_task_core_all(pid_t pid, int pid_dir, struct proc_pid_stat *stat ...@@ -716,13 +718,6 @@ static int dump_task_core_all(pid_t pid, int pid_dir, struct proc_pid_stat *stat
goto err_free; goto err_free;
pr_info("OK\n"); pr_info("OK\n");
pr_info("Obtainting task brk ... ");
brk = brk_seized(pid, 0);
if ((long)brk < 0)
goto err_free;
core->tc.mm_brk = brk;
pr_info("OK\n");
core->tc.task_state = TASK_ALIVE; core->tc.task_state = TASK_ALIVE;
core->tc.exit_code = 0; core->tc.exit_code = 0;
...@@ -1254,7 +1249,7 @@ static int dump_one_task(struct pstree_item *item, struct cr_fdset *cr_fdset) ...@@ -1254,7 +1249,7 @@ static int dump_one_task(struct pstree_item *item, struct cr_fdset *cr_fdset)
goto err; goto err;
} }
ret = dump_task_core_all(pid, pid_dir, &pps_buf, cr_fdset); ret = dump_task_core_all(pid, pid_dir, &pps_buf, &misc, 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;
......
...@@ -28,7 +28,6 @@ extern void *mmap_seized(pid_t pid, user_regs_struct_t *regs, ...@@ -28,7 +28,6 @@ extern void *mmap_seized(pid_t pid, user_regs_struct_t *regs,
extern int munmap_seized(pid_t pid, user_regs_struct_t *regs, extern int munmap_seized(pid_t pid, user_regs_struct_t *regs,
void *addr, size_t length); void *addr, size_t length);
extern unsigned long brk_seized(pid_t pid, unsigned long addr);
extern int syscall_seized(pid_t pid, extern int syscall_seized(pid_t pid,
user_regs_struct_t *where, user_regs_struct_t *where,
......
...@@ -89,6 +89,7 @@ struct parasite_dump_pages_args { ...@@ -89,6 +89,7 @@ struct parasite_dump_pages_args {
struct parasite_dump_misc { struct parasite_dump_misc {
parasite_status_t status; parasite_status_t status;
unsigned int secbits; unsigned int secbits;
unsigned long brk;
}; };
/* /*
......
...@@ -258,6 +258,11 @@ static always_inline long sys_prctl(int code, unsigned long arg2, unsigned long ...@@ -258,6 +258,11 @@ static always_inline long sys_prctl(int code, unsigned long arg2, unsigned long
return syscall5(__NR_prctl, code, arg2, arg3, arg4, arg5); return syscall5(__NR_prctl, code, arg2, arg3, arg4, arg5);
} }
static always_inline long sys_brk(unsigned long arg)
{
return syscall1(__NR_brk, arg);
}
static always_inline long sys_clone(unsigned long flags, void *child_stack, static always_inline long sys_clone(unsigned long flags, void *child_stack,
void *parent_tid, void *child_tid) void *parent_tid, void *child_tid)
{ {
......
...@@ -92,31 +92,6 @@ int munmap_seized(pid_t pid, user_regs_struct_t *regs, ...@@ -92,31 +92,6 @@ int munmap_seized(pid_t pid, user_regs_struct_t *regs,
return ret; return ret;
} }
unsigned long brk_seized(pid_t pid, unsigned long addr)
{
user_regs_struct_t params, regs_orig;
unsigned long ret = -1UL;
jerr(ptrace(PTRACE_GETREGS, pid, NULL, &regs_orig), err);
params = regs_orig;
params.ax = (unsigned long)__NR_brk; /* brk */
params.di = (unsigned long)addr; /* @addr */
ret = syscall_seized(pid, &regs_orig, &params, &params);
if (!ret)
ret = (unsigned long)params.ax;
else
ret = -1UL;
if (ptrace(PTRACE_SETREGS, pid, NULL, &regs_orig)) {
pr_panic("Can't restore registers (pid: %d)\n", pid);
ret = -1UL;
}
err:
return ret;
}
int syscall_seized(pid_t pid, int syscall_seized(pid_t pid,
user_regs_struct_t *where, user_regs_struct_t *where,
user_regs_struct_t *params, user_regs_struct_t *params,
......
...@@ -363,6 +363,7 @@ static int dump_misc(struct parasite_dump_misc *args) ...@@ -363,6 +363,7 @@ static int dump_misc(struct parasite_dump_misc *args)
parasite_status_t *st = &args->status; parasite_status_t *st = &args->status;
args->secbits = sys_prctl(PR_GET_SECUREBITS, 0, 0, 0, 0); args->secbits = sys_prctl(PR_GET_SECUREBITS, 0, 0, 0, 0);
args->brk = sys_brk(0);
SET_PARASITE_STATUS(st, 0, 0); SET_PARASITE_STATUS(st, 0, 0);
return 0; return 0;
......
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