lkml.org 
[lkml]   [2011]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH 4/7] cgroups: New cancel_attach_task subsystem callback
    On Mon, Jul 11, 2011 at 7:15 AM, Frederic Weisbecker <fweisbec@gmail.com> wrote:
    > To cancel a process attachment on a subsystem, we only call the
    > cancel_attach() callback once on the leader but we have no
    > way to cancel the attachment individually for each member of
    > the process group.
    >
    > This is going to be needed for the max number of tasks susbystem
    > that is coming.
    >
    > To prepare for this integration, call a new cancel_attach_task()
    > callback on each task of the group until we reach the member that
    > failed to attach.
    >
    > Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>

    Acked-by: Paul Menage <menage@google.com>


    > Cc: Paul Menage <menage@google.com>
    > Cc: Li Zefan <lizf@cn.fujitsu.com>
    > Cc: Johannes Weiner <hannes@cmpxchg.org>
    > Cc: Aditya Kali <adityakali@google.com>
    > ---
    >  include/linux/cgroup.h |    1 +
    >  kernel/cgroup.c        |   15 ++++++++++++---
    >  2 files changed, 13 insertions(+), 3 deletions(-)
    >
    > diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
    > index e8288a0..94454143 100644
    > --- a/include/linux/cgroup.h
    > +++ b/include/linux/cgroup.h
    > @@ -472,6 +472,7 @@ struct cgroup_subsys {
    >                               struct task_struct *tsk);
    >        void (*cancel_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
    >                              struct task_struct *tsk);
    > +       void (*cancel_attach_task)(struct cgroup *cgrp, struct task_struct *tsk);
    >        void (*pre_attach)(struct cgroup *cgrp);
    >        void (*attach_task)(struct cgroup *cgrp, struct cgroup *old_cgrp, struct task_struct *tsk);
    >        void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
    > diff --git a/kernel/cgroup.c b/kernel/cgroup.c
    > index c3ee4cf..210dc05 100644
    > --- a/kernel/cgroup.c
    > +++ b/kernel/cgroup.c
    > @@ -1989,7 +1989,7 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader)
    >  {
    >        int retval, i, group_size;
    >        struct cgroup_subsys *ss, *failed_ss = NULL;
    > -       bool cancel_failed_ss = false;
    > +       struct task_struct *failed_task = NULL;
    >        /* guaranteed to be initialized later, but the compiler needs this */
    >        struct cgroup *oldcgrp = NULL;
    >        struct css_set *oldcg;
    > @@ -2077,7 +2077,7 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader)
    >                                retval = ss->can_attach_task(cgrp, oldcgrp, tsk);
    >                                if (retval) {
    >                                        failed_ss = ss;
    > -                                       cancel_failed_ss = true;
    > +                                       failed_task = tsk;
    >                                        goto out_cancel_attach;
    >                                }
    >                        }
    > @@ -2172,8 +2172,17 @@ out_cancel_attach:
    >        /* same deal as in cgroup_attach_task */
    >        if (retval) {
    >                for_each_subsys(root, ss) {
    > +                       if (ss->cancel_attach_task && (ss != failed_ss || failed_task)) {
    > +                               for (i = 0; i < group_size; i++) {
    > +                                       tsk = flex_array_get_ptr(group, i);
    > +                                       if (tsk == failed_task)
    > +                                               break;
    > +                                       ss->cancel_attach_task(cgrp, tsk);
    > +                               }
    > +                       }
    > +
    >                        if (ss == failed_ss) {
    > -                               if (cancel_failed_ss && ss->cancel_attach)
    > +                               if (failed_task && ss->cancel_attach)
    >                                        ss->cancel_attach(ss, cgrp, leader);
    >                                break;
    >                        }
    > --
    > 1.7.5.4
    >
    >
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2011-07-26 03:01    [W:0.030 / U:0.224 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site