[Crash-utility] [PATCH] runq: make tasks in throttled cfs_rqs/rt_rqs displayed
Dave Anderson
anderson at redhat.com
Mon Nov 5 21:44:04 UTC 2012
----- Original Message -----
> >>
> >> I worry about the large number of kernel structure.member declarations that the
> >> command depends upon, because if just one of them changes, it breaks the command.
> >> So it would be preferable if the "runq" command (with no arguments) would only use
> >> a minimal set of structure.member offsets.
>
> I made two new offset-init functions for runq:
>
> static void cfs_rq_offset_init(void);
> static void task_group_offset_init(void);
One minor suggestion -- it's really not necessary to call MEMBER_EXISTS()
prior to calling MEMBER_OFFSET_INIT():
diff --git a/kernel.c b/kernel.c
index 45da48e..868d777 100755
--- a/kernel.c
+++ b/kernel.c
@@ -308,6 +308,12 @@ kernel_init()
STRUCT_SIZE_INIT(prio_array, "prio_array");
MEMBER_OFFSET_INIT(rq_cfs, "rq", "cfs");
+ if (MEMBER_EXISTS("task_group", "cfs_rq"))
+ MEMBER_OFFSET_INIT(task_group_cfs_rq, "task_group", "cfs_rq");
+ if (MEMBER_EXISTS("task_group", "rt_rq"))
+ MEMBER_OFFSET_INIT(task_group_rt_rq, "task_group", "rt_rq");
+ if (MEMBER_EXISTS("task_group", "parent"))
+ MEMBER_OFFSET_INIT(task_group_parent, "task_group", "parent");
You can simply just call MEMBER_OFFSET_INIT() the 3 times above. If the structure
members don't exist, MEMBER_OFFSET_INIT() will just set the offsets to -1
(INVALID_OFFSET).
The same thing applies in your task_group_offset_init() function:
+ if (MEMBER_EXISTS("task_group", "cfs_bandwidth")) {
+ MEMBER_OFFSET_INIT(task_group_cfs_bandwidth,
+ "task_group", "cfs_bandwidth");
+ MEMBER_OFFSET_INIT(cfs_rq_throttled, "cfs_rq",
+ "throttled");
+ }
+
+ if (MEMBER_EXISTS("task_group", "rt_bandwidth")) {
+ MEMBER_OFFSET_INIT(task_group_rt_bandwidth,
+ "task_group", "rt_bandwidth");
+ MEMBER_OFFSET_INIT(rt_rq_rt_throttled, "rt_rq",
+ "rt_throttled");
+ }
Sometimes it helps to call MEMBER_EXISTS() for clarity's sake, but it's
actually kind of redundant.
> >
> > And to follow up, I'm still running tests (and will do so overnight) on your latest
> > patch, but I immediately see this on any 2.6.30, 2.6.31 or 2.6.32 kernel, and on
> > some 2.6.36 and 2.6.38 kernels, where "runq -g" fails like this:
> >
> > crash> runq -g
> > runq: invalid kernel virtual address: 0 type: "dentry"
> > crash>
> >
>
> As you have pointed in another mail, this is fixed in patch v2, I think.
Yes, that's fixed this time...
>
> > And we certainly want to keep the group information separate from
> > the normal "runq" command. Here on a "live" 4 cpu Fedora 3.6.3 kernel,
> > the command output exceeds 1000 lines! I'm pretty sure that most
> > people will *not* want to see all of this:
> >
> > crash> runq -g
> > CPU 0
> > CURRENT: PID: 0 TASK: ffffffff81c13420 COMMAND: "swapper/0"
> > RT PRIO_ARRAY: ffff88021e213e28
> > [100] GROUP RT PRIO_ARRAY: ffff88020db22000 <system>
> > [100] GROUP RT PRIO_ARRAY: ffff8801f8180000 <udisks2.service>
> > [no tasks queued]
>
> <snip>
>
> > [no tasks queued]
> > GROUP CFS RB_ROOT: ffff88020a844128
> > [no tasks queued]
> > crash>
> >
> > In fact, it's difficult to actually find a real *task* that is on
> > a run queue from among all of the empty "[no tasks queued]" groups!
> >
>
> I've noticed this in the first patch and patch V2 has fixed this.
OK, although I didn't realize that was a bug? What were all of those
empty groups that are no longer shown? Are they actually *not* queued?
>
> So I attach the new patch v2 version for runq -g. If you still find
> any bug in your tests or have any suggestion about it, that's very
> helpful.
>
> TODO:
> 1. The help info about the -g option.
> 2. Change rt_rq tasks displayed non-hierarchically.
Like I mentioned above, the latest patch does not change the default
behavior of runq alone, and "runq -g" is not as verbose as the last
patch, which I presume is your intent.
Thanks,
Dave
More information about the Crash-utility
mailing list