Since fd will be reused even if dma buffer doesn't release,
this will cause output buffer error when use usb camera
with mjpeg or h264 format.
Change-Id: I2baeb2c5d9127df0a0eb362b8c577c05ceca470d
Signed-off-by: Jung Zhao <jung.zhao@rock-chips.com>
};
void *cpu_addr;
unsigned long size;
};
void *cpu_addr;
unsigned long size;
int index;
struct dma_buf_attachment *attach;
struct sg_table *sgt;
int index;
struct dma_buf_attachment *attach;
struct sg_table *sgt;
int fd)
{
struct vcodec_drm_buffer *drm_buffer = NULL, *n;
int fd)
{
struct vcodec_drm_buffer *drm_buffer = NULL, *n;
+ struct dma_buf *dma_buf = NULL;
+
+ dma_buf = dma_buf_get(fd);
list_for_each_entry_safe(drm_buffer, n, &session_info->buffer_list,
list) {
list_for_each_entry_safe(drm_buffer, n, &session_info->buffer_list,
list) {
- if (drm_buffer->fd == fd)
+ if (drm_buffer->dma_buf == dma_buf) {
+ dma_buf_put(dma_buf);
+ dma_buf_put(dma_buf);
+
list_for_each_entry_safe(drm_buffer, n, &session_info->buffer_list,
list) {
vpu_iommu_debug(session_info->debug_level, DEBUG_IOMMU_OPS_DUMP,
list_for_each_entry_safe(drm_buffer, n, &session_info->buffer_list,
list) {
vpu_iommu_debug(session_info->debug_level, DEBUG_IOMMU_OPS_DUMP,
- "index %d drm_buffer fd %d cpu_addr %p\n",
+ "index %d drm_buffer dma_buf %p cpu_addr %p\n",
- drm_buffer->fd, drm_buffer->cpu_addr);
+ drm_buffer->dma_buf, drm_buffer->cpu_addr);
struct device *dev = session_info->dev;
struct dma_buf_attachment *attach;
struct sg_table *sgt;
struct device *dev = session_info->dev;
struct dma_buf_attachment *attach;
struct sg_table *sgt;
+ struct dma_buf *dma_buf;
+ dma_buf = dma_buf_get(fd);
+ if (IS_ERR(dma_buf)) {
+ ret = PTR_ERR(dma_buf);
+ return ret;
+ }
+
list_for_each_entry_safe(drm_buffer, n,
&session_info->buffer_list, list) {
list_for_each_entry_safe(drm_buffer, n,
&session_info->buffer_list, list) {
- if (drm_buffer->fd == fd)
+ if (drm_buffer->dma_buf == dma_buf) {
+ dma_buf_put(dma_buf);
return drm_buffer->index;
return drm_buffer->index;
}
drm_buffer = kzalloc(sizeof(*drm_buffer), GFP_KERNEL);
}
drm_buffer = kzalloc(sizeof(*drm_buffer), GFP_KERNEL);
- drm_buffer->dma_buf = dma_buf_get(fd);
- if (IS_ERR(drm_buffer->dma_buf)) {
- ret = PTR_ERR(drm_buffer->dma_buf);
- kfree(drm_buffer);
- return ret;
- }
- drm_buffer->fd = fd;
+ drm_buffer->dma_buf = dma_buf;
drm_buffer->session_info = session_info;
kref_init(&drm_buffer->ref);
drm_buffer->session_info = session_info;
kref_init(&drm_buffer->ref);