lkml.org 
[lkml]   [2009]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC v17][PATCH 22/60] c/r: external checkpoint of a task other than ourself


    Serge E. Hallyn wrote:
    > Quoting Oren Laadan (orenl@librato.com):
    >>
    >> Serge E. Hallyn wrote:
    >>> Quoting Oren Laadan (orenl@librato.com):
    >>>> Now we can do "external" checkpoint, i.e. act on another task.
    >>> ...
    >>>
    >>>> long do_checkpoint(struct ckpt_ctx *ctx, pid_t pid)
    >>>> {
    >>>> long ret;
    >>>>
    >>>> + ret = init_checkpoint_ctx(ctx, pid);
    >>>> + if (ret < 0)
    >>>> + return ret;
    >>>> +
    >>>> + if (ctx->root_freezer) {
    >>>> + ret = cgroup_freezer_begin_checkpoint(ctx->root_freezer);
    >>>> + if (ret < 0)
    >>>> + return ret;
    >>>> + }
    >>> Self-checkpoint of a task in root freezer is now denied, though.
    >>>
    >>> Was that intentional?
    >> Yes.
    >>
    >> "root freezer" is an arbitrary task in the checkpoint subtree or
    >> container. It is used to verify that all checkpointed tasks - except
    >> for current, if doing self-checkpoint - belong to the same freezer
    >> group.
    >>
    >> Since current is busy calling checkpoint(2), and since we only permit
    >> checkpoint of (cgroup-) frozen tasks, then - by definition - it cannot
    >> possibly belong to the same group. If it did, it would itself be frozen
    >> like its fellows and unable to call checkpoint(2).
    >
    > So then you're saying that regular self-checkpoint no longer works,
    > but the documentation still shows self.c and claims it should just
    > work.

    I'm unsure why you say that self-checkpoint no longer works ?
    In fact, I just double checked that it does.

    Self-checkpoint has two immediate use-cases:

    1) Single process that checkpoints itself - ctx->root_freezer remains
    NULL, which causes cgroup_freezer_begin_checkpoint() to be skipped.

    2) Process P that belongs to a hierarchy (subtree or container), and
    P calls checkpoint(2) to checkpoint the hierarchy.
    For this to work, all other processes in the hierarchy must be frozen.
    Therefore, they also belong to a freezer cgroup (perhaps more than one -
    but that is not permitted).
    In this case, ctx->root will point to a process from the freezer cgroup,
    and the code tests all other processes (excluding P, which is current)
    to confirm that they belong to the same freezer cgroup.
    P itself can not possibly belong to it, otherwise it would have been
    frozen and not executing the checkpoint(2) syscall.

    IOW, for case 2 to work, one must arrange for all tasks in the target
    hierarchy, except for P (- current, the checkpointer), to belong to
    a single freezer cgroup, and for that cgroup to be frozen.

    >>> Self-checkpoint of a task in root freezer is now denied, though.

    Maybe I didn't really understand what you meant by that, and by
    "root freezer" ?

    >
    > Mind you I prefer this as it is more consistent, but I thought it
    > was something you wanted to support.

    Self-checkpoint simply allows a process to checkpoint itself (and
    perhaps additional processes too). I never quite understood why you
    view it as a source of inconsistency ...

    Nevertheless, it still works.

    Oren.



    \
     
     \ /
      Last update: 2009-07-23 16:17    [W:0.038 / U:0.356 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site