static struct dma_buf_list db_list;
 
+static char *dmabuffs_dname(struct dentry *dentry, char *buffer, int buflen)
+{
+       struct dma_buf *dmabuf;
+       char name[DMA_BUF_NAME_LEN];
+       size_t ret = 0;
+
+       dmabuf = dentry->d_fsdata;
+       mutex_lock(&dmabuf->lock);
+       if (dmabuf->name)
+               ret = strlcpy(name, dmabuf->name, DMA_BUF_NAME_LEN);
+       mutex_unlock(&dmabuf->lock);
+
+       return dynamic_dname(dentry, buffer, buflen, "/%s:%s",
+                            dentry->d_name.name, ret > 0 ? name : "");
+}
+
 static const struct dentry_operations dma_buf_dentry_ops = {
-       .d_dname = simple_dname,
+       .d_dname = dmabuffs_dname,
 };
 
 static struct vfsmount *dma_buf_mnt;
        return events;
 }
 
+/**
+ * dma_buf_set_name - Set a name to a specific dma_buf to track the usage.
+ * The name of the dma-buf buffer can only be set when the dma-buf is not
+ * attached to any devices. It could theoritically support changing the
+ * name of the dma-buf if the same piece of memory is used for multiple
+ * purpose between different devices.
+ *
+ * @dmabuf [in]     dmabuf buffer that will be renamed.
+ * @buf:   [in]     A piece of userspace memory that contains the name of
+ *                  the dma-buf.
+ *
+ * Returns 0 on success. If the dma-buf buffer is already attached to
+ * devices, return -EBUSY.
+ *
+ */
+static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf)
+{
+       char *name = strndup_user(buf, DMA_BUF_NAME_LEN);
+       long ret = 0;
+
+       if (IS_ERR(name))
+               return PTR_ERR(name);
+
+       mutex_lock(&dmabuf->lock);
+       if (!list_empty(&dmabuf->attachments)) {
+               ret = -EBUSY;
+               kfree(name);
+               goto out_unlock;
+       }
+       kfree(dmabuf->name);
+       dmabuf->name = name;
+
+out_unlock:
+       mutex_unlock(&dmabuf->lock);
+       return ret;
+}
+
 static long dma_buf_ioctl(struct file *file,
                          unsigned int cmd, unsigned long arg)
 {
                        ret = dma_buf_begin_cpu_access(dmabuf, direction);
 
                return ret;
+
+       case DMA_BUF_SET_NAME:
+               return dma_buf_set_name(dmabuf, (const char __user *)arg);
+
        default:
                return -ENOTTY;
        }
                goto err_alloc_file;
        file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
        file->private_data = dmabuf;
+       file->f_path.dentry->d_fsdata = dmabuf;
 
        return file;
 
                        continue;
                }
 
-               seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\t%08lu\n",
+               seq_printf(s, "%08zu\t%08x\t%08x\t%08ld\t%s\t%08lu\t%s\n",
                                buf_obj->size,
                                buf_obj->file->f_flags, buf_obj->file->f_mode,
                                file_count(buf_obj->file),
                                buf_obj->exp_name,
-                               file_inode(buf_obj->file)->i_ino);
+                               file_inode(buf_obj->file)->i_ino,
+                               buf_obj->name ?: "");
 
                robj = buf_obj->resv;
                while (true) {
 
  * @file: file pointer used for sharing buffers across, and for refcounting.
  * @attachments: list of dma_buf_attachment that denotes all devices attached.
  * @ops: dma_buf_ops associated with this buffer object.
- * @lock: used internally to serialize list manipulation, attach/detach and vmap/unmap
+ * @lock: used internally to serialize list manipulation, attach/detach and
+ *        vmap/unmap, and accesses to name
  * @vmapping_counter: used internally to refcnt the vmaps
  * @vmap_ptr: the current vmap ptr if vmapping_counter > 0
  * @exp_name: name of the exporter; useful for debugging.
+ * @name: userspace-provided name; useful for accounting and debugging.
  * @owner: pointer to exporter module; used for refcounting when exporter is a
  *         kernel module.
  * @list_node: node for dma_buf accounting and debugging.
        unsigned vmapping_counter;
        void *vmap_ptr;
        const char *exp_name;
+       const char *name;
        struct module *owner;
        struct list_head list_node;
        void *priv;