Linux Media Controller development
 help / color / mirror / Atom feed
From: Hans Verkuil <hverkuil@xs4all.nl>
To: Philipp Zabel <p.zabel@pengutronix.de>,
	Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Cc: Sylwester Nawrocki <s.nawrocki@samsung.com>,
	Pawel Osciak <pawel@osciak.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Kyungmin Park <kyungmin.park@samsung.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Hans Verkuil <hans.verkuil@cisco.com>,
	Kamil Debski <kamil@wypas.org>,
	linux-media@vger.kernel.org, kernel@pengutronix.de
Subject: Re: [PATCH v3 3/3] [media] videobuf2: add trace events
Date: Sun, 26 Jul 2015 13:18:21 +0200	[thread overview]
Message-ID: <55B4C1FD.80201@xs4all.nl> (raw)
In-Reply-To: <1436536166-3307-3-git-send-email-p.zabel@pengutronix.de>

Hi Philipp,

On 07/10/2015 03:49 PM, Philipp Zabel wrote:
> Add videobuf2 specific vb2_qbuf and vb2_dqbuf trace events that mirror the
> v4l2_qbuf and v4l2_dqbuf trace events, only they include additional
> information about queue fill state and are emitted right before the buffer
> is enqueued in the driver or userspace is woken up. This allows to make
> sense of the timeline of trace events in combination with others that might
> be triggered by __enqueue_in_driver.
> 
> Also two new trace events vb2_buf_queue and vb2_buf_done are added,
> allowing to trace the handover between videobuf2 framework and driver.
> 
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
> Changes since v2:
>  - Use vb2->v4l2_planes[0].bytesused instead of vb->v4l2_buf.bytesused, which
>    is always zero.
> ---
>  drivers/media/v4l2-core/videobuf2-core.c | 11 ++++
>  include/trace/events/v4l2.h              | 97 ++++++++++++++++++++++++++++++++
>  2 files changed, 108 insertions(+)
> 
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index 93b3154..b866a6b 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -30,6 +30,8 @@
>  #include <media/v4l2-common.h>
>  #include <media/videobuf2-core.h>
> 

Shouldn't there be a #define CREATE_TRACE_POINTS added before the include? That's
what is done in v4l2-ioctl.c as well.

I updated my kernel on my laptop to the latest media master and without this line it
gives me link errors:

ERROR: "__tracepoint_vb2_qbuf" [drivers/media/v4l2-core/videobuf2-core.ko] undefined!
ERROR: "__tracepoint_vb2_buf_done" [drivers/media/v4l2-core/videobuf2-core.ko] undefined!
ERROR: "__tracepoint_vb2_buf_queue" [drivers/media/v4l2-core/videobuf2-core.ko] undefined!
ERROR: "__tracepoint_vb2_dqbuf" [drivers/media/v4l2-core/videobuf2-core.ko] undefined!
scripts/Makefile.modpost:90: recipe for target '__modpost' failed

I'm not sure why I didn't see this anywhere else, but can you take a look at this?

Regards,

	Hans
 
> +#include <trace/events/v4l2.h>
> +
>  static int debug;
>  module_param(debug, int, 0644);
>  
> @@ -1207,6 +1209,8 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
>  	atomic_dec(&q->owned_by_drv_count);
>  	spin_unlock_irqrestore(&q->done_lock, flags);
>  
> +	trace_vb2_buf_done(q, vb);
> +
>  	if (state == VB2_BUF_STATE_QUEUED) {
>  		if (q->start_streaming_called)
>  			__enqueue_in_driver(vb);
> @@ -1629,6 +1633,8 @@ static void __enqueue_in_driver(struct vb2_buffer *vb)
>  	vb->state = VB2_BUF_STATE_ACTIVE;
>  	atomic_inc(&q->owned_by_drv_count);
>  
> +	trace_vb2_buf_queue(q, vb);
> +
>  	/* sync buffers */
>  	for (plane = 0; plane < vb->num_planes; ++plane)
>  		call_void_memop(vb, prepare, vb->planes[plane].mem_priv);
> @@ -1878,6 +1884,8 @@ static int vb2_internal_qbuf(struct vb2_queue *q, struct v4l2_buffer *b)
>  			vb->v4l2_buf.timecode = b->timecode;
>  	}
>  
> +	trace_vb2_qbuf(q, vb);
> +
>  	/*
>  	 * If already streaming, give the buffer to driver for processing.
>  	 * If not, the buffer will be given to driver on next streamon.
> @@ -2123,6 +2131,9 @@ static int vb2_internal_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool n
>  	/* Remove from videobuf queue */
>  	list_del(&vb->queued_entry);
>  	q->queued_count--;
> +
> +	trace_vb2_dqbuf(q, vb);
> +
>  	if (!V4L2_TYPE_IS_OUTPUT(q->type) &&
>  	    vb->v4l2_buf.flags & V4L2_BUF_FLAG_LAST)
>  		q->last_buffer_dequeued = true;
> diff --git a/include/trace/events/v4l2.h b/include/trace/events/v4l2.h
> index 4c88a32..dbf017b 100644
> --- a/include/trace/events/v4l2.h
> +++ b/include/trace/events/v4l2.h
> @@ -174,6 +174,103 @@ DEFINE_EVENT(v4l2_event_class, v4l2_qbuf,
>  	TP_ARGS(minor, buf)
>  );
>  
> +DECLARE_EVENT_CLASS(vb2_event_class,
> +	TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb),
> +	TP_ARGS(q, vb),
> +
> +	TP_STRUCT__entry(
> +		__field(int, minor)
> +		__field(u32, queued_count)
> +		__field(int, owned_by_drv_count)
> +		__field(u32, index)
> +		__field(u32, type)
> +		__field(u32, bytesused)
> +		__field(u32, flags)
> +		__field(u32, field)
> +		__field(s64, timestamp)
> +		__field(u32, timecode_type)
> +		__field(u32, timecode_flags)
> +		__field(u8, timecode_frames)
> +		__field(u8, timecode_seconds)
> +		__field(u8, timecode_minutes)
> +		__field(u8, timecode_hours)
> +		__field(u8, timecode_userbits0)
> +		__field(u8, timecode_userbits1)
> +		__field(u8, timecode_userbits2)
> +		__field(u8, timecode_userbits3)
> +		__field(u32, sequence)
> +	),
> +
> +	TP_fast_assign(
> +		__entry->minor = q->owner ? q->owner->vdev->minor : -1;
> +		__entry->queued_count = q->queued_count;
> +		__entry->owned_by_drv_count =
> +			atomic_read(&q->owned_by_drv_count);
> +		__entry->index = vb->v4l2_buf.index;
> +		__entry->type = vb->v4l2_buf.type;
> +		__entry->bytesused = vb->v4l2_planes[0].bytesused;
> +		__entry->flags = vb->v4l2_buf.flags;
> +		__entry->field = vb->v4l2_buf.field;
> +		__entry->timestamp = timeval_to_ns(&vb->v4l2_buf.timestamp);
> +		__entry->timecode_type = vb->v4l2_buf.timecode.type;
> +		__entry->timecode_flags = vb->v4l2_buf.timecode.flags;
> +		__entry->timecode_frames = vb->v4l2_buf.timecode.frames;
> +		__entry->timecode_seconds = vb->v4l2_buf.timecode.seconds;
> +		__entry->timecode_minutes = vb->v4l2_buf.timecode.minutes;
> +		__entry->timecode_hours = vb->v4l2_buf.timecode.hours;
> +		__entry->timecode_userbits0 = vb->v4l2_buf.timecode.userbits[0];
> +		__entry->timecode_userbits1 = vb->v4l2_buf.timecode.userbits[1];
> +		__entry->timecode_userbits2 = vb->v4l2_buf.timecode.userbits[2];
> +		__entry->timecode_userbits3 = vb->v4l2_buf.timecode.userbits[3];
> +		__entry->sequence = vb->v4l2_buf.sequence;
> +	),
> +
> +	TP_printk("minor = %d, queued = %u, owned_by_drv = %d, index = %u, "
> +		  "type = %s, bytesused = %u, flags = %s, field = %s, "
> +		  "timestamp = %llu, timecode = { type = %s, flags = %s, "
> +		  "frames = %u, seconds = %u, minutes = %u, hours = %u, "
> +		  "userbits = { %u %u %u %u } }, sequence = %u", __entry->minor,
> +		  __entry->queued_count,
> +		  __entry->owned_by_drv_count,
> +		  __entry->index, show_type(__entry->type),
> +		  __entry->bytesused,
> +		  show_flags(__entry->flags),
> +		  show_field(__entry->field),
> +		  __entry->timestamp,
> +		  show_timecode_type(__entry->timecode_type),
> +		  show_timecode_flags(__entry->timecode_flags),
> +		  __entry->timecode_frames,
> +		  __entry->timecode_seconds,
> +		  __entry->timecode_minutes,
> +		  __entry->timecode_hours,
> +		  __entry->timecode_userbits0,
> +		  __entry->timecode_userbits1,
> +		  __entry->timecode_userbits2,
> +		  __entry->timecode_userbits3,
> +		  __entry->sequence
> +	)
> +)
> +
> +DEFINE_EVENT(vb2_event_class, vb2_buf_done,
> +	TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb),
> +	TP_ARGS(q, vb)
> +);
> +
> +DEFINE_EVENT(vb2_event_class, vb2_buf_queue,
> +	TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb),
> +	TP_ARGS(q, vb)
> +);
> +
> +DEFINE_EVENT(vb2_event_class, vb2_dqbuf,
> +	TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb),
> +	TP_ARGS(q, vb)
> +);
> +
> +DEFINE_EVENT(vb2_event_class, vb2_qbuf,
> +	TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb),
> +	TP_ARGS(q, vb)
> +);
> +
>  #endif /* if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) */
>  
>  /* This part must be outside protection */
> 


  reply	other threads:[~2015-07-26 11:18 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-10 13:49 [PATCH v3 1/3] [media] v4l2-dev: use event class to deduplicate v4l2 trace events Philipp Zabel
2015-07-10 13:49 ` [PATCH v3 2/3] [media] v4l2-mem2mem: set the queue owner field just as vb2_ioctl_reqbufs does Philipp Zabel
2015-07-10 13:49 ` [PATCH v3 3/3] [media] videobuf2: add trace events Philipp Zabel
2015-07-26 11:18   ` Hans Verkuil [this message]
2015-07-27 11:12     ` Philipp Zabel
2015-07-28  7:53       ` Philipp Zabel
2015-08-03 15:50         ` Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55B4C1FD.80201@xs4all.nl \
    --to=hverkuil@xs4all.nl \
    --cc=hans.verkuil@cisco.com \
    --cc=kamil@wypas.org \
    --cc=kernel@pengutronix.de \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-media@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=mchehab@osg.samsung.com \
    --cc=p.zabel@pengutronix.de \
    --cc=pawel@osciak.com \
    --cc=rostedt@goodmis.org \
    --cc=s.nawrocki@samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox