提交 aa32f4c0 编写于 作者: H Hans Verkuil 提交者: Mauro Carvalho Chehab

[media] v4l2: move tracepoints to video_usercopy

The (d)qbuf ioctls were traced in the low-level v4l2 ioctl function. The
trace was outside the serialization lock, so that can affect the usefulness
of the timing. In addition, the __user pointer was expected instead of a
proper kernel pointer.

By moving the tracepoints to video_usercopy we ensure that the trace calls
use the correct kernel pointer, and that it happens right after the ioctl
call to the driver, so certainly inside the serialization lock.

In addition, we only trace if the call was successful.
Signed-off-by: NHans Verkuil <hans.verkuil@cisco.com>
Acked-by: NWade Farnsworth <wade_farnsworth@mentor.com>
Signed-off-by: NMauro Carvalho Chehab <m.chehab@samsung.com>
上级 3fe6d4b9
...@@ -31,10 +31,6 @@ ...@@ -31,10 +31,6 @@
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h> #include <media/v4l2-ioctl.h>
#define CREATE_TRACE_POINTS
#include <trace/events/v4l2.h>
#define VIDEO_NUM_DEVICES 256 #define VIDEO_NUM_DEVICES 256
#define VIDEO_NAME "video4linux" #define VIDEO_NAME "video4linux"
...@@ -395,11 +391,6 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -395,11 +391,6 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
} else } else
ret = -ENOTTY; ret = -ENOTTY;
if (cmd == VIDIOC_DQBUF)
trace_v4l2_dqbuf(vdev->minor, (struct v4l2_buffer *)arg);
else if (cmd == VIDIOC_QBUF)
trace_v4l2_qbuf(vdev->minor, (struct v4l2_buffer *)arg);
return ret; return ret;
} }
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
#include <media/videobuf2-core.h> #include <media/videobuf2-core.h>
#define CREATE_TRACE_POINTS
#include <trace/events/v4l2.h>
/* Zero out the end of the struct pointed to by p. Everything after, but /* Zero out the end of the struct pointed to by p. Everything after, but
* not including, the specified field is cleared. */ * not including, the specified field is cleared. */
#define CLEAR_AFTER_FIELD(p, field) \ #define CLEAR_AFTER_FIELD(p, field) \
...@@ -2338,6 +2341,12 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg, ...@@ -2338,6 +2341,12 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
err = func(file, cmd, parg); err = func(file, cmd, parg);
if (err == -ENOIOCTLCMD) if (err == -ENOIOCTLCMD)
err = -ENOTTY; err = -ENOTTY;
if (err == 0) {
if (cmd == VIDIOC_DQBUF)
trace_v4l2_dqbuf(video_devdata(file)->minor, parg);
else if (cmd == VIDIOC_QBUF)
trace_v4l2_qbuf(video_devdata(file)->minor, parg);
}
if (has_array_args) { if (has_array_args) {
*kernel_ptr = user_ptr; *kernel_ptr = user_ptr;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册