dma-buf updates for 3.12
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJSMFL8AAoJEAG+/NWsLn5bN8kP/RsMj8bxkQ3XZt3rj4kwOSpz VV0hVB+M3OnrZft8CJVJ0qoXyeH+oWFRUfUmfF408A9plSLG85/tau0cOVyND279 pW+y1z/DP82rUn9JhFgBpPGmcUoMruKdBxf4wBV3mmquq16eEu7zPAYPWmnnyUpd jOokf+w6jhdJ/ztAqjMBXwO0vcrK0zG03NpmNbIlHh47ofCCOxHvld4aq3Yia7dd rSkrvcYTfMAQx5C5qGLtxwD+hnx6hWAn9OUj4oIHKF2QlUG+47lOZaT0ZDpDEk53 dse2wHxFwHmWg4AjIBkMBvCHpvdm3MZ3HMsM1Z63e944rt8p5s3WkF+R++l6oXN7 bgcAIZGG1ZNvwnu4ZAwV0kJ5uPy74V1LA/zuE+4Fa+qtWhOqo/VxcQKtzzgMh8oY 29iisOez8MlCj9QV+MSb9KYfB8rR6EQL2LpEmKYY/jZo1cfhtayfyoWD9wLYNFFM 3Jz2yjb7IMvGXUAXmynMCk9OWX6hoIu7xiR9VSNYvjOMK/JrlKb+CSV7o3ieka7I pC2Ep1kblCDXCDUkoej+E0mWzLAnkMjHlYtBmKnOoQpenL43si3C5WwWoD77IjdR ZEH2rNeGy6pVfxFBUiMj0aCJsI+vbYV3UXyNSMIy4XxOLVL3prb1W0+FM4lZk9It MpU3ep2rFaCOp6KZLr0y =7NUB -----END PGP SIGNATURE----- Merge tag 'for-3.12' of git://git.linaro.org/people/sumitsemwal/linux-dma-buf Pull dma-buf updates from Sumit Semwal: "Yet another small one - dma-buf framework now supports size discovery of the buffer via llseek" * tag 'for-3.12' of git://git.linaro.org/people/sumitsemwal/linux-dma-buf: dma-buf: Expose buffer size to userspace (v2) dma-buf: Check return value of anon_inode_getfile
This commit is contained in:
commit
b3b7568490
|
@ -407,6 +407,18 @@ Being able to mmap an export dma-buf buffer object has 2 main use-cases:
|
||||||
interesting ways depending upong the exporter (if userspace starts depending
|
interesting ways depending upong the exporter (if userspace starts depending
|
||||||
upon this implicit synchronization).
|
upon this implicit synchronization).
|
||||||
|
|
||||||
|
Other Interfaces Exposed to Userspace on the dma-buf FD
|
||||||
|
------------------------------------------------------
|
||||||
|
|
||||||
|
- Since kernel 3.12 the dma-buf FD supports the llseek system call, but only
|
||||||
|
with offset=0 and whence=SEEK_END|SEEK_SET. SEEK_SET is supported to allow
|
||||||
|
the usual size discover pattern size = SEEK_END(0); SEEK_SET(0). Every other
|
||||||
|
llseek operation will report -EINVAL.
|
||||||
|
|
||||||
|
If llseek on dma-buf FDs isn't support the kernel will report -ESPIPE for all
|
||||||
|
cases. Userspace can use this to detect support for discovering the dma-buf
|
||||||
|
size using llseek.
|
||||||
|
|
||||||
Miscellaneous notes
|
Miscellaneous notes
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
|
|
@ -77,9 +77,36 @@ static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma)
|
||||||
return dmabuf->ops->mmap(dmabuf, vma);
|
return dmabuf->ops->mmap(dmabuf, vma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence)
|
||||||
|
{
|
||||||
|
struct dma_buf *dmabuf;
|
||||||
|
loff_t base;
|
||||||
|
|
||||||
|
if (!is_dma_buf_file(file))
|
||||||
|
return -EBADF;
|
||||||
|
|
||||||
|
dmabuf = file->private_data;
|
||||||
|
|
||||||
|
/* only support discovering the end of the buffer,
|
||||||
|
but also allow SEEK_SET to maintain the idiomatic
|
||||||
|
SEEK_END(0), SEEK_CUR(0) pattern */
|
||||||
|
if (whence == SEEK_END)
|
||||||
|
base = dmabuf->size;
|
||||||
|
else if (whence == SEEK_SET)
|
||||||
|
base = 0;
|
||||||
|
else
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (offset != 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return base + offset;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct file_operations dma_buf_fops = {
|
static const struct file_operations dma_buf_fops = {
|
||||||
.release = dma_buf_release,
|
.release = dma_buf_release,
|
||||||
.mmap = dma_buf_mmap_internal,
|
.mmap = dma_buf_mmap_internal,
|
||||||
|
.llseek = dma_buf_llseek,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -133,7 +160,12 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
|
||||||
dmabuf->exp_name = exp_name;
|
dmabuf->exp_name = exp_name;
|
||||||
|
|
||||||
file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf, flags);
|
file = anon_inode_getfile("dmabuf", &dma_buf_fops, dmabuf, flags);
|
||||||
|
if (IS_ERR(file)) {
|
||||||
|
kfree(dmabuf);
|
||||||
|
return ERR_CAST(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
file->f_mode |= FMODE_LSEEK;
|
||||||
dmabuf->file = file;
|
dmabuf->file = file;
|
||||||
|
|
||||||
mutex_init(&dmabuf->lock);
|
mutex_init(&dmabuf->lock);
|
||||||
|
|
Loading…
Reference in New Issue