[CRIU] [PATCH 01/12] pstree: Bind CoreEntry to pstree and fill it with registers early
Cyrill Gorcunov
gorcunov at openvz.org
Fri Mar 1 13:58:03 EST 2013
On Fri, Mar 01, 2013 at 10:44:27PM +0400, Pavel Emelyanov wrote:
> > - if (ctl)
> > - regs = ctl->regs_orig;
> > - else {
> > - if (ptrace(PTRACE_GETREGS, pid, NULL, ®s)) {
> > - pr_err("Can't obtain GP registers for %d\n", pid);
> > - goto err;
> > - }
> > + if (ptrace(PTRACE_GETREGS, pid, NULL, ®s)) {
> > + pr_err("Can't obtain GP registers for %d\n", pid);
> > + goto err;
> > }
>
> So, do we still have regs duplication?
We simply _can't_ live without regs duplication for thread leader.
parasite_ctl must have own copy in cpu _native_ format, while
CoreEntry'ies carry registers converted to protobuf format.
I though about to use CoreEntry instead but this implies adding
a new routines which would convert pb registers to native format,
which eventually only complicates the code. That's why I left it
in this way.
> > +static int collect_regs_seized(struct pstree_item *item)
> > +{
> > + unsigned int i;
> > + int ret;
> > +
> > + if (pstree_alloc_cores(item))
> > + return -1;
> > +
> > + for (i = 0; i < item->nr_threads; i++) {
> > + pid_t pid = item->threads[i].real;
> > + ret = get_task_regs(pid, item->core[i]);
> > + if (ret) {
> > + pr_err("Can't obtain regs for thread %d\n", pid);
> > + return -1;
> > + }
> > +
> > + if (item->threads[i].real == item->pid.real)
> > + item->this_core = item->core[i];
>
> We've already done this in pstree_alloc_cores()
Indeed, this is harmless leftover, thanks!
> > + }
> > +
> > + return 0;
> > +}
>
> > +int pstree_alloc_cores(struct pstree_item *item)
> > +{
> > + unsigned int i;
> > +
> > + item->core = xzalloc(sizeof(*item->core) * item->nr_threads);
> > + if (!item->core)
> > + return -1;
> > +
> > + for (i = 0; i < item->nr_threads; i++) {
> > + int is_leader = (item->threads[i].real == item->pid.real);
> > +
> > + item->core[i] = core_entry_alloc(item->state != TASK_DEAD, is_leader);
> > + if (!item->core[i])
> > + goto err;
> > +
> > + if (is_leader)
> > + item->this_core = item->core[i];
>
> The version in collect_regs_seized() without is_leader looks nicer.
I wanted to distinguish pstree functions with anything else, ie we
have pstree_alloc_cores/pstree_free_cores pair which doesn't care
about the data present in CoreEntry but only serves allocation/frees
of CoreEntry, and collect_regs_seized which fills core entries with
registers.
In first versions of this patch collect_regs_seized didn't allocate
Cores but you don't like it as far as i remember, that's why I moved
pstree_alloc_cores into collect_regs_seized.
Cyrill
More information about the CRIU
mailing list