• Ezequiel Garcia's avatar
    media: v4l2-mem2mem: Avoid calling .device_run in v4l2_m2m_job_finish · cbd9463d
    Ezequiel Garcia authored
    v4l2_m2m_job_finish() is typically called when
    DMA operations complete, in interrupt handlers or DMA
    completion callbacks. Calling .device_run from v4l2_m2m_job_finish
    creates a nasty re-entrancy path into the driver.
    
    Moreover, some implementation of .device_run might need to sleep,
    as is the case for drivers supporting the Request API,
    where controls are applied via v4l2_ctrl_request_setup,
    which takes the ctrl handler mutex.
    
    This commit adds a deferred context that calls v4l2_m2m_try_run,
    and gets scheduled by v4l2_m2m_job_finish().
    
    Before this change, device_run would be called from these
    paths:
    
    vb2_m2m_request_queue, or
    v4l2_m2m_streamon, or
    v4l2_m2m_qbuf
      v4l2_m2m_try_schedule
        v4l2_m2m_try_run
          .device_run
    
    v4l2_m2m_job_finish
      v4l2_m2m_try_run
        .device_run
    
    After this change, the latter is now gone and instead:
    
    v4l2_m2m_device_run_work
      v4l2_m2m_try_run
        .device_run
    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>
    cbd9463d
v4l2-mem2mem.c 30.7 KB