Minor changes for 4.2
- add ref-counting for kernel modules as exporters - minor code style fixes -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJVjVZEAAoJEAG+/NWsLn5bpj0P/jcGdZ8COA5Z9JTGa/aJFPkq HcPwL95jbttI6GEjuilUSNwu1PtQH3puOBBvPFcbHaOQLLchRI+J7vQ517cFAVxq rDyuUZLTnrnb15l8afJb5GqQf+CzHcnmPYCTBUjsSfhPJYfMPs34/4Dl4WHFL9YO tzqmWBp3o3SMzfNL47ilU4g3jjmaHNP+vq+IYQLcvWHO08c6sNtbyjI/mggT52LD foi1Lq/hzS4uOBjBAOWLdmHm4Elq4uMCLyA9eDQW3K+jb912IT5jxuv/eF4NR9TP wPA0K66ca529Z93G8B4C+52TTt60jUzJDDH8/5S1Kh1ycCpV+3sArJR/8B5iN82+ G8FM441JCsQGvRfFEyFbTWmu+I2yiTaCjaiSJ1UnvWPxHQljT15+mL/Y/hrGZD9O RtBxTYNWDdhNqLfFLcS3vLwbHAa9KxaM7YX4AKweMxXHgyUEXFcjyX2pfVaI1qVH 5PirSktRG6y1oiy48f0GgVadayOhOwo+biWbwxd0PYtGI+vJa3I1nLuNPSyRch8z AbLEXBmamobrIy5YJp5pMK6GrcriPHl0PGRm+rEyh+A3qX6Lwsr9VOYjjVcAsT3s toqrdIPGF4+SC+0MY+tkOCA+u1KO4fmvuSldGys40vFfC+bzh2P4MEN2KzQ9uqUo pscJcra0RXdm0z0JvbCU =r0yn -----END PGP SIGNATURE----- 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
This commit is contained in:
Коммит
93f0824cae
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -24,24 +24,28 @@
|
|||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче