diff options
Diffstat (limited to 'rt-plot.c')
-rw-r--r-- | rt-plot.c | 53 |
1 files changed, 38 insertions, 15 deletions
@@ -7,13 +7,20 @@ | |||
7 | */ | 7 | */ |
8 | struct record* | 8 | struct record* |
9 | __find_rt_record(struct graph_info *ginfo, struct rt_plot_common *rt_info, | 9 | __find_rt_record(struct graph_info *ginfo, struct rt_plot_common *rt_info, |
10 | guint64 time, int display) | 10 | guint64 time, int display, unsigned long long range) |
11 | { | 11 | { |
12 | int next_cpu, match, eid, ignored; | 12 | int next_cpu, match, eid, ignored; |
13 | struct record *record; | 13 | struct record *record; |
14 | 14 | ||
15 | set_cpus_to_rts(ginfo, time); | 15 | set_cpus_to_rts(ginfo, time); |
16 | while ((record = tracecmd_read_next_data(ginfo->handle, &next_cpu))) { | 16 | while ((record = tracecmd_read_next_data(ginfo->handle, &next_cpu))) { |
17 | |||
18 | if (range && get_rts(ginfo, record) >= time + range) { | ||
19 | free_record(record); | ||
20 | record = NULL; | ||
21 | break; | ||
22 | } | ||
23 | |||
17 | eid = pevent_data_type(ginfo->pevent, record); | 24 | eid = pevent_data_type(ginfo->pevent, record); |
18 | ignored = (eid == ginfo->event_sched_switch_id); | 25 | ignored = (eid == ginfo->event_sched_switch_id); |
19 | if (!ignored && display) { | 26 | if (!ignored && display) { |
@@ -65,14 +72,17 @@ rt_plot_display_last_event(struct graph_info *ginfo, struct graph_plot *plot, | |||
65 | } | 72 | } |
66 | 73 | ||
67 | static struct record* | 74 | static struct record* |
68 | find_prev_record(struct graph_info *ginfo, struct rt_plot_common *rt_info, | 75 | find_prev_display_record(struct graph_info *ginfo, struct rt_plot_common *rt_info, |
69 | unsigned long long time) | 76 | unsigned long long time, unsigned long long range) |
70 | { | 77 | { |
71 | int eid, ignored, match, cpu; | 78 | int eid, ignored, match, cpu; |
72 | struct record *prev, *res = NULL; | 79 | struct record *prev, *res = NULL; |
73 | unsigned long long min_ts; | 80 | unsigned long long min_ts; |
74 | 81 | ||
75 | min_ts = time - max_rt_search(ginfo); | 82 | if (range) |
83 | min_ts = time - range; | ||
84 | else | ||
85 | min_ts = time - max_rt_search(ginfo); | ||
76 | 86 | ||
77 | set_cpus_to_rts(ginfo, time); | 87 | set_cpus_to_rts(ginfo, time); |
78 | 88 | ||
@@ -111,17 +121,25 @@ rt_plot_display_info(struct graph_info *ginfo, struct graph_plot *plot, | |||
111 | struct rt_plot_common *rt_info = plot->private; | 121 | struct rt_plot_common *rt_info = plot->private; |
112 | struct event_format *event; | 122 | struct event_format *event; |
113 | struct record *record, *prev_record; | 123 | struct record *record, *prev_record; |
114 | unsigned long long msec, nsec, rts; | 124 | unsigned long long msec, nsec, rts, ptime, rtime, range; |
125 | long long pdiff, rdiff; | ||
115 | int eid; | 126 | int eid; |
116 | 127 | ||
117 | record = rt_info->write_header(rt_info, ginfo, s, time); | 128 | rt_info->write_header(rt_info, ginfo, s, time); |
118 | prev_record = find_prev_record(ginfo, rt_info, time); | 129 | |
119 | 130 | /* Stupid, fix to use resolution */ | |
120 | if (!record || (prev_record && prev_record != record && | 131 | range = 2 / ginfo->resolution; |
121 | (time - get_rts(ginfo, prev_record)) < | 132 | record = __find_rt_record(ginfo, rt_info, time, 1, range); |
122 | (get_rts(ginfo, record) - time))) { | 133 | prev_record = find_prev_display_record(ginfo, rt_info, time, range); |
123 | free_record(record); | 134 | |
124 | record = prev_record; | 135 | if (!record) { |
136 | record = prev_record; | ||
137 | } else if (prev_record) { | ||
138 | ptime = get_rts(ginfo, prev_record); | ||
139 | rtime = get_rts(ginfo, record); | ||
140 | pdiff = (ptime < time) ? time - ptime : ptime - time; | ||
141 | rdiff = (rtime < time) ? time - rtime : rtime - time; | ||
142 | record = (pdiff < rdiff) ? prev_record : record; | ||
125 | } | 143 | } |
126 | 144 | ||
127 | if (record) { | 145 | if (record) { |
@@ -137,6 +155,8 @@ rt_plot_display_info(struct graph_info *ginfo, struct graph_plot *plot, | |||
137 | pevent_event_info(s, event, record); | 155 | pevent_event_info(s, event, record); |
138 | } else | 156 | } else |
139 | trace_seq_printf(s, "\nUNKNOWN EVENT %d\n", eid); | 157 | trace_seq_printf(s, "\nUNKNOWN EVENT %d\n", eid); |
158 | } else { | ||
159 | trace_seq_printf(s, "Failsauce\n"); | ||
140 | } | 160 | } |
141 | trace_seq_putc(s, '\n'); | 161 | trace_seq_putc(s, '\n'); |
142 | nano_to_milli(time, &msec, &nsec); | 162 | nano_to_milli(time, &msec, &nsec); |
@@ -349,15 +369,19 @@ struct record* get_previous_release(struct graph_info *ginfo, int match_tid, | |||
349 | unsigned long long release, deadline, min_ts; | 369 | unsigned long long release, deadline, min_ts; |
350 | struct record *last_rec = NULL, *rec, *ret = NULL; | 370 | struct record *last_rec = NULL, *rec, *ret = NULL; |
351 | 371 | ||
372 | *out_job = -2; | ||
373 | |||
352 | min_ts = time - max_rt_search(ginfo); | 374 | min_ts = time - max_rt_search(ginfo); |
353 | 375 | ||
354 | /* The release record could have occurred on any CPU. Search all */ | 376 | /* The release record could have occurred on any CPU. Search all */ |
355 | for (cpu = 0; cpu < ginfo->cpus; cpu++) { | 377 | for (cpu = 0; cpu < ginfo->cpus; cpu++) { |
378 | set_cpu_to_rts(ginfo, time, cpu); | ||
356 | last_rec = tracecmd_peek_data(ginfo->handle, cpu); | 379 | last_rec = tracecmd_peek_data(ginfo->handle, cpu); |
357 | 380 | ||
358 | /* Require a record to start with */ | 381 | /* Require a record to start with */ |
359 | if (!last_rec) | 382 | if (!last_rec) { |
360 | goto loop_end; | 383 | goto loop_end; |
384 | } | ||
361 | last_rec->ref_count++; | 385 | last_rec->ref_count++; |
362 | 386 | ||
363 | while ((rec = tracecmd_read_prev(ginfo->handle, last_rec))) { | 387 | while ((rec = tracecmd_read_prev(ginfo->handle, last_rec))) { |
@@ -384,7 +408,6 @@ struct record* get_previous_release(struct graph_info *ginfo, int match_tid, | |||
384 | *out_release = release; | 408 | *out_release = release; |
385 | *out_deadline = deadline; | 409 | *out_deadline = deadline; |
386 | } | 410 | } |
387 | |||
388 | last_rec = NULL; | 411 | last_rec = NULL; |
389 | goto loop_end; | 412 | goto loop_end; |
390 | } | 413 | } |