aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/dma-buf-sharing.txt23
-rw-r--r--drivers/dma-buf/dma-buf.c47
-rw-r--r--drivers/gpu/drm/armada/armada_gem.c10
-rw-r--r--drivers/gpu/drm/drm_prime.c12
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_dmabuf.c9
-rw-r--r--drivers/gpu/drm/i915/i915_gem_dmabuf.c10
-rw-r--r--drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c9
-rw-r--r--drivers/gpu/drm/tegra/gem.c10
-rw-r--r--drivers/gpu/drm/ttm/ttm_object.c9
-rw-r--r--drivers/gpu/drm/udl/udl_dmabuf.c9
-rw-r--r--drivers/media/v4l2-core/videobuf2-dma-contig.c8
-rw-r--r--drivers/media/v4l2-core/videobuf2-dma-sg.c8
-rw-r--r--drivers/media/v4l2-core/videobuf2-vmalloc.c8
-rw-r--r--drivers/staging/android/ion/ion.c9
-rw-r--r--include/linux/dma-buf.h34
15 files changed, 152 insertions, 63 deletions
diff --git a/Documentation/dma-buf-sharing.txt b/Documentation/dma-buf-sharing.txt
index bb9753b635a3..480c8de3c2c4 100644
--- a/Documentation/dma-buf-sharing.txt
+++ b/Documentation/dma-buf-sharing.txt
@@ -49,25 +49,26 @@ The dma_buf buffer sharing API usage contains the following steps:
49 The buffer exporter announces its wish to export a buffer. In this, it 49 The buffer exporter announces its wish to export a buffer. In this, it
50 connects its own private buffer data, provides implementation for operations 50 connects its own private buffer data, provides implementation for operations
51 that can be performed on the exported dma_buf, and flags for the file 51 that can be performed on the exported dma_buf, and flags for the file
52 associated with this buffer. 52 associated with this buffer. All these fields are filled in struct
53 dma_buf_export_info, defined via the DEFINE_DMA_BUF_EXPORT_INFO macro.
53 54
54 Interface: 55 Interface:
55 struct dma_buf *dma_buf_export_named(void *priv, struct dma_buf_ops *ops, 56 DEFINE_DMA_BUF_EXPORT_INFO(exp_info)
56 size_t size, int flags, 57 struct dma_buf *dma_buf_export(struct dma_buf_export_info *exp_info)
57 const char *exp_name)
58 58
59 If this succeeds, dma_buf_export_named allocates a dma_buf structure, and 59 If this succeeds, dma_buf_export allocates a dma_buf structure, and
60 returns a pointer to the same. It also associates an anonymous file with this 60 returns a pointer to the same. It also associates an anonymous file with this
61 buffer, so it can be exported. On failure to allocate the dma_buf object, 61 buffer, so it can be exported. On failure to allocate the dma_buf object,
62 it returns NULL. 62 it returns NULL.
63 63
64 'exp_name' is the name of exporter - to facilitate information while 64 'exp_name' in struct dma_buf_export_info is the name of exporter - to
65 debugging. 65 facilitate information while debugging. It is set to KBUILD_MODNAME by
66 default, so exporters don't have to provide a specific name, if they don't
67 wish to.
68
69 DEFINE_DMA_BUF_EXPORT_INFO macro defines the struct dma_buf_export_info,
70 zeroes it out and pre-populates exp_name in it.
66 71
67 Exporting modules which do not wish to provide any specific name may use the
68 helper define 'dma_buf_export()', with the same arguments as above, but
69 without the last argument; a KBUILD_MODNAME pre-processor directive will be
70 inserted in place of 'exp_name' instead.
71 72
722. Userspace gets a handle to pass around to potential buffer-users 732. Userspace gets a handle to pass around to potential buffer-users
73 74
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 5be225c2ba98..c5a9138a6a8d 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -265,43 +265,40 @@ static inline int is_dma_buf_file(struct file *file)
265} 265}
266 266
267/** 267/**
268 * dma_buf_export_named - Creates a new dma_buf, and associates an anon file 268 * dma_buf_export - Creates a new dma_buf, and associates an anon file
269 * with this buffer, so it can be exported. 269 * with this buffer, so it can be exported.
270 * Also connect the allocator specific data and ops to the buffer. 270 * Also connect the allocator specific data and ops to the buffer.
271 * Additionally, provide a name string for exporter; useful in debugging. 271 * Additionally, provide a name string for exporter; useful in debugging.
272 * 272 *
273 * @priv: [in] Attach private data of allocator to this buffer 273 * @exp_info: [in] holds all the export related information provided
274 * @ops: [in] Attach allocator-defined dma buf ops to the new buffer. 274 * by the exporter. see struct dma_buf_export_info
275 * @size: [in] Size of the buffer 275 * for further details.
276 * @flags: [in] mode flags for the file.
277 * @exp_name: [in] name of the exporting module - useful for debugging.
278 * @resv: [in] reservation-object, NULL to allocate default one.
279 * 276 *
280 * Returns, on success, a newly created dma_buf object, which wraps the 277 * Returns, on success, a newly created dma_buf object, which wraps the
281 * supplied private data and operations for dma_buf_ops. On either missing 278 * supplied private data and operations for dma_buf_ops. On either missing
282 * ops, or error in allocating struct dma_buf, will return negative error. 279 * ops, or error in allocating struct dma_buf, will return negative error.
283 * 280 *
284 */ 281 */
285struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, 282struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
286 size_t size, int flags, const char *exp_name,
287 struct reservation_object *resv)
288{ 283{
289 struct dma_buf *dmabuf; 284 struct dma_buf *dmabuf;
285 struct reservation_object *resv = exp_info->resv;
290 struct file *file; 286 struct file *file;
291 size_t alloc_size = sizeof(struct dma_buf); 287 size_t alloc_size = sizeof(struct dma_buf);
292 if (!resv) 288 if (!exp_info->resv)
293 alloc_size += sizeof(struct reservation_object); 289 alloc_size += sizeof(struct reservation_object);
294 else 290 else
295 /* prevent &dma_buf[1] == dma_buf->resv */ 291 /* prevent &dma_buf[1] == dma_buf->resv */
296 alloc_size += 1; 292 alloc_size += 1;
297 293
298 if (WARN_ON(!priv || !ops 294 if (WARN_ON(!exp_info->priv
299 || !ops->map_dma_buf 295 || !exp_info->ops
300 || !ops->unmap_dma_buf 296 || !exp_info->ops->map_dma_buf
301 || !ops->release 297 || !exp_info->ops->unmap_dma_buf
302 || !ops->kmap_atomic 298 || !exp_info->ops->release
303 || !ops->kmap 299 || !exp_info->ops->kmap_atomic
304 || !ops->mmap)) { 300 || !exp_info->ops->kmap
301 || !exp_info->ops->mmap)) {
305 return ERR_PTR(-EINVAL); 302 return ERR_PTR(-EINVAL);
306 } 303 }
307 304
@@ -309,10 +306,10 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
309 if (dmabuf == NULL) 306 if (dmabuf == NULL)
310 return ERR_PTR(-ENOMEM); 307 return ERR_PTR(-ENOMEM);
311 308
312 dmabuf->priv = priv; 309 dmabuf->priv = exp_info->priv;
313 dmabuf->ops = ops; 310 dmabuf->ops = exp_info->ops;
314 dmabuf->size = size; 311 dmabuf->size = exp_info->size;
315 dmabuf->exp_name = exp_name; 312 dmabuf->exp_name = exp_info->exp_name;
316 init_waitqueue_head(&dmabuf->poll); 313 init_waitqueue_head(&dmabuf->poll);
317 dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll; 314 dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
318 dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0; 315 dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0;
@@ -323,7 +320,8 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
323 } 320 }
324 dmabuf->resv = resv; 321 dmabuf->resv = resv;
325 322
326 file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf, flags); 323 file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf,
324 exp_info->flags);
327 if (IS_ERR(file)) { 325 if (IS_ERR(file)) {
328 kfree(dmabuf); 326 kfree(dmabuf);
329 return ERR_CAST(file); 327 return ERR_CAST(file);
@@ -341,8 +339,7 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
341 339
342 return dmabuf; 340 return dmabuf;
343} 341}
344EXPORT_SYMBOL_GPL(dma_buf_export_named); 342EXPORT_SYMBOL_GPL(dma_buf_export);
345
346 343
347/** 344/**
348 * dma_buf_fd - returns a file descriptor for the given dma_buf 345 * dma_buf_fd - returns a file descriptor for the given dma_buf
diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c
index ef5feeecec84..580e10acaa3a 100644
--- a/drivers/gpu/drm/armada/armada_gem.c
+++ b/drivers/gpu/drm/armada/armada_gem.c
@@ -538,8 +538,14 @@ struct dma_buf *
538armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj, 538armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj,
539 int flags) 539 int flags)
540{ 540{
541 return dma_buf_export(obj, &armada_gem_prime_dmabuf_ops, obj->size, 541 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
542 O_RDWR, NULL); 542
543 exp_info.ops = &armada_gem_prime_dmabuf_ops;
544 exp_info.size = obj->size;
545 exp_info.flags = O_RDWR;
546 exp_info.priv = obj;
547
548 return dma_buf_export(&exp_info);
543} 549}
544 550
545struct drm_gem_object * 551struct drm_gem_object *
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 7482b06cd08f..7fec191b45f7 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -339,13 +339,17 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = {
339struct dma_buf *drm_gem_prime_export(struct drm_device *dev, 339struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
340 struct drm_gem_object *obj, int flags) 340 struct drm_gem_object *obj, int flags)
341{ 341{
342 struct reservation_object *robj = NULL; 342 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
343
344 exp_info.ops = &drm_gem_prime_dmabuf_ops;
345 exp_info.size = obj->size;
346 exp_info.flags = flags;
347 exp_info.priv = obj;
343 348
344 if (dev->driver->gem_prime_res_obj) 349 if (dev->driver->gem_prime_res_obj)
345 robj = dev->driver->gem_prime_res_obj(obj); 350 exp_info.resv = dev->driver->gem_prime_res_obj(obj);
346 351
347 return dma_buf_export(obj, &drm_gem_prime_dmabuf_ops, obj->size, 352 return dma_buf_export(&exp_info);
348 flags, robj);
349} 353}
350EXPORT_SYMBOL(drm_gem_prime_export); 354EXPORT_SYMBOL(drm_gem_prime_export);
351 355
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
index 3833bf8ca025..cd485c091b30 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
@@ -185,9 +185,14 @@ struct dma_buf *exynos_dmabuf_prime_export(struct drm_device *drm_dev,
185 struct drm_gem_object *obj, int flags) 185 struct drm_gem_object *obj, int flags)
186{ 186{
187 struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); 187 struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
188 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
188 189
189 return dma_buf_export(obj, &exynos_dmabuf_ops, 190 exp_info.ops = &exynos_dmabuf_ops;
190 exynos_gem_obj->base.size, flags, NULL); 191 exp_info.size = exynos_gem_obj->base.size;
192 exp_info.flags = flags;
193 exp_info.priv = obj;
194
195 return dma_buf_export(&exp_info);
191} 196}
192 197
193struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, 198struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev,
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
index 82a1f4b57778..7998da27c500 100644
--- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
@@ -230,6 +230,13 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
230 struct drm_gem_object *gem_obj, int flags) 230 struct drm_gem_object *gem_obj, int flags)
231{ 231{
232 struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); 232 struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
233 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
234
235 exp_info.ops = &i915_dmabuf_ops;
236 exp_info.size = gem_obj->size;
237 exp_info.flags = flags;
238 exp_info.priv = gem_obj;
239
233 240
234 if (obj->ops->dmabuf_export) { 241 if (obj->ops->dmabuf_export) {
235 int ret = obj->ops->dmabuf_export(obj); 242 int ret = obj->ops->dmabuf_export(obj);
@@ -237,8 +244,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
237 return ERR_PTR(ret); 244 return ERR_PTR(ret);
238 } 245 }
239 246
240 return dma_buf_export(gem_obj, &i915_dmabuf_ops, gem_obj->size, flags, 247 return dma_buf_export(&exp_info);
241 NULL);
242} 248}
243 249
244static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) 250static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
index b46dabd9faf7..344fd789170d 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
@@ -171,7 +171,14 @@ static struct dma_buf_ops omap_dmabuf_ops = {
171struct dma_buf *omap_gem_prime_export(struct drm_device *dev, 171struct dma_buf *omap_gem_prime_export(struct drm_device *dev,
172 struct drm_gem_object *obj, int flags) 172 struct drm_gem_object *obj, int flags)
173{ 173{
174 return dma_buf_export(obj, &omap_dmabuf_ops, obj->size, flags, NULL); 174 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
175
176 exp_info.ops = &omap_dmabuf_ops;
177 exp_info.size = obj->size;
178 exp_info.flags = flags;
179 exp_info.priv = obj;
180
181 return dma_buf_export(&exp_info);
175} 182}
176 183
177struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev, 184struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev,
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index cfb481943b6b..1217272a51f2 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -627,8 +627,14 @@ struct dma_buf *tegra_gem_prime_export(struct drm_device *drm,
627 struct drm_gem_object *gem, 627 struct drm_gem_object *gem,
628 int flags) 628 int flags)
629{ 629{
630 return dma_buf_export(gem, &tegra_gem_prime_dmabuf_ops, gem->size, 630 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
631 flags, NULL); 631
632 exp_info.ops = &tegra_gem_prime_dmabuf_ops;
633 exp_info.size = gem->size;
634 exp_info.flags = flags;
635 exp_info.priv = gem;
636
637 return dma_buf_export(&exp_info);
632} 638}
633 639
634struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm, 640struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm,
diff --git a/drivers/gpu/drm/ttm/ttm_object.c b/drivers/gpu/drm/ttm/ttm_object.c
index 12c87110db3a..4f5fa8d65fe9 100644
--- a/drivers/gpu/drm/ttm/ttm_object.c
+++ b/drivers/gpu/drm/ttm/ttm_object.c
@@ -683,6 +683,12 @@ int ttm_prime_handle_to_fd(struct ttm_object_file *tfile,
683 683
684 dma_buf = prime->dma_buf; 684 dma_buf = prime->dma_buf;
685 if (!dma_buf || !get_dma_buf_unless_doomed(dma_buf)) { 685 if (!dma_buf || !get_dma_buf_unless_doomed(dma_buf)) {
686 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
687
688 exp_info.ops = &tdev->ops;
689 exp_info.size = prime->size;
690 exp_info.flags = flags;
691 exp_info.priv = prime;
686 692
687 /* 693 /*
688 * Need to create a new dma_buf, with memory accounting. 694 * Need to create a new dma_buf, with memory accounting.
@@ -694,8 +700,7 @@ int ttm_prime_handle_to_fd(struct ttm_object_file *tfile,
694 goto out_unref; 700 goto out_unref;
695 } 701 }
696 702
697 dma_buf = dma_buf_export(prime, &tdev->ops, 703 dma_buf = dma_buf_export(&exp_info);
698 prime->size, flags, NULL);
699 if (IS_ERR(dma_buf)) { 704 if (IS_ERR(dma_buf)) {
700 ret = PTR_ERR(dma_buf); 705 ret = PTR_ERR(dma_buf);
701 ttm_mem_global_free(tdev->mem_glob, 706 ttm_mem_global_free(tdev->mem_glob,
diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c
index ac8a66b4dfc2..e2243edd1ce3 100644
--- a/drivers/gpu/drm/udl/udl_dmabuf.c
+++ b/drivers/gpu/drm/udl/udl_dmabuf.c
@@ -202,7 +202,14 @@ static struct dma_buf_ops udl_dmabuf_ops = {
202struct dma_buf *udl_gem_prime_export(struct drm_device *dev, 202struct dma_buf *udl_gem_prime_export(struct drm_device *dev,
203 struct drm_gem_object *obj, int flags) 203 struct drm_gem_object *obj, int flags)
204{ 204{
205 return dma_buf_export(obj, &udl_dmabuf_ops, obj->size, flags, NULL); 205 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
206
207 exp_info.ops = &udl_dmabuf_ops;
208 exp_info.size = obj->size;
209 exp_info.flags = flags;
210 exp_info.priv = obj;
211
212 return dma_buf_export(&exp_info);
206} 213}
207 214
208static int udl_prime_create(struct drm_device *dev, 215static int udl_prime_create(struct drm_device *dev,
diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c b/drivers/media/v4l2-core/videobuf2-dma-contig.c
index 69e0483adfee..644dec73d220 100644
--- a/drivers/media/v4l2-core/videobuf2-dma-contig.c
+++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c
@@ -402,6 +402,12 @@ static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv, unsigned long flags)
402{ 402{
403 struct vb2_dc_buf *buf = buf_priv; 403 struct vb2_dc_buf *buf = buf_priv;
404 struct dma_buf *dbuf; 404 struct dma_buf *dbuf;
405 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
406
407 exp_info.ops = &vb2_dc_dmabuf_ops;
408 exp_info.size = buf->size;
409 exp_info.flags = flags;
410 exp_info.priv = buf;
405 411
406 if (!buf->sgt_base) 412 if (!buf->sgt_base)
407 buf->sgt_base = vb2_dc_get_base_sgt(buf); 413 buf->sgt_base = vb2_dc_get_base_sgt(buf);
@@ -409,7 +415,7 @@ static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv, unsigned long flags)
409 if (WARN_ON(!buf->sgt_base)) 415 if (WARN_ON(!buf->sgt_base))
410 return NULL; 416 return NULL;
411 417
412 dbuf = dma_buf_export(buf, &vb2_dc_dmabuf_ops, buf->size, flags, NULL); 418 dbuf = dma_buf_export(&exp_info);
413 if (IS_ERR(dbuf)) 419 if (IS_ERR(dbuf))
414 return NULL; 420 return NULL;
415 421
diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c
index b1838abb6d00..45c708e463b9 100644
--- a/drivers/media/v4l2-core/videobuf2-dma-sg.c
+++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c
@@ -583,11 +583,17 @@ static struct dma_buf *vb2_dma_sg_get_dmabuf(void *buf_priv, unsigned long flags
583{ 583{
584 struct vb2_dma_sg_buf *buf = buf_priv; 584 struct vb2_dma_sg_buf *buf = buf_priv;
585 struct dma_buf *dbuf; 585 struct dma_buf *dbuf;
586 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
587
588 exp_info.ops = &vb2_dma_sg_dmabuf_ops;
589 exp_info.size = buf->size;
590 exp_info.flags = flags;
591 exp_info.priv = buf;
586 592
587 if (WARN_ON(!buf->dma_sgt)) 593 if (WARN_ON(!buf->dma_sgt))
588 return NULL; 594 return NULL;
589 595
590 dbuf = dma_buf_export(buf, &vb2_dma_sg_dmabuf_ops, buf->size, flags, NULL); 596 dbuf = dma_buf_export(&exp_info);
591 if (IS_ERR(dbuf)) 597 if (IS_ERR(dbuf))
592 return NULL; 598 return NULL;
593 599
diff --git a/drivers/media/v4l2-core/videobuf2-vmalloc.c b/drivers/media/v4l2-core/videobuf2-vmalloc.c
index bcde88572429..657ab302a5cf 100644
--- a/drivers/media/v4l2-core/videobuf2-vmalloc.c
+++ b/drivers/media/v4l2-core/videobuf2-vmalloc.c
@@ -368,11 +368,17 @@ static struct dma_buf *vb2_vmalloc_get_dmabuf(void *buf_priv, unsigned long flag
368{ 368{
369 struct vb2_vmalloc_buf *buf = buf_priv; 369 struct vb2_vmalloc_buf *buf = buf_priv;
370 struct dma_buf *dbuf; 370 struct dma_buf *dbuf;
371 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
372
373 exp_info.ops = &vb2_vmalloc_dmabuf_ops;
374 exp_info.size = buf->size;
375 exp_info.flags = flags;
376 exp_info.priv = buf;
371 377
372 if (WARN_ON(!buf->vaddr)) 378 if (WARN_ON(!buf->vaddr))
373 return NULL; 379 return NULL;
374 380
375 dbuf = dma_buf_export(buf, &vb2_vmalloc_dmabuf_ops, buf->size, flags, NULL); 381 dbuf = dma_buf_export(&exp_info);
376 if (IS_ERR(dbuf)) 382 if (IS_ERR(dbuf))
377 return NULL; 383 return NULL;
378 384
diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index 0e3d8c7add24..b94d69feff46 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -1106,6 +1106,12 @@ struct dma_buf *ion_share_dma_buf(struct ion_client *client,
1106 struct ion_buffer *buffer; 1106 struct ion_buffer *buffer;
1107 struct dma_buf *dmabuf; 1107 struct dma_buf *dmabuf;
1108 bool valid_handle; 1108 bool valid_handle;
1109 DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
1110
1111 exp_info.ops = &dma_buf_ops;
1112 exp_info.size = buffer->size;
1113 exp_info.flags = O_RDWR;
1114 exp_info.priv = buffer;
1109 1115
1110 mutex_lock(&client->lock); 1116 mutex_lock(&client->lock);
1111 valid_handle = ion_handle_validate(client, handle); 1117 valid_handle = ion_handle_validate(client, handle);
@@ -1118,8 +1124,7 @@ struct dma_buf *ion_share_dma_buf(struct ion_client *client,
1118 ion_buffer_get(buffer); 1124 ion_buffer_get(buffer);
1119 mutex_unlock(&client->lock); 1125 mutex_unlock(&client->lock);
1120 1126
1121 dmabuf = dma_buf_export(buffer, &dma_buf_ops, buffer->size, O_RDWR, 1127 dmabuf = dma_buf_export(&exp_info);
1122 NULL);
1123 if (IS_ERR(dmabuf)) { 1128 if (IS_ERR(dmabuf)) {
1124 ion_buffer_put(buffer); 1129 ion_buffer_put(buffer);
1125 return dmabuf; 1130 return dmabuf;
diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
index 694e1fe1c4b4..2f0b431b73e0 100644
--- a/include/linux/dma-buf.h
+++ b/include/linux/dma-buf.h
@@ -163,6 +163,33 @@ struct dma_buf_attachment {
163}; 163};
164 164
165/** 165/**
166 * struct dma_buf_export_info - holds information needed to export a dma_buf
167 * @exp_name: name of the exporting module - useful for debugging.
168 * @ops: Attach allocator-defined dma buf ops to the new buffer
169 * @size: Size of the buffer
170 * @flags: mode flags for the file
171 * @resv: reservation-object, NULL to allocate default one
172 * @priv: Attach private data of allocator to this buffer
173 *
174 * This structure holds the information required to export the buffer. Used
175 * with dma_buf_export() only.
176 */
177struct dma_buf_export_info {
178 const char *exp_name;
179 const struct dma_buf_ops *ops;
180 size_t size;
181 int flags;
182 struct reservation_object *resv;
183 void *priv;
184};
185
186/**
187 * helper macro for exporters; zeros and fills in most common values
188 */
189#define DEFINE_DMA_BUF_EXPORT_INFO(a) \
190 struct dma_buf_export_info a = { .exp_name = KBUILD_MODNAME }
191
192/**
166 * get_dma_buf - convenience wrapper for get_file. 193 * get_dma_buf - convenience wrapper for get_file.
167 * @dmabuf: [in] pointer to dma_buf 194 * @dmabuf: [in] pointer to dma_buf
168 * 195 *
@@ -181,12 +208,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
181void dma_buf_detach(struct dma_buf *dmabuf, 208void dma_buf_detach(struct dma_buf *dmabuf,
182 struct dma_buf_attachment *dmabuf_attach); 209 struct dma_buf_attachment *dmabuf_attach);
183 210
184struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops, 211struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info);
185 size_t size, int flags, const char *,
186 struct reservation_object *);
187
188#define dma_buf_export(priv, ops, size, flags, resv) \
189 dma_buf_export_named(priv, ops, size, flags, KBUILD_MODNAME, resv)
190 212
191int dma_buf_fd(struct dma_buf *dmabuf, int flags); 213int dma_buf_fd(struct dma_buf *dmabuf, int flags);
192struct dma_buf *dma_buf_get(int fd); 214struct dma_buf *dma_buf_get(int fd);