[PATCH 3/6] dma-buf: use reservation objects
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
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
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