[igt-dev] [PATCH i-g-t 2/2] intel_gpu_overlay: Update for class:instance engine tracepoints

Chris Wilson chris at chris-wilson.co.uk
Tue Jun 5 19:40:42 UTC 2018


Quoting Lionel Landwerlin (2018-06-05 18:14:58)
> On 05/06/18 17:50, Tvrtko Ursulin wrote:
> > From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> >
> > A miminal hack to parse the new tracepoint format and invent new "ring
> > id's" based on engine class and instance.
> >
> > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> > Cc: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> > ---
> >   overlay/gpu-perf.c | 36 ++++++++++++++++++++++++++++--------
> >   1 file changed, 28 insertions(+), 8 deletions(-)
> >
> > diff --git a/overlay/gpu-perf.c b/overlay/gpu-perf.c
> > index ea3480050ab9..e77125672088 100644
> > --- a/overlay/gpu-perf.c
> > +++ b/overlay/gpu-perf.c
> > @@ -85,7 +85,8 @@ struct tracepoint {
> >   
> >       int device_field;
> >       int ctx_field;
> > -     int ring_field;
> > +     int class_field;
> > +     int instance_field;
> >       int seqno_field;
> >       int global_seqno_field;
> >       int plane_field;
> > @@ -151,8 +152,10 @@ tracepoint_id(int tp_id)
> >                               tp->device_field = f;
> >                       } else if (!strcmp(tp->fields[f].name, "ctx")) {
> >                               tp->ctx_field = f;
> > -                     } else if (!strcmp(tp->fields[f].name, "ring")) {
> > -                             tp->ring_field = f;
> > +                     } else if (!strcmp(tp->fields[f].name, "class")) {
> > +                             tp->class_field = f;
> > +                     } else if (!strcmp(tp->fields[f].name, "instance")) {
> > +                             tp->instance_field = f;
> 
> That looks good to me. We only support the most recent kernel?

Yes. It's a devtool using a dev interface. It's sole purpose is for
debugging the current kernel, or userspace in conjunction with drm-tip.
It's a temporary hack...

> >                       } else if (!strcmp(tp->fields[f].name, "seqno")) {
> >                               tp->seqno_field = f;
> >                       } else if (!strcmp(tp->fields[f].name, "global_seqno")) {
> > @@ -175,6 +178,23 @@ tracepoint_id(int tp_id)
> >                            tracepoints[tp_id].fields[                 \
> >                                    tracepoints[tp_id].field_name##_field].offset))
> >   
> > +#define READ_TP_FIELD_U16(sample, tp_id, field_name)                 \
> > +     (*(const uint16_t *)((sample)->tracepoint_data +                \
> > +                          tracepoints[tp_id].fields[                 \
> > +                                  tracepoints[tp_id].field_name##_field].offset))
> > +
> > +#define GET_RING_ID(sample, tp_id) \
> > +({ \
> > +     unsigned char class, instance, ring; \
> > +\
> > +     class = READ_TP_FIELD_U16(sample, tp_id, class); \
> > +     instance = READ_TP_FIELD_U16(sample, tp_id, instance); \
> > +\
> > +     ring = class * 2 + instance; \
> 
> Do you want to make it clear that we cannot have more than 2 instances 
> per class?

Or make it easier to spot and expand in future.
-Chris


More information about the igt-dev mailing list