lkml.org 
[lkml]   [2010]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [RFC/RFT PATCH v3] sched: automated per tty task groups
    From
    Date
    On Mon, 2010-11-15 at 17:55 -0800, Paul Menage wrote:
    > On Mon, Nov 15, 2010 at 5:18 PM, Linus Torvalds
    > <torvalds@linux-foundation.org> wrote:
    > >
    > > so sched_debug_show() is apparently calling cgroup_path() with a NULL
    > > cgroup. I think it's "print_task()" that is to blame, it does
    > >
    > > cgroup_path(task_group(p)->css.cgroup, ..
    > >
    > > without checking whether there _is_ any css.cgroup.
    >
    > Right - previously the returned task_group would be always associated
    > with a cgroup. Now, it may not be.
    >
    > The original task_group() should be made accessible for anything that
    > wants a real cgroup in the scheduler hierarchy, and called from the
    > new task_group() function. Not sure what the best naming convention
    > would be, maybe task_group() and effective_task_group() ?

    Right, that doesn't solve the full problem though.

    /proc/sched_debug should show these automagic task_groups, its just that
    there's currently no way to properly name them, we can of course add
    something like a name field to the struct autogroup thing, but what do
    we fill it with? "autogroup-%d" and keep a sequence number for each
    autogroup?

    Then the below task_group_path() thing can try the autogroup name scheme
    if it finds a NULL css.

    Something like the below might avoid the explosion:

    ---
    kernel/sched_debug.c | 28 ++++++++++++++--------------
    1 files changed, 14 insertions(+), 14 deletions(-)

    diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c
    index 2e1b0d1..9b5560f 100644
    --- a/kernel/sched_debug.c
    +++ b/kernel/sched_debug.c
    @@ -87,6 +87,19 @@ static void print_cfs_group_stats(struct seq_file *m, int cpu,
    }
    #endif

    +#if defined(CONFIG_CGROUP_SCHED) && \
    + (defined(CONFIG_FAIR_GROUP_SCHED) || defined(CONFIG_RT_GROUP_SCHED))
    +static void task_group_path(struct task_group *tg, char *buf, int buflen)
    +{
    + /* may be NULL if the underlying cgroup isn't fully-created yet */
    + if (!tg->css.cgroup) {
    + buf[0] = '\0';
    + return;
    + }
    + cgroup_path(tg->css.cgroup, buf, buflen);
    +}
    +#endif
    +
    static void
    print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
    {
    @@ -115,7 +128,7 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
    char path[64];

    rcu_read_lock();
    - cgroup_path(task_group(p)->css.cgroup, path, sizeof(path));
    + task_group_path(task_group(p), path, sizeof(path));
    rcu_read_unlock();
    SEQ_printf(m, " %s", path);
    }
    @@ -147,19 +160,6 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
    read_unlock_irqrestore(&tasklist_lock, flags);
    }

    -#if defined(CONFIG_CGROUP_SCHED) && \
    - (defined(CONFIG_FAIR_GROUP_SCHED) || defined(CONFIG_RT_GROUP_SCHED))
    -static void task_group_path(struct task_group *tg, char *buf, int buflen)
    -{
    - /* may be NULL if the underlying cgroup isn't fully-created yet */
    - if (!tg->css.cgroup) {
    - buf[0] = '\0';
    - return;
    - }
    - cgroup_path(tg->css.cgroup, buf, buflen);
    -}
    -#endif
    -
    void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
    {
    s64 MIN_vruntime = -1, min_vruntime, max_vruntime = -1,


    \
     
     \ /
      Last update: 2010-11-16 15:03    [W:3.338 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site