Commit 93f0824c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dma-buf-for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/sumits/dma-buf

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
parents 2a298679 5136629d
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/anon_inodes.h> #include <linux/anon_inodes.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/reservation.h> #include <linux/reservation.h>
...@@ -72,6 +73,7 @@ static int dma_buf_release(struct inode *inode, struct file *file) ...@@ -72,6 +73,7 @@ static int dma_buf_release(struct inode *inode, struct file *file)
if (dmabuf->resv == (struct reservation_object *)&dmabuf[1]) if (dmabuf->resv == (struct reservation_object *)&dmabuf[1])
reservation_object_fini(dmabuf->resv); reservation_object_fini(dmabuf->resv);
module_put(dmabuf->owner);
kfree(dmabuf); kfree(dmabuf);
return 0; return 0;
} }
...@@ -285,6 +287,7 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info) ...@@ -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 reservation_object *resv = exp_info->resv;
struct file *file; struct file *file;
size_t alloc_size = sizeof(struct dma_buf); size_t alloc_size = sizeof(struct dma_buf);
if (!exp_info->resv) if (!exp_info->resv)
alloc_size += sizeof(struct reservation_object); alloc_size += sizeof(struct reservation_object);
else else
...@@ -302,14 +305,20 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info) ...@@ -302,14 +305,20 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
if (!try_module_get(exp_info->owner))
return ERR_PTR(-ENOENT);
dmabuf = kzalloc(alloc_size, GFP_KERNEL); dmabuf = kzalloc(alloc_size, GFP_KERNEL);
if (dmabuf == NULL) if (!dmabuf) {
module_put(exp_info->owner);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
dmabuf->priv = exp_info->priv; dmabuf->priv = exp_info->priv;
dmabuf->ops = exp_info->ops; dmabuf->ops = exp_info->ops;
dmabuf->size = exp_info->size; dmabuf->size = exp_info->size;
dmabuf->exp_name = exp_info->exp_name; dmabuf->exp_name = exp_info->exp_name;
dmabuf->owner = exp_info->owner;
init_waitqueue_head(&dmabuf->poll); init_waitqueue_head(&dmabuf->poll);
dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll; dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0; 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, ...@@ -545,7 +554,8 @@ int dma_buf_begin_cpu_access(struct dma_buf *dmabuf, size_t start, size_t len,
return -EINVAL; return -EINVAL;
if (dmabuf->ops->begin_cpu_access) 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; return ret;
} }
...@@ -826,6 +836,7 @@ static int dma_buf_describe(struct seq_file *s) ...@@ -826,6 +836,7 @@ static int dma_buf_describe(struct seq_file *s)
static int dma_buf_show(struct seq_file *s, void *unused) static int dma_buf_show(struct seq_file *s, void *unused)
{ {
void (*func)(struct seq_file *) = s->private; void (*func)(struct seq_file *) = s->private;
func(s); func(s);
return 0; return 0;
} }
...@@ -847,7 +858,9 @@ static struct dentry *dma_buf_debugfs_dir; ...@@ -847,7 +858,9 @@ static struct dentry *dma_buf_debugfs_dir;
static int dma_buf_init_debugfs(void) static int dma_buf_init_debugfs(void)
{ {
int err = 0; int err = 0;
dma_buf_debugfs_dir = debugfs_create_dir("dma_buf", NULL); dma_buf_debugfs_dir = debugfs_create_dir("dma_buf", NULL);
if (IS_ERR(dma_buf_debugfs_dir)) { if (IS_ERR(dma_buf_debugfs_dir)) {
err = PTR_ERR(dma_buf_debugfs_dir); err = PTR_ERR(dma_buf_debugfs_dir);
dma_buf_debugfs_dir = NULL; dma_buf_debugfs_dir = NULL;
......
...@@ -337,7 +337,8 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj, ...@@ -337,7 +337,8 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj,
rcu_read_lock(); rcu_read_lock();
if (wait_all) { if (wait_all) {
struct reservation_object_list *fobj = rcu_dereference(obj->fence); struct reservation_object_list *fobj =
rcu_dereference(obj->fence);
if (fobj) if (fobj)
shared_count = fobj->shared_count; shared_count = fobj->shared_count;
...@@ -429,7 +430,8 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj, ...@@ -429,7 +430,8 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj,
if (test_all) { if (test_all) {
unsigned i; unsigned i;
struct reservation_object_list *fobj = rcu_dereference(obj->fence); struct reservation_object_list *fobj =
rcu_dereference(obj->fence);
if (fobj) if (fobj)
shared_count = fobj->shared_count; shared_count = fobj->shared_count;
...@@ -462,7 +464,8 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj, ...@@ -462,7 +464,8 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj,
goto unlock_retry; goto unlock_retry;
if (fence_excl) { if (fence_excl) {
ret = reservation_object_test_signaled_single(fence_excl); ret = reservation_object_test_signaled_single(
fence_excl);
if (ret < 0) if (ret < 0)
goto unlock_retry; goto unlock_retry;
} }
......
...@@ -24,24 +24,28 @@ ...@@ -24,24 +24,28 @@
static const char *seqno_fence_get_driver_name(struct fence *fence) static const char *seqno_fence_get_driver_name(struct fence *fence)
{ {
struct seqno_fence *seqno_fence = to_seqno_fence(fence); struct seqno_fence *seqno_fence = to_seqno_fence(fence);
return seqno_fence->ops->get_driver_name(fence); return seqno_fence->ops->get_driver_name(fence);
} }
static const char *seqno_fence_get_timeline_name(struct fence *fence) static const char *seqno_fence_get_timeline_name(struct fence *fence)
{ {
struct seqno_fence *seqno_fence = to_seqno_fence(fence); struct seqno_fence *seqno_fence = to_seqno_fence(fence);
return seqno_fence->ops->get_timeline_name(fence); return seqno_fence->ops->get_timeline_name(fence);
} }
static bool seqno_enable_signaling(struct fence *fence) static bool seqno_enable_signaling(struct fence *fence)
{ {
struct seqno_fence *seqno_fence = to_seqno_fence(fence); struct seqno_fence *seqno_fence = to_seqno_fence(fence);
return seqno_fence->ops->enable_signaling(fence); return seqno_fence->ops->enable_signaling(fence);
} }
static bool seqno_signaled(struct fence *fence) static bool seqno_signaled(struct fence *fence)
{ {
struct seqno_fence *seqno_fence = to_seqno_fence(fence); struct seqno_fence *seqno_fence = to_seqno_fence(fence);
return seqno_fence->ops->signaled && seqno_fence->ops->signaled(fence); return seqno_fence->ops->signaled && seqno_fence->ops->signaled(fence);
} }
...@@ -56,9 +60,11 @@ static void seqno_release(struct fence *fence) ...@@ -56,9 +60,11 @@ static void seqno_release(struct fence *fence)
fence_free(&f->base); 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); struct seqno_fence *f = to_seqno_fence(fence);
return f->ops->wait(fence, intr, timeout); return f->ops->wait(fence, intr, timeout);
} }
......
...@@ -115,6 +115,8 @@ struct dma_buf_ops { ...@@ -115,6 +115,8 @@ struct dma_buf_ops {
* @attachments: list of dma_buf_attachment that denotes all devices attached. * @attachments: list of dma_buf_attachment that denotes all devices attached.
* @ops: dma_buf_ops associated with this buffer object. * @ops: dma_buf_ops associated with this buffer object.
* @exp_name: name of the exporter; useful for debugging. * @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. * @list_node: node for dma_buf accounting and debugging.
* @priv: exporter specific private data for this buffer object. * @priv: exporter specific private data for this buffer object.
* @resv: reservation object linked to this dma-buf * @resv: reservation object linked to this dma-buf
...@@ -129,6 +131,7 @@ struct dma_buf { ...@@ -129,6 +131,7 @@ struct dma_buf {
unsigned vmapping_counter; unsigned vmapping_counter;
void *vmap_ptr; void *vmap_ptr;
const char *exp_name; const char *exp_name;
struct module *owner;
struct list_head list_node; struct list_head list_node;
void *priv; void *priv;
struct reservation_object *resv; struct reservation_object *resv;
...@@ -164,7 +167,8 @@ struct dma_buf_attachment { ...@@ -164,7 +167,8 @@ struct dma_buf_attachment {
/** /**
* struct dma_buf_export_info - holds information needed to export a dma_buf * 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 * @ops: Attach allocator-defined dma buf ops to the new buffer
* @size: Size of the buffer * @size: Size of the buffer
* @flags: mode flags for the file * @flags: mode flags for the file
...@@ -176,6 +180,7 @@ struct dma_buf_attachment { ...@@ -176,6 +180,7 @@ struct dma_buf_attachment {
*/ */
struct dma_buf_export_info { struct dma_buf_export_info {
const char *exp_name; const char *exp_name;
struct module *owner;
const struct dma_buf_ops *ops; const struct dma_buf_ops *ops;
size_t size; size_t size;
int flags; int flags;
...@@ -187,7 +192,8 @@ struct dma_buf_export_info { ...@@ -187,7 +192,8 @@ struct dma_buf_export_info {
* helper macro for exporters; zeros and fills in most common values * helper macro for exporters; zeros and fills in most common values
*/ */
#define DEFINE_DMA_BUF_EXPORT_INFO(a) \ #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. * get_dma_buf - convenience wrapper for get_file.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment