Re: [PATCH] media: vb2: fix handling MAPPED buffer flag

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

 



On Wednesday, August 24, 2011 11:54:23 Marek Szyprowski wrote:
> MAPPED flag was set for the buffer only if all it's planes were mapped and
> relied on a simple mapping counter. This assumption is really bogus,
> especially because the buffers may be mapped multiple times. Also the
> meaning of this flag for muliplane buffers was not really useful. This
> patch fixes this issue by setting the MAPPED flag for the buffer if any of
> it's planes is in use (what means that has been mapped at least once), so
> MAPPED flag can be used as 'in_use' indicator.

Looks good!

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

This makes much more sense...

Regards,

	Hans

> 
> Reported-by: Hans Verkuil <hverkuil@xxxxxxxxx>
> Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx>
> CC: Pawel Osciak <pawel@xxxxxxxxxx>
> ---
>  drivers/media/video/videobuf2-core.c |   67 
++++++++++++++++++----------------
>  include/media/videobuf2-core.h       |    3 --
>  2 files changed, 36 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/media/video/videobuf2-core.c 
b/drivers/media/video/videobuf2-core.c
> index c360627..e89fd53 100644
> --- a/drivers/media/video/videobuf2-core.c
> +++ b/drivers/media/video/videobuf2-core.c
> @@ -277,6 +277,41 @@ static int __verify_planes_array(struct vb2_buffer *vb, 
struct v4l2_buffer *b)
>  }
>  
>  /**
> + * __buffer_in_use() - return true if the buffer is in use and
> + * the queue cannot be freed (by the means of REQBUFS(0)) call
> + */
> +static bool __buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb)
> +{
> +	unsigned int plane;
> +	for (plane = 0; plane < vb->num_planes; ++plane) {
> +		/*
> +		 * If num_users() has not been provided, call_memop
> +		 * will return 0, apparently nobody cares about this
> +		 * case anyway. If num_users() returns more than 1,
> +		 * we are not the only user of the plane's memory.
> +		 */
> +		if (call_memop(q, plane, num_users,
> +				vb->planes[plane].mem_priv) > 1)
> +			return true;
> +	}
> +	return false;
> +}
> +
> +/**
> + * __buffers_in_use() - return true if any buffers on the queue are in use 
and
> + * the queue cannot be freed (by the means of REQBUFS(0)) call
> + */
> +static bool __buffers_in_use(struct vb2_queue *q)
> +{
> +	unsigned int buffer;
> +	for (buffer = 0; buffer < q->num_buffers; ++buffer) {
> +		if (__buffer_in_use(q, q->bufs[buffer]))
> +			return true;
> +	}
> +	return false;
> +}
> +
> +/**
>   * __fill_v4l2_buffer() - fill in a struct v4l2_buffer with information to 
be
>   * returned to userspace
>   */
> @@ -335,7 +370,7 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, 
struct v4l2_buffer *b)
>  		break;
>  	}
>  
> -	if (vb->num_planes_mapped == vb->num_planes)
> +	if (__buffer_in_use(q, vb))
>  		b->flags |= V4L2_BUF_FLAG_MAPPED;
>  
>  	return ret;
> @@ -400,33 +435,6 @@ static int __verify_mmap_ops(struct vb2_queue *q)
>  }
>  
>  /**
> - * __buffers_in_use() - return true if any buffers on the queue are in use 
and
> - * the queue cannot be freed (by the means of REQBUFS(0)) call
> - */
> -static bool __buffers_in_use(struct vb2_queue *q)
> -{
> -	unsigned int buffer, plane;
> -	struct vb2_buffer *vb;
> -
> -	for (buffer = 0; buffer < q->num_buffers; ++buffer) {
> -		vb = q->bufs[buffer];
> -		for (plane = 0; plane < vb->num_planes; ++plane) {
> -			/*
> -			 * If num_users() has not been provided, call_memop
> -			 * will return 0, apparently nobody cares about this
> -			 * case anyway. If num_users() returns more than 1,
> -			 * we are not the only user of the plane's memory.
> -			 */
> -			if (call_memop(q, plane, num_users,
> -					vb->planes[plane].mem_priv) > 1)
> -				return true;
> -		}
> -	}
> -
> -	return false;
> -}
> -
> -/**
>   * vb2_reqbufs() - Initiate streaming
>   * @q:		videobuf2 queue
>   * @req:	struct passed from userspace to vidioc_reqbufs handler in driver
> @@ -1343,9 +1351,6 @@ int vb2_mmap(struct vb2_queue *q, struct 
vm_area_struct *vma)
>  	if (ret)
>  		return ret;
>  
> -	vb_plane->mapped = 1;
> -	vb->num_planes_mapped++;
> -
>  	dprintk(3, "Buffer %d, plane %d successfully mapped\n", buffer, plane);
>  	return 0;
>  }
> diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
> index 496d6e5..984f2ba 100644
> --- a/include/media/videobuf2-core.h
> +++ b/include/media/videobuf2-core.h
> @@ -75,7 +75,6 @@ struct vb2_mem_ops {
>  
>  struct vb2_plane {
>  	void			*mem_priv;
> -	int			mapped:1;
>  };
>  
>  /**
> @@ -147,7 +146,6 @@ struct vb2_queue;
>   * @done_entry:		entry on the list that stores all buffers ready to
>   *			be dequeued to userspace
>   * @planes:		private per-plane information; do not change
> - * @num_planes_mapped:	number of mapped planes; do not change
>   */
>  struct vb2_buffer {
>  	struct v4l2_buffer	v4l2_buf;
> @@ -164,7 +162,6 @@ struct vb2_buffer {
>  	struct list_head	done_entry;
>  
>  	struct vb2_plane	planes[VIDEO_MAX_PLANES];
> -	unsigned int		num_planes_mapped;
>  };
>  
>  /**
> -- 
> 1.7.1.569.g6f426
> 
> --
> 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
> 
--
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