Commit d20089fb authored by Pavel Emelyanov's avatar Pavel Emelyanov

dump: Merge thread and task parasite-core info dumping

There are parts dumping which is common to thread and task,
and this stuff is represented by parasite_dump_thread structure.

Merge this into parasite_dump_misc and facror out dumping code.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 1aacdca5
...@@ -626,13 +626,20 @@ static int dump_task_ids(struct pstree_item *item, const struct cr_fdset *cr_fds ...@@ -626,13 +626,20 @@ static int dump_task_ids(struct pstree_item *item, const struct cr_fdset *cr_fds
return pb_write_one(fdset_fd(cr_fdset, CR_FD_IDS), item->ids, PB_IDS); return pb_write_one(fdset_fd(cr_fdset, CR_FD_IDS), item->ids, PB_IDS);
} }
static int dump_thread_core(int pid, ThreadCoreEntry *tc) int dump_thread_core(int pid, CoreEntry *core, const struct parasite_dump_thread *ti)
{ {
int ret; int ret;
ThreadCoreEntry *tc = core->thread_core;
ret = get_task_futex_robust_list(pid, tc); ret = get_task_futex_robust_list(pid, tc);
if (!ret) if (!ret)
ret = dump_sched_info(pid, tc); ret = dump_sched_info(pid, tc);
if (!ret) {
core_put_tls(core, ti->tls);
CORE_THREAD_ARCH_INFO(core)->clear_tid_addr = encode_pointer(ti->tid_addr);
BUG_ON(!tc->sas);
copy_sas(tc->sas, &ti->sas);
}
return ret; return ret;
} }
...@@ -657,20 +664,13 @@ static int dump_task_core_all(struct parasite_ctl *ctl, ...@@ -657,20 +664,13 @@ static int dump_task_core_all(struct parasite_ctl *ctl,
strncpy((char *)core->tc->comm, stat->comm, TASK_COMM_LEN); strncpy((char *)core->tc->comm, stat->comm, TASK_COMM_LEN);
core->tc->flags = stat->flags; core->tc->flags = stat->flags;
core->tc->task_state = TASK_ALIVE; core->tc->task_state = TASK_ALIVE;
core->tc->exit_code = 0; core->tc->exit_code = 0;
ret = dump_thread_core(pid, core->thread_core); ret = dump_thread_core(pid, core, &misc->ti);
if (ret) if (ret)
goto err; goto err;
core_put_tls(core, misc->tls);
CORE_THREAD_ARCH_INFO(core)->clear_tid_addr = encode_pointer(misc->tid_addr);
BUG_ON(!core->thread_core->sas);
copy_sas(core->thread_core->sas, &misc->sas);
ret = pb_write_one(fd_core, core, PB_CORE); ret = pb_write_one(fd_core, core, PB_CORE);
if (ret < 0) if (ret < 0)
goto err; goto err;
...@@ -1099,10 +1099,6 @@ static int dump_task_thread(struct parasite_ctl *parasite_ctl, ...@@ -1099,10 +1099,6 @@ static int dump_task_thread(struct parasite_ctl *parasite_ctl,
goto err; goto err;
} }
ret = dump_thread_core(pid, core->thread_core);
if (ret)
goto err;
fd_core = open_image(CR_FD_CORE, O_DUMP, tid->virt); fd_core = open_image(CR_FD_CORE, O_DUMP, tid->virt);
if (fd_core < 0) if (fd_core < 0)
goto err; goto err;
......
...@@ -73,6 +73,7 @@ extern int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_d ...@@ -73,6 +73,7 @@ extern int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_d
extern int parasite_dump_creds(struct parasite_ctl *ctl, struct _CredsEntry *ce); extern int parasite_dump_creds(struct parasite_ctl *ctl, struct _CredsEntry *ce);
extern int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id, extern int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id,
struct pid *tid, struct _CoreEntry *core); struct pid *tid, struct _CoreEntry *core);
extern int dump_thread_core(int pid, CoreEntry *core, const struct parasite_dump_thread *dt);
extern int parasite_drain_fds_seized(struct parasite_ctl *ctl, extern int parasite_drain_fds_seized(struct parasite_ctl *ctl,
struct parasite_drain_fd *dfds, struct parasite_drain_fd *dfds,
......
...@@ -128,6 +128,13 @@ static inline int posix_timers_dump_size(int timer_n) ...@@ -128,6 +128,13 @@ static inline int posix_timers_dump_size(int timer_n)
return sizeof(int) + sizeof(struct posix_timer) * timer_n; return sizeof(int) + sizeof(struct posix_timer) * timer_n;
} }
struct parasite_dump_thread {
unsigned int *tid_addr;
pid_t tid;
u32 tls;
stack_t sas;
};
/* /*
* Misc sfuff, that is too small for separate file, but cannot * Misc sfuff, that is too small for separate file, but cannot
* be read w/o using parasite * be read w/o using parasite
...@@ -135,15 +142,13 @@ static inline int posix_timers_dump_size(int timer_n) ...@@ -135,15 +142,13 @@ static inline int posix_timers_dump_size(int timer_n)
struct parasite_dump_misc { struct parasite_dump_misc {
unsigned long brk; unsigned long brk;
unsigned int *tid_addr;
u32 pid; u32 pid;
u32 sid; u32 sid;
u32 pgid; u32 pgid;
u32 tls;
u32 umask; u32 umask;
stack_t sas; struct parasite_dump_thread ti;
}; };
#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned)) #define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned))
...@@ -154,13 +159,6 @@ struct parasite_dump_creds { ...@@ -154,13 +159,6 @@ struct parasite_dump_creds {
unsigned int groups[PARASITE_MAX_GROUPS]; unsigned int groups[PARASITE_MAX_GROUPS];
}; };
struct parasite_dump_thread {
unsigned int *tid_addr;
pid_t tid;
u32 tls;
stack_t sas;
};
static inline void copy_sas(ThreadSasEntry *dst, const stack_t *src) static inline void copy_sas(ThreadSasEntry *dst, const stack_t *src)
{ {
dst->ss_sp = encode_pointer(src->ss_sp); dst->ss_sp = encode_pointer(src->ss_sp);
......
...@@ -482,14 +482,8 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id, ...@@ -482,14 +482,8 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id,
return -1; return -1;
} }
BUG_ON(!tc->sas);
copy_sas(tc->sas, &args->sas);
CORE_THREAD_ARCH_INFO(core)->clear_tid_addr = encode_pointer(args->tid_addr);
tid->virt = args->tid; tid->virt = args->tid;
core_put_tls(core, args->tls); return dump_thread_core(pid, core, args);
return 0;
} }
int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset) int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset)
......
...@@ -136,26 +136,29 @@ static int dump_posix_timers(struct parasite_dump_posix_timers_args *args) ...@@ -136,26 +136,29 @@ static int dump_posix_timers(struct parasite_dump_posix_timers_args *args)
return ret; return ret;
} }
static int dump_misc(struct parasite_dump_misc *args) static int dump_thread_common(struct parasite_dump_thread *ti)
{ {
int ret; int ret;
ti->tls = arch_get_tls();
ret = sys_prctl(PR_GET_TID_ADDRESS, (unsigned long) &ti->tid_addr, 0, 0, 0);
if (ret == 0)
ret = sys_sigaltstack(NULL, &ti->sas);
return ret;
}
static int dump_misc(struct parasite_dump_misc *args)
{
args->brk = sys_brk(0); args->brk = sys_brk(0);
args->pid = sys_getpid(); args->pid = sys_getpid();
args->sid = sys_getsid(); args->sid = sys_getsid();
args->pgid = sys_getpgid(0); args->pgid = sys_getpgid(0);
args->tls = arch_get_tls();
args->umask = sys_umask(0); args->umask = sys_umask(0);
sys_umask(args->umask); /* never fails */ sys_umask(args->umask); /* never fails */
ret = sys_sigaltstack(NULL, &args->sas); return dump_thread_common(&args->ti);
if (ret)
return ret;
ret = sys_prctl(PR_GET_TID_ADDRESS, (unsigned long) &args->tid_addr, 0, 0, 0);
return ret;
} }
static int dump_creds(struct parasite_dump_creds *args) static int dump_creds(struct parasite_dump_creds *args)
...@@ -205,19 +208,8 @@ static int drain_fds(struct parasite_drain_fd *args) ...@@ -205,19 +208,8 @@ static int drain_fds(struct parasite_drain_fd *args)
static int dump_thread(struct parasite_dump_thread *args) static int dump_thread(struct parasite_dump_thread *args)
{ {
pid_t tid = sys_gettid(); args->tid = sys_gettid();
int ret; return dump_thread_common(args);
ret = sys_prctl(PR_GET_TID_ADDRESS, (unsigned long) &args->tid_addr, 0, 0, 0);
if (ret)
return ret;
args->tid = tid;
args->tls = arch_get_tls();
ret = sys_sigaltstack(NULL, &args->sas);
return ret;
} }
static char proc_mountpoint[] = "proc.crtools"; static char proc_mountpoint[] = "proc.crtools";
......
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