[PATCH 3/6] dma-buf: use reservation objects

2014-02-24 Thread Maarten Lankhorst
This allows reservation objects to be used in dma-buf. it's required
for implementing polling support on the fences that belong to a dma-buf.

Signed-off-by: Maarten Lankhorst maarten.lankho...@canonical.com
Acked-by: Mauro Carvalho Chehab m.che...@samsung.com #drivers/media/v4l2-core/
Acked-by: Thomas Hellstrom thellst...@vmware.com #drivers/gpu/drm/ttm
---
 drivers/base/dma-buf.c |   22 --
 drivers/gpu/drm/drm_prime.c|8 +++-
 drivers/gpu/drm/exynos/exynos_drm_dmabuf.c |2 +-
 drivers/gpu/drm/i915/i915_gem_dmabuf.c |2 +-
 drivers/gpu/drm/nouveau/nouveau_drm.c  |1 +
 drivers/gpu/drm/nouveau/nouveau_gem.h  |1 +
 drivers/gpu/drm/nouveau/nouveau_prime.c|7 +++
 drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c  |2 +-
 drivers/gpu/drm/radeon/radeon_drv.c|2 ++
 drivers/gpu/drm/radeon/radeon_prime.c  |8 
 drivers/gpu/drm/ttm/ttm_object.c   |2 +-
 drivers/media/v4l2-core/videobuf2-dma-contig.c |2 +-
 drivers/staging/android/ion/ion.c  |2 +-
 include/drm/drmP.h |2 ++
 include/linux/dma-buf.h|9 ++---
 15 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/drivers/base/dma-buf.c b/drivers/base/dma-buf.c
index 1e16cbd61da2..65d0f6201db4 100644
--- a/drivers/base/dma-buf.c
+++ b/drivers/base/dma-buf.c
@@ -25,10 +25,12 @@
 #include linux/fs.h
 #include linux/slab.h
 #include linux/dma-buf.h
+#include linux/fence.h
 #include linux/anon_inodes.h
 #include linux/export.h
 #include linux/debugfs.h
 #include linux/seq_file.h
+#include linux/reservation.h
 
 static inline int is_dma_buf_file(struct file *);
 
@@ -56,6 +58,9 @@ static int dma_buf_release(struct inode *inode, struct file 
*file)
list_del(dmabuf-list_node);
mutex_unlock(db_list.lock);
 
+   if (dmabuf-resv == (struct reservation_object *)dmabuf[1])
+   reservation_object_fini(dmabuf-resv);
+
kfree(dmabuf);
return 0;
 }
@@ -128,6 +133,7 @@ static inline int is_dma_buf_file(struct file *file)
  * @size:  [in]Size of the buffer
  * @flags: [in]mode flags for the file.
  * @exp_name:  [in]name of the exporting module - useful for debugging.
+ * @resv:  [in]reservation-object, NULL to allocate default one.
  *
  * Returns, on success, a newly created dma_buf object, which wraps the
  * supplied private data and operations for dma_buf_ops. On either missing
@@ -135,10 +141,17 @@ static inline int is_dma_buf_file(struct file *file)
  *
  */
 struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
-   size_t size, int flags, const char *exp_name)
+   size_t size, int flags, const char *exp_name,
+   struct reservation_object *resv)
 {
struct dma_buf *dmabuf;
struct file *file;
+   size_t alloc_size = sizeof(struct dma_buf);
+   if (!resv)
+   alloc_size += sizeof(struct reservation_object);
+   else
+   /* prevent dma_buf[1] == dma_buf-resv */
+   alloc_size += 1;
 
if (WARN_ON(!priv || !ops
  || !ops-map_dma_buf
@@ -150,7 +163,7 @@ struct dma_buf *dma_buf_export_named(void *priv, const 
struct dma_buf_ops *ops,
return ERR_PTR(-EINVAL);
}
 
-   dmabuf = kzalloc(sizeof(struct dma_buf), GFP_KERNEL);
+   dmabuf = kzalloc(alloc_size, GFP_KERNEL);
if (dmabuf == NULL)
return ERR_PTR(-ENOMEM);
 
@@ -158,6 +171,11 @@ struct dma_buf *dma_buf_export_named(void *priv, const 
struct dma_buf_ops *ops,
dmabuf-ops = ops;
dmabuf-size = size;
dmabuf-exp_name = exp_name;
+   if (!resv) {
+   resv = (struct reservation_object *)dmabuf[1];
+   reservation_object_init(resv);
+   }
+   dmabuf-resv = resv;
 
file = anon_inode_getfile(dmabuf, dma_buf_fops, dmabuf, flags);
if (IS_ERR(file)) {
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 56805c39c906..a13e90245adf 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -318,7 +318,13 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = 
 {
 struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
 struct drm_gem_object *obj, int flags)
 {
-   return dma_buf_export(obj, drm_gem_prime_dmabuf_ops, obj-size, flags);
+   struct reservation_object *robj = NULL;
+
+   if (dev-driver-gem_prime_res_obj)
+   robj = dev-driver-gem_prime_res_obj(obj);
+
+   return dma_buf_export(obj, drm_gem_prime_dmabuf_ops, obj-size,
+ flags, robj);
 }
 EXPORT_SYMBOL(drm_gem_prime_export);
 
diff --git 

Re: [PATCH 3/6] dma-buf: use reservation objects

2014-02-19 Thread Thomas Hellstrom
On 02/17/2014 04:56 PM, Maarten Lankhorst wrote:
 This allows reservation objects to be used in dma-buf. it's required
 for implementing polling support on the fences that belong to a dma-buf.

 Signed-off-by: Maarten Lankhorst maarten.lankho...@canonical.com
 Acked-by: Mauro Carvalho Chehab m.che...@samsung.com 
 #drivers/media/v4l2-core/

For the TTM part:

 Acked-by: Thomas Hellstrom thellst...@vmware.com
--
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 3/6] dma-buf: use reservation objects

2014-02-17 Thread Rob Clark
On Mon, Feb 17, 2014 at 10:56 AM, Maarten Lankhorst
maarten.lankho...@canonical.com wrote:
 This allows reservation objects to be used in dma-buf. it's required
 for implementing polling support on the fences that belong to a dma-buf.

 Signed-off-by: Maarten Lankhorst maarten.lankho...@canonical.com
 Acked-by: Mauro Carvalho Chehab m.che...@samsung.com 
 #drivers/media/v4l2-core/
 ---
  drivers/base/dma-buf.c |   22 --
  drivers/gpu/drm/drm_prime.c|8 +++-
  drivers/gpu/drm/exynos/exynos_drm_dmabuf.c |2 +-
  drivers/gpu/drm/i915/i915_gem_dmabuf.c |2 +-
  drivers/gpu/drm/nouveau/nouveau_drm.c  |1 +
  drivers/gpu/drm/nouveau/nouveau_gem.h  |1 +
  drivers/gpu/drm/nouveau/nouveau_prime.c|7 +++
  drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c  |2 +-
  drivers/gpu/drm/radeon/radeon_drv.c|2 ++
  drivers/gpu/drm/radeon/radeon_prime.c  |8 
  drivers/gpu/drm/ttm/ttm_object.c   |2 +-
  drivers/media/v4l2-core/videobuf2-dma-contig.c |2 +-
  include/drm/drmP.h |2 ++
  include/linux/dma-buf.h|9 ++---
  14 files changed, 59 insertions(+), 11 deletions(-)

 diff --git a/drivers/base/dma-buf.c b/drivers/base/dma-buf.c
 index 1e16cbd61da2..85e792c2c909 100644
 --- a/drivers/base/dma-buf.c
 +++ b/drivers/base/dma-buf.c
 @@ -25,10 +25,12 @@
  #include linux/fs.h
  #include linux/slab.h
  #include linux/dma-buf.h
 +#include linux/fence.h
  #include linux/anon_inodes.h
  #include linux/export.h
  #include linux/debugfs.h
  #include linux/seq_file.h
 +#include linux/reservation.h

  static inline int is_dma_buf_file(struct file *);

 @@ -56,6 +58,9 @@ static int dma_buf_release(struct inode *inode, struct file 
 *file)
 list_del(dmabuf-list_node);
 mutex_unlock(db_list.lock);

 +   if (dmabuf-resv == (struct reservation_object*)dmabuf[1])
 +   reservation_object_fini(dmabuf-resv);
 +
 kfree(dmabuf);
 return 0;
  }
 @@ -128,6 +133,7 @@ static inline int is_dma_buf_file(struct file *file)
   * @size:  [in]Size of the buffer
   * @flags: [in]mode flags for the file.
   * @exp_name:  [in]name of the exporting module - useful for debugging.
 + * @resv:  [in]reservation-object, NULL to allocate default one.
   *
   * Returns, on success, a newly created dma_buf object, which wraps the
   * supplied private data and operations for dma_buf_ops. On either missing
 @@ -135,10 +141,17 @@ static inline int is_dma_buf_file(struct file *file)
   *
   */
  struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops 
 *ops,
 -   size_t size, int flags, const char *exp_name)
 +   size_t size, int flags, const char *exp_name,
 +   struct reservation_object *resv)
  {
 struct dma_buf *dmabuf;
 struct file *file;
 +   size_t alloc_size = sizeof(struct dma_buf);
 +   if (!resv)
 +   alloc_size += sizeof(struct reservation_object);
 +   else
 +   /* prevent dma_buf[1] == dma_buf-resv */
 +   alloc_size += 1;

 if (WARN_ON(!priv || !ops
   || !ops-map_dma_buf
 @@ -150,7 +163,7 @@ struct dma_buf *dma_buf_export_named(void *priv, const 
 struct dma_buf_ops *ops,
 return ERR_PTR(-EINVAL);
 }

 -   dmabuf = kzalloc(sizeof(struct dma_buf), GFP_KERNEL);
 +   dmabuf = kzalloc(alloc_size, GFP_KERNEL);
 if (dmabuf == NULL)
 return ERR_PTR(-ENOMEM);

 @@ -158,6 +171,11 @@ struct dma_buf *dma_buf_export_named(void *priv, const 
 struct dma_buf_ops *ops,
 dmabuf-ops = ops;
 dmabuf-size = size;
 dmabuf-exp_name = exp_name;
 +   if (!resv) {
 +   resv = (struct reservation_object*)dmabuf[1];
 +   reservation_object_init(resv);
 +   }
 +   dmabuf-resv = resv;

 file = anon_inode_getfile(dmabuf, dma_buf_fops, dmabuf, flags);
 if (IS_ERR(file)) {
 diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
 index 56805c39c906..a13e90245adf 100644
 --- a/drivers/gpu/drm/drm_prime.c
 +++ b/drivers/gpu/drm/drm_prime.c
 @@ -318,7 +318,13 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops 
 =  {
  struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
  struct drm_gem_object *obj, int flags)
  {
 -   return dma_buf_export(obj, drm_gem_prime_dmabuf_ops, obj-size, 
 flags);
 +   struct reservation_object *robj = NULL;
 +
 +   if (dev-driver-gem_prime_res_obj)
 +   robj = dev-driver-gem_prime_res_obj(obj);

well, you could hook up msm_gem_prime_res_obj too (since I already
have a resv obj in 'struct msm_gem_object' ;-)

That said, I wonder if