[igt-dev] [PATCH i-g-t 4/4] lib/i915/perf: don't forget last timeline element

Umesh Nerlige Ramappa umesh.nerlige.ramappa at intel.com
Thu Jan 7 21:44:29 UTC 2021


On Thu, Jan 07, 2021 at 12:12:27PM +0200, Lionel Landwerlin wrote:
>On 07/01/2021 03:07, Umesh Nerlige Ramappa wrote:
>>On Mon, Dec 28, 2020 at 05:19:40AM +0200, Lionel Landwerlin wrote:
>>>We're currently dropping the last element of the timeline.
>>
>>Inside the for-loop we append timeline events on context switches 
>>indicating what context ran and for how long, but that's not the 
>>case for the append_timeline_event outside the for-loop.
>>
>>Does the one outside indicate how long last_ctx_id ran before 
>>capture ended (or we ran out of records)? Is it possible for the 
>>user to distinguish the two? Just thinking out loud.
>
>
>Let's say you have the following reports
>
>
>report0 ctx=1
>
>report1 ctx=2
>
>report2 ctx=1
>
>
>That generates 2 timeline events (report1 - report0 for ctx1), 
>(report2 - report1 for ctx2).
>
>Those 2 are generated within the for loop because it notices a change 
>in ctx value twice.
>
>
>Now this :
>
>
>report0 ctx=1
>
>report1 ctx=2
>
>report2 ctx=1
>
>report3 ctx=1
>
>
>This also generates 2 timeline events within the for loop.
>
>But because the last report3 has the same ctx as report2, there is no 
>additional timeline event generated for ctx1 within the for loop.
>
>And we just quit the loop because we ran out of reports.
>
>So we need to add one more item.
>
>
>The gpu_ts_start & gpu_ts_end being generated before the continue; in 
>the for loop, make the last append_timeline_event() add the right 
>timestamps after the for loop for that last timeline.

Makes sense, thanks.
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>

-Umesh
>
>
>-Lionel
>
>
>>
>>Otherwise:
>>
>>Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
>>
>>Thanks,
>>Umesh
>>>
>>>Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>>>Fixes: 43116ee368585d ("lib/i915-perf: add i915 perf data reader")
>>>---
>>>lib/i915/perf_data_reader.c | 27 ++++++++++++++++++---------
>>>1 file changed, 18 insertions(+), 9 deletions(-)
>>>
>>>diff --git a/lib/i915/perf_data_reader.c b/lib/i915/perf_data_reader.c
>>>index 4b68fb502..065fe6066 100644
>>>--- a/lib/i915/perf_data_reader.c
>>>+++ b/lib/i915/perf_data_reader.c
>>>@@ -298,17 +298,23 @@ static void
>>>generate_cpu_events(struct intel_perf_data_reader *reader)
>>>{
>>>    uint32_t last_header_idx = 0;
>>>-    const struct drm_i915_perf_record_header *last_header = 
>>>reader->records[0];
>>>+    const struct drm_i915_perf_record_header *last_header = 
>>>reader->records[0],
>>>+        *current_header = reader->records[0];
>>>+    const uint8_t *start_report, *end_report;
>>>+    uint32_t last_ctx_id, current_ctx_id;
>>>+    uint64_t gpu_ts_start, gpu_ts_end;
>>>
>>>    for (uint32_t i = 1; i < reader->n_records; i++) {
>>>-        const struct drm_i915_perf_record_header *current_header =
>>>-            reader->records[i];
>>>-        const uint8_t *start_report = (const uint8_t *) 
>>>(last_header + 1),
>>>-            *end_report = (const uint8_t *) (current_header + 1);
>>>-        uint32_t last_ctx_id = oa_report_ctx_id(&reader->devinfo, 
>>>start_report),
>>>-            current_ctx_id = oa_report_ctx_id(&reader->devinfo, 
>>>end_report);
>>>-        uint64_t gpu_ts_start = oa_report_timestamp(start_report),
>>>-            gpu_ts_end = oa_report_timestamp(end_report);
>>>+        current_header = reader->records[i];
>>>+
>>>+        start_report = (const uint8_t *) (last_header + 1);
>>>+        end_report = (const uint8_t *) (current_header + 1);
>>>+
>>>+        last_ctx_id = oa_report_ctx_id(&reader->devinfo, start_report);
>>>+        current_ctx_id = oa_report_ctx_id(&reader->devinfo, 
>>>end_report);
>>>+
>>>+        gpu_ts_start = oa_report_timestamp(start_report);
>>>+        gpu_ts_end = oa_report_timestamp(end_report);
>>>
>>>        if (last_ctx_id == current_ctx_id)
>>>            continue;
>>>@@ -318,6 +324,9 @@ generate_cpu_events(struct 
>>>intel_perf_data_reader *reader)
>>>        last_header = current_header;
>>>        last_header_idx = i;
>>>    }
>>>+
>>>+    if (last_header != current_header)
>>>+        append_timeline_event(reader, gpu_ts_start, gpu_ts_end, 
>>>last_header_idx, reader->n_records - 1, last_ctx_id);
>>>}
>>>
>>>static void
>>>-- 
>>>2.30.0.rc2
>>>
>


More information about the igt-dev mailing list