LCOV - code coverage report
Current view: top level - drivers/dma-buf - dma-buf.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 12 379 3.2 %
Date: 2022-12-09 01:23:36 Functions: 2 33 6.1 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  * Framework for buffer objects that can be shared across devices/subsystems.
       4             :  *
       5             :  * Copyright(C) 2011 Linaro Limited. All rights reserved.
       6             :  * Author: Sumit Semwal <sumit.semwal@ti.com>
       7             :  *
       8             :  * Many thanks to linaro-mm-sig list, and specially
       9             :  * Arnd Bergmann <arnd@arndb.de>, Rob Clark <rob@ti.com> and
      10             :  * Daniel Vetter <daniel@ffwll.ch> for their support in creation and
      11             :  * refining of this idea.
      12             :  */
      13             : 
      14             : #include <linux/fs.h>
      15             : #include <linux/slab.h>
      16             : #include <linux/dma-buf.h>
      17             : #include <linux/dma-fence.h>
      18             : #include <linux/anon_inodes.h>
      19             : #include <linux/export.h>
      20             : #include <linux/debugfs.h>
      21             : #include <linux/module.h>
      22             : #include <linux/seq_file.h>
      23             : #include <linux/poll.h>
      24             : #include <linux/dma-resv.h>
      25             : #include <linux/mm.h>
      26             : #include <linux/mount.h>
      27             : #include <linux/pseudo_fs.h>
      28             : 
      29             : #include <uapi/linux/dma-buf.h>
      30             : #include <uapi/linux/magic.h>
      31             : 
      32             : #include "dma-buf-sysfs-stats.h"
      33             : 
      34             : static inline int is_dma_buf_file(struct file *);
      35             : 
      36             : struct dma_buf_list {
      37             :         struct list_head head;
      38             :         struct mutex lock;
      39             : };
      40             : 
      41             : static struct dma_buf_list db_list;
      42             : 
      43           0 : static char *dmabuffs_dname(struct dentry *dentry, char *buffer, int buflen)
      44             : {
      45             :         struct dma_buf *dmabuf;
      46             :         char name[DMA_BUF_NAME_LEN];
      47           0 :         size_t ret = 0;
      48             : 
      49           0 :         dmabuf = dentry->d_fsdata;
      50           0 :         spin_lock(&dmabuf->name_lock);
      51           0 :         if (dmabuf->name)
      52           0 :                 ret = strlcpy(name, dmabuf->name, DMA_BUF_NAME_LEN);
      53           0 :         spin_unlock(&dmabuf->name_lock);
      54             : 
      55           0 :         return dynamic_dname(dentry, buffer, buflen, "/%s:%s",
      56             :                              dentry->d_name.name, ret > 0 ? name : "");
      57             : }
      58             : 
      59           0 : static void dma_buf_release(struct dentry *dentry)
      60             : {
      61             :         struct dma_buf *dmabuf;
      62             : 
      63           0 :         dmabuf = dentry->d_fsdata;
      64           0 :         if (unlikely(!dmabuf))
      65             :                 return;
      66             : 
      67           0 :         BUG_ON(dmabuf->vmapping_counter);
      68             : 
      69             :         /*
      70             :          * If you hit this BUG() it could mean:
      71             :          * * There's a file reference imbalance in dma_buf_poll / dma_buf_poll_cb or somewhere else
      72             :          * * dmabuf->cb_in/out.active are non-0 despite no pending fence callback
      73             :          */
      74           0 :         BUG_ON(dmabuf->cb_in.active || dmabuf->cb_out.active);
      75             : 
      76           0 :         dma_buf_stats_teardown(dmabuf);
      77           0 :         dmabuf->ops->release(dmabuf);
      78             : 
      79           0 :         if (dmabuf->resv == (struct dma_resv *)&dmabuf[1])
      80           0 :                 dma_resv_fini(dmabuf->resv);
      81             : 
      82           0 :         WARN_ON(!list_empty(&dmabuf->attachments));
      83           0 :         module_put(dmabuf->owner);
      84           0 :         kfree(dmabuf->name);
      85           0 :         kfree(dmabuf);
      86             : }
      87             : 
      88           0 : static int dma_buf_file_release(struct inode *inode, struct file *file)
      89             : {
      90             :         struct dma_buf *dmabuf;
      91             : 
      92           0 :         if (!is_dma_buf_file(file))
      93             :                 return -EINVAL;
      94             : 
      95           0 :         dmabuf = file->private_data;
      96             : 
      97           0 :         mutex_lock(&db_list.lock);
      98           0 :         list_del(&dmabuf->list_node);
      99           0 :         mutex_unlock(&db_list.lock);
     100             : 
     101           0 :         return 0;
     102             : }
     103             : 
     104             : static const struct dentry_operations dma_buf_dentry_ops = {
     105             :         .d_dname = dmabuffs_dname,
     106             :         .d_release = dma_buf_release,
     107             : };
     108             : 
     109             : static struct vfsmount *dma_buf_mnt;
     110             : 
     111           1 : static int dma_buf_fs_init_context(struct fs_context *fc)
     112             : {
     113             :         struct pseudo_fs_context *ctx;
     114             : 
     115           1 :         ctx = init_pseudo(fc, DMA_BUF_MAGIC);
     116           1 :         if (!ctx)
     117             :                 return -ENOMEM;
     118           1 :         ctx->dops = &dma_buf_dentry_ops;
     119           1 :         return 0;
     120             : }
     121             : 
     122             : static struct file_system_type dma_buf_fs_type = {
     123             :         .name = "dmabuf",
     124             :         .init_fs_context = dma_buf_fs_init_context,
     125             :         .kill_sb = kill_anon_super,
     126             : };
     127             : 
     128           0 : static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma)
     129             : {
     130             :         struct dma_buf *dmabuf;
     131             : 
     132           0 :         if (!is_dma_buf_file(file))
     133             :                 return -EINVAL;
     134             : 
     135           0 :         dmabuf = file->private_data;
     136             : 
     137             :         /* check if buffer supports mmap */
     138           0 :         if (!dmabuf->ops->mmap)
     139             :                 return -EINVAL;
     140             : 
     141             :         /* check for overflowing the buffer's size */
     142           0 :         if (vma->vm_pgoff + vma_pages(vma) >
     143           0 :             dmabuf->size >> PAGE_SHIFT)
     144             :                 return -EINVAL;
     145             : 
     146           0 :         return dmabuf->ops->mmap(dmabuf, vma);
     147             : }
     148             : 
     149           0 : static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence)
     150             : {
     151             :         struct dma_buf *dmabuf;
     152             :         loff_t base;
     153             : 
     154           0 :         if (!is_dma_buf_file(file))
     155             :                 return -EBADF;
     156             : 
     157           0 :         dmabuf = file->private_data;
     158             : 
     159             :         /* only support discovering the end of the buffer,
     160             :            but also allow SEEK_SET to maintain the idiomatic
     161             :            SEEK_END(0), SEEK_CUR(0) pattern */
     162           0 :         if (whence == SEEK_END)
     163           0 :                 base = dmabuf->size;
     164           0 :         else if (whence == SEEK_SET)
     165             :                 base = 0;
     166             :         else
     167             :                 return -EINVAL;
     168             : 
     169           0 :         if (offset != 0)
     170             :                 return -EINVAL;
     171             : 
     172           0 :         return base + offset;
     173             : }
     174             : 
     175             : /**
     176             :  * DOC: implicit fence polling
     177             :  *
     178             :  * To support cross-device and cross-driver synchronization of buffer access
     179             :  * implicit fences (represented internally in the kernel with &struct dma_fence)
     180             :  * can be attached to a &dma_buf. The glue for that and a few related things are
     181             :  * provided in the &dma_resv structure.
     182             :  *
     183             :  * Userspace can query the state of these implicitly tracked fences using poll()
     184             :  * and related system calls:
     185             :  *
     186             :  * - Checking for EPOLLIN, i.e. read access, can be use to query the state of the
     187             :  *   most recent write or exclusive fence.
     188             :  *
     189             :  * - Checking for EPOLLOUT, i.e. write access, can be used to query the state of
     190             :  *   all attached fences, shared and exclusive ones.
     191             :  *
     192             :  * Note that this only signals the completion of the respective fences, i.e. the
     193             :  * DMA transfers are complete. Cache flushing and any other necessary
     194             :  * preparations before CPU access can begin still need to happen.
     195             :  */
     196             : 
     197           0 : static void dma_buf_poll_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
     198             : {
     199           0 :         struct dma_buf_poll_cb_t *dcb = (struct dma_buf_poll_cb_t *)cb;
     200           0 :         struct dma_buf *dmabuf = container_of(dcb->poll, struct dma_buf, poll);
     201             :         unsigned long flags;
     202             : 
     203           0 :         spin_lock_irqsave(&dcb->poll->lock, flags);
     204           0 :         wake_up_locked_poll(dcb->poll, dcb->active);
     205           0 :         dcb->active = 0;
     206           0 :         spin_unlock_irqrestore(&dcb->poll->lock, flags);
     207           0 :         dma_fence_put(fence);
     208             :         /* Paired with get_file in dma_buf_poll */
     209           0 :         fput(dmabuf->file);
     210           0 : }
     211             : 
     212           0 : static bool dma_buf_poll_add_cb(struct dma_resv *resv, bool write,
     213             :                                 struct dma_buf_poll_cb_t *dcb)
     214             : {
     215             :         struct dma_resv_iter cursor;
     216             :         struct dma_fence *fence;
     217             :         int r;
     218             : 
     219           0 :         dma_resv_for_each_fence(&cursor, resv, dma_resv_usage_rw(write),
     220             :                                 fence) {
     221           0 :                 dma_fence_get(fence);
     222           0 :                 r = dma_fence_add_callback(fence, &dcb->cb, dma_buf_poll_cb);
     223           0 :                 if (!r)
     224             :                         return true;
     225           0 :                 dma_fence_put(fence);
     226             :         }
     227             : 
     228             :         return false;
     229             : }
     230             : 
     231           0 : static __poll_t dma_buf_poll(struct file *file, poll_table *poll)
     232             : {
     233             :         struct dma_buf *dmabuf;
     234             :         struct dma_resv *resv;
     235             :         __poll_t events;
     236             : 
     237           0 :         dmabuf = file->private_data;
     238           0 :         if (!dmabuf || !dmabuf->resv)
     239             :                 return EPOLLERR;
     240             : 
     241           0 :         resv = dmabuf->resv;
     242             : 
     243           0 :         poll_wait(file, &dmabuf->poll, poll);
     244             : 
     245           0 :         events = poll_requested_events(poll) & (EPOLLIN | EPOLLOUT);
     246           0 :         if (!events)
     247             :                 return 0;
     248             : 
     249           0 :         dma_resv_lock(resv, NULL);
     250             : 
     251           0 :         if (events & EPOLLOUT) {
     252           0 :                 struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_out;
     253             : 
     254             :                 /* Check that callback isn't busy */
     255           0 :                 spin_lock_irq(&dmabuf->poll.lock);
     256           0 :                 if (dcb->active)
     257           0 :                         events &= ~EPOLLOUT;
     258             :                 else
     259           0 :                         dcb->active = EPOLLOUT;
     260           0 :                 spin_unlock_irq(&dmabuf->poll.lock);
     261             : 
     262           0 :                 if (events & EPOLLOUT) {
     263             :                         /* Paired with fput in dma_buf_poll_cb */
     264           0 :                         get_file(dmabuf->file);
     265             : 
     266           0 :                         if (!dma_buf_poll_add_cb(resv, true, dcb))
     267             :                                 /* No callback queued, wake up any other waiters */
     268           0 :                                 dma_buf_poll_cb(NULL, &dcb->cb);
     269             :                         else
     270           0 :                                 events &= ~EPOLLOUT;
     271             :                 }
     272             :         }
     273             : 
     274           0 :         if (events & EPOLLIN) {
     275           0 :                 struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_in;
     276             : 
     277             :                 /* Check that callback isn't busy */
     278           0 :                 spin_lock_irq(&dmabuf->poll.lock);
     279           0 :                 if (dcb->active)
     280           0 :                         events &= ~EPOLLIN;
     281             :                 else
     282           0 :                         dcb->active = EPOLLIN;
     283           0 :                 spin_unlock_irq(&dmabuf->poll.lock);
     284             : 
     285           0 :                 if (events & EPOLLIN) {
     286             :                         /* Paired with fput in dma_buf_poll_cb */
     287           0 :                         get_file(dmabuf->file);
     288             : 
     289           0 :                         if (!dma_buf_poll_add_cb(resv, false, dcb))
     290             :                                 /* No callback queued, wake up any other waiters */
     291           0 :                                 dma_buf_poll_cb(NULL, &dcb->cb);
     292             :                         else
     293           0 :                                 events &= ~EPOLLIN;
     294             :                 }
     295             :         }
     296             : 
     297           0 :         dma_resv_unlock(resv);
     298           0 :         return events;
     299             : }
     300             : 
     301             : /**
     302             :  * dma_buf_set_name - Set a name to a specific dma_buf to track the usage.
     303             :  * It could support changing the name of the dma-buf if the same
     304             :  * piece of memory is used for multiple purpose between different devices.
     305             :  *
     306             :  * @dmabuf: [in]     dmabuf buffer that will be renamed.
     307             :  * @buf:    [in]     A piece of userspace memory that contains the name of
     308             :  *                   the dma-buf.
     309             :  *
     310             :  * Returns 0 on success. If the dma-buf buffer is already attached to
     311             :  * devices, return -EBUSY.
     312             :  *
     313             :  */
     314           0 : static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf)
     315             : {
     316           0 :         char *name = strndup_user(buf, DMA_BUF_NAME_LEN);
     317             : 
     318           0 :         if (IS_ERR(name))
     319           0 :                 return PTR_ERR(name);
     320             : 
     321           0 :         spin_lock(&dmabuf->name_lock);
     322           0 :         kfree(dmabuf->name);
     323           0 :         dmabuf->name = name;
     324           0 :         spin_unlock(&dmabuf->name_lock);
     325             : 
     326             :         return 0;
     327             : }
     328             : 
     329           0 : static long dma_buf_ioctl(struct file *file,
     330             :                           unsigned int cmd, unsigned long arg)
     331             : {
     332             :         struct dma_buf *dmabuf;
     333             :         struct dma_buf_sync sync;
     334             :         enum dma_data_direction direction;
     335             :         int ret;
     336             : 
     337           0 :         dmabuf = file->private_data;
     338             : 
     339           0 :         switch (cmd) {
     340             :         case DMA_BUF_IOCTL_SYNC:
     341           0 :                 if (copy_from_user(&sync, (void __user *) arg, sizeof(sync)))
     342             :                         return -EFAULT;
     343             : 
     344           0 :                 if (sync.flags & ~DMA_BUF_SYNC_VALID_FLAGS_MASK)
     345             :                         return -EINVAL;
     346             : 
     347           0 :                 switch (sync.flags & DMA_BUF_SYNC_RW) {
     348             :                 case DMA_BUF_SYNC_READ:
     349             :                         direction = DMA_FROM_DEVICE;
     350             :                         break;
     351             :                 case DMA_BUF_SYNC_WRITE:
     352           0 :                         direction = DMA_TO_DEVICE;
     353           0 :                         break;
     354             :                 case DMA_BUF_SYNC_RW:
     355           0 :                         direction = DMA_BIDIRECTIONAL;
     356           0 :                         break;
     357             :                 default:
     358             :                         return -EINVAL;
     359             :                 }
     360             : 
     361           0 :                 if (sync.flags & DMA_BUF_SYNC_END)
     362           0 :                         ret = dma_buf_end_cpu_access(dmabuf, direction);
     363             :                 else
     364           0 :                         ret = dma_buf_begin_cpu_access(dmabuf, direction);
     365             : 
     366           0 :                 return ret;
     367             : 
     368             :         case DMA_BUF_SET_NAME_A:
     369             :         case DMA_BUF_SET_NAME_B:
     370           0 :                 return dma_buf_set_name(dmabuf, (const char __user *)arg);
     371             : 
     372             :         default:
     373             :                 return -ENOTTY;
     374             :         }
     375             : }
     376             : 
     377           0 : static void dma_buf_show_fdinfo(struct seq_file *m, struct file *file)
     378             : {
     379           0 :         struct dma_buf *dmabuf = file->private_data;
     380             : 
     381           0 :         seq_printf(m, "size:\t%zu\n", dmabuf->size);
     382             :         /* Don't count the temporary reference taken inside procfs seq_show */
     383           0 :         seq_printf(m, "count:\t%ld\n", file_count(dmabuf->file) - 1);
     384           0 :         seq_printf(m, "exp_name:\t%s\n", dmabuf->exp_name);
     385           0 :         spin_lock(&dmabuf->name_lock);
     386           0 :         if (dmabuf->name)
     387           0 :                 seq_printf(m, "name:\t%s\n", dmabuf->name);
     388           0 :         spin_unlock(&dmabuf->name_lock);
     389           0 : }
     390             : 
     391             : static const struct file_operations dma_buf_fops = {
     392             :         .release        = dma_buf_file_release,
     393             :         .mmap           = dma_buf_mmap_internal,
     394             :         .llseek         = dma_buf_llseek,
     395             :         .poll           = dma_buf_poll,
     396             :         .unlocked_ioctl = dma_buf_ioctl,
     397             :         .compat_ioctl   = compat_ptr_ioctl,
     398             :         .show_fdinfo    = dma_buf_show_fdinfo,
     399             : };
     400             : 
     401             : /*
     402             :  * is_dma_buf_file - Check if struct file* is associated with dma_buf
     403             :  */
     404             : static inline int is_dma_buf_file(struct file *file)
     405             : {
     406             :         return file->f_op == &dma_buf_fops;
     407             : }
     408             : 
     409           0 : static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
     410             : {
     411             :         static atomic64_t dmabuf_inode = ATOMIC64_INIT(0);
     412             :         struct file *file;
     413           0 :         struct inode *inode = alloc_anon_inode(dma_buf_mnt->mnt_sb);
     414             : 
     415           0 :         if (IS_ERR(inode))
     416             :                 return ERR_CAST(inode);
     417             : 
     418           0 :         inode->i_size = dmabuf->size;
     419           0 :         inode_set_bytes(inode, dmabuf->size);
     420             : 
     421             :         /*
     422             :          * The ->i_ino acquired from get_next_ino() is not unique thus
     423             :          * not suitable for using it as dentry name by dmabuf stats.
     424             :          * Override ->i_ino with the unique and dmabuffs specific
     425             :          * value.
     426             :          */
     427           0 :         inode->i_ino = atomic64_add_return(1, &dmabuf_inode);
     428           0 :         file = alloc_file_pseudo(inode, dma_buf_mnt, "dmabuf",
     429             :                                  flags, &dma_buf_fops);
     430           0 :         if (IS_ERR(file))
     431             :                 goto err_alloc_file;
     432           0 :         file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
     433           0 :         file->private_data = dmabuf;
     434           0 :         file->f_path.dentry->d_fsdata = dmabuf;
     435             : 
     436           0 :         return file;
     437             : 
     438             : err_alloc_file:
     439           0 :         iput(inode);
     440           0 :         return file;
     441             : }
     442             : 
     443             : /**
     444             :  * DOC: dma buf device access
     445             :  *
     446             :  * For device DMA access to a shared DMA buffer the usual sequence of operations
     447             :  * is fairly simple:
     448             :  *
     449             :  * 1. The exporter defines his exporter instance using
     450             :  *    DEFINE_DMA_BUF_EXPORT_INFO() and calls dma_buf_export() to wrap a private
     451             :  *    buffer object into a &dma_buf. It then exports that &dma_buf to userspace
     452             :  *    as a file descriptor by calling dma_buf_fd().
     453             :  *
     454             :  * 2. Userspace passes this file-descriptors to all drivers it wants this buffer
     455             :  *    to share with: First the file descriptor is converted to a &dma_buf using
     456             :  *    dma_buf_get(). Then the buffer is attached to the device using
     457             :  *    dma_buf_attach().
     458             :  *
     459             :  *    Up to this stage the exporter is still free to migrate or reallocate the
     460             :  *    backing storage.
     461             :  *
     462             :  * 3. Once the buffer is attached to all devices userspace can initiate DMA
     463             :  *    access to the shared buffer. In the kernel this is done by calling
     464             :  *    dma_buf_map_attachment() and dma_buf_unmap_attachment().
     465             :  *
     466             :  * 4. Once a driver is done with a shared buffer it needs to call
     467             :  *    dma_buf_detach() (after cleaning up any mappings) and then release the
     468             :  *    reference acquired with dma_buf_get() by calling dma_buf_put().
     469             :  *
     470             :  * For the detailed semantics exporters are expected to implement see
     471             :  * &dma_buf_ops.
     472             :  */
     473             : 
     474             : /**
     475             :  * dma_buf_export - Creates a new dma_buf, and associates an anon file
     476             :  * with this buffer, so it can be exported.
     477             :  * Also connect the allocator specific data and ops to the buffer.
     478             :  * Additionally, provide a name string for exporter; useful in debugging.
     479             :  *
     480             :  * @exp_info:   [in]    holds all the export related information provided
     481             :  *                      by the exporter. see &struct dma_buf_export_info
     482             :  *                      for further details.
     483             :  *
     484             :  * Returns, on success, a newly created struct dma_buf object, which wraps the
     485             :  * supplied private data and operations for struct dma_buf_ops. On either
     486             :  * missing ops, or error in allocating struct dma_buf, will return negative
     487             :  * error.
     488             :  *
     489             :  * For most cases the easiest way to create @exp_info is through the
     490             :  * %DEFINE_DMA_BUF_EXPORT_INFO macro.
     491             :  */
     492           0 : struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
     493             : {
     494             :         struct dma_buf *dmabuf;
     495           0 :         struct dma_resv *resv = exp_info->resv;
     496             :         struct file *file;
     497           0 :         size_t alloc_size = sizeof(struct dma_buf);
     498             :         int ret;
     499             : 
     500           0 :         if (!exp_info->resv)
     501             :                 alloc_size += sizeof(struct dma_resv);
     502             :         else
     503             :                 /* prevent &dma_buf[1] == dma_buf->resv */
     504           0 :                 alloc_size += 1;
     505             : 
     506           0 :         if (WARN_ON(!exp_info->priv
     507             :                           || !exp_info->ops
     508             :                           || !exp_info->ops->map_dma_buf
     509             :                           || !exp_info->ops->unmap_dma_buf
     510             :                           || !exp_info->ops->release)) {
     511             :                 return ERR_PTR(-EINVAL);
     512             :         }
     513             : 
     514           0 :         if (WARN_ON(exp_info->ops->cache_sgt_mapping &&
     515             :                     (exp_info->ops->pin || exp_info->ops->unpin)))
     516             :                 return ERR_PTR(-EINVAL);
     517             : 
     518           0 :         if (WARN_ON(!exp_info->ops->pin != !exp_info->ops->unpin))
     519             :                 return ERR_PTR(-EINVAL);
     520             : 
     521           0 :         if (!try_module_get(exp_info->owner))
     522             :                 return ERR_PTR(-ENOENT);
     523             : 
     524           0 :         dmabuf = kzalloc(alloc_size, GFP_KERNEL);
     525           0 :         if (!dmabuf) {
     526             :                 ret = -ENOMEM;
     527             :                 goto err_module;
     528             :         }
     529             : 
     530           0 :         dmabuf->priv = exp_info->priv;
     531           0 :         dmabuf->ops = exp_info->ops;
     532           0 :         dmabuf->size = exp_info->size;
     533           0 :         dmabuf->exp_name = exp_info->exp_name;
     534           0 :         dmabuf->owner = exp_info->owner;
     535           0 :         spin_lock_init(&dmabuf->name_lock);
     536           0 :         init_waitqueue_head(&dmabuf->poll);
     537           0 :         dmabuf->cb_in.poll = dmabuf->cb_out.poll = &dmabuf->poll;
     538           0 :         dmabuf->cb_in.active = dmabuf->cb_out.active = 0;
     539             : 
     540           0 :         if (!resv) {
     541           0 :                 resv = (struct dma_resv *)&dmabuf[1];
     542           0 :                 dma_resv_init(resv);
     543             :         }
     544           0 :         dmabuf->resv = resv;
     545             : 
     546           0 :         file = dma_buf_getfile(dmabuf, exp_info->flags);
     547           0 :         if (IS_ERR(file)) {
     548           0 :                 ret = PTR_ERR(file);
     549             :                 goto err_dmabuf;
     550             :         }
     551             : 
     552           0 :         file->f_mode |= FMODE_LSEEK;
     553           0 :         dmabuf->file = file;
     554             : 
     555           0 :         mutex_init(&dmabuf->lock);
     556           0 :         INIT_LIST_HEAD(&dmabuf->attachments);
     557             : 
     558           0 :         mutex_lock(&db_list.lock);
     559           0 :         list_add(&dmabuf->list_node, &db_list.head);
     560           0 :         mutex_unlock(&db_list.lock);
     561             : 
     562           0 :         ret = dma_buf_stats_setup(dmabuf);
     563             :         if (ret)
     564             :                 goto err_sysfs;
     565             : 
     566           0 :         return dmabuf;
     567             : 
     568             : err_sysfs:
     569             :         /*
     570             :          * Set file->f_path.dentry->d_fsdata to NULL so that when
     571             :          * dma_buf_release() gets invoked by dentry_ops, it exits
     572             :          * early before calling the release() dma_buf op.
     573             :          */
     574             :         file->f_path.dentry->d_fsdata = NULL;
     575             :         fput(file);
     576             : err_dmabuf:
     577           0 :         kfree(dmabuf);
     578             : err_module:
     579           0 :         module_put(exp_info->owner);
     580           0 :         return ERR_PTR(ret);
     581             : }
     582             : EXPORT_SYMBOL_NS_GPL(dma_buf_export, DMA_BUF);
     583             : 
     584             : /**
     585             :  * dma_buf_fd - returns a file descriptor for the given struct dma_buf
     586             :  * @dmabuf:     [in]    pointer to dma_buf for which fd is required.
     587             :  * @flags:      [in]    flags to give to fd
     588             :  *
     589             :  * On success, returns an associated 'fd'. Else, returns error.
     590             :  */
     591           0 : int dma_buf_fd(struct dma_buf *dmabuf, int flags)
     592             : {
     593             :         int fd;
     594             : 
     595           0 :         if (!dmabuf || !dmabuf->file)
     596             :                 return -EINVAL;
     597             : 
     598           0 :         fd = get_unused_fd_flags(flags);
     599           0 :         if (fd < 0)
     600             :                 return fd;
     601             : 
     602           0 :         fd_install(fd, dmabuf->file);
     603             : 
     604           0 :         return fd;
     605             : }
     606             : EXPORT_SYMBOL_NS_GPL(dma_buf_fd, DMA_BUF);
     607             : 
     608             : /**
     609             :  * dma_buf_get - returns the struct dma_buf related to an fd
     610             :  * @fd: [in]    fd associated with the struct dma_buf to be returned
     611             :  *
     612             :  * On success, returns the struct dma_buf associated with an fd; uses
     613             :  * file's refcounting done by fget to increase refcount. returns ERR_PTR
     614             :  * otherwise.
     615             :  */
     616           0 : struct dma_buf *dma_buf_get(int fd)
     617             : {
     618             :         struct file *file;
     619             : 
     620           0 :         file = fget(fd);
     621             : 
     622           0 :         if (!file)
     623             :                 return ERR_PTR(-EBADF);
     624             : 
     625           0 :         if (!is_dma_buf_file(file)) {
     626           0 :                 fput(file);
     627           0 :                 return ERR_PTR(-EINVAL);
     628             :         }
     629             : 
     630           0 :         return file->private_data;
     631             : }
     632             : EXPORT_SYMBOL_NS_GPL(dma_buf_get, DMA_BUF);
     633             : 
     634             : /**
     635             :  * dma_buf_put - decreases refcount of the buffer
     636             :  * @dmabuf:     [in]    buffer to reduce refcount of
     637             :  *
     638             :  * Uses file's refcounting done implicitly by fput().
     639             :  *
     640             :  * If, as a result of this call, the refcount becomes 0, the 'release' file
     641             :  * operation related to this fd is called. It calls &dma_buf_ops.release vfunc
     642             :  * in turn, and frees the memory allocated for dmabuf when exported.
     643             :  */
     644           0 : void dma_buf_put(struct dma_buf *dmabuf)
     645             : {
     646           0 :         if (WARN_ON(!dmabuf || !dmabuf->file))
     647             :                 return;
     648             : 
     649           0 :         fput(dmabuf->file);
     650             : }
     651             : EXPORT_SYMBOL_NS_GPL(dma_buf_put, DMA_BUF);
     652             : 
     653             : static void mangle_sg_table(struct sg_table *sg_table)
     654             : {
     655             : #ifdef CONFIG_DMABUF_DEBUG
     656             :         int i;
     657             :         struct scatterlist *sg;
     658             : 
     659             :         /* To catch abuse of the underlying struct page by importers mix
     660             :          * up the bits, but take care to preserve the low SG_ bits to
     661             :          * not corrupt the sgt. The mixing is undone in __unmap_dma_buf
     662             :          * before passing the sgt back to the exporter. */
     663             :         for_each_sgtable_sg(sg_table, sg, i)
     664             :                 sg->page_link ^= ~0xffUL;
     665             : #endif
     666             : 
     667             : }
     668           0 : static struct sg_table * __map_dma_buf(struct dma_buf_attachment *attach,
     669             :                                        enum dma_data_direction direction)
     670             : {
     671             :         struct sg_table *sg_table;
     672             :         signed long ret;
     673             : 
     674           0 :         sg_table = attach->dmabuf->ops->map_dma_buf(attach, direction);
     675           0 :         if (IS_ERR_OR_NULL(sg_table))
     676             :                 return sg_table;
     677             : 
     678           0 :         if (!dma_buf_attachment_is_dynamic(attach)) {
     679           0 :                 ret = dma_resv_wait_timeout(attach->dmabuf->resv,
     680             :                                             DMA_RESV_USAGE_KERNEL, true,
     681             :                                             MAX_SCHEDULE_TIMEOUT);
     682           0 :                 if (ret < 0) {
     683           0 :                         attach->dmabuf->ops->unmap_dma_buf(attach, sg_table,
     684             :                                                            direction);
     685           0 :                         return ERR_PTR(ret);
     686             :                 }
     687             :         }
     688             : 
     689             :         mangle_sg_table(sg_table);
     690             :         return sg_table;
     691             : }
     692             : 
     693             : /**
     694             :  * dma_buf_dynamic_attach - Add the device to dma_buf's attachments list
     695             :  * @dmabuf:             [in]    buffer to attach device to.
     696             :  * @dev:                [in]    device to be attached.
     697             :  * @importer_ops:       [in]    importer operations for the attachment
     698             :  * @importer_priv:      [in]    importer private pointer for the attachment
     699             :  *
     700             :  * Returns struct dma_buf_attachment pointer for this attachment. Attachments
     701             :  * must be cleaned up by calling dma_buf_detach().
     702             :  *
     703             :  * Optionally this calls &dma_buf_ops.attach to allow device-specific attach
     704             :  * functionality.
     705             :  *
     706             :  * Returns:
     707             :  *
     708             :  * A pointer to newly created &dma_buf_attachment on success, or a negative
     709             :  * error code wrapped into a pointer on failure.
     710             :  *
     711             :  * Note that this can fail if the backing storage of @dmabuf is in a place not
     712             :  * accessible to @dev, and cannot be moved to a more suitable place. This is
     713             :  * indicated with the error code -EBUSY.
     714             :  */
     715             : struct dma_buf_attachment *
     716           0 : dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
     717             :                        const struct dma_buf_attach_ops *importer_ops,
     718             :                        void *importer_priv)
     719             : {
     720             :         struct dma_buf_attachment *attach;
     721             :         int ret;
     722             : 
     723           0 :         if (WARN_ON(!dmabuf || !dev))
     724             :                 return ERR_PTR(-EINVAL);
     725             : 
     726           0 :         if (WARN_ON(importer_ops && !importer_ops->move_notify))
     727             :                 return ERR_PTR(-EINVAL);
     728             : 
     729           0 :         attach = kzalloc(sizeof(*attach), GFP_KERNEL);
     730           0 :         if (!attach)
     731             :                 return ERR_PTR(-ENOMEM);
     732             : 
     733           0 :         attach->dev = dev;
     734           0 :         attach->dmabuf = dmabuf;
     735           0 :         if (importer_ops)
     736           0 :                 attach->peer2peer = importer_ops->allow_peer2peer;
     737           0 :         attach->importer_ops = importer_ops;
     738           0 :         attach->importer_priv = importer_priv;
     739             : 
     740           0 :         if (dmabuf->ops->attach) {
     741           0 :                 ret = dmabuf->ops->attach(dmabuf, attach);
     742           0 :                 if (ret)
     743             :                         goto err_attach;
     744             :         }
     745           0 :         dma_resv_lock(dmabuf->resv, NULL);
     746           0 :         list_add(&attach->node, &dmabuf->attachments);
     747           0 :         dma_resv_unlock(dmabuf->resv);
     748             : 
     749             :         /* When either the importer or the exporter can't handle dynamic
     750             :          * mappings we cache the mapping here to avoid issues with the
     751             :          * reservation object lock.
     752             :          */
     753           0 :         if (dma_buf_attachment_is_dynamic(attach) !=
     754           0 :             dma_buf_is_dynamic(dmabuf)) {
     755             :                 struct sg_table *sgt;
     756             : 
     757           0 :                 if (dma_buf_is_dynamic(attach->dmabuf)) {
     758           0 :                         dma_resv_lock(attach->dmabuf->resv, NULL);
     759           0 :                         ret = dmabuf->ops->pin(attach);
     760           0 :                         if (ret)
     761             :                                 goto err_unlock;
     762             :                 }
     763             : 
     764           0 :                 sgt = __map_dma_buf(attach, DMA_BIDIRECTIONAL);
     765           0 :                 if (!sgt)
     766           0 :                         sgt = ERR_PTR(-ENOMEM);
     767           0 :                 if (IS_ERR(sgt)) {
     768           0 :                         ret = PTR_ERR(sgt);
     769             :                         goto err_unpin;
     770             :                 }
     771           0 :                 if (dma_buf_is_dynamic(attach->dmabuf))
     772           0 :                         dma_resv_unlock(attach->dmabuf->resv);
     773           0 :                 attach->sgt = sgt;
     774           0 :                 attach->dir = DMA_BIDIRECTIONAL;
     775             :         }
     776             : 
     777             :         return attach;
     778             : 
     779             : err_attach:
     780           0 :         kfree(attach);
     781           0 :         return ERR_PTR(ret);
     782             : 
     783             : err_unpin:
     784           0 :         if (dma_buf_is_dynamic(attach->dmabuf))
     785           0 :                 dmabuf->ops->unpin(attach);
     786             : 
     787             : err_unlock:
     788           0 :         if (dma_buf_is_dynamic(attach->dmabuf))
     789           0 :                 dma_resv_unlock(attach->dmabuf->resv);
     790             : 
     791           0 :         dma_buf_detach(dmabuf, attach);
     792           0 :         return ERR_PTR(ret);
     793             : }
     794             : EXPORT_SYMBOL_NS_GPL(dma_buf_dynamic_attach, DMA_BUF);
     795             : 
     796             : /**
     797             :  * dma_buf_attach - Wrapper for dma_buf_dynamic_attach
     798             :  * @dmabuf:     [in]    buffer to attach device to.
     799             :  * @dev:        [in]    device to be attached.
     800             :  *
     801             :  * Wrapper to call dma_buf_dynamic_attach() for drivers which still use a static
     802             :  * mapping.
     803             :  */
     804           0 : struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
     805             :                                           struct device *dev)
     806             : {
     807           0 :         return dma_buf_dynamic_attach(dmabuf, dev, NULL, NULL);
     808             : }
     809             : EXPORT_SYMBOL_NS_GPL(dma_buf_attach, DMA_BUF);
     810             : 
     811             : static void __unmap_dma_buf(struct dma_buf_attachment *attach,
     812             :                             struct sg_table *sg_table,
     813             :                             enum dma_data_direction direction)
     814             : {
     815             :         /* uses XOR, hence this unmangles */
     816           0 :         mangle_sg_table(sg_table);
     817             : 
     818           0 :         attach->dmabuf->ops->unmap_dma_buf(attach, sg_table, direction);
     819             : }
     820             : 
     821             : /**
     822             :  * dma_buf_detach - Remove the given attachment from dmabuf's attachments list
     823             :  * @dmabuf:     [in]    buffer to detach from.
     824             :  * @attach:     [in]    attachment to be detached; is free'd after this call.
     825             :  *
     826             :  * Clean up a device attachment obtained by calling dma_buf_attach().
     827             :  *
     828             :  * Optionally this calls &dma_buf_ops.detach for device-specific detach.
     829             :  */
     830           0 : void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
     831             : {
     832           0 :         if (WARN_ON(!dmabuf || !attach))
     833             :                 return;
     834             : 
     835           0 :         if (attach->sgt) {
     836           0 :                 if (dma_buf_is_dynamic(attach->dmabuf))
     837           0 :                         dma_resv_lock(attach->dmabuf->resv, NULL);
     838             : 
     839           0 :                 __unmap_dma_buf(attach, attach->sgt, attach->dir);
     840             : 
     841           0 :                 if (dma_buf_is_dynamic(attach->dmabuf)) {
     842           0 :                         dmabuf->ops->unpin(attach);
     843           0 :                         dma_resv_unlock(attach->dmabuf->resv);
     844             :                 }
     845             :         }
     846             : 
     847           0 :         dma_resv_lock(dmabuf->resv, NULL);
     848           0 :         list_del(&attach->node);
     849           0 :         dma_resv_unlock(dmabuf->resv);
     850           0 :         if (dmabuf->ops->detach)
     851           0 :                 dmabuf->ops->detach(dmabuf, attach);
     852             : 
     853           0 :         kfree(attach);
     854             : }
     855             : EXPORT_SYMBOL_NS_GPL(dma_buf_detach, DMA_BUF);
     856             : 
     857             : /**
     858             :  * dma_buf_pin - Lock down the DMA-buf
     859             :  * @attach:     [in]    attachment which should be pinned
     860             :  *
     861             :  * Only dynamic importers (who set up @attach with dma_buf_dynamic_attach()) may
     862             :  * call this, and only for limited use cases like scanout and not for temporary
     863             :  * pin operations. It is not permitted to allow userspace to pin arbitrary
     864             :  * amounts of buffers through this interface.
     865             :  *
     866             :  * Buffers must be unpinned by calling dma_buf_unpin().
     867             :  *
     868             :  * Returns:
     869             :  * 0 on success, negative error code on failure.
     870             :  */
     871           0 : int dma_buf_pin(struct dma_buf_attachment *attach)
     872             : {
     873           0 :         struct dma_buf *dmabuf = attach->dmabuf;
     874           0 :         int ret = 0;
     875             : 
     876           0 :         WARN_ON(!dma_buf_attachment_is_dynamic(attach));
     877             : 
     878             :         dma_resv_assert_held(dmabuf->resv);
     879             : 
     880           0 :         if (dmabuf->ops->pin)
     881           0 :                 ret = dmabuf->ops->pin(attach);
     882             : 
     883           0 :         return ret;
     884             : }
     885             : EXPORT_SYMBOL_NS_GPL(dma_buf_pin, DMA_BUF);
     886             : 
     887             : /**
     888             :  * dma_buf_unpin - Unpin a DMA-buf
     889             :  * @attach:     [in]    attachment which should be unpinned
     890             :  *
     891             :  * This unpins a buffer pinned by dma_buf_pin() and allows the exporter to move
     892             :  * any mapping of @attach again and inform the importer through
     893             :  * &dma_buf_attach_ops.move_notify.
     894             :  */
     895           0 : void dma_buf_unpin(struct dma_buf_attachment *attach)
     896             : {
     897           0 :         struct dma_buf *dmabuf = attach->dmabuf;
     898             : 
     899           0 :         WARN_ON(!dma_buf_attachment_is_dynamic(attach));
     900             : 
     901             :         dma_resv_assert_held(dmabuf->resv);
     902             : 
     903           0 :         if (dmabuf->ops->unpin)
     904           0 :                 dmabuf->ops->unpin(attach);
     905           0 : }
     906             : EXPORT_SYMBOL_NS_GPL(dma_buf_unpin, DMA_BUF);
     907             : 
     908             : /**
     909             :  * dma_buf_map_attachment - Returns the scatterlist table of the attachment;
     910             :  * mapped into _device_ address space. Is a wrapper for map_dma_buf() of the
     911             :  * dma_buf_ops.
     912             :  * @attach:     [in]    attachment whose scatterlist is to be returned
     913             :  * @direction:  [in]    direction of DMA transfer
     914             :  *
     915             :  * Returns sg_table containing the scatterlist to be returned; returns ERR_PTR
     916             :  * on error. May return -EINTR if it is interrupted by a signal.
     917             :  *
     918             :  * On success, the DMA addresses and lengths in the returned scatterlist are
     919             :  * PAGE_SIZE aligned.
     920             :  *
     921             :  * A mapping must be unmapped by using dma_buf_unmap_attachment(). Note that
     922             :  * the underlying backing storage is pinned for as long as a mapping exists,
     923             :  * therefore users/importers should not hold onto a mapping for undue amounts of
     924             :  * time.
     925             :  *
     926             :  * Important: Dynamic importers must wait for the exclusive fence of the struct
     927             :  * dma_resv attached to the DMA-BUF first.
     928             :  */
     929           0 : struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
     930             :                                         enum dma_data_direction direction)
     931             : {
     932             :         struct sg_table *sg_table;
     933             :         int r;
     934             : 
     935             :         might_sleep();
     936             : 
     937           0 :         if (WARN_ON(!attach || !attach->dmabuf))
     938             :                 return ERR_PTR(-EINVAL);
     939             : 
     940           0 :         if (dma_buf_attachment_is_dynamic(attach))
     941             :                 dma_resv_assert_held(attach->dmabuf->resv);
     942             : 
     943           0 :         if (attach->sgt) {
     944             :                 /*
     945             :                  * Two mappings with different directions for the same
     946             :                  * attachment are not allowed.
     947             :                  */
     948           0 :                 if (attach->dir != direction &&
     949             :                     attach->dir != DMA_BIDIRECTIONAL)
     950             :                         return ERR_PTR(-EBUSY);
     951             : 
     952           0 :                 return attach->sgt;
     953             :         }
     954             : 
     955           0 :         if (dma_buf_is_dynamic(attach->dmabuf)) {
     956             :                 dma_resv_assert_held(attach->dmabuf->resv);
     957             :                 if (!IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY)) {
     958           0 :                         r = attach->dmabuf->ops->pin(attach);
     959           0 :                         if (r)
     960           0 :                                 return ERR_PTR(r);
     961             :                 }
     962             :         }
     963             : 
     964           0 :         sg_table = __map_dma_buf(attach, direction);
     965           0 :         if (!sg_table)
     966           0 :                 sg_table = ERR_PTR(-ENOMEM);
     967             : 
     968           0 :         if (IS_ERR(sg_table) && dma_buf_is_dynamic(attach->dmabuf) &&
     969             :              !IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY))
     970           0 :                 attach->dmabuf->ops->unpin(attach);
     971             : 
     972           0 :         if (!IS_ERR(sg_table) && attach->dmabuf->ops->cache_sgt_mapping) {
     973           0 :                 attach->sgt = sg_table;
     974           0 :                 attach->dir = direction;
     975             :         }
     976             : 
     977             : #ifdef CONFIG_DMA_API_DEBUG
     978             :         if (!IS_ERR(sg_table)) {
     979             :                 struct scatterlist *sg;
     980             :                 u64 addr;
     981             :                 int len;
     982             :                 int i;
     983             : 
     984             :                 for_each_sgtable_dma_sg(sg_table, sg, i) {
     985             :                         addr = sg_dma_address(sg);
     986             :                         len = sg_dma_len(sg);
     987             :                         if (!PAGE_ALIGNED(addr) || !PAGE_ALIGNED(len)) {
     988             :                                 pr_debug("%s: addr %llx or len %x is not page aligned!\n",
     989             :                                          __func__, addr, len);
     990             :                         }
     991             :                 }
     992             :         }
     993             : #endif /* CONFIG_DMA_API_DEBUG */
     994             :         return sg_table;
     995             : }
     996             : EXPORT_SYMBOL_NS_GPL(dma_buf_map_attachment, DMA_BUF);
     997             : 
     998             : /**
     999             :  * dma_buf_unmap_attachment - unmaps and decreases usecount of the buffer;might
    1000             :  * deallocate the scatterlist associated. Is a wrapper for unmap_dma_buf() of
    1001             :  * dma_buf_ops.
    1002             :  * @attach:     [in]    attachment to unmap buffer from
    1003             :  * @sg_table:   [in]    scatterlist info of the buffer to unmap
    1004             :  * @direction:  [in]    direction of DMA transfer
    1005             :  *
    1006             :  * This unmaps a DMA mapping for @attached obtained by dma_buf_map_attachment().
    1007             :  */
    1008           0 : void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
    1009             :                                 struct sg_table *sg_table,
    1010             :                                 enum dma_data_direction direction)
    1011             : {
    1012             :         might_sleep();
    1013             : 
    1014           0 :         if (WARN_ON(!attach || !attach->dmabuf || !sg_table))
    1015             :                 return;
    1016             : 
    1017           0 :         if (dma_buf_attachment_is_dynamic(attach))
    1018             :                 dma_resv_assert_held(attach->dmabuf->resv);
    1019             : 
    1020           0 :         if (attach->sgt == sg_table)
    1021             :                 return;
    1022             : 
    1023           0 :         if (dma_buf_is_dynamic(attach->dmabuf))
    1024             :                 dma_resv_assert_held(attach->dmabuf->resv);
    1025             : 
    1026           0 :         __unmap_dma_buf(attach, sg_table, direction);
    1027             : 
    1028           0 :         if (dma_buf_is_dynamic(attach->dmabuf) &&
    1029             :             !IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY))
    1030           0 :                 dma_buf_unpin(attach);
    1031             : }
    1032             : EXPORT_SYMBOL_NS_GPL(dma_buf_unmap_attachment, DMA_BUF);
    1033             : 
    1034             : /**
    1035             :  * dma_buf_move_notify - notify attachments that DMA-buf is moving
    1036             :  *
    1037             :  * @dmabuf:     [in]    buffer which is moving
    1038             :  *
    1039             :  * Informs all attachmenst that they need to destroy and recreated all their
    1040             :  * mappings.
    1041             :  */
    1042           0 : void dma_buf_move_notify(struct dma_buf *dmabuf)
    1043             : {
    1044             :         struct dma_buf_attachment *attach;
    1045             : 
    1046             :         dma_resv_assert_held(dmabuf->resv);
    1047             : 
    1048           0 :         list_for_each_entry(attach, &dmabuf->attachments, node)
    1049           0 :                 if (attach->importer_ops)
    1050           0 :                         attach->importer_ops->move_notify(attach);
    1051           0 : }
    1052             : EXPORT_SYMBOL_NS_GPL(dma_buf_move_notify, DMA_BUF);
    1053             : 
    1054             : /**
    1055             :  * DOC: cpu access
    1056             :  *
    1057             :  * There are mutliple reasons for supporting CPU access to a dma buffer object:
    1058             :  *
    1059             :  * - Fallback operations in the kernel, for example when a device is connected
    1060             :  *   over USB and the kernel needs to shuffle the data around first before
    1061             :  *   sending it away. Cache coherency is handled by braketing any transactions
    1062             :  *   with calls to dma_buf_begin_cpu_access() and dma_buf_end_cpu_access()
    1063             :  *   access.
    1064             :  *
    1065             :  *   Since for most kernel internal dma-buf accesses need the entire buffer, a
    1066             :  *   vmap interface is introduced. Note that on very old 32-bit architectures
    1067             :  *   vmalloc space might be limited and result in vmap calls failing.
    1068             :  *
    1069             :  *   Interfaces::
    1070             :  *
    1071             :  *      void \*dma_buf_vmap(struct dma_buf \*dmabuf, struct iosys_map \*map)
    1072             :  *      void dma_buf_vunmap(struct dma_buf \*dmabuf, struct iosys_map \*map)
    1073             :  *
    1074             :  *   The vmap call can fail if there is no vmap support in the exporter, or if
    1075             :  *   it runs out of vmalloc space. Note that the dma-buf layer keeps a reference
    1076             :  *   count for all vmap access and calls down into the exporter's vmap function
    1077             :  *   only when no vmapping exists, and only unmaps it once. Protection against
    1078             :  *   concurrent vmap/vunmap calls is provided by taking the &dma_buf.lock mutex.
    1079             :  *
    1080             :  * - For full compatibility on the importer side with existing userspace
    1081             :  *   interfaces, which might already support mmap'ing buffers. This is needed in
    1082             :  *   many processing pipelines (e.g. feeding a software rendered image into a
    1083             :  *   hardware pipeline, thumbnail creation, snapshots, ...). Also, Android's ION
    1084             :  *   framework already supported this and for DMA buffer file descriptors to
    1085             :  *   replace ION buffers mmap support was needed.
    1086             :  *
    1087             :  *   There is no special interfaces, userspace simply calls mmap on the dma-buf
    1088             :  *   fd. But like for CPU access there's a need to braket the actual access,
    1089             :  *   which is handled by the ioctl (DMA_BUF_IOCTL_SYNC). Note that
    1090             :  *   DMA_BUF_IOCTL_SYNC can fail with -EAGAIN or -EINTR, in which case it must
    1091             :  *   be restarted.
    1092             :  *
    1093             :  *   Some systems might need some sort of cache coherency management e.g. when
    1094             :  *   CPU and GPU domains are being accessed through dma-buf at the same time.
    1095             :  *   To circumvent this problem there are begin/end coherency markers, that
    1096             :  *   forward directly to existing dma-buf device drivers vfunc hooks. Userspace
    1097             :  *   can make use of those markers through the DMA_BUF_IOCTL_SYNC ioctl. The
    1098             :  *   sequence would be used like following:
    1099             :  *
    1100             :  *     - mmap dma-buf fd
    1101             :  *     - for each drawing/upload cycle in CPU 1. SYNC_START ioctl, 2. read/write
    1102             :  *       to mmap area 3. SYNC_END ioctl. This can be repeated as often as you
    1103             :  *       want (with the new data being consumed by say the GPU or the scanout
    1104             :  *       device)
    1105             :  *     - munmap once you don't need the buffer any more
    1106             :  *
    1107             :  *    For correctness and optimal performance, it is always required to use
    1108             :  *    SYNC_START and SYNC_END before and after, respectively, when accessing the
    1109             :  *    mapped address. Userspace cannot rely on coherent access, even when there
    1110             :  *    are systems where it just works without calling these ioctls.
    1111             :  *
    1112             :  * - And as a CPU fallback in userspace processing pipelines.
    1113             :  *
    1114             :  *   Similar to the motivation for kernel cpu access it is again important that
    1115             :  *   the userspace code of a given importing subsystem can use the same
    1116             :  *   interfaces with a imported dma-buf buffer object as with a native buffer
    1117             :  *   object. This is especially important for drm where the userspace part of
    1118             :  *   contemporary OpenGL, X, and other drivers is huge, and reworking them to
    1119             :  *   use a different way to mmap a buffer rather invasive.
    1120             :  *
    1121             :  *   The assumption in the current dma-buf interfaces is that redirecting the
    1122             :  *   initial mmap is all that's needed. A survey of some of the existing
    1123             :  *   subsystems shows that no driver seems to do any nefarious thing like
    1124             :  *   syncing up with outstanding asynchronous processing on the device or
    1125             :  *   allocating special resources at fault time. So hopefully this is good
    1126             :  *   enough, since adding interfaces to intercept pagefaults and allow pte
    1127             :  *   shootdowns would increase the complexity quite a bit.
    1128             :  *
    1129             :  *   Interface::
    1130             :  *
    1131             :  *      int dma_buf_mmap(struct dma_buf \*, struct vm_area_struct \*,
    1132             :  *                     unsigned long);
    1133             :  *
    1134             :  *   If the importing subsystem simply provides a special-purpose mmap call to
    1135             :  *   set up a mapping in userspace, calling do_mmap with &dma_buf.file will
    1136             :  *   equally achieve that for a dma-buf object.
    1137             :  */
    1138             : 
    1139             : static int __dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
    1140             :                                       enum dma_data_direction direction)
    1141             : {
    1142           0 :         bool write = (direction == DMA_BIDIRECTIONAL ||
    1143             :                       direction == DMA_TO_DEVICE);
    1144           0 :         struct dma_resv *resv = dmabuf->resv;
    1145             :         long ret;
    1146             : 
    1147             :         /* Wait on any implicit rendering fences */
    1148           0 :         ret = dma_resv_wait_timeout(resv, dma_resv_usage_rw(write),
    1149             :                                     true, MAX_SCHEDULE_TIMEOUT);
    1150           0 :         if (ret < 0)
    1151           0 :                 return ret;
    1152             : 
    1153             :         return 0;
    1154             : }
    1155             : 
    1156             : /**
    1157             :  * dma_buf_begin_cpu_access - Must be called before accessing a dma_buf from the
    1158             :  * cpu in the kernel context. Calls begin_cpu_access to allow exporter-specific
    1159             :  * preparations. Coherency is only guaranteed in the specified range for the
    1160             :  * specified access direction.
    1161             :  * @dmabuf:     [in]    buffer to prepare cpu access for.
    1162             :  * @direction:  [in]    length of range for cpu access.
    1163             :  *
    1164             :  * After the cpu access is complete the caller should call
    1165             :  * dma_buf_end_cpu_access(). Only when cpu access is braketed by both calls is
    1166             :  * it guaranteed to be coherent with other DMA access.
    1167             :  *
    1168             :  * This function will also wait for any DMA transactions tracked through
    1169             :  * implicit synchronization in &dma_buf.resv. For DMA transactions with explicit
    1170             :  * synchronization this function will only ensure cache coherency, callers must
    1171             :  * ensure synchronization with such DMA transactions on their own.
    1172             :  *
    1173             :  * Can return negative error values, returns 0 on success.
    1174             :  */
    1175           0 : int dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
    1176             :                              enum dma_data_direction direction)
    1177             : {
    1178           0 :         int ret = 0;
    1179             : 
    1180           0 :         if (WARN_ON(!dmabuf))
    1181             :                 return -EINVAL;
    1182             : 
    1183             :         might_lock(&dmabuf->resv->lock.base);
    1184             : 
    1185           0 :         if (dmabuf->ops->begin_cpu_access)
    1186           0 :                 ret = dmabuf->ops->begin_cpu_access(dmabuf, direction);
    1187             : 
    1188             :         /* Ensure that all fences are waited upon - but we first allow
    1189             :          * the native handler the chance to do so more efficiently if it
    1190             :          * chooses. A double invocation here will be reasonably cheap no-op.
    1191             :          */
    1192           0 :         if (ret == 0)
    1193           0 :                 ret = __dma_buf_begin_cpu_access(dmabuf, direction);
    1194             : 
    1195             :         return ret;
    1196             : }
    1197             : EXPORT_SYMBOL_NS_GPL(dma_buf_begin_cpu_access, DMA_BUF);
    1198             : 
    1199             : /**
    1200             :  * dma_buf_end_cpu_access - Must be called after accessing a dma_buf from the
    1201             :  * cpu in the kernel context. Calls end_cpu_access to allow exporter-specific
    1202             :  * actions. Coherency is only guaranteed in the specified range for the
    1203             :  * specified access direction.
    1204             :  * @dmabuf:     [in]    buffer to complete cpu access for.
    1205             :  * @direction:  [in]    length of range for cpu access.
    1206             :  *
    1207             :  * This terminates CPU access started with dma_buf_begin_cpu_access().
    1208             :  *
    1209             :  * Can return negative error values, returns 0 on success.
    1210             :  */
    1211           0 : int dma_buf_end_cpu_access(struct dma_buf *dmabuf,
    1212             :                            enum dma_data_direction direction)
    1213             : {
    1214           0 :         int ret = 0;
    1215             : 
    1216           0 :         WARN_ON(!dmabuf);
    1217             : 
    1218             :         might_lock(&dmabuf->resv->lock.base);
    1219             : 
    1220           0 :         if (dmabuf->ops->end_cpu_access)
    1221           0 :                 ret = dmabuf->ops->end_cpu_access(dmabuf, direction);
    1222             : 
    1223           0 :         return ret;
    1224             : }
    1225             : EXPORT_SYMBOL_NS_GPL(dma_buf_end_cpu_access, DMA_BUF);
    1226             : 
    1227             : 
    1228             : /**
    1229             :  * dma_buf_mmap - Setup up a userspace mmap with the given vma
    1230             :  * @dmabuf:     [in]    buffer that should back the vma
    1231             :  * @vma:        [in]    vma for the mmap
    1232             :  * @pgoff:      [in]    offset in pages where this mmap should start within the
    1233             :  *                      dma-buf buffer.
    1234             :  *
    1235             :  * This function adjusts the passed in vma so that it points at the file of the
    1236             :  * dma_buf operation. It also adjusts the starting pgoff and does bounds
    1237             :  * checking on the size of the vma. Then it calls the exporters mmap function to
    1238             :  * set up the mapping.
    1239             :  *
    1240             :  * Can return negative error values, returns 0 on success.
    1241             :  */
    1242           0 : int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
    1243             :                  unsigned long pgoff)
    1244             : {
    1245           0 :         if (WARN_ON(!dmabuf || !vma))
    1246             :                 return -EINVAL;
    1247             : 
    1248             :         /* check if buffer supports mmap */
    1249           0 :         if (!dmabuf->ops->mmap)
    1250             :                 return -EINVAL;
    1251             : 
    1252             :         /* check for offset overflow */
    1253           0 :         if (pgoff + vma_pages(vma) < pgoff)
    1254             :                 return -EOVERFLOW;
    1255             : 
    1256             :         /* check for overflowing the buffer's size */
    1257           0 :         if (pgoff + vma_pages(vma) >
    1258           0 :             dmabuf->size >> PAGE_SHIFT)
    1259             :                 return -EINVAL;
    1260             : 
    1261             :         /* readjust the vma */
    1262           0 :         vma_set_file(vma, dmabuf->file);
    1263           0 :         vma->vm_pgoff = pgoff;
    1264             : 
    1265           0 :         return dmabuf->ops->mmap(dmabuf, vma);
    1266             : }
    1267             : EXPORT_SYMBOL_NS_GPL(dma_buf_mmap, DMA_BUF);
    1268             : 
    1269             : /**
    1270             :  * dma_buf_vmap - Create virtual mapping for the buffer object into kernel
    1271             :  * address space. Same restrictions as for vmap and friends apply.
    1272             :  * @dmabuf:     [in]    buffer to vmap
    1273             :  * @map:        [out]   returns the vmap pointer
    1274             :  *
    1275             :  * This call may fail due to lack of virtual mapping address space.
    1276             :  * These calls are optional in drivers. The intended use for them
    1277             :  * is for mapping objects linear in kernel space for high use objects.
    1278             :  *
    1279             :  * To ensure coherency users must call dma_buf_begin_cpu_access() and
    1280             :  * dma_buf_end_cpu_access() around any cpu access performed through this
    1281             :  * mapping.
    1282             :  *
    1283             :  * Returns 0 on success, or a negative errno code otherwise.
    1284             :  */
    1285           0 : int dma_buf_vmap(struct dma_buf *dmabuf, struct iosys_map *map)
    1286             : {
    1287             :         struct iosys_map ptr;
    1288           0 :         int ret = 0;
    1289             : 
    1290           0 :         iosys_map_clear(map);
    1291             : 
    1292           0 :         if (WARN_ON(!dmabuf))
    1293             :                 return -EINVAL;
    1294             : 
    1295           0 :         if (!dmabuf->ops->vmap)
    1296             :                 return -EINVAL;
    1297             : 
    1298           0 :         mutex_lock(&dmabuf->lock);
    1299           0 :         if (dmabuf->vmapping_counter) {
    1300           0 :                 dmabuf->vmapping_counter++;
    1301           0 :                 BUG_ON(iosys_map_is_null(&dmabuf->vmap_ptr));
    1302           0 :                 *map = dmabuf->vmap_ptr;
    1303           0 :                 goto out_unlock;
    1304             :         }
    1305             : 
    1306           0 :         BUG_ON(iosys_map_is_set(&dmabuf->vmap_ptr));
    1307             : 
    1308           0 :         ret = dmabuf->ops->vmap(dmabuf, &ptr);
    1309           0 :         if (WARN_ON_ONCE(ret))
    1310             :                 goto out_unlock;
    1311             : 
    1312           0 :         dmabuf->vmap_ptr = ptr;
    1313           0 :         dmabuf->vmapping_counter = 1;
    1314             : 
    1315           0 :         *map = dmabuf->vmap_ptr;
    1316             : 
    1317             : out_unlock:
    1318           0 :         mutex_unlock(&dmabuf->lock);
    1319           0 :         return ret;
    1320             : }
    1321             : EXPORT_SYMBOL_NS_GPL(dma_buf_vmap, DMA_BUF);
    1322             : 
    1323             : /**
    1324             :  * dma_buf_vunmap - Unmap a vmap obtained by dma_buf_vmap.
    1325             :  * @dmabuf:     [in]    buffer to vunmap
    1326             :  * @map:        [in]    vmap pointer to vunmap
    1327             :  */
    1328           0 : void dma_buf_vunmap(struct dma_buf *dmabuf, struct iosys_map *map)
    1329             : {
    1330           0 :         if (WARN_ON(!dmabuf))
    1331             :                 return;
    1332             : 
    1333           0 :         BUG_ON(iosys_map_is_null(&dmabuf->vmap_ptr));
    1334           0 :         BUG_ON(dmabuf->vmapping_counter == 0);
    1335           0 :         BUG_ON(!iosys_map_is_equal(&dmabuf->vmap_ptr, map));
    1336             : 
    1337           0 :         mutex_lock(&dmabuf->lock);
    1338           0 :         if (--dmabuf->vmapping_counter == 0) {
    1339           0 :                 if (dmabuf->ops->vunmap)
    1340           0 :                         dmabuf->ops->vunmap(dmabuf, map);
    1341           0 :                 iosys_map_clear(&dmabuf->vmap_ptr);
    1342             :         }
    1343           0 :         mutex_unlock(&dmabuf->lock);
    1344             : }
    1345             : EXPORT_SYMBOL_NS_GPL(dma_buf_vunmap, DMA_BUF);
    1346             : 
    1347             : #ifdef CONFIG_DEBUG_FS
    1348             : static int dma_buf_debug_show(struct seq_file *s, void *unused)
    1349             : {
    1350             :         struct dma_buf *buf_obj;
    1351             :         struct dma_buf_attachment *attach_obj;
    1352             :         int count = 0, attach_count;
    1353             :         size_t size = 0;
    1354             :         int ret;
    1355             : 
    1356             :         ret = mutex_lock_interruptible(&db_list.lock);
    1357             : 
    1358             :         if (ret)
    1359             :                 return ret;
    1360             : 
    1361             :         seq_puts(s, "\nDma-buf Objects:\n");
    1362             :         seq_printf(s, "%-8s\t%-8s\t%-8s\t%-8s\texp_name\t%-8s\n",
    1363             :                    "size", "flags", "mode", "count", "ino");
    1364             : 
    1365             :         list_for_each_entry(buf_obj, &db_list.head, list_node) {
    1366             : 
    1367             :                 ret = dma_resv_lock_interruptible(buf_obj->resv, NULL);
    1368             :                 if (ret)
    1369             :                         goto error_unlock;
    1370             : 
    1371             : 
    1372             :                 spin_lock(&buf_obj->name_lock);
    1373             :                 seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\t%08lu\t%s\n",
    1374             :                                 buf_obj->size,
    1375             :                                 buf_obj->file->f_flags, buf_obj->file->f_mode,
    1376             :                                 file_count(buf_obj->file),
    1377             :                                 buf_obj->exp_name,
    1378             :                                 file_inode(buf_obj->file)->i_ino,
    1379             :                                 buf_obj->name ?: "");
    1380             :                 spin_unlock(&buf_obj->name_lock);
    1381             : 
    1382             :                 dma_resv_describe(buf_obj->resv, s);
    1383             : 
    1384             :                 seq_puts(s, "\tAttached Devices:\n");
    1385             :                 attach_count = 0;
    1386             : 
    1387             :                 list_for_each_entry(attach_obj, &buf_obj->attachments, node) {
    1388             :                         seq_printf(s, "\t%s\n", dev_name(attach_obj->dev));
    1389             :                         attach_count++;
    1390             :                 }
    1391             :                 dma_resv_unlock(buf_obj->resv);
    1392             : 
    1393             :                 seq_printf(s, "Total %d devices attached\n\n",
    1394             :                                 attach_count);
    1395             : 
    1396             :                 count++;
    1397             :                 size += buf_obj->size;
    1398             :         }
    1399             : 
    1400             :         seq_printf(s, "\nTotal %d objects, %zu bytes\n", count, size);
    1401             : 
    1402             :         mutex_unlock(&db_list.lock);
    1403             :         return 0;
    1404             : 
    1405             : error_unlock:
    1406             :         mutex_unlock(&db_list.lock);
    1407             :         return ret;
    1408             : }
    1409             : 
    1410             : DEFINE_SHOW_ATTRIBUTE(dma_buf_debug);
    1411             : 
    1412             : static struct dentry *dma_buf_debugfs_dir;
    1413             : 
    1414             : static int dma_buf_init_debugfs(void)
    1415             : {
    1416             :         struct dentry *d;
    1417             :         int err = 0;
    1418             : 
    1419             :         d = debugfs_create_dir("dma_buf", NULL);
    1420             :         if (IS_ERR(d))
    1421             :                 return PTR_ERR(d);
    1422             : 
    1423             :         dma_buf_debugfs_dir = d;
    1424             : 
    1425             :         d = debugfs_create_file("bufinfo", S_IRUGO, dma_buf_debugfs_dir,
    1426             :                                 NULL, &dma_buf_debug_fops);
    1427             :         if (IS_ERR(d)) {
    1428             :                 pr_debug("dma_buf: debugfs: failed to create node bufinfo\n");
    1429             :                 debugfs_remove_recursive(dma_buf_debugfs_dir);
    1430             :                 dma_buf_debugfs_dir = NULL;
    1431             :                 err = PTR_ERR(d);
    1432             :         }
    1433             : 
    1434             :         return err;
    1435             : }
    1436             : 
    1437             : static void dma_buf_uninit_debugfs(void)
    1438             : {
    1439             :         debugfs_remove_recursive(dma_buf_debugfs_dir);
    1440             : }
    1441             : #else
    1442             : static inline int dma_buf_init_debugfs(void)
    1443             : {
    1444             :         return 0;
    1445             : }
    1446             : static inline void dma_buf_uninit_debugfs(void)
    1447             : {
    1448             : }
    1449             : #endif
    1450             : 
    1451           1 : static int __init dma_buf_init(void)
    1452             : {
    1453             :         int ret;
    1454             : 
    1455           1 :         ret = dma_buf_init_sysfs_statistics();
    1456             :         if (ret)
    1457             :                 return ret;
    1458             : 
    1459           1 :         dma_buf_mnt = kern_mount(&dma_buf_fs_type);
    1460           2 :         if (IS_ERR(dma_buf_mnt))
    1461           0 :                 return PTR_ERR(dma_buf_mnt);
    1462             : 
    1463           1 :         mutex_init(&db_list.lock);
    1464           1 :         INIT_LIST_HEAD(&db_list.head);
    1465             :         dma_buf_init_debugfs();
    1466           1 :         return 0;
    1467             : }
    1468             : subsys_initcall(dma_buf_init);
    1469             : 
    1470           0 : static void __exit dma_buf_deinit(void)
    1471             : {
    1472             :         dma_buf_uninit_debugfs();
    1473           0 :         kern_unmount(dma_buf_mnt);
    1474             :         dma_buf_uninit_sysfs_statistics();
    1475           0 : }
    1476             : __exitcall(dma_buf_deinit);

Generated by: LCOV version 1.14