>From 3cb0190cc380ac1fc52ebbf3b1794679ba90f39c Mon Sep 17 00:00:00 2001 From: zhangyanfei 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 --- 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