Hello Dave, 

In runq command, when dumping cfs and rt runqueues,
it seems that we get the wrong nr_running values of rq
and cfs_rq.

Please refer to the attached patch.

Thanks
Zhang Yanfei
>From 3cb0190cc380ac1fc52ebbf3b1794679ba90f39c Mon Sep 17 00:00:00 2001
From: zhangyanfei <[email protected]>
Date: Tue, 21 Aug 2012 15:59:34 +0800
Subject: [PATCH] Fix bug: use cfs_rq->h_nr_running to get correct entity numbers

Signed-off-by: zhangyanfei <[email protected]>
---
 defs.h    |    1 +
 symbols.c |    2 ++
 task.c    |   17 +++++++++++++----
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/defs.h b/defs.h
index 4a8e2e3..d0e34d4 100755
--- a/defs.h
+++ b/defs.h
@@ -1576,6 +1576,7 @@ struct offset_table {                    /* stash of 
commonly-used offsets */
        long rq_nr_running;
        long cfs_rq_rb_leftmost;
        long cfs_rq_nr_running;
+       long cfs_rq_h_nr_running;
        long cfs_rq_tasks_timeline;
        long task_struct_se;
        long sched_entity_run_node;
diff --git a/symbols.c b/symbols.c
index 2646ff8..cb15e9e 100755
--- a/symbols.c
+++ b/symbols.c
@@ -8638,6 +8638,8 @@ dump_offset_table(char *spec, ulong makestruct)
                OFFSET(sched_entity_on_rq));
        fprintf(fp, "             cfs_rq_nr_running: %ld\n",
                OFFSET(cfs_rq_nr_running));
+       fprintf(fp, "           cfs_rq_h_nr_running: %ld\n",
+               OFFSET(cfs_rq_h_nr_running));
        fprintf(fp, "            cfs_rq_rb_leftmost: %ld\n",
                OFFSET(cfs_rq_rb_leftmost));
        fprintf(fp, "         cfs_rq_tasks_timeline: %ld\n",
diff --git a/task.c b/task.c
index c8dee43..40690fe 100755
--- a/task.c
+++ b/task.c
@@ -7566,6 +7566,9 @@ dump_CFS_runqueues(void)
                MEMBER_OFFSET_INIT(sched_entity_on_rq, "sched_entity", "on_rq");
                MEMBER_OFFSET_INIT(cfs_rq_rb_leftmost, "cfs_rq", "rb_leftmost");
                MEMBER_OFFSET_INIT(cfs_rq_nr_running, "cfs_rq", "nr_running");
+               if (MEMBER_EXISTS("cfs_rq", "h_nr_running"))
+                       MEMBER_OFFSET_INIT(cfs_rq_h_nr_running,
+                               "cfs_rq", "h_nr_running");
                MEMBER_OFFSET_INIT(cfs_rq_tasks_timeline, "cfs_rq", 
                        "tasks_timeline");
                MEMBER_OFFSET_INIT(cfs_rq_curr, "cfs_rq", "curr");
@@ -7610,6 +7613,7 @@ dump_CFS_runqueues(void)
 
                 readmem(runq, KVADDR, runqbuf, SIZE(runqueue),
                         "per-cpu rq", FAULT_ON_ERROR);
+               nr_running = LONG(runqbuf + OFFSET(rq_nr_running));
 
                if (cfs_rq_buf) {
                        /*
@@ -7622,16 +7626,21 @@ dump_CFS_runqueues(void)
 
                        readmem(cfs_rq, KVADDR, cfs_rq_buf, SIZE(cfs_rq),
                                "per-cpu cfs_rq", FAULT_ON_ERROR);
-                       nr_running = LONG(cfs_rq_buf + OFFSET(rq_nr_running));
                        cfs_rq_nr_running = ULONG(cfs_rq_buf + 
                                OFFSET(cfs_rq_nr_running));
                        root = (struct rb_root *)(cfs_rq + 
                                OFFSET(cfs_rq_tasks_timeline));
                } else {
                        cfs_rq = runq + OFFSET(rq_cfs);
-                       nr_running = LONG(runqbuf + OFFSET(rq_nr_running));
-                       cfs_rq_nr_running = ULONG(runqbuf + OFFSET(rq_cfs) + 
-                               OFFSET(cfs_rq_nr_running));
+                       if (MEMBER_EXISTS("cfs_rq", "h_nr_running")) {
+                               cfs_rq_nr_running = ULONG(runqbuf +
+                                       OFFSET(rq_cfs) +
+                                       OFFSET(cfs_rq_h_nr_running));
+                       } else {
+                               cfs_rq_nr_running = ULONG(runqbuf +
+                                       OFFSET(rq_cfs) +
+                                       OFFSET(cfs_rq_nr_running));
+                       }
                        root = (struct rb_root *)(runq + OFFSET(rq_cfs) + 
                                OFFSET(cfs_rq_tasks_timeline));
                }
-- 
1.7.1

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

Reply via email to