This will automatically add stream on/off tracing for all v4l2 drivers.

Signed-off-by: Detlev Casanova <[email protected]>
---
 drivers/media/v4l2-core/v4l2-ioctl.c | 20 ++++++++++++++++++--
 include/trace/events/v4l2.h          | 28 ++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c 
b/drivers/media/v4l2-core/v4l2-ioctl.c
index a3b6df0571d6..fd5193fc722e 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1963,13 +1963,29 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops 
*ops, struct file *file,
 static int v4l_streamon(const struct v4l2_ioctl_ops *ops, struct file *file,
                        void *arg)
 {
-       return ops->vidioc_streamon(file, NULL, *(unsigned int *)arg);
+       struct v4l2_fh *fh = file_to_v4l2_fh(file);
+       int err;
+
+       err = ops->vidioc_streamon(file, NULL, *(unsigned int *)arg);
+
+       if (!err)
+               trace_v4l2_streamon(fh->tgid, fh->fd);
+
+       return err;
 }
 
 static int v4l_streamoff(const struct v4l2_ioctl_ops *ops, struct file *file,
                         void *arg)
 {
-       return ops->vidioc_streamoff(file, NULL, *(unsigned int *)arg);
+       struct v4l2_fh *fh = file_to_v4l2_fh(file);
+       int err;
+
+       err = ops->vidioc_streamoff(file, NULL, *(unsigned int *)arg);
+
+       if (!err)
+               trace_v4l2_streamoff(fh->tgid, fh->fd);
+
+       return err;
 }
 
 static int v4l_g_tuner(const struct v4l2_ioctl_ops *ops, struct file *file,
diff --git a/include/trace/events/v4l2.h b/include/trace/events/v4l2.h
index 248bc09bfc99..bec310eaedc7 100644
--- a/include/trace/events/v4l2.h
+++ b/include/trace/events/v4l2.h
@@ -262,6 +262,34 @@ DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_qbuf,
        TP_ARGS(q, vb)
 );
 
+DECLARE_EVENT_CLASS(v4l2_stream_class,
+       TP_PROTO(u32 tgid, u32 fd),
+       TP_ARGS(tgid, fd),
+
+       TP_STRUCT__entry(
+               __field(u32, tgid)
+               __field(u32, fd)
+       ),
+
+       TP_fast_assign(
+               __entry->tgid = tgid;
+               __entry->fd = fd;
+       ),
+
+       TP_printk("tgid = %u, fd = %u",
+                 __entry->tgid, __entry->fd)
+);
+
+DEFINE_EVENT(v4l2_stream_class, v4l2_streamon,
+       TP_PROTO(u32 tgid, u32 fd),
+       TP_ARGS(tgid, fd)
+);
+
+DEFINE_EVENT(v4l2_stream_class, v4l2_streamoff,
+       TP_PROTO(u32 tgid, u32 fd),
+       TP_ARGS(tgid, fd)
+);
+
 #endif /* if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) */
 
 /* This part must be outside protection */
-- 
2.53.0


Reply via email to