On Thursday 01 April 2010 11:23:30 Laurent Pinchart wrote:
> Hi Hans,
> 
> On Thursday 01 April 2010 10:01:10 Hans Verkuil wrote:
> > Hi all,
> > 
> > I just read on LWN that the core kernel guys are putting more effort into
> > removing the BKL. We are still using it in our own drivers, mostly V4L.
> > 
> > I added a BKL column to my driver list:
> > 
> > http://www.linuxtv.org/wiki/index.php/V4L_framework_progress#Bridge_Drivers
> > 
> > If you 'own' one of these drivers that still use BKL, then it would be nice
> > if you can try and remove the use of the BKL from those drivers.
> > 
> > The other part that needs to be done is to move from using the .ioctl file
> > op to using .unlocked_ioctl. Very few drivers do that, but I suspect
> > almost no driver actually needs to use .ioctl.
> 
> What about something like this patch as a first step ?

That doesn't fix anything. You just move the BKL from one place to another.
I don't see any benefit from that.

Regards,

        Hans

> 
> diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c
> index 7090699..14e1b1c 100644
> --- a/drivers/media/video/v4l2-dev.c
> +++ b/drivers/media/video/v4l2-dev.c
> @@ -25,6 +25,7 @@
>  #include <linux/init.h>
>  #include <linux/kmod.h>
>  #include <linux/slab.h>
> +#include <linux/smp_lock.h>
>  #include <asm/uaccess.h>
>  #include <asm/system.h>
>  
> @@ -215,28 +216,22 @@ static unsigned int v4l2_poll(struct file *filp, struct 
> poll_table_struct *poll)
>       return vdev->fops->poll(filp, poll);
>  }
>  
> -static int v4l2_ioctl(struct inode *inode, struct file *filp,
> -             unsigned int cmd, unsigned long arg)
> -{
> -     struct video_device *vdev = video_devdata(filp);
> -
> -     if (!vdev->fops->ioctl)
> -             return -ENOTTY;
> -     /* Allow ioctl to continue even if the device was unregistered.
> -        Things like dequeueing buffers might still be useful. */
> -     return vdev->fops->ioctl(filp, cmd, arg);
> -}
> -
>  static long v4l2_unlocked_ioctl(struct file *filp,
>               unsigned int cmd, unsigned long arg)
>  {
>       struct video_device *vdev = video_devdata(filp);
> +     int ret = -ENOTTY;
>  
> -     if (!vdev->fops->unlocked_ioctl)
> -             return -ENOTTY;
>       /* Allow ioctl to continue even if the device was unregistered.
>          Things like dequeueing buffers might still be useful. */
> -     return vdev->fops->unlocked_ioctl(filp, cmd, arg);
> +     if (vdev->fops->ioctl) {
> +             lock_kernel();
> +             ret = vdev->fops->ioctl(filp, cmd, arg);
> +             unlock_kernel();
> +     } else if (vdev->fops->unlocked_ioctl)
> +             ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
> +
> +     return ret;
>  }
>  
>  #ifdef CONFIG_MMU
> @@ -323,22 +318,6 @@ static const struct file_operations v4l2_unlocked_fops = 
> {
>       .llseek = no_llseek,
>  };
>  
> -static const struct file_operations v4l2_fops = {
> -     .owner = THIS_MODULE,
> -     .read = v4l2_read,
> -     .write = v4l2_write,
> -     .open = v4l2_open,
> -     .get_unmapped_area = v4l2_get_unmapped_area,
> -     .mmap = v4l2_mmap,
> -     .ioctl = v4l2_ioctl,
> -#ifdef CONFIG_COMPAT
> -     .compat_ioctl = v4l2_compat_ioctl32,
> -#endif
> -     .release = v4l2_release,
> -     .poll = v4l2_poll,
> -     .llseek = no_llseek,
> -};
> -
>  /**
>   * get_index - assign stream index number based on parent device
>   * @vdev: video_device to assign index number to, vdev->parent should be 
> assigned
> @@ -517,10 +496,7 @@ static int __video_register_device(struct video_device 
> *vdev, int type, int nr,
>               ret = -ENOMEM;
>               goto cleanup;
>       }
> -     if (vdev->fops->unlocked_ioctl)
> -             vdev->cdev->ops = &v4l2_unlocked_fops;
> -     else
> -             vdev->cdev->ops = &v4l2_fops;
> +     vdev->cdev->ops = &v4l2_unlocked_fops;
>       vdev->cdev->owner = vdev->fops->owner;
>       ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
>       if (ret < 0) {
> 
> A second step would be to replace lock_kernel/unlock_kernel with a
> V4L-specific lock, and the third step to push the lock into drivers.
> 
> 

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to