Re: [RFC/PATCH] v4l: vb2: Add a function to discard all DONE buffers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/10/2014 02:04 PM, Laurent Pinchart wrote:
> When suspending a device while a video stream is active all buffers
> marked as done but not dequeued yet will be kept across suspend and
> given back to userspace after resume. This will result in outdated
> buffers being dequeued.
> 
> Introduce a new vb2 function to mark all done buffers as erroneous
> instead, to be used by drivers at resume time.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>

Makes sense.

Acked-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>

Regards,

	Hans

> ---
>  drivers/media/v4l2-core/videobuf2-core.c | 24 ++++++++++++++++++++++++
>  include/media/videobuf2-core.h           |  1 +
>  2 files changed, 25 insertions(+)
> 
> The OMAP3 ISP driver custom queue implementation has this feature. I'm trying
> to move it to videobuf2, and thus need something similar in vb2. The function
> name could probably be improved, I'm open to suggestions.
> 
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index 8e6695c..ae2b5b1 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -971,6 +971,30 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
>  EXPORT_SYMBOL_GPL(vb2_buffer_done);
>  
>  /**
> + * vb2_discard_done() - discard all buffers marked as DONE
> + * @q:		videobuf2 queue
> + *
> + * This function is intended to be used with suspend/resume operations. It
> + * discards all 'done' buffers as they would be too old to be requested after
> + * resume.
> + *
> + * Drivers must stop the hardware and synchronize with interrupt handlers and/or
> + * delayed works before calling this function to make sure no buffer will be
> + * touched by the driver and/or hardware.
> + */
> +void vb2_discard_done(struct vb2_queue *q)
> +{
> +	struct vb2_buffer *vb;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&q->done_lock, flags);
> +	list_for_each_entry(vb, &q->done_list, done_entry)
> +		vb->state = VB2_BUF_STATE_ERROR;
> +	spin_unlock_irqrestore(&q->done_lock, flags);
> +}
> +EXPORT_SYMBOL_GPL(vb2_discard_done);
> +
> +/**
>   * __fill_vb2_buffer() - fill a vb2_buffer with information provided in a
>   * v4l2_buffer by the userspace. The caller has already verified that struct
>   * v4l2_buffer has a valid number of planes.
> diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
> index bf6859e..213b555 100644
> --- a/include/media/videobuf2-core.h
> +++ b/include/media/videobuf2-core.h
> @@ -372,6 +372,7 @@ void *vb2_plane_vaddr(struct vb2_buffer *vb, unsigned int plane_no);
>  void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no);
>  
>  void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state);
> +void vb2_discard_done(struct vb2_queue *q);
>  int vb2_wait_for_all_buffers(struct vb2_queue *q);
>  
>  int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b);
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux