* [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations
@ 2015-02-17 8:44 Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 1/6] pvrusb2: replace .ioctl by .unlocked_ioctl Hans Verkuil
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Hans Verkuil @ 2015-02-17 8:44 UTC (permalink / raw)
To: linux-media; +Cc: laurent.pinchart
Changes in v1:
- use core locking in the uvc gadget driver
All V4L2 drivers should use .unlocked_ioctl instead of .ioctl. There are
only three drivers left that do not do that: pvrusb2, radio-bcm2048 and
the uvc gadget driver.
The pvrusb2 driver does its own locking as far as I can tell, so it can
just switch to unlocked_ioctl. Ditto for radio-bcm2048.
The uvc gadget driver uses a lock for the queuing ioctls, but not for
g/s_format. Laurent suggested to just use core locking here, so that's
what I did. Compile tested only. In addition querycap didn't set
device_caps, so that was added as well (this will cause a warning
otherwise).
The last patch removes the old .ioctl op completely.
Regards,
Hans
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCHv2 1/6] pvrusb2: replace .ioctl by .unlocked_ioctl.
2015-02-17 8:44 [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations Hans Verkuil
@ 2015-02-17 8:44 ` Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 2/6] radio-bcm2048: use unlocked_ioctl instead of ioctl Hans Verkuil
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Hans Verkuil @ 2015-02-17 8:44 UTC (permalink / raw)
To: linux-media; +Cc: laurent.pinchart, Hans Verkuil
From: Hans Verkuil <hans.verkuil@cisco.com>
As far as I can tell pvrusb2 does its own locking, so there is
no need to use .ioctl.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
---
drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
index 35e4ea5..91c1700 100644
--- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
+++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c
@@ -1247,7 +1247,7 @@ static const struct v4l2_file_operations vdev_fops = {
.open = pvr2_v4l2_open,
.release = pvr2_v4l2_release,
.read = pvr2_v4l2_read,
- .ioctl = pvr2_v4l2_ioctl,
+ .unlocked_ioctl = pvr2_v4l2_ioctl,
.poll = pvr2_v4l2_poll,
};
--
2.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 2/6] radio-bcm2048: use unlocked_ioctl instead of ioctl
2015-02-17 8:44 [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 1/6] pvrusb2: replace .ioctl by .unlocked_ioctl Hans Verkuil
@ 2015-02-17 8:44 ` Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 3/6] uvc gadget: switch to v4l2 core locking Hans Verkuil
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Hans Verkuil @ 2015-02-17 8:44 UTC (permalink / raw)
To: linux-media; +Cc: laurent.pinchart, Hans Verkuil
From: Hans Verkuil <hans.verkuil@cisco.com>
This driver does its own locking, so there is no need to use
ioctl instead of unlocked_ioctl.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Pali Rohár <pali.rohar@gmail.com>
---
drivers/staging/media/bcm2048/radio-bcm2048.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/media/bcm2048/radio-bcm2048.c b/drivers/staging/media/bcm2048/radio-bcm2048.c
index 5382506..512fa26 100644
--- a/drivers/staging/media/bcm2048/radio-bcm2048.c
+++ b/drivers/staging/media/bcm2048/radio-bcm2048.c
@@ -2274,7 +2274,7 @@ done:
*/
static const struct v4l2_file_operations bcm2048_fops = {
.owner = THIS_MODULE,
- .ioctl = video_ioctl2,
+ .unlocked_ioctl = video_ioctl2,
/* for RDS read support */
.open = bcm2048_fops_open,
.release = bcm2048_fops_release,
--
2.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 3/6] uvc gadget: switch to v4l2 core locking
2015-02-17 8:44 [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 1/6] pvrusb2: replace .ioctl by .unlocked_ioctl Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 2/6] radio-bcm2048: use unlocked_ioctl instead of ioctl Hans Verkuil
@ 2015-02-17 8:44 ` Hans Verkuil
2015-02-17 20:51 ` Laurent Pinchart
2015-02-17 8:44 ` [PATCHv2 4/6] uvc gadget: switch to unlocked_ioctl Hans Verkuil
` (2 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Hans Verkuil @ 2015-02-17 8:44 UTC (permalink / raw)
To: linux-media; +Cc: laurent.pinchart, Hans Verkuil
From: Hans Verkuil <hans.verkuil@cisco.com>
Switch this driver over to the V4L2 core locking mechanism in preparation
for switching to unlocked_ioctl. Suggested by Laurent Pinchart.
This patch introduces a new mutex at the struct uvc_video level and
drops the old mutex at the queue level. The new lock is now used for all
ioctl locking and in the release file operation (the driver always has
to take care of locking in file operations, the core only serializes
ioctls).
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
---
drivers/usb/gadget/function/f_uvc.c | 2 +
drivers/usb/gadget/function/uvc.h | 1 +
drivers/usb/gadget/function/uvc_queue.c | 79 ++++++---------------------------
drivers/usb/gadget/function/uvc_queue.h | 4 +-
drivers/usb/gadget/function/uvc_v4l2.c | 3 +-
drivers/usb/gadget/function/uvc_video.c | 3 +-
6 files changed, 22 insertions(+), 70 deletions(-)
diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 945b3bd..87876371 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -446,6 +446,7 @@ uvc_register_video(struct uvc_device *uvc)
video->ioctl_ops = &uvc_v4l2_ioctl_ops;
video->release = video_device_release;
video->vfl_dir = VFL_DIR_TX;
+ video->lock = &uvc->video.mutex;
strlcpy(video->name, cdev->gadget->name, sizeof(video->name));
uvc->vdev = video;
@@ -817,6 +818,7 @@ static struct usb_function *uvc_alloc(struct usb_function_instance *fi)
if (uvc == NULL)
return ERR_PTR(-ENOMEM);
+ mutex_init(&uvc->video.mutex);
uvc->state = UVC_STATE_DISCONNECTED;
opts = to_f_uvc_opts(fi);
diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h
index f67695c..3390ecd 100644
--- a/drivers/usb/gadget/function/uvc.h
+++ b/drivers/usb/gadget/function/uvc.h
@@ -115,6 +115,7 @@ struct uvc_video
unsigned int width;
unsigned int height;
unsigned int imagesize;
+ struct mutex mutex; /* protects frame parameters */
/* Requests */
unsigned int req_size;
diff --git a/drivers/usb/gadget/function/uvc_queue.c b/drivers/usb/gadget/function/uvc_queue.c
index 8ea8b3b..d617c39 100644
--- a/drivers/usb/gadget/function/uvc_queue.c
+++ b/drivers/usb/gadget/function/uvc_queue.c
@@ -104,29 +104,16 @@ static void uvc_buffer_queue(struct vb2_buffer *vb)
spin_unlock_irqrestore(&queue->irqlock, flags);
}
-static void uvc_wait_prepare(struct vb2_queue *vq)
-{
- struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
-
- mutex_unlock(&queue->mutex);
-}
-
-static void uvc_wait_finish(struct vb2_queue *vq)
-{
- struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
-
- mutex_lock(&queue->mutex);
-}
-
static struct vb2_ops uvc_queue_qops = {
.queue_setup = uvc_queue_setup,
.buf_prepare = uvc_buffer_prepare,
.buf_queue = uvc_buffer_queue,
- .wait_prepare = uvc_wait_prepare,
- .wait_finish = uvc_wait_finish,
+ .wait_prepare = vb2_ops_wait_prepare,
+ .wait_finish = vb2_ops_wait_finish,
};
-int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
+int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
+ struct mutex *lock)
{
int ret;
@@ -135,6 +122,7 @@ int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
queue->queue.drv_priv = queue;
queue->queue.buf_struct_size = sizeof(struct uvc_buffer);
queue->queue.ops = &uvc_queue_qops;
+ queue->queue.lock = lock;
queue->queue.mem_ops = &vb2_vmalloc_memops;
queue->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
| V4L2_BUF_FLAG_TSTAMP_SRC_EOF;
@@ -142,7 +130,6 @@ int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
if (ret)
return ret;
- mutex_init(&queue->mutex);
spin_lock_init(&queue->irqlock);
INIT_LIST_HEAD(&queue->irqqueue);
queue->flags = 0;
@@ -155,9 +142,7 @@ int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
*/
void uvcg_free_buffers(struct uvc_video_queue *queue)
{
- mutex_lock(&queue->mutex);
vb2_queue_release(&queue->queue);
- mutex_unlock(&queue->mutex);
}
/*
@@ -168,22 +153,14 @@ int uvcg_alloc_buffers(struct uvc_video_queue *queue,
{
int ret;
- mutex_lock(&queue->mutex);
ret = vb2_reqbufs(&queue->queue, rb);
- mutex_unlock(&queue->mutex);
return ret ? ret : rb->count;
}
int uvcg_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
{
- int ret;
-
- mutex_lock(&queue->mutex);
- ret = vb2_querybuf(&queue->queue, buf);
- mutex_unlock(&queue->mutex);
-
- return ret;
+ return vb2_querybuf(&queue->queue, buf);
}
int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
@@ -191,18 +168,14 @@ int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
unsigned long flags;
int ret;
- mutex_lock(&queue->mutex);
ret = vb2_qbuf(&queue->queue, buf);
if (ret < 0)
- goto done;
+ return ret;
spin_lock_irqsave(&queue->irqlock, flags);
ret = (queue->flags & UVC_QUEUE_PAUSED) != 0;
queue->flags &= ~UVC_QUEUE_PAUSED;
spin_unlock_irqrestore(&queue->irqlock, flags);
-
-done:
- mutex_unlock(&queue->mutex);
return ret;
}
@@ -213,13 +186,7 @@ done:
int uvcg_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf,
int nonblocking)
{
- int ret;
-
- mutex_lock(&queue->mutex);
- ret = vb2_dqbuf(&queue->queue, buf, nonblocking);
- mutex_unlock(&queue->mutex);
-
- return ret;
+ return vb2_dqbuf(&queue->queue, buf, nonblocking);
}
/*
@@ -231,24 +198,12 @@ int uvcg_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf,
unsigned int uvcg_queue_poll(struct uvc_video_queue *queue, struct file *file,
poll_table *wait)
{
- unsigned int ret;
-
- mutex_lock(&queue->mutex);
- ret = vb2_poll(&queue->queue, file, wait);
- mutex_unlock(&queue->mutex);
-
- return ret;
+ return vb2_poll(&queue->queue, file, wait);
}
int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)
{
- int ret;
-
- mutex_lock(&queue->mutex);
- ret = vb2_mmap(&queue->queue, vma);
- mutex_unlock(&queue->mutex);
-
- return ret;
+ return vb2_mmap(&queue->queue, vma);
}
#ifndef CONFIG_MMU
@@ -260,12 +215,7 @@ int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)
unsigned long uvcg_queue_get_unmapped_area(struct uvc_video_queue *queue,
unsigned long pgoff)
{
- unsigned long ret;
-
- mutex_lock(&queue->mutex);
- ret = vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0);
- mutex_unlock(&queue->mutex);
- return ret;
+ return vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0);
}
#endif
@@ -327,18 +277,17 @@ int uvcg_queue_enable(struct uvc_video_queue *queue, int enable)
unsigned long flags;
int ret = 0;
- mutex_lock(&queue->mutex);
if (enable) {
ret = vb2_streamon(&queue->queue, queue->queue.type);
if (ret < 0)
- goto done;
+ return ret;
queue->sequence = 0;
queue->buf_used = 0;
} else {
ret = vb2_streamoff(&queue->queue, queue->queue.type);
if (ret < 0)
- goto done;
+ return ret;
spin_lock_irqsave(&queue->irqlock, flags);
INIT_LIST_HEAD(&queue->irqqueue);
@@ -353,8 +302,6 @@ int uvcg_queue_enable(struct uvc_video_queue *queue, int enable)
spin_unlock_irqrestore(&queue->irqlock, flags);
}
-done:
- mutex_unlock(&queue->mutex);
return ret;
}
diff --git a/drivers/usb/gadget/function/uvc_queue.h b/drivers/usb/gadget/function/uvc_queue.h
index 03919c7..01ca9ea 100644
--- a/drivers/usb/gadget/function/uvc_queue.h
+++ b/drivers/usb/gadget/function/uvc_queue.h
@@ -41,7 +41,6 @@ struct uvc_buffer {
struct uvc_video_queue {
struct vb2_queue queue;
- struct mutex mutex; /* Protects queue */
unsigned int flags;
__u32 sequence;
@@ -57,7 +56,8 @@ static inline int uvc_queue_streaming(struct uvc_video_queue *queue)
return vb2_is_streaming(&queue->queue);
}
-int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type);
+int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
+ struct mutex *lock);
void uvcg_free_buffers(struct uvc_video_queue *queue);
diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index 5aad7fe..0bd6965 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -14,7 +14,6 @@
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/list.h>
-#include <linux/mutex.h>
#include <linux/videodev2.h>
#include <linux/vmalloc.h>
#include <linux/wait.h>
@@ -311,8 +310,10 @@ uvc_v4l2_release(struct file *file)
uvc_function_disconnect(uvc);
+ mutex_lock(&video->mutex);
uvcg_video_enable(video, 0);
uvcg_free_buffers(&video->queue);
+ mutex_unlock(&video->mutex);
file->private_data = NULL;
v4l2_fh_del(&handle->vfh);
diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c
index 9cb86bc..8927358 100644
--- a/drivers/usb/gadget/function/uvc_video.c
+++ b/drivers/usb/gadget/function/uvc_video.c
@@ -390,7 +390,8 @@ int uvcg_video_init(struct uvc_video *video)
video->imagesize = 320 * 240 * 2;
/* Initialize the video buffers queue. */
- uvcg_queue_init(&video->queue, V4L2_BUF_TYPE_VIDEO_OUTPUT);
+ uvcg_queue_init(&video->queue, V4L2_BUF_TYPE_VIDEO_OUTPUT,
+ &video->mutex);
return 0;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 4/6] uvc gadget: switch to unlocked_ioctl.
2015-02-17 8:44 [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations Hans Verkuil
` (2 preceding siblings ...)
2015-02-17 8:44 ` [PATCHv2 3/6] uvc gadget: switch to v4l2 core locking Hans Verkuil
@ 2015-02-17 8:44 ` Hans Verkuil
2015-02-17 20:51 ` Laurent Pinchart
2015-02-17 8:44 ` [PATCHv2 5/6] uvc gadget: set device_caps in querycap Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 6/6] v4l2-core: remove the old .ioctl BKL replacement Hans Verkuil
5 siblings, 1 reply; 9+ messages in thread
From: Hans Verkuil @ 2015-02-17 8:44 UTC (permalink / raw)
To: linux-media; +Cc: laurent.pinchart, Hans Verkuil
From: Hans Verkuil <hans.verkuil@cisco.com>
Instead of .ioctl use unlocked_ioctl. This allows us to finally remove
the old .ioctl op.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
---
drivers/usb/gadget/function/uvc_v4l2.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index 0bd6965..5a84e51 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -357,7 +357,7 @@ struct v4l2_file_operations uvc_v4l2_fops = {
.owner = THIS_MODULE,
.open = uvc_v4l2_open,
.release = uvc_v4l2_release,
- .ioctl = video_ioctl2,
+ .unlocked_ioctl = video_ioctl2,
.mmap = uvc_v4l2_mmap,
.poll = uvc_v4l2_poll,
#ifndef CONFIG_MMU
--
2.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 5/6] uvc gadget: set device_caps in querycap.
2015-02-17 8:44 [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations Hans Verkuil
` (3 preceding siblings ...)
2015-02-17 8:44 ` [PATCHv2 4/6] uvc gadget: switch to unlocked_ioctl Hans Verkuil
@ 2015-02-17 8:44 ` Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 6/6] v4l2-core: remove the old .ioctl BKL replacement Hans Verkuil
5 siblings, 0 replies; 9+ messages in thread
From: Hans Verkuil @ 2015-02-17 8:44 UTC (permalink / raw)
To: linux-media; +Cc: laurent.pinchart, Hans Verkuil
From: Hans Verkuil <hans.verkuil@cisco.com>
The V4L2 core will warn if this is not done. Unfortunately this driver
wasn't updated.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
drivers/usb/gadget/function/uvc_v4l2.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index 5a84e51..cbd9bf0 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -75,7 +75,8 @@ uvc_v4l2_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
strlcpy(cap->bus_info, dev_name(&cdev->gadget->dev),
sizeof(cap->bus_info));
- cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING;
+ cap->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING;
+ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 6/6] v4l2-core: remove the old .ioctl BKL replacement
2015-02-17 8:44 [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations Hans Verkuil
` (4 preceding siblings ...)
2015-02-17 8:44 ` [PATCHv2 5/6] uvc gadget: set device_caps in querycap Hans Verkuil
@ 2015-02-17 8:44 ` Hans Verkuil
5 siblings, 0 replies; 9+ messages in thread
From: Hans Verkuil @ 2015-02-17 8:44 UTC (permalink / raw)
To: linux-media; +Cc: laurent.pinchart, Hans Verkuil
From: Hans Verkuil <hans.verkuil@cisco.com>
To keep V4L2 drivers that did not yet convert to unlocked_ioctl happy,
the v4l2 core had a .ioctl file operation that took a V4L2 lock.
The last drivers are now converted to unlocked_ioctl, so all this
old code can now be removed.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
---
drivers/media/v4l2-core/v4l2-dev.c | 28 ----------------------------
drivers/media/v4l2-core/v4l2-device.c | 1 -
include/media/v4l2-dev.h | 1 -
include/media/v4l2-device.h | 2 --
4 files changed, 32 deletions(-)
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
index d89d5cb..9f4538c 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -357,34 +357,6 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
if (lock)
mutex_unlock(lock);
- } else if (vdev->fops->ioctl) {
- /* This code path is a replacement for the BKL. It is a major
- * hack but it will have to do for those drivers that are not
- * yet converted to use unlocked_ioctl.
- *
- * All drivers implement struct v4l2_device, so we use the
- * lock defined there to serialize the ioctls.
- *
- * However, if the driver sleeps, then it blocks all ioctls
- * since the lock is still held. This is very common for
- * VIDIOC_DQBUF since that normally waits for a frame to arrive.
- * As a result any other ioctl calls will proceed very, very
- * slowly since each call will have to wait for the VIDIOC_QBUF
- * to finish. Things that should take 0.01s may now take 10-20
- * seconds.
- *
- * The workaround is to *not* take the lock for VIDIOC_DQBUF.
- * This actually works OK for videobuf-based drivers, since
- * videobuf will take its own internal lock.
- */
- struct mutex *m = &vdev->v4l2_dev->ioctl_lock;
-
- if (cmd != VIDIOC_DQBUF && mutex_lock_interruptible(m))
- return -ERESTARTSYS;
- if (video_is_registered(vdev))
- ret = vdev->fops->ioctl(filp, cmd, arg);
- if (cmd != VIDIOC_DQBUF)
- mutex_unlock(m);
} else
ret = -ENOTTY;
diff --git a/drivers/media/v4l2-core/v4l2-device.c b/drivers/media/v4l2-core/v4l2-device.c
index 204cc67..5b0a30b 100644
--- a/drivers/media/v4l2-core/v4l2-device.c
+++ b/drivers/media/v4l2-core/v4l2-device.c
@@ -37,7 +37,6 @@ int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
INIT_LIST_HEAD(&v4l2_dev->subdevs);
spin_lock_init(&v4l2_dev->lock);
- mutex_init(&v4l2_dev->ioctl_lock);
v4l2_prio_init(&v4l2_dev->prio);
kref_init(&v4l2_dev->ref);
get_device(dev);
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
index 3e4fddf..acbcd2f 100644
--- a/include/media/v4l2-dev.h
+++ b/include/media/v4l2-dev.h
@@ -65,7 +65,6 @@ struct v4l2_file_operations {
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
- long (*ioctl) (struct file *, unsigned int, unsigned long);
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
#ifdef CONFIG_COMPAT
long (*compat_ioctl32) (struct file *, unsigned int, unsigned long);
diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h
index ffb69da..9c58157 100644
--- a/include/media/v4l2-device.h
+++ b/include/media/v4l2-device.h
@@ -58,8 +58,6 @@ struct v4l2_device {
struct v4l2_ctrl_handler *ctrl_handler;
/* Device's priority state */
struct v4l2_prio_state prio;
- /* BKL replacement mutex. Temporary solution only. */
- struct mutex ioctl_lock;
/* Keep track of the references to this struct. */
struct kref ref;
/* Release function that is called when the ref count goes to 0. */
--
2.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCHv2 3/6] uvc gadget: switch to v4l2 core locking
2015-02-17 8:44 ` [PATCHv2 3/6] uvc gadget: switch to v4l2 core locking Hans Verkuil
@ 2015-02-17 20:51 ` Laurent Pinchart
0 siblings, 0 replies; 9+ messages in thread
From: Laurent Pinchart @ 2015-02-17 20:51 UTC (permalink / raw)
To: Hans Verkuil; +Cc: linux-media, Hans Verkuil
Hi Hans,
Thank you for the patch.
On Tuesday 17 February 2015 09:44:06 Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil@cisco.com>
>
> Switch this driver over to the V4L2 core locking mechanism in preparation
> for switching to unlocked_ioctl. Suggested by Laurent Pinchart.
>
> This patch introduces a new mutex at the struct uvc_video level and
> drops the old mutex at the queue level. The new lock is now used for all
> ioctl locking and in the release file operation (the driver always has
> to take care of locking in file operations, the core only serializes
> ioctls).
The patch also drops locking in the mmap and get_unmapped_area functions,
shouldn't you mention it in the commit message ? Or possibly split that change
to a separate patch, as that's a bugfix by itself (taking the queue lock there
creates a possible AB-BA deadlock).
> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/usb/gadget/function/f_uvc.c | 2 +
> drivers/usb/gadget/function/uvc.h | 1 +
> drivers/usb/gadget/function/uvc_queue.c | 79 +++++-------------------------
> drivers/usb/gadget/function/uvc_queue.h | 4 +-
> drivers/usb/gadget/function/uvc_v4l2.c | 3 +-
> drivers/usb/gadget/function/uvc_video.c | 3 +-
> 6 files changed, 22 insertions(+), 70 deletions(-)
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCHv2 4/6] uvc gadget: switch to unlocked_ioctl.
2015-02-17 8:44 ` [PATCHv2 4/6] uvc gadget: switch to unlocked_ioctl Hans Verkuil
@ 2015-02-17 20:51 ` Laurent Pinchart
0 siblings, 0 replies; 9+ messages in thread
From: Laurent Pinchart @ 2015-02-17 20:51 UTC (permalink / raw)
To: Hans Verkuil; +Cc: linux-media, Hans Verkuil
Hi Hans,
Thank you for the patch.
On Tuesday 17 February 2015 09:44:07 Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil@cisco.com>
>
> Instead of .ioctl use unlocked_ioctl. This allows us to finally remove
> the old .ioctl op.
>
> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/usb/gadget/function/uvc_v4l2.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/function/uvc_v4l2.c
> b/drivers/usb/gadget/function/uvc_v4l2.c index 0bd6965..5a84e51 100644
> --- a/drivers/usb/gadget/function/uvc_v4l2.c
> +++ b/drivers/usb/gadget/function/uvc_v4l2.c
> @@ -357,7 +357,7 @@ struct v4l2_file_operations uvc_v4l2_fops = {
> .owner = THIS_MODULE,
> .open = uvc_v4l2_open,
> .release = uvc_v4l2_release,
> - .ioctl = video_ioctl2,
> + .unlocked_ioctl = video_ioctl2,
> .mmap = uvc_v4l2_mmap,
> .poll = uvc_v4l2_poll,
> #ifndef CONFIG_MMU
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-02-17 20:50 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-17 8:44 [PATCHv2 0/6] Remove .ioctl from v4l2_file_operations Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 1/6] pvrusb2: replace .ioctl by .unlocked_ioctl Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 2/6] radio-bcm2048: use unlocked_ioctl instead of ioctl Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 3/6] uvc gadget: switch to v4l2 core locking Hans Verkuil
2015-02-17 20:51 ` Laurent Pinchart
2015-02-17 8:44 ` [PATCHv2 4/6] uvc gadget: switch to unlocked_ioctl Hans Verkuil
2015-02-17 20:51 ` Laurent Pinchart
2015-02-17 8:44 ` [PATCHv2 5/6] uvc gadget: set device_caps in querycap Hans Verkuil
2015-02-17 8:44 ` [PATCHv2 6/6] v4l2-core: remove the old .ioctl BKL replacement Hans Verkuil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox