scsi: qla2xxx: Use named initializers for q_dev_state
[linux-2.6-microblaze.git] / drivers / xen / gntdev-dmabuf.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 /*
4  * Xen dma-buf functionality for gntdev.
5  *
6  * DMA buffer implementation is based on drivers/gpu/drm/drm_prime.c.
7  *
8  * Copyright (c) 2018 Oleksandr Andrushchenko, EPAM Systems Inc.
9  */
10
11 #include <linux/kernel.h>
12 #include <linux/errno.h>
13 #include <linux/dma-buf.h>
14 #include <linux/slab.h>
15 #include <linux/types.h>
16 #include <linux/uaccess.h>
17 #include <linux/module.h>
18
19 #include <xen/xen.h>
20 #include <xen/grant_table.h>
21
22 #include "gntdev-common.h"
23 #include "gntdev-dmabuf.h"
24
25 MODULE_IMPORT_NS(DMA_BUF);
26
27 #ifndef GRANT_INVALID_REF
28 /*
29  * Note on usage of grant reference 0 as invalid grant reference:
30  * grant reference 0 is valid, but never exposed to a driver,
31  * because of the fact it is already in use/reserved by the PV console.
32  */
33 #define GRANT_INVALID_REF       0
34 #endif
35
36 struct gntdev_dmabuf {
37         struct gntdev_dmabuf_priv *priv;
38         struct dma_buf *dmabuf;
39         struct list_head next;
40         int fd;
41
42         union {
43                 struct {
44                         /* Exported buffers are reference counted. */
45                         struct kref refcount;
46
47                         struct gntdev_priv *priv;
48                         struct gntdev_grant_map *map;
49                 } exp;
50                 struct {
51                         /* Granted references of the imported buffer. */
52                         grant_ref_t *refs;
53                         /* Scatter-gather table of the imported buffer. */
54                         struct sg_table *sgt;
55                         /* dma-buf attachment of the imported buffer. */
56                         struct dma_buf_attachment *attach;
57                 } imp;
58         } u;
59
60         /* Number of pages this buffer has. */
61         int nr_pages;
62         /* Pages of this buffer. */
63         struct page **pages;
64 };
65
66 struct gntdev_dmabuf_wait_obj {
67         struct list_head next;
68         struct gntdev_dmabuf *gntdev_dmabuf;
69         struct completion completion;
70 };
71
72 struct gntdev_dmabuf_attachment {
73         struct sg_table *sgt;
74         enum dma_data_direction dir;
75 };
76
77 struct gntdev_dmabuf_priv {
78         /* List of exported DMA buffers. */
79         struct list_head exp_list;
80         /* List of wait objects. */
81         struct list_head exp_wait_list;
82         /* List of imported DMA buffers. */
83         struct list_head imp_list;
84         /* This is the lock which protects dma_buf_xxx lists. */
85         struct mutex lock;
86         /*
87          * We reference this file while exporting dma-bufs, so
88          * the grant device context is not destroyed while there are
89          * external users alive.
90          */
91         struct file *filp;
92 };
93
94 /* DMA buffer export support. */
95
96 /* Implementation of wait for exported DMA buffer to be released. */
97
98 static void dmabuf_exp_release(struct kref *kref);
99
100 static struct gntdev_dmabuf_wait_obj *
101 dmabuf_exp_wait_obj_new(struct gntdev_dmabuf_priv *priv,
102                         struct gntdev_dmabuf *gntdev_dmabuf)
103 {
104         struct gntdev_dmabuf_wait_obj *obj;
105
106         obj = kzalloc(sizeof(*obj), GFP_KERNEL);
107         if (!obj)
108                 return ERR_PTR(-ENOMEM);
109
110         init_completion(&obj->completion);
111         obj->gntdev_dmabuf = gntdev_dmabuf;
112
113         mutex_lock(&priv->lock);
114         list_add(&obj->next, &priv->exp_wait_list);
115         /* Put our reference and wait for gntdev_dmabuf's release to fire. */
116         kref_put(&gntdev_dmabuf->u.exp.refcount, dmabuf_exp_release);
117         mutex_unlock(&priv->lock);
118         return obj;
119 }
120
121 static void dmabuf_exp_wait_obj_free(struct gntdev_dmabuf_priv *priv,
122                                      struct gntdev_dmabuf_wait_obj *obj)
123 {
124         mutex_lock(&priv->lock);
125         list_del(&obj->next);
126         mutex_unlock(&priv->lock);
127         kfree(obj);
128 }
129
130 static int dmabuf_exp_wait_obj_wait(struct gntdev_dmabuf_wait_obj *obj,
131                                     u32 wait_to_ms)
132 {
133         if (wait_for_completion_timeout(&obj->completion,
134                         msecs_to_jiffies(wait_to_ms)) <= 0)
135                 return -ETIMEDOUT;
136
137         return 0;
138 }
139
140 static void dmabuf_exp_wait_obj_signal(struct gntdev_dmabuf_priv *priv,
141                                        struct gntdev_dmabuf *gntdev_dmabuf)
142 {
143         struct gntdev_dmabuf_wait_obj *obj;
144
145         list_for_each_entry(obj, &priv->exp_wait_list, next)
146                 if (obj->gntdev_dmabuf == gntdev_dmabuf) {
147                         pr_debug("Found gntdev_dmabuf in the wait list, wake\n");
148                         complete_all(&obj->completion);
149                         break;
150                 }
151 }
152
153 static struct gntdev_dmabuf *
154 dmabuf_exp_wait_obj_get_dmabuf(struct gntdev_dmabuf_priv *priv, int fd)
155 {
156         struct gntdev_dmabuf *gntdev_dmabuf, *ret = ERR_PTR(-ENOENT);
157
158         mutex_lock(&priv->lock);
159         list_for_each_entry(gntdev_dmabuf, &priv->exp_list, next)
160                 if (gntdev_dmabuf->fd == fd) {
161                         pr_debug("Found gntdev_dmabuf in the wait list\n");
162                         kref_get(&gntdev_dmabuf->u.exp.refcount);
163                         ret = gntdev_dmabuf;
164                         break;
165                 }
166         mutex_unlock(&priv->lock);
167         return ret;
168 }
169
170 static int dmabuf_exp_wait_released(struct gntdev_dmabuf_priv *priv, int fd,
171                                     int wait_to_ms)
172 {
173         struct gntdev_dmabuf *gntdev_dmabuf;
174         struct gntdev_dmabuf_wait_obj *obj;
175         int ret;
176
177         pr_debug("Will wait for dma-buf with fd %d\n", fd);
178         /*
179          * Try to find the DMA buffer: if not found means that
180          * either the buffer has already been released or file descriptor
181          * provided is wrong.
182          */
183         gntdev_dmabuf = dmabuf_exp_wait_obj_get_dmabuf(priv, fd);
184         if (IS_ERR(gntdev_dmabuf))
185                 return PTR_ERR(gntdev_dmabuf);
186
187         /*
188          * gntdev_dmabuf still exists and is reference count locked by us now,
189          * so prepare to wait: allocate wait object and add it to the wait list,
190          * so we can find it on release.
191          */
192         obj = dmabuf_exp_wait_obj_new(priv, gntdev_dmabuf);
193         if (IS_ERR(obj))
194                 return PTR_ERR(obj);
195
196         ret = dmabuf_exp_wait_obj_wait(obj, wait_to_ms);
197         dmabuf_exp_wait_obj_free(priv, obj);
198         return ret;
199 }
200
201 /* DMA buffer export support. */
202
203 static struct sg_table *
204 dmabuf_pages_to_sgt(struct page **pages, unsigned int nr_pages)
205 {
206         struct sg_table *sgt;
207         int ret;
208
209         sgt = kmalloc(sizeof(*sgt), GFP_KERNEL);
210         if (!sgt) {
211                 ret = -ENOMEM;
212                 goto out;
213         }
214
215         ret = sg_alloc_table_from_pages(sgt, pages, nr_pages, 0,
216                                         nr_pages << PAGE_SHIFT,
217                                         GFP_KERNEL);
218         if (ret)
219                 goto out;
220
221         return sgt;
222
223 out:
224         kfree(sgt);
225         return ERR_PTR(ret);
226 }
227
228 static int dmabuf_exp_ops_attach(struct dma_buf *dma_buf,
229                                  struct dma_buf_attachment *attach)
230 {
231         struct gntdev_dmabuf_attachment *gntdev_dmabuf_attach;
232
233         gntdev_dmabuf_attach = kzalloc(sizeof(*gntdev_dmabuf_attach),
234                                        GFP_KERNEL);
235         if (!gntdev_dmabuf_attach)
236                 return -ENOMEM;
237
238         gntdev_dmabuf_attach->dir = DMA_NONE;
239         attach->priv = gntdev_dmabuf_attach;
240         return 0;
241 }
242
243 static void dmabuf_exp_ops_detach(struct dma_buf *dma_buf,
244                                   struct dma_buf_attachment *attach)
245 {
246         struct gntdev_dmabuf_attachment *gntdev_dmabuf_attach = attach->priv;
247
248         if (gntdev_dmabuf_attach) {
249                 struct sg_table *sgt = gntdev_dmabuf_attach->sgt;
250
251                 if (sgt) {
252                         if (gntdev_dmabuf_attach->dir != DMA_NONE)
253                                 dma_unmap_sgtable(attach->dev, sgt,
254                                                   gntdev_dmabuf_attach->dir,
255                                                   DMA_ATTR_SKIP_CPU_SYNC);
256                         sg_free_table(sgt);
257                 }
258
259                 kfree(sgt);
260                 kfree(gntdev_dmabuf_attach);
261                 attach->priv = NULL;
262         }
263 }
264
265 static struct sg_table *
266 dmabuf_exp_ops_map_dma_buf(struct dma_buf_attachment *attach,
267                            enum dma_data_direction dir)
268 {
269         struct gntdev_dmabuf_attachment *gntdev_dmabuf_attach = attach->priv;
270         struct gntdev_dmabuf *gntdev_dmabuf = attach->dmabuf->priv;
271         struct sg_table *sgt;
272
273         pr_debug("Mapping %d pages for dev %p\n", gntdev_dmabuf->nr_pages,
274                  attach->dev);
275
276         if (dir == DMA_NONE || !gntdev_dmabuf_attach)
277                 return ERR_PTR(-EINVAL);
278
279         /* Return the cached mapping when possible. */
280         if (gntdev_dmabuf_attach->dir == dir)
281                 return gntdev_dmabuf_attach->sgt;
282
283         /*
284          * Two mappings with different directions for the same attachment are
285          * not allowed.
286          */
287         if (gntdev_dmabuf_attach->dir != DMA_NONE)
288                 return ERR_PTR(-EBUSY);
289
290         sgt = dmabuf_pages_to_sgt(gntdev_dmabuf->pages,
291                                   gntdev_dmabuf->nr_pages);
292         if (!IS_ERR(sgt)) {
293                 if (dma_map_sgtable(attach->dev, sgt, dir,
294                                     DMA_ATTR_SKIP_CPU_SYNC)) {
295                         sg_free_table(sgt);
296                         kfree(sgt);
297                         sgt = ERR_PTR(-ENOMEM);
298                 } else {
299                         gntdev_dmabuf_attach->sgt = sgt;
300                         gntdev_dmabuf_attach->dir = dir;
301                 }
302         }
303         if (IS_ERR(sgt))
304                 pr_debug("Failed to map sg table for dev %p\n", attach->dev);
305         return sgt;
306 }
307
308 static void dmabuf_exp_ops_unmap_dma_buf(struct dma_buf_attachment *attach,
309                                          struct sg_table *sgt,
310                                          enum dma_data_direction dir)
311 {
312         /* Not implemented. The unmap is done at dmabuf_exp_ops_detach(). */
313 }
314
315 static void dmabuf_exp_release(struct kref *kref)
316 {
317         struct gntdev_dmabuf *gntdev_dmabuf =
318                 container_of(kref, struct gntdev_dmabuf, u.exp.refcount);
319
320         dmabuf_exp_wait_obj_signal(gntdev_dmabuf->priv, gntdev_dmabuf);
321         list_del(&gntdev_dmabuf->next);
322         fput(gntdev_dmabuf->priv->filp);
323         kfree(gntdev_dmabuf);
324 }
325
326 static void dmabuf_exp_remove_map(struct gntdev_priv *priv,
327                                   struct gntdev_grant_map *map)
328 {
329         mutex_lock(&priv->lock);
330         list_del(&map->next);
331         gntdev_put_map(NULL /* already removed */, map);
332         mutex_unlock(&priv->lock);
333 }
334
335 static void dmabuf_exp_ops_release(struct dma_buf *dma_buf)
336 {
337         struct gntdev_dmabuf *gntdev_dmabuf = dma_buf->priv;
338         struct gntdev_dmabuf_priv *priv = gntdev_dmabuf->priv;
339
340         dmabuf_exp_remove_map(gntdev_dmabuf->u.exp.priv,
341                               gntdev_dmabuf->u.exp.map);
342         mutex_lock(&priv->lock);
343         kref_put(&gntdev_dmabuf->u.exp.refcount, dmabuf_exp_release);
344         mutex_unlock(&priv->lock);
345 }
346
347 static const struct dma_buf_ops dmabuf_exp_ops =  {
348         .attach = dmabuf_exp_ops_attach,
349         .detach = dmabuf_exp_ops_detach,
350         .map_dma_buf = dmabuf_exp_ops_map_dma_buf,
351         .unmap_dma_buf = dmabuf_exp_ops_unmap_dma_buf,
352         .release = dmabuf_exp_ops_release,
353 };
354
355 struct gntdev_dmabuf_export_args {
356         struct gntdev_priv *priv;
357         struct gntdev_grant_map *map;
358         struct gntdev_dmabuf_priv *dmabuf_priv;
359         struct device *dev;
360         int count;
361         struct page **pages;
362         u32 fd;
363 };
364
365 static int dmabuf_exp_from_pages(struct gntdev_dmabuf_export_args *args)
366 {
367         DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
368         struct gntdev_dmabuf *gntdev_dmabuf;
369         int ret;
370
371         gntdev_dmabuf = kzalloc(sizeof(*gntdev_dmabuf), GFP_KERNEL);
372         if (!gntdev_dmabuf)
373                 return -ENOMEM;
374
375         kref_init(&gntdev_dmabuf->u.exp.refcount);
376
377         gntdev_dmabuf->priv = args->dmabuf_priv;
378         gntdev_dmabuf->nr_pages = args->count;
379         gntdev_dmabuf->pages = args->pages;
380         gntdev_dmabuf->u.exp.priv = args->priv;
381         gntdev_dmabuf->u.exp.map = args->map;
382
383         exp_info.exp_name = KBUILD_MODNAME;
384         if (args->dev->driver && args->dev->driver->owner)
385                 exp_info.owner = args->dev->driver->owner;
386         else
387                 exp_info.owner = THIS_MODULE;
388         exp_info.ops = &dmabuf_exp_ops;
389         exp_info.size = args->count << PAGE_SHIFT;
390         exp_info.flags = O_RDWR;
391         exp_info.priv = gntdev_dmabuf;
392
393         gntdev_dmabuf->dmabuf = dma_buf_export(&exp_info);
394         if (IS_ERR(gntdev_dmabuf->dmabuf)) {
395                 ret = PTR_ERR(gntdev_dmabuf->dmabuf);
396                 gntdev_dmabuf->dmabuf = NULL;
397                 goto fail;
398         }
399
400         ret = dma_buf_fd(gntdev_dmabuf->dmabuf, O_CLOEXEC);
401         if (ret < 0)
402                 goto fail;
403
404         gntdev_dmabuf->fd = ret;
405         args->fd = ret;
406
407         pr_debug("Exporting DMA buffer with fd %d\n", ret);
408
409         mutex_lock(&args->dmabuf_priv->lock);
410         list_add(&gntdev_dmabuf->next, &args->dmabuf_priv->exp_list);
411         mutex_unlock(&args->dmabuf_priv->lock);
412         get_file(gntdev_dmabuf->priv->filp);
413         return 0;
414
415 fail:
416         if (gntdev_dmabuf->dmabuf)
417                 dma_buf_put(gntdev_dmabuf->dmabuf);
418         kfree(gntdev_dmabuf);
419         return ret;
420 }
421
422 static struct gntdev_grant_map *
423 dmabuf_exp_alloc_backing_storage(struct gntdev_priv *priv, int dmabuf_flags,
424                                  int count)
425 {
426         struct gntdev_grant_map *map;
427
428         if (unlikely(gntdev_test_page_count(count)))
429                 return ERR_PTR(-EINVAL);
430
431         if ((dmabuf_flags & GNTDEV_DMA_FLAG_WC) &&
432             (dmabuf_flags & GNTDEV_DMA_FLAG_COHERENT)) {
433                 pr_debug("Wrong dma-buf flags: 0x%x\n", dmabuf_flags);
434                 return ERR_PTR(-EINVAL);
435         }
436
437         map = gntdev_alloc_map(priv, count, dmabuf_flags);
438         if (!map)
439                 return ERR_PTR(-ENOMEM);
440
441         return map;
442 }
443
444 static int dmabuf_exp_from_refs(struct gntdev_priv *priv, int flags,
445                                 int count, u32 domid, u32 *refs, u32 *fd)
446 {
447         struct gntdev_grant_map *map;
448         struct gntdev_dmabuf_export_args args;
449         int i, ret;
450
451         map = dmabuf_exp_alloc_backing_storage(priv, flags, count);
452         if (IS_ERR(map))
453                 return PTR_ERR(map);
454
455         for (i = 0; i < count; i++) {
456                 map->grants[i].domid = domid;
457                 map->grants[i].ref = refs[i];
458         }
459
460         mutex_lock(&priv->lock);
461         gntdev_add_map(priv, map);
462         mutex_unlock(&priv->lock);
463
464         map->flags |= GNTMAP_host_map;
465 #if defined(CONFIG_X86)
466         map->flags |= GNTMAP_device_map;
467 #endif
468
469         ret = gntdev_map_grant_pages(map);
470         if (ret < 0)
471                 goto out;
472
473         args.priv = priv;
474         args.map = map;
475         args.dev = priv->dma_dev;
476         args.dmabuf_priv = priv->dmabuf_priv;
477         args.count = map->count;
478         args.pages = map->pages;
479         args.fd = -1; /* Shut up unnecessary gcc warning for i386 */
480
481         ret = dmabuf_exp_from_pages(&args);
482         if (ret < 0)
483                 goto out;
484
485         *fd = args.fd;
486         return 0;
487
488 out:
489         dmabuf_exp_remove_map(priv, map);
490         return ret;
491 }
492
493 /* DMA buffer import support. */
494
495 static int
496 dmabuf_imp_grant_foreign_access(struct page **pages, u32 *refs,
497                                 int count, int domid)
498 {
499         grant_ref_t priv_gref_head;
500         int i, ret;
501
502         ret = gnttab_alloc_grant_references(count, &priv_gref_head);
503         if (ret < 0) {
504                 pr_debug("Cannot allocate grant references, ret %d\n", ret);
505                 return ret;
506         }
507
508         for (i = 0; i < count; i++) {
509                 int cur_ref;
510
511                 cur_ref = gnttab_claim_grant_reference(&priv_gref_head);
512                 if (cur_ref < 0) {
513                         ret = cur_ref;
514                         pr_debug("Cannot claim grant reference, ret %d\n", ret);
515                         goto out;
516                 }
517
518                 gnttab_grant_foreign_access_ref(cur_ref, domid,
519                                                 xen_page_to_gfn(pages[i]), 0);
520                 refs[i] = cur_ref;
521         }
522
523         return 0;
524
525 out:
526         gnttab_free_grant_references(priv_gref_head);
527         return ret;
528 }
529
530 static void dmabuf_imp_end_foreign_access(u32 *refs, int count)
531 {
532         int i;
533
534         for (i = 0; i < count; i++)
535                 if (refs[i] != GRANT_INVALID_REF)
536                         gnttab_end_foreign_access(refs[i], 0, 0UL);
537 }
538
539 static void dmabuf_imp_free_storage(struct gntdev_dmabuf *gntdev_dmabuf)
540 {
541         kfree(gntdev_dmabuf->pages);
542         kfree(gntdev_dmabuf->u.imp.refs);
543         kfree(gntdev_dmabuf);
544 }
545
546 static struct gntdev_dmabuf *dmabuf_imp_alloc_storage(int count)
547 {
548         struct gntdev_dmabuf *gntdev_dmabuf;
549         int i;
550
551         gntdev_dmabuf = kzalloc(sizeof(*gntdev_dmabuf), GFP_KERNEL);
552         if (!gntdev_dmabuf)
553                 goto fail_no_free;
554
555         gntdev_dmabuf->u.imp.refs = kcalloc(count,
556                                             sizeof(gntdev_dmabuf->u.imp.refs[0]),
557                                             GFP_KERNEL);
558         if (!gntdev_dmabuf->u.imp.refs)
559                 goto fail;
560
561         gntdev_dmabuf->pages = kcalloc(count,
562                                        sizeof(gntdev_dmabuf->pages[0]),
563                                        GFP_KERNEL);
564         if (!gntdev_dmabuf->pages)
565                 goto fail;
566
567         gntdev_dmabuf->nr_pages = count;
568
569         for (i = 0; i < count; i++)
570                 gntdev_dmabuf->u.imp.refs[i] = GRANT_INVALID_REF;
571
572         return gntdev_dmabuf;
573
574 fail:
575         dmabuf_imp_free_storage(gntdev_dmabuf);
576 fail_no_free:
577         return ERR_PTR(-ENOMEM);
578 }
579
580 static struct gntdev_dmabuf *
581 dmabuf_imp_to_refs(struct gntdev_dmabuf_priv *priv, struct device *dev,
582                    int fd, int count, int domid)
583 {
584         struct gntdev_dmabuf *gntdev_dmabuf, *ret;
585         struct dma_buf *dma_buf;
586         struct dma_buf_attachment *attach;
587         struct sg_table *sgt;
588         struct sg_page_iter sg_iter;
589         int i;
590
591         dma_buf = dma_buf_get(fd);
592         if (IS_ERR(dma_buf))
593                 return ERR_CAST(dma_buf);
594
595         gntdev_dmabuf = dmabuf_imp_alloc_storage(count);
596         if (IS_ERR(gntdev_dmabuf)) {
597                 ret = gntdev_dmabuf;
598                 goto fail_put;
599         }
600
601         gntdev_dmabuf->priv = priv;
602         gntdev_dmabuf->fd = fd;
603
604         attach = dma_buf_attach(dma_buf, dev);
605         if (IS_ERR(attach)) {
606                 ret = ERR_CAST(attach);
607                 goto fail_free_obj;
608         }
609
610         gntdev_dmabuf->u.imp.attach = attach;
611
612         sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
613         if (IS_ERR(sgt)) {
614                 ret = ERR_CAST(sgt);
615                 goto fail_detach;
616         }
617
618         /* Check that we have zero offset. */
619         if (sgt->sgl->offset) {
620                 ret = ERR_PTR(-EINVAL);
621                 pr_debug("DMA buffer has %d bytes offset, user-space expects 0\n",
622                          sgt->sgl->offset);
623                 goto fail_unmap;
624         }
625
626         /* Check number of pages that imported buffer has. */
627         if (attach->dmabuf->size != gntdev_dmabuf->nr_pages << PAGE_SHIFT) {
628                 ret = ERR_PTR(-EINVAL);
629                 pr_debug("DMA buffer has %zu pages, user-space expects %d\n",
630                          attach->dmabuf->size, gntdev_dmabuf->nr_pages);
631                 goto fail_unmap;
632         }
633
634         gntdev_dmabuf->u.imp.sgt = sgt;
635
636         /* Now convert sgt to array of pages and check for page validity. */
637         i = 0;
638         for_each_sgtable_page(sgt, &sg_iter, 0) {
639                 struct page *page = sg_page_iter_page(&sg_iter);
640                 /*
641                  * Check if page is valid: this can happen if we are given
642                  * a page from VRAM or other resources which are not backed
643                  * by a struct page.
644                  */
645                 if (!pfn_valid(page_to_pfn(page))) {
646                         ret = ERR_PTR(-EINVAL);
647                         goto fail_unmap;
648                 }
649
650                 gntdev_dmabuf->pages[i++] = page;
651         }
652
653         ret = ERR_PTR(dmabuf_imp_grant_foreign_access(gntdev_dmabuf->pages,
654                                                       gntdev_dmabuf->u.imp.refs,
655                                                       count, domid));
656         if (IS_ERR(ret))
657                 goto fail_end_access;
658
659         pr_debug("Imported DMA buffer with fd %d\n", fd);
660
661         mutex_lock(&priv->lock);
662         list_add(&gntdev_dmabuf->next, &priv->imp_list);
663         mutex_unlock(&priv->lock);
664
665         return gntdev_dmabuf;
666
667 fail_end_access:
668         dmabuf_imp_end_foreign_access(gntdev_dmabuf->u.imp.refs, count);
669 fail_unmap:
670         dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
671 fail_detach:
672         dma_buf_detach(dma_buf, attach);
673 fail_free_obj:
674         dmabuf_imp_free_storage(gntdev_dmabuf);
675 fail_put:
676         dma_buf_put(dma_buf);
677         return ret;
678 }
679
680 /*
681  * Find the hyper dma-buf by its file descriptor and remove
682  * it from the buffer's list.
683  */
684 static struct gntdev_dmabuf *
685 dmabuf_imp_find_unlink(struct gntdev_dmabuf_priv *priv, int fd)
686 {
687         struct gntdev_dmabuf *q, *gntdev_dmabuf, *ret = ERR_PTR(-ENOENT);
688
689         mutex_lock(&priv->lock);
690         list_for_each_entry_safe(gntdev_dmabuf, q, &priv->imp_list, next) {
691                 if (gntdev_dmabuf->fd == fd) {
692                         pr_debug("Found gntdev_dmabuf in the import list\n");
693                         ret = gntdev_dmabuf;
694                         list_del(&gntdev_dmabuf->next);
695                         break;
696                 }
697         }
698         mutex_unlock(&priv->lock);
699         return ret;
700 }
701
702 static int dmabuf_imp_release(struct gntdev_dmabuf_priv *priv, u32 fd)
703 {
704         struct gntdev_dmabuf *gntdev_dmabuf;
705         struct dma_buf_attachment *attach;
706         struct dma_buf *dma_buf;
707
708         gntdev_dmabuf = dmabuf_imp_find_unlink(priv, fd);
709         if (IS_ERR(gntdev_dmabuf))
710                 return PTR_ERR(gntdev_dmabuf);
711
712         pr_debug("Releasing DMA buffer with fd %d\n", fd);
713
714         dmabuf_imp_end_foreign_access(gntdev_dmabuf->u.imp.refs,
715                                       gntdev_dmabuf->nr_pages);
716
717         attach = gntdev_dmabuf->u.imp.attach;
718
719         if (gntdev_dmabuf->u.imp.sgt)
720                 dma_buf_unmap_attachment(attach, gntdev_dmabuf->u.imp.sgt,
721                                          DMA_BIDIRECTIONAL);
722         dma_buf = attach->dmabuf;
723         dma_buf_detach(attach->dmabuf, attach);
724         dma_buf_put(dma_buf);
725
726         dmabuf_imp_free_storage(gntdev_dmabuf);
727         return 0;
728 }
729
730 static void dmabuf_imp_release_all(struct gntdev_dmabuf_priv *priv)
731 {
732         struct gntdev_dmabuf *q, *gntdev_dmabuf;
733
734         list_for_each_entry_safe(gntdev_dmabuf, q, &priv->imp_list, next)
735                 dmabuf_imp_release(priv, gntdev_dmabuf->fd);
736 }
737
738 /* DMA buffer IOCTL support. */
739
740 long gntdev_ioctl_dmabuf_exp_from_refs(struct gntdev_priv *priv, int use_ptemod,
741                                        struct ioctl_gntdev_dmabuf_exp_from_refs __user *u)
742 {
743         struct ioctl_gntdev_dmabuf_exp_from_refs op;
744         u32 *refs;
745         long ret;
746
747         if (use_ptemod) {
748                 pr_debug("Cannot provide dma-buf: use_ptemode %d\n",
749                          use_ptemod);
750                 return -EINVAL;
751         }
752
753         if (copy_from_user(&op, u, sizeof(op)) != 0)
754                 return -EFAULT;
755
756         if (unlikely(gntdev_test_page_count(op.count)))
757                 return -EINVAL;
758
759         refs = kcalloc(op.count, sizeof(*refs), GFP_KERNEL);
760         if (!refs)
761                 return -ENOMEM;
762
763         if (copy_from_user(refs, u->refs, sizeof(*refs) * op.count) != 0) {
764                 ret = -EFAULT;
765                 goto out;
766         }
767
768         ret = dmabuf_exp_from_refs(priv, op.flags, op.count,
769                                    op.domid, refs, &op.fd);
770         if (ret)
771                 goto out;
772
773         if (copy_to_user(u, &op, sizeof(op)) != 0)
774                 ret = -EFAULT;
775
776 out:
777         kfree(refs);
778         return ret;
779 }
780
781 long gntdev_ioctl_dmabuf_exp_wait_released(struct gntdev_priv *priv,
782                                            struct ioctl_gntdev_dmabuf_exp_wait_released __user *u)
783 {
784         struct ioctl_gntdev_dmabuf_exp_wait_released op;
785
786         if (copy_from_user(&op, u, sizeof(op)) != 0)
787                 return -EFAULT;
788
789         return dmabuf_exp_wait_released(priv->dmabuf_priv, op.fd,
790                                         op.wait_to_ms);
791 }
792
793 long gntdev_ioctl_dmabuf_imp_to_refs(struct gntdev_priv *priv,
794                                      struct ioctl_gntdev_dmabuf_imp_to_refs __user *u)
795 {
796         struct ioctl_gntdev_dmabuf_imp_to_refs op;
797         struct gntdev_dmabuf *gntdev_dmabuf;
798         long ret;
799
800         if (copy_from_user(&op, u, sizeof(op)) != 0)
801                 return -EFAULT;
802
803         if (unlikely(gntdev_test_page_count(op.count)))
804                 return -EINVAL;
805
806         gntdev_dmabuf = dmabuf_imp_to_refs(priv->dmabuf_priv,
807                                            priv->dma_dev, op.fd,
808                                            op.count, op.domid);
809         if (IS_ERR(gntdev_dmabuf))
810                 return PTR_ERR(gntdev_dmabuf);
811
812         if (copy_to_user(u->refs, gntdev_dmabuf->u.imp.refs,
813                          sizeof(*u->refs) * op.count) != 0) {
814                 ret = -EFAULT;
815                 goto out_release;
816         }
817         return 0;
818
819 out_release:
820         dmabuf_imp_release(priv->dmabuf_priv, op.fd);
821         return ret;
822 }
823
824 long gntdev_ioctl_dmabuf_imp_release(struct gntdev_priv *priv,
825                                      struct ioctl_gntdev_dmabuf_imp_release __user *u)
826 {
827         struct ioctl_gntdev_dmabuf_imp_release op;
828
829         if (copy_from_user(&op, u, sizeof(op)) != 0)
830                 return -EFAULT;
831
832         return dmabuf_imp_release(priv->dmabuf_priv, op.fd);
833 }
834
835 struct gntdev_dmabuf_priv *gntdev_dmabuf_init(struct file *filp)
836 {
837         struct gntdev_dmabuf_priv *priv;
838
839         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
840         if (!priv)
841                 return ERR_PTR(-ENOMEM);
842
843         mutex_init(&priv->lock);
844         INIT_LIST_HEAD(&priv->exp_list);
845         INIT_LIST_HEAD(&priv->exp_wait_list);
846         INIT_LIST_HEAD(&priv->imp_list);
847
848         priv->filp = filp;
849
850         return priv;
851 }
852
853 void gntdev_dmabuf_fini(struct gntdev_dmabuf_priv *priv)
854 {
855         dmabuf_imp_release_all(priv);
856         kfree(priv);
857 }