----- Original Message -----

> > Another question re: your patch -- is it possible to have a "depth" greater
> > than 1?
>
> Yes, "depth" could be greater than 1, see the example below:
>
> CPU 0 RUNQUEUE: ffff880028216680
>   CURRENT: PID: 17085  TASK: ffff880137c63540  COMMAND: "bash"
>   RT PRIO_ARRAY: ffff880028216808                                        <-- 
> depth = 0
>      [  0] PID: 17129  TASK: ffff880037aeaaa0  COMMAND: "rtloop99"
>            PID: 2832   TASK: ffff88013b09cae0  COMMAND: "rtkit-daemon"
>            PID: 6      TASK: ffff88013d7c6080  COMMAND: "watchdog/0"
>      [  1] GROUP RT PRIO_ARRAY: ffff88002ca65000                         <-- 
> depth = 1
>               [  1] GROUP RT PRIO_ARRAY: ffff880015821000                <-- 
> depth = 2
>                        [  1] PID: 17126  TASK: ffff880135d2a040  COMMAND: 
> "rtloop98"
>               [ 98] PID: 17119  TASK: ffff88010190d500  COMMAND: "rtloop1"
>                     PID: 17121  TASK: ffff88013bd27500  COMMAND: "rtloop1"
>                     PID: 17120  TASK: ffff88010190caa0  COMMAND: "rtloop1"
>   CFS RB_ROOT: ffff880028216718
...

> Hmm, I think the depth could not be that big. So how do you think this
> kind of output.
> 
> The attached patch just changed "CHILD" to "GROUP".

Interesting -- how did you set up the depth-greater-than-one scenario?

Anyway, given that it is possible, let's at least tighten up the output display
by changing each "9 * depth" usage to be "6 * depth".  That should alter
your example output to look like this:

CPU 0 RUNQUEUE: ffff880028216680
  CURRENT: PID: 17085  TASK: ffff880137c63540  COMMAND: "bash"
  RT PRIO_ARRAY: ffff880028216808                                       
     [  0] PID: 17129  TASK: ffff880037aeaaa0  COMMAND: "rtloop99"
           PID: 2832   TASK: ffff88013b09cae0  COMMAND: "rtkit-daemon"
           PID: 6      TASK: ffff88013d7c6080  COMMAND: "watchdog/0"
     [  1] GROUP RT PRIO_ARRAY: ffff88002ca65000                       
           [  1] GROUP RT PRIO_ARRAY: ffff880015821000                
                 [  1] PID: 17126  TASK: ffff880135d2a040  COMMAND: "rtloop98"
           [ 98] PID: 17119  TASK: ffff88010190d500  COMMAND: "rtloop1"
                 PID: 17121  TASK: ffff88013bd27500  COMMAND: "rtloop1"
                 PID: 17120  TASK: ffff88010190caa0  COMMAND: "rtloop1"
  CFS RB_ROOT: ffff880028216718
     ...

And also, I'd prefer to not create the dangling "static int depth", 
but rather to add a depth argument to dump_RT_prio_array(), where 
dump_CFS_runqueues() passes a 0, and dump_RT_prio_array() passes
"depth+1" to itself: 

static void
dump_RT_prio_array(int depth, ulong k_prio_array, char *u_prio_array)
{
        int i, c, tot, cnt, qheads;
        ulong offset, kvaddr, uvaddr;
        ulong list_head[2];
        struct list_data list_data, *ld;
        struct task_context *tc;
        ulong *tlist;
        ulong my_q, task_addr;
        char *rt_rq_buf;

        if (!depth)
                fprintf(fp, "  RT PRIO_ARRAY: %lx\n",  k_prio_array);

        qheads = (i = ARRAY_LENGTH(rt_prio_array_queue)) ?
                i : get_array_length("rt_prio_array.queue", NULL, 
SIZE(list_head));

        ld = &list_data;

        for (i = tot = 0; i < qheads; i++) {
                offset =  OFFSET(rt_prio_array_queue) + (i * SIZE(list_head));
                kvaddr = k_prio_array + offset;
                uvaddr = (ulong)u_prio_array + offset;
                BCOPY((char *)uvaddr, (char *)&list_head[0], sizeof(ulong)*2);

                if (CRASHDEBUG(1))
                        fprintf(fp, "rt_prio_array[%d] @ %lx => %lx/%lx\n", 
                                i, kvaddr, list_head[0], list_head[1]);

                if ((list_head[0] == kvaddr) && (list_head[1] == kvaddr))
                        continue;

                INDENT(5 + 6 * depth);
                fprintf(fp, "[%3d] ", i);

                BZERO(ld, sizeof(struct list_data));
                ld->start = list_head[0];
                if (VALID_MEMBER(task_struct_rt) &&
                    VALID_MEMBER(sched_rt_entity_run_list))
                        ld->list_head_offset = OFFSET(sched_rt_entity_run_list);
                else
                        ld->list_head_offset = OFFSET(task_struct_run_list);
                ld->end = kvaddr;
                hq_open();
                cnt = do_list(ld);
                hq_close();
                tlist = (ulong *)GETBUF((cnt) * sizeof(ulong));
                cnt = retrieve_list(tlist, cnt);
                for (c = 0; c < cnt; c++) {
                        task_addr = tlist[c];
                        if (VALID_MEMBER(sched_rt_entity_my_q)) {
                                readmem(tlist[c] + OFFSET(sched_rt_entity_my_q),
                                        KVADDR, &my_q, sizeof(ulong), "my_q",
                                        FAULT_ON_ERROR);
                                if (my_q) {
                                        rt_rq_buf = GETBUF(SIZE(rt_rq));
                                        readmem(my_q, KVADDR, rt_rq_buf,
                                                SIZE(rt_rq), "rt_rq",
                                                FAULT_ON_ERROR);
                                        if (c)
                                                INDENT(11 + 6 * depth);
                                        fprintf(fp, "GROUP RT PRIO_ARRAY: 
%lx\n",
                                                my_q + OFFSET(rt_rq_active));
                                        tot++;
                                        dump_RT_prio_array(depth+1,
                                                my_q + OFFSET(rt_rq_active),
                                                
&rt_rq_buf[OFFSET(rt_rq_active)]);
                                        continue;
                                } else
                                        task_addr -= OFFSET(task_struct_rt);
                        }
                        if (!(tc = task_to_context(task_addr)))
                                continue;
                        if (c)
                                INDENT(11 + 6 * depth);
                        fprintf(fp, "PID: %-5ld  TASK: %lx  COMMAND: \"%s\"\n",
                                tc->pid, tc->task, tc->comm);
                        tot++;
                }
                FREEBUF(tlist);
        }

        if (!tot) {
                INDENT(5 + 6 * depth);
                fprintf(fp, "[no tasks queued]\n");     
        }
}

Can you verify that those changes work for you?

Thanks,
  Dave

--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to