• Hans Verkuil's avatar
    [media] v4l2-dev: add flag to have the core lock all file operations · 5126f259
    Hans Verkuil authored
    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: default avatarHans Verkuil <hans.verkuil@cisco.com>
    Acked-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
    5126f259
ivtv-streams.c 29.4 KB