Commit Graph

256 Commits

Author SHA1 Message Date
94bb2fba0d visualizer: Make proper rectangles from i915 GPU events.
This reveals that we've got really bogus times from these events.  I
think there are two things here: the begin is the submit time, not the
submit-to-hardware time.  And the end time is retire, which is too
delayed to be really useful.  We need to move i915 over to the
low-level tracepoints.

However, this code proved to be useful for vc4, where I have good
timings.
2018-05-17 19:36:01 +01:00
7f889b487d capture: add doc for new_from_fd 2018-05-17 13:13:36 +01:00
1ef68eeb31 capture: do 24 bit counter identifier checks
Max uint was more than we allow, since we steal the top 8 bits for some
other data. This instead checks for 24-bit and warns if the user tries to
store a counter value that was not registered.
2018-05-17 12:29:04 +01:00
3d14ce4eaa capture: use uint for requested counter id
Also document this thing so it is more obvious what is going on with the
resulting counter ranges.
2018-05-17 12:19:54 +01:00
b4d5fdd5e4 writer: clear values before setting counters
We have an annoying issue where we look at all fiends of a counter values
chunk in the counter set frame. So we need those values set to zero. If
we are passed fewer counter values than can fit in the frame, we leave
some of that data uninitialized. This ensures that it is cleared.
2018-05-17 11:38:34 +01:00
851e593ae5 hostinfo: fix cpu/pid parameters for setting cpu counters
We don't need pid here anyway, since we're just passing on counters for the
system itself.
2018-05-17 11:04:23 +01:00
d523fcc024 rectangles: cycle colors
We will still probably want something smarter here, but this gets things
to be more distinguished than black.
2018-05-17 09:05:26 +01:00
896bbaea89 Use Unicode in translatable strings
See https://developer.gnome.org/hig/stable/typography.html
2018-05-16 18:12:56 +02:00
9381ae3070 rectangles: add basic tooltip support
We definitely want to do something better, but this at least allows testing
some data which is useful now to see what is going on.
2018-05-16 16:33:46 +01:00
ca5684910f rectangles: improve rectangle positioning 2018-05-16 15:09:33 +01:00
a15eb358ce visualizer: ignore anchor x/y position
We don't need that, and it breaks for things not at index 0,0.
2018-05-16 15:09:20 +01:00
a61703d7e5 sources/perf: Add drm/i915 GPU begin/end times. 2018-05-16 14:27:38 +01:00
a3bda35b28 sources/perf: Capture the CRTC number and MSC for vblank events.
This will help make sense of vblank events in a multi-screen
environment (where there are two streams of vblanks), and hopefully
also useful for correlating to compositor events.
2018-05-16 14:27:33 +01:00
88af69c3ec visualizers: mark fields as private 2018-05-16 12:44:48 +01:00
af3e3b0e2a marks: start on visualizer row data for marks
This is sort of a minimal implementation to get started. There is still
plenty to do, but we can iterate from here.
2018-05-16 12:44:48 +01:00
1140e80efc rectangles: start on helper to generate rectangle data
This is meant to be used by marks visualizer to show rectangles.
2018-05-16 12:44:48 +01:00
590d317a94 cursor: add helper to get reader
We might need this so that we can access to the updated end time that was
determined by iterating frames.
2018-05-16 12:44:48 +01:00
0e9f4ca291 visualizers: limit mark rows to 30 2018-05-16 12:44:48 +01:00
14d2554c35 marks: add group to visualizer row
This will allow us to filter events that we do not care about for a given
row. We add a visualizer row per-group.
2018-05-16 12:44:48 +01:00
4f9ea0fce8 visualizers: discover group types when locating mark types 2018-05-16 12:44:48 +01:00
540ff0e05d marks: stub out a visualizer row
This doesn't do any rendering yet, but it gets us the plumbing we need to
start rendering mark content into a visualizer row.
2018-05-16 12:44:48 +01:00
6fa2c270e8 visualizers: discover visualizers from capture reader
The goal here is to avoid having to hard code what visualizers are shown
from the .ui files. We just should add things that we find are supported.

Long term, I think we'll add a concept of an "instrument" which is the
combination of a data source (SpSource) and a visualizer (SpVisualizerRow).

The other goal here is to enable the future support for discovering marks
and adding rows for each of those threads.
2018-05-16 12:44:48 +01:00
6da2a3be4b clock: handle uninitialized clock gracefully
If we haven't discovered the proper clock, just default to monotonic.
2018-05-16 12:30:10 +01:00
f8176b699b clock: prefer clock monotonic
Various articles claim that CLOCK_MONOTONIC is actually faster than the
CLOCK_MONOTONIC_RAW, and that seems to be my experience.
2018-05-16 12:28:42 +01:00
ac11f0f941 sources/perf: Capture DRM vblank events as a mark.
This should be useful to visualize system-wide events in the CPU
timeline, especially once we add some more events.

We may want to define some modes eventually, as not all captures will
care about GPU visualization.  However, it's pretty low overhead (60Hz
* number of monitors), so maybe we can just filter it out at
visualization time.

We do a bit more setup work than necessary here (looking up the config
number for the tracepoint per CPU, rather than looking it up once at
startup), but I suspect I'll want to refactor the init anyway once we
add more tracepoint markers.
2018-05-16 10:52:28 +01:00
925dadce82 sources/perf: Include the sample identifier in PERF_RECORD_SAMPLE.
If we want to start watching other perf events, we need a way to look
up what perf event we got when a PERF_RECORD_SAMPLE comes in.  The
sample identifier is what does that.
2018-05-16 10:52:28 +01:00
83b75e6528 sources/perf: Add an explanatory comment for the CPU loop.
I stumbled over this kernel restriction, too.
2018-05-16 10:52:28 +01:00
380995fde5 sources/perf: Add a comment explaining sp-perf-counter structs. 2018-05-16 10:52:28 +01:00
e853c79be9 mark: add group to mark event
This allows grouping marks together so that the UI can present marks within
the same group in the same visualizer row.

The goal here is that our perf stream with drm data will have "drm" or some
similar group name (resulting in one row). mutter/cogl/gnome-shell will
use the thread-id as the group name (or something else that is useful) so
their events are grouped together. gdk-wayland might have it's own group
name as well.

The end result is that we can get a mark row for each series of related
data.
2018-05-15 16:33:30 +01:00
eb6fdffa6f visualizers: fix whitespace 2018-05-15 11:35:01 +01:00
6e8c30dfa3 line-visualizer: use array for pointers and mark private 2018-05-15 10:02:58 +01:00
c6260ad177 capture: update stats for marks 2018-05-14 17:51:51 +01:00
4bdbf130b2 capture: add simple mark support
The goal here is to have an API that allows us to record things like
frame timing data. We might iterate on this API a bit, but this gets us
started.

A SpCaptureMark with a zero duration should be treated like an epoch mark
once a visualizer is created. SpCaptureMark with a non-zero duration should
be treated like a begin/end of operation. This may be useful in generating
something like a flame graph.
2018-05-14 17:15:57 +01:00
c3d1fd0ff8 sp-capture-writer: Initialize write buffer
Valgrind notes that the buffer is not fully initialized when we pass it
to write(). This could potentially write sensitive data, if we are not
careful with the buffer length.

See https://gitlab.gnome.org/GNOME/gjs/issues/120

https://bugzilla.gnome.org/show_bug.cgi?id=794272
2018-03-12 16:50:51 -07:00
0219ee5205 capture-cursor: specify const for condition
We don't modify this, so it can be const.
2018-02-13 17:18:28 -08:00
951213ddb6 capture-reader: cleanup some space checks
Add a few more assertions to make sure we have what we think we have. Also
we can drop self->pos from our while loop checks as it will always be zero.
2018-02-13 17:10:02 -08:00
0ec2c127ea capture-reader: fix byte swap of frame info
If we are swapping between endianness, we were miss swapping various fields
and they'd all end up with the swapped len value.
2018-02-13 16:34:41 -08:00
0ddab3db6e callgraph: add information about expectations 2018-01-29 02:11:03 -08:00
3b3252e050 kernel-symbol: delay symbol filtering until lookup
We don't want to avoid adding the symbols to the index table, or we will
get the wrong addresses.

So instead, add them, and then ignore the symbols upon lookup.
2018-01-29 02:09:31 -08:00
8a47f72749 callgraph: use last valid context 2018-01-29 01:38:35 -08:00
c05d5a5d66 callgraph: code style cleanup 2018-01-29 01:38:35 -08:00
2f6b01781f elf: ignore address context that is not user
We should be betting a context change as part of the stack, so ignore it
if we didn't get a user context.
2018-01-29 01:38:35 -08:00
deecb04963 kernel-symbol: code style cleanup 2018-01-29 01:38:35 -08:00
1bc52902eb kernel-symbols: avoid symbols not in text (code) section
Those are defind as t or T type.
2018-01-29 01:38:35 -08:00
8fb46f3e7f kernel-symbol: fix result parsing from sysprofd
We need to add an additional () around our result type from sysprofd.
2018-01-29 01:38:35 -08:00
911d51d447 kallsyms: make SpKallsyms more testable
This allows us to pass in the file to read from, and adds a quick test
case to view the parsed output. It also fixes a base-10 vs base-16
mistake in parsing addresses.
2018-01-29 01:38:35 -08:00
acab78da72 callgraph: use sp_symbol_resolver_resolve_with_context()
We want to ensure that we give the resolve the address context so that it
can filter whether or not the address range applies.
2018-01-28 22:16:59 -08:00
bb78a1c165 elf: only resolve addresses in none/user address context
This ensures that we only try to resolve addresses for ELFs when we know
we're inside of the userspace address context.
2018-01-28 22:14:32 -08:00
aa0506e26f symbol-resolver: check for kernel address context
We only want to resolve a symbol if we're inside the kernel context.
Otherwise, it wont be accurate.
2018-01-28 22:13:49 -08:00
df07f6d915 resolver: extend interface to include address context
We might need access to the address context when resolving symbols so that
we know if the address range applies to us.
2018-01-28 22:12:27 -08:00