Merge tag 'dma-buf-for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/sumits...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 27 Jun 2015 00:40:54 +0000 (17:40 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 27 Jun 2015 00:40:54 +0000 (17:40 -0700)
Pull dma-buf updates from Sumit Semwal:
 "Minor changes for 4.2

   - add ref-counting for kernel modules as exporters
   - minor code style fixes"

* tag 'dma-buf-for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/sumits/dma-buf:
  dma-buf: Minor coding style fixes
  dma-buf: add ref counting for module as exporter

drivers/dma-buf/dma-buf.c
drivers/dma-buf/reservation.c
drivers/dma-buf/seqno-fence.c
include/linux/dma-buf.h

index c5a9138..155c146 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/anon_inodes.h>
 #include <linux/export.h>
 #include <linux/debugfs.h>
+#include <linux/module.h>
 #include <linux/seq_file.h>
 #include <linux/poll.h>
 #include <linux/reservation.h>
@@ -72,6 +73,7 @@ static int dma_buf_release(struct inode *inode, struct file *file)
        if (dmabuf->resv == (struct reservation_object *)&dmabuf[1])
                reservation_object_fini(dmabuf->resv);
 
+       module_put(dmabuf->owner);
        kfree(dmabuf);
        return 0;
 }
@@ -285,6 +287,7 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
        struct reservation_object *resv = exp_info->resv;
        struct file *file;
        size_t alloc_size = sizeof(struct dma_buf);
+
        if (!exp_info->resv)
                alloc_size += sizeof(struct reservation_object);
        else
@@ -302,14 +305,20 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
                return ERR_PTR(-EINVAL);
        }
 
+       if (!try_module_get(exp_info->owner))
+               return ERR_PTR(-ENOENT);
+
        dmabuf = kzalloc(alloc_size, GFP_KERNEL);
-       if (dmabuf == NULL)
+       if (!dmabuf) {
+               module_put(exp_info->owner);
                return ERR_PTR(-ENOMEM);
+       }
 
        dmabuf->priv = exp_info->priv;
        dmabuf->ops = exp_info->ops;
        dmabuf->size = exp_info->size;
        dmabuf->exp_name = exp_info->exp_name;
+       dmabuf->owner = exp_info->owner;
        init_waitqueue_head(&dmabuf->poll);
        dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
        dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0;
@@ -545,7 +554,8 @@ int dma_buf_begin_cpu_access(struct dma_buf *dmabuf, size_t start, size_t len,
                return -EINVAL;
 
        if (dmabuf->ops->begin_cpu_access)
-               ret = dmabuf->ops->begin_cpu_access(dmabuf, start, len, direction);
+               ret = dmabuf->ops->begin_cpu_access(dmabuf, start,
+                                                       len, direction);
 
        return ret;
 }
@@ -649,7 +659,7 @@ EXPORT_SYMBOL_GPL(dma_buf_kunmap);
  * @dmabuf:    [in]    buffer that should back the vma
  * @vma:       [in]    vma for the mmap
  * @pgoff:     [in]    offset in pages where this mmap should start within the
- *                     dma-buf buffer.
+ *                     dma-buf buffer.
  *
  * This function adjusts the passed in vma so that it points at the file of the
  * dma_buf operation. It also adjusts the starting pgoff and does bounds
@@ -826,6 +836,7 @@ static int dma_buf_describe(struct seq_file *s)
 static int dma_buf_show(struct seq_file *s, void *unused)
 {
        void (*func)(struct seq_file *) = s->private;
+
        func(s);
        return 0;
 }
@@ -847,7 +858,9 @@ static struct dentry *dma_buf_debugfs_dir;
 static int dma_buf_init_debugfs(void)
 {
        int err = 0;
+
        dma_buf_debugfs_dir = debugfs_create_dir("dma_buf", NULL);
+
        if (IS_ERR(dma_buf_debugfs_dir)) {
                err = PTR_ERR(dma_buf_debugfs_dir);
                dma_buf_debugfs_dir = NULL;
index 39920d7..c0bd572 100644 (file)
@@ -337,7 +337,8 @@ retry:
        rcu_read_lock();
 
        if (wait_all) {
-               struct reservation_object_list *fobj = rcu_dereference(obj->fence);
+               struct reservation_object_list *fobj =
+                                               rcu_dereference(obj->fence);
 
                if (fobj)
                        shared_count = fobj->shared_count;
@@ -429,7 +430,8 @@ retry:
        if (test_all) {
                unsigned i;
 
-               struct reservation_object_list *fobj = rcu_dereference(obj->fence);
+               struct reservation_object_list *fobj =
+                                               rcu_dereference(obj->fence);
 
                if (fobj)
                        shared_count = fobj->shared_count;
@@ -462,7 +464,8 @@ retry:
                        goto unlock_retry;
 
                if (fence_excl) {
-                       ret = reservation_object_test_signaled_single(fence_excl);
+                       ret = reservation_object_test_signaled_single(
+                                                               fence_excl);
                        if (ret < 0)
                                goto unlock_retry;
                }
index 7d12a39..71127f8 100644 (file)
 static const char *seqno_fence_get_driver_name(struct fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
+
        return seqno_fence->ops->get_driver_name(fence);
 }
 
 static const char *seqno_fence_get_timeline_name(struct fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
+
        return seqno_fence->ops->get_timeline_name(fence);
 }
 
 static bool seqno_enable_signaling(struct fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
+
        return seqno_fence->ops->enable_signaling(fence);
 }
 
 static bool seqno_signaled(struct fence *fence)
 {
        struct seqno_fence *seqno_fence = to_seqno_fence(fence);
+
        return seqno_fence->ops->signaled && seqno_fence->ops->signaled(fence);
 }
 
@@ -56,9 +60,11 @@ static void seqno_release(struct fence *fence)
                fence_free(&f->base);
 }
 
-static signed long seqno_wait(struct fence *fence, bool intr, signed long timeout)
+static signed long seqno_wait(struct fence *fence, bool intr,
+                               signed long timeout)
 {
        struct seqno_fence *f = to_seqno_fence(fence);
+
        return f->ops->wait(fence, intr, timeout);
 }
 
index 2f0b431..f98bd70 100644 (file)
@@ -115,6 +115,8 @@ struct dma_buf_ops {
  * @attachments: list of dma_buf_attachment that denotes all devices attached.
  * @ops: dma_buf_ops associated with this buffer object.
  * @exp_name: name of the exporter; useful for debugging.
+ * @owner: pointer to exporter module; used for refcounting when exporter is a
+ *         kernel module.
  * @list_node: node for dma_buf accounting and debugging.
  * @priv: exporter specific private data for this buffer object.
  * @resv: reservation object linked to this dma-buf
@@ -129,6 +131,7 @@ struct dma_buf {
        unsigned vmapping_counter;
        void *vmap_ptr;
        const char *exp_name;
+       struct module *owner;
        struct list_head list_node;
        void *priv;
        struct reservation_object *resv;
@@ -164,7 +167,8 @@ struct dma_buf_attachment {
 
 /**
  * struct dma_buf_export_info - holds information needed to export a dma_buf
- * @exp_name:  name of the exporting module - useful for debugging.
+ * @exp_name:  name of the exporter - useful for debugging.
+ * @owner:     pointer to exporter module - used for refcounting kernel module
  * @ops:       Attach allocator-defined dma buf ops to the new buffer
  * @size:      Size of the buffer
  * @flags:     mode flags for the file
@@ -176,6 +180,7 @@ struct dma_buf_attachment {
  */
 struct dma_buf_export_info {
        const char *exp_name;
+       struct module *owner;
        const struct dma_buf_ops *ops;
        size_t size;
        int flags;
@@ -187,7 +192,8 @@ struct dma_buf_export_info {
  * helper macro for exporters; zeros and fills in most common values
  */
 #define DEFINE_DMA_BUF_EXPORT_INFO(a)  \
-       struct dma_buf_export_info a = { .exp_name = KBUILD_MODNAME }
+       struct dma_buf_export_info a = { .exp_name = KBUILD_MODNAME, \
+                                        .owner = THIS_MODULE }
 
 /**
  * get_dma_buf - convenience wrapper for get_file.