Memory freeing when dmabuf fds are exported with VIDIOC_EXPBUF

2016-07-27 Thread Kazunori Kobayashi
Hi,

I have a question about memory freeing by calling REQBUF(0) before all the
dmabuf fds exported with VIDIOC_EXPBUF are closed.

In calling REQBUF(0), videobuf2-core returns -EBUSY when the reference count
of a vb2 buffer is more than 1. When dmabuf fds are not exported (usual 
V4L2_MEMORY_MMAP case),
the check is no problem, but when dmabuf fds are exported and some of them are
not closed (in other words the references to that memory are left),
we cannot succeed in calling REQBUF(0) despite being able to free the memory
after all the references are dropped.

Actually REQBUF(0) does not force a vb2 buffer to be freed but decreases
the refcount of it. Also all the vb2 memory allocators that support dmabuf 
exporting
(dma-contig, dma-sg, vmalloc) implements memory freeing by release() of 
dma_buf_ops,
so I think there is no need to return -EBUSY when exporting dmabuf fds.

Could you please tell me what you think?

The code that I am talking about is in drivers/media/v4l2-core/videobuf2-core.c:

   if (*count == 0 || q->num_buffers != 0 || q->memory != memory) {
  /*
   * We already have buffers allocated, so first check if they
   * are not in use and can be freed.
   */
  mutex_lock(>mmap_lock);
  if (q->memory == VB2_MEMORY_MMAP && __buffers_in_use(q)) {
  mutex_unlock(>mmap_lock);
  dprintk(1, "memory in use, cannot free\n");
  return -EBUSY;
  }

Regards,
Kobayashi
-- 
-----
IGEL Co.,Ltd. Kazunori Kobayashi
kkoba...@igel.co.jp
http://www.igel.co.jp/
--
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


Re: [PATCH] [media] soc_camera: Support VIDIOC_EXPBUF ioctl

2014-09-21 Thread Kazunori Kobayashi
Hi Guennadi,

Thank you for your review.

(2014/09/20 16:50), Guennadi Liakhovetski wrote:
 Hi Kobayashi-san,
 
 Thanks for the patch. In principle it looks good, just one question below:
 
 On Thu, 11 Sep 2014, Kazunori Kobayashi wrote:
 
 This patch allows for exporting a dmabuf descriptor from soc_camera drivers.

 Signed-off-by: Kazunori Kobayashi kkoba...@igel.co.jp
 ---
  drivers/media/platform/soc_camera/soc_camera.c | 14 ++
  1 file changed, 14 insertions(+)

 diff --git a/drivers/media/platform/soc_camera/soc_camera.c 
 b/drivers/media/platform/soc_camera/soc_camera.c
 index f4308fe..9d7b8ea 100644
 --- a/drivers/media/platform/soc_camera/soc_camera.c
 +++ b/drivers/media/platform/soc_camera/soc_camera.c
 @@ -437,6 +437,19 @@ static int soc_camera_prepare_buf(struct file *file, 
 void *priv,
  return vb2_prepare_buf(icd-vb2_vidq, b);
  }
  
 +static int soc_camera_expbuf(struct file *file, void *priv,
 + struct v4l2_exportbuffer *p)
 +{
 +struct soc_camera_device *icd = file-private_data;
 +struct soc_camera_host *ici = to_soc_camera_host(icd-parent);
 +
 +/* videobuf2 only */
 +if (ici-ops-init_videobuf)
 +return -EINVAL;
 +else
 +return vb2_expbuf(icd-vb2_vidq, p);
 
 Many soc-camera queue management functions, like queuing, dequeuing a 
 buffer check, that the caller is indeed the process, that is controlling 
 the device. This is done for the case, when two (or more) processes open a 
 video device node, some of them only want to monitor it, or control 
 parameters like exposure etc. Whereas only one process is allowed to 
 perform critical operations, like setting a video format, starting and 
 stopping streaming, queuing and dequeuing buffers. Should this function 
 too use such a check
 
   if (icd-streamer != file)
   return -EBUSY;
 
 If you agree, I can just add it myself, no need to resubmit.
I think that's appropriate suggestion.
The dmabuf exporting should be restricted to the process that
operates the video streaming.
Please add the check.

 
 Thanks
 Guennadi
 
 +}
 +
  /* Always entered with .host_lock held */
  static int soc_camera_init_user_formats(struct soc_camera_device *icd)
  {
 @@ -2085,6 +2098,7 @@ static const struct v4l2_ioctl_ops 
 soc_camera_ioctl_ops = {
  .vidioc_dqbuf= soc_camera_dqbuf,
  .vidioc_create_bufs  = soc_camera_create_bufs,
  .vidioc_prepare_buf  = soc_camera_prepare_buf,
 +.vidioc_expbuf   = soc_camera_expbuf,
  .vidioc_streamon = soc_camera_streamon,
  .vidioc_streamoff= soc_camera_streamoff,
  .vidioc_cropcap  = soc_camera_cropcap,
 -- 
 1.8.1.2



-- 
-
IGEL Co.,Ltd. Kazunori Kobayashi
kkoba...@igel.co.jp
http://www.igel.co.jp/
--
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


[PATCH] [media] soc_camera: Support VIDIOC_EXPBUF ioctl

2014-09-11 Thread Kazunori Kobayashi
This patch allows for exporting a dmabuf descriptor from soc_camera drivers.

Signed-off-by: Kazunori Kobayashi kkoba...@igel.co.jp
---
 drivers/media/platform/soc_camera/soc_camera.c | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/drivers/media/platform/soc_camera/soc_camera.c 
b/drivers/media/platform/soc_camera/soc_camera.c
index f4308fe..9d7b8ea 100644
--- a/drivers/media/platform/soc_camera/soc_camera.c
+++ b/drivers/media/platform/soc_camera/soc_camera.c
@@ -437,6 +437,19 @@ static int soc_camera_prepare_buf(struct file *file, void 
*priv,
return vb2_prepare_buf(icd-vb2_vidq, b);
 }
 
+static int soc_camera_expbuf(struct file *file, void *priv,
+struct v4l2_exportbuffer *p)
+{
+   struct soc_camera_device *icd = file-private_data;
+   struct soc_camera_host *ici = to_soc_camera_host(icd-parent);
+
+   /* videobuf2 only */
+   if (ici-ops-init_videobuf)
+   return -EINVAL;
+   else
+   return vb2_expbuf(icd-vb2_vidq, p);
+}
+
 /* Always entered with .host_lock held */
 static int soc_camera_init_user_formats(struct soc_camera_device *icd)
 {
@@ -2085,6 +2098,7 @@ static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = 
{
.vidioc_dqbuf= soc_camera_dqbuf,
.vidioc_create_bufs  = soc_camera_create_bufs,
.vidioc_prepare_buf  = soc_camera_prepare_buf,
+   .vidioc_expbuf   = soc_camera_expbuf,
.vidioc_streamon = soc_camera_streamon,
.vidioc_streamoff= soc_camera_streamoff,
.vidioc_cropcap  = soc_camera_cropcap,
-- 
1.8.1.2

--
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