Commit 542a522d authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Mauro Carvalho Chehab
Browse files

media: v4l2-ioctl.c: Simplify locking for m2m devices



Now that the mutexes for output and capture vb2 queues match,
it is possible to refer to the context q_lock as the
m2m lock for a given m2m context.

Remove the output/capture lock selection.

Signed-off-by: default avatarEzequiel Garcia <ezequiel@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 913f3ec2
Loading
Loading
Loading
Loading
+2 −45
Original line number Diff line number Diff line
@@ -2693,45 +2693,6 @@ static bool v4l2_is_known_ioctl(unsigned int cmd)
	return v4l2_ioctls[_IOC_NR(cmd)].ioctl == cmd;
}

#if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV)
static bool v4l2_ioctl_m2m_queue_is_output(unsigned int cmd, void *arg)
{
	switch (cmd) {
	case VIDIOC_CREATE_BUFS: {
		struct v4l2_create_buffers *cbufs = arg;

		return V4L2_TYPE_IS_OUTPUT(cbufs->format.type);
	}
	case VIDIOC_REQBUFS: {
		struct v4l2_requestbuffers *rbufs = arg;

		return V4L2_TYPE_IS_OUTPUT(rbufs->type);
	}
	case VIDIOC_QBUF:
	case VIDIOC_DQBUF:
	case VIDIOC_QUERYBUF:
	case VIDIOC_PREPARE_BUF: {
		struct v4l2_buffer *buf = arg;

		return V4L2_TYPE_IS_OUTPUT(buf->type);
	}
	case VIDIOC_EXPBUF: {
		struct v4l2_exportbuffer *expbuf = arg;

		return V4L2_TYPE_IS_OUTPUT(expbuf->type);
	}
	case VIDIOC_STREAMON:
	case VIDIOC_STREAMOFF: {
		int *type = arg;

		return V4L2_TYPE_IS_OUTPUT(*type);
	}
	default:
		return false;
	}
}
#endif

static struct mutex *v4l2_ioctl_get_lock(struct video_device *vdev,
					 struct v4l2_fh *vfh, unsigned int cmd,
					 void *arg)
@@ -2741,12 +2702,8 @@ static struct mutex *v4l2_ioctl_get_lock(struct video_device *vdev,
#if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV)
	if (vfh && vfh->m2m_ctx &&
	    (v4l2_ioctls[_IOC_NR(cmd)].flags & INFO_FL_QUEUE)) {
		bool is_output = v4l2_ioctl_m2m_queue_is_output(cmd, arg);
		struct v4l2_m2m_queue_ctx *ctx = is_output ?
			&vfh->m2m_ctx->out_q_ctx : &vfh->m2m_ctx->cap_q_ctx;

		if (ctx->q.lock)
			return ctx->q.lock;
		if (vfh->m2m_ctx->q_lock)
			return vfh->m2m_ctx->q_lock;
	}
#endif
	if (vdev->queue && vdev->queue->lock &&