aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/radio
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-05-10 03:57:22 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-14 08:19:38 -0400
commit5126f2590bee412e3053de851cb07f531e4be36a (patch)
tree6afbccb73c4eea0ee4dd660537fff2c51322157a /drivers/media/radio
parent4b902fec7cd838d2376517455acb03a83898e262 (diff)
[media] v4l2-dev: add flag to have the core lock all file operations
This used to be the default if the lock pointer was set, but now that lock is by default only used for ioctl serialization. Those drivers that already used core locking have this flag set explicitly, except for some drivers where it was obvious that there was no need to serialize any file operations other than ioctl. The drivers that didn't need this flag were: drivers/media/radio/dsbr100.c drivers/media/radio/radio-isa.c drivers/media/radio/radio-keene.c drivers/media/radio/radio-miropcm20.c drivers/media/radio/radio-mr800.c drivers/media/radio/radio-tea5764.c drivers/media/radio/radio-timb.c drivers/media/video/vivi.c sound/i2c/other/tea575x-tuner.c The other drivers that use core locking and where it was not immediately obvious that this flag wasn't needed were changed so that the flag is set together with a comment that that driver needs work to avoid having to set that flag. This will often involve taking the core lock in the fops themselves. Eventually this flag should go and it should not be used in new drivers. There are a few reasons why we want to avoid core locking of non-ioctl fops: in the case of mmap this can lead to a deadlock in rare situations since when mmap is called the mmap_sem is held and it is possible for other parts of the code to take that lock as well (copy_from_user()/copy_to_user() perform a down_read(&mm->mmap_sem) when a page fault occurs). It is very unlikely that that happens since the core lock serializes all fops, but the kernel warns about it if lock validation is turned on. For poll it is also undesirable to take the core lock as that can introduce increased latency. The same is true for read/write. While it was possible to make flags or something to turn on/off taking the core lock for each file operation, in practice it is much simpler to just not take it at all except for ioctl and leave it to the driver to take the lock. There are only a handful fops compared to the zillion ioctls we have. I also wanted to make it obvious which drivers still take the lock for all fops, so that's why I chose to have drivers set it explicitly. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Acked-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/radio')
-rw-r--r--drivers/media/radio/wl128x/fmdrv_v4l2.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/media/radio/wl128x/fmdrv_v4l2.c b/drivers/media/radio/wl128x/fmdrv_v4l2.c
index 077d369a0173..080b96a61f1a 100644
--- a/drivers/media/radio/wl128x/fmdrv_v4l2.c
+++ b/drivers/media/radio/wl128x/fmdrv_v4l2.c
@@ -518,6 +518,10 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr)
518 video_set_drvdata(gradio_dev, fmdev); 518 video_set_drvdata(gradio_dev, fmdev);
519 519
520 gradio_dev->lock = &fmdev->mutex; 520 gradio_dev->lock = &fmdev->mutex;
521 /* Locking in file operations other than ioctl should be done
522 by the driver, not the V4L2 core.
523 This driver needs auditing so that this flag can be removed. */
524 set_bit(V4L2_FL_LOCK_ALL_FOPS, &gradio_dev->flags);
521 525
522 /* Register with V4L2 subsystem as RADIO device */ 526 /* Register with V4L2 subsystem as RADIO device */
523 if (video_register_device(gradio_dev, VFL_TYPE_RADIO, radio_nr)) { 527 if (video_register_device(gradio_dev, VFL_TYPE_RADIO, radio_nr)) {