[PATCH] Fix bugs in runq

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <zhangyanfei@xxxxxxxxxxxxxx>
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 <zhangyanfei@xxxxxxxxxxxxxx>
---
 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
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux