perf timechart: Show the name of the waker/wakee in timechart
Arjan van de Ven [Sun, 20 Sep 2009 16:13:28 +0000 (18:13 +0200)]
Timechart currently shows thin green lines for sending or receiving
wakeups. This patch also prints (in a very small font) the name of
the process that is being woken/wakes up this process.

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20090920181328.68baa978@linux.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

tools/perf/builtin-timechart.c
tools/perf/util/svghelper.c
tools/perf/util/svghelper.h

index 58d737e..3f45b8b 100644 (file)
@@ -752,6 +752,7 @@ static void draw_wakeups(void)
        we = wake_events;
        while (we) {
                int from = 0, to = 0;
+               char *task_from = NULL, *task_to = NULL;
 
                /* locate the column of the waker and wakee */
                p = all_data;
@@ -760,10 +761,14 @@ static void draw_wakeups(void)
                                c = p->all;
                                while (c) {
                                        if (c->Y && c->start_time <= we->time && c->end_time >= we->time) {
-                                               if (p->pid == we->waker)
+                                               if (p->pid == we->waker) {
                                                        from = c->Y;
-                                               if (p->pid == we->wakee)
+                                                       task_from = c->comm;
+                                               }
+                                               if (p->pid == we->wakee) {
                                                        to = c->Y;
+                                                       task_to = c->comm;
+                                               }
                                        }
                                        c = c->next;
                                }
@@ -776,7 +781,7 @@ static void draw_wakeups(void)
                else if (from && to && abs(from - to) == 1)
                        svg_wakeline(we->time, from, to);
                else
-                       svg_partial_wakeline(we->time, from, to);
+                       svg_partial_wakeline(we->time, from, task_from, to, task_to);
                we = we->next;
        }
 }
index b0fcecd..9f70fa8 100644 (file)
@@ -242,7 +242,7 @@ void svg_pstate(int cpu, u64 start, u64 end, u64 freq)
 }
 
 
-void svg_partial_wakeline(u64 start, int row1, int row2)
+void svg_partial_wakeline(u64 start, int row1, char *desc1, int row2, char *desc2)
 {
        double height;
 
@@ -251,21 +251,35 @@ void svg_partial_wakeline(u64 start, int row1, int row2)
 
 
        if (row1 < row2) {
-               if (row1)
+               if (row1) {
                        fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
                                time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32);
-
-               if (row2)
+                       if (desc2)
+                               fprintf(svgfile, "<text transform=\"translate(%4.8f,%4.8f) rotate(90)\" font-size=\"0.02pt\">%s &gt;</text>\n",
+                                       time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_HEIGHT/48, desc2);
+               }
+               if (row2) {
                        fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
                                time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32,  time2pixels(start), row2 * SLOT_MULT);
+                       if (desc1)
+                               fprintf(svgfile, "<text transform=\"translate(%4.8f,%4.8f) rotate(90)\" font-size=\"0.02pt\">%s &gt;</text>\n",
+                                       time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32, desc1);
+               }
        } else {
-               if (row2)
+               if (row2) {
                        fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
                                time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32);
-
-               if (row1)
+                       if (desc1)
+                               fprintf(svgfile, "<text transform=\"translate(%4.8f,%4.8f) rotate(90)\" font-size=\"0.02pt\">%s &lt;</text>\n",
+                                       time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/48, desc1);
+               }
+               if (row1) {
                        fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
                                time2pixels(start), row1 * SLOT_MULT - SLOT_MULT/32,  time2pixels(start), row1 * SLOT_MULT);
+                       if (desc2)
+                               fprintf(svgfile, "<text transform=\"translate(%4.8f,%4.8f) rotate(90)\" font-size=\"0.02pt\">%s &lt;</text>\n",
+                                       time2pixels(start), row1 * SLOT_MULT - SLOT_HEIGHT/32, desc2);
+               }
        }
        height = row1 * SLOT_MULT;
        if (row2 > row1)
index ad79b5d..8260a7e 100644 (file)
@@ -17,7 +17,7 @@ extern void svg_pstate(int cpu, u64 start, u64 end, u64 freq);
 extern void svg_time_grid(u64 start, u64 end);
 extern void svg_legenda(void);
 extern void svg_wakeline(u64 start, int row1, int row2);
-extern void svg_partial_wakeline(u64 start, int row1, int row2);
+extern void svg_partial_wakeline(u64 start, int row1, char *desc1, int row2, char *desc2);
 extern void svg_interrupt(u64 start, int row);
 extern void svg_text(int Yslot, u64 start, const char *text);
 extern void svg_close(void);