summaryrefslogtreecommitdiffstats
path: root/drivers/media/common
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab+samsung@kernel.org>2018-12-17 10:34:24 -0500
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2018-12-17 10:34:24 -0500
commit4bd257d884902b81493cf11531915009ab5787cf (patch)
treebf60af2fb9454154e30b888f7f86a9845ad2c4b7 /drivers/media/common
parentd2b4387f3bdf016e266d23cf657465f557721488 (diff)
parent7566ec393f4161572ba6f11ad5171fd5d59b0fbd (diff)
Merge tag 'v4.20-rc7' into patchwork
Linux 4.20-rc7 * tag 'v4.20-rc7': (403 commits) Linux 4.20-rc7 scripts/spdxcheck.py: always open files in binary mode checkstack.pl: fix for aarch64 userfaultfd: check VM_MAYWRITE was set after verifying the uffd is registered fs/iomap.c: get/put the page in iomap_page_create/release() hugetlbfs: call VM_BUG_ON_PAGE earlier in free_huge_page() memblock: annotate memblock_is_reserved() with __init_memblock psi: fix reference to kernel commandline enable arch/sh/include/asm/io.h: provide prototypes for PCI I/O mapping in asm/io.h mm/sparse: add common helper to mark all memblocks present mm: introduce common STRUCT_PAGE_MAX_SHIFT define alpha: fix hang caused by the bootmem removal XArray: Fix xa_alloc when id exceeds max drm/vmwgfx: Protect from excessive execbuf kernel memory allocations v3 MAINTAINERS: Daniel for drm co-maintainer drm/amdgpu: drop fclk/gfxclk ratio setting IB/core: Fix oops in netdev_next_upper_dev_rcu() dm thin: bump target version drm/vmwgfx: remove redundant return ret statement drm/i915: Flush GPU relocs harder for gen3 ...
Diffstat (limited to 'drivers/media/common')
-rw-r--r--drivers/media/common/videobuf2/videobuf2-core.c44
-rw-r--r--drivers/media/common/videobuf2/videobuf2-v4l2.c13
2 files changed, 44 insertions, 13 deletions
diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
index 0ca81d495bda..70e8c3366f9c 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -948,7 +948,7 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
948 } 948 }
949 atomic_dec(&q->owned_by_drv_count); 949 atomic_dec(&q->owned_by_drv_count);
950 950
951 if (vb->req_obj.req) { 951 if (state != VB2_BUF_STATE_QUEUED && vb->req_obj.req) {
952 /* This is not supported at the moment */ 952 /* This is not supported at the moment */
953 WARN_ON(state == VB2_BUF_STATE_REQUEUEING); 953 WARN_ON(state == VB2_BUF_STATE_REQUEUEING);
954 media_request_object_unbind(&vb->req_obj); 954 media_request_object_unbind(&vb->req_obj);
@@ -1360,8 +1360,12 @@ static void vb2_req_release(struct media_request_object *obj)
1360{ 1360{
1361 struct vb2_buffer *vb = container_of(obj, struct vb2_buffer, req_obj); 1361 struct vb2_buffer *vb = container_of(obj, struct vb2_buffer, req_obj);
1362 1362
1363 if (vb->state == VB2_BUF_STATE_IN_REQUEST) 1363 if (vb->state == VB2_BUF_STATE_IN_REQUEST) {
1364 vb->state = VB2_BUF_STATE_DEQUEUED; 1364 vb->state = VB2_BUF_STATE_DEQUEUED;
1365 if (vb->request)
1366 media_request_put(vb->request);
1367 vb->request = NULL;
1368 }
1365} 1369}
1366 1370
1367static const struct media_request_object_ops vb2_core_req_ops = { 1371static const struct media_request_object_ops vb2_core_req_ops = {
@@ -1529,6 +1533,18 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
1529 return ret; 1533 return ret;
1530 1534
1531 vb->state = VB2_BUF_STATE_IN_REQUEST; 1535 vb->state = VB2_BUF_STATE_IN_REQUEST;
1536
1537 /*
1538 * Increment the refcount and store the request.
1539 * The request refcount is decremented again when the
1540 * buffer is dequeued. This is to prevent vb2_buffer_done()
1541 * from freeing the request from interrupt context, which can
1542 * happen if the application closed the request fd after
1543 * queueing the request.
1544 */
1545 media_request_get(req);
1546 vb->request = req;
1547
1532 /* Fill buffer information for the userspace */ 1548 /* Fill buffer information for the userspace */
1533 if (pb) { 1549 if (pb) {
1534 call_void_bufop(q, copy_timestamp, vb, pb); 1550 call_void_bufop(q, copy_timestamp, vb, pb);
@@ -1750,10 +1766,6 @@ static void __vb2_dqbuf(struct vb2_buffer *vb)
1750 call_void_memop(vb, unmap_dmabuf, vb->planes[i].mem_priv); 1766 call_void_memop(vb, unmap_dmabuf, vb->planes[i].mem_priv);
1751 vb->planes[i].dbuf_mapped = 0; 1767 vb->planes[i].dbuf_mapped = 0;
1752 } 1768 }
1753 if (vb->req_obj.req) {
1754 media_request_object_unbind(&vb->req_obj);
1755 media_request_object_put(&vb->req_obj);
1756 }
1757 call_void_bufop(q, init_buffer, vb); 1769 call_void_bufop(q, init_buffer, vb);
1758} 1770}
1759 1771
@@ -1798,6 +1810,14 @@ int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb,
1798 /* go back to dequeued state */ 1810 /* go back to dequeued state */
1799 __vb2_dqbuf(vb); 1811 __vb2_dqbuf(vb);
1800 1812
1813 if (WARN_ON(vb->req_obj.req)) {
1814 media_request_object_unbind(&vb->req_obj);
1815 media_request_object_put(&vb->req_obj);
1816 }
1817 if (vb->request)
1818 media_request_put(vb->request);
1819 vb->request = NULL;
1820
1801 dprintk(2, "dqbuf of buffer %d, with state %d\n", 1821 dprintk(2, "dqbuf of buffer %d, with state %d\n",
1802 vb->index, vb->state); 1822 vb->index, vb->state);
1803 1823
@@ -1904,6 +1924,14 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
1904 vb->prepared = false; 1924 vb->prepared = false;
1905 } 1925 }
1906 __vb2_dqbuf(vb); 1926 __vb2_dqbuf(vb);
1927
1928 if (vb->req_obj.req) {
1929 media_request_object_unbind(&vb->req_obj);
1930 media_request_object_put(&vb->req_obj);
1931 }
1932 if (vb->request)
1933 media_request_put(vb->request);
1934 vb->request = NULL;
1907 } 1935 }
1908} 1936}
1909 1937
@@ -1941,10 +1969,8 @@ int vb2_core_streamon(struct vb2_queue *q, unsigned int type)
1941 if (ret) 1969 if (ret)
1942 return ret; 1970 return ret;
1943 ret = vb2_start_streaming(q); 1971 ret = vb2_start_streaming(q);
1944 if (ret) { 1972 if (ret)
1945 __vb2_queue_cancel(q);
1946 return ret; 1973 return ret;
1947 }
1948 } 1974 }
1949 1975
1950 q->streaming = 1; 1976 q->streaming = 1;
diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c
index 1244c246d0c4..78a841b83d41 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -332,10 +332,10 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
332} 332}
333 333
334static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *mdev, 334static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
335 struct v4l2_buffer *b, 335 struct v4l2_buffer *b, bool is_prepare,
336 const char *opname,
337 struct media_request **p_req) 336 struct media_request **p_req)
338{ 337{
338 const char *opname = is_prepare ? "prepare_buf" : "qbuf";
339 struct media_request *req; 339 struct media_request *req;
340 struct vb2_v4l2_buffer *vbuf; 340 struct vb2_v4l2_buffer *vbuf;
341 struct vb2_buffer *vb; 341 struct vb2_buffer *vb;
@@ -377,6 +377,9 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
377 return ret; 377 return ret;
378 } 378 }
379 379
380 if (is_prepare)
381 return 0;
382
380 if (!(b->flags & V4L2_BUF_FLAG_REQUEST_FD)) { 383 if (!(b->flags & V4L2_BUF_FLAG_REQUEST_FD)) {
381 if (q->uses_requests) { 384 if (q->uses_requests) {
382 dprintk(1, "%s: queue uses requests\n", opname); 385 dprintk(1, "%s: queue uses requests\n", opname);
@@ -630,8 +633,10 @@ static void fill_buf_caps(struct vb2_queue *q, u32 *caps)
630 *caps |= V4L2_BUF_CAP_SUPPORTS_USERPTR; 633 *caps |= V4L2_BUF_CAP_SUPPORTS_USERPTR;
631 if (q->io_modes & VB2_DMABUF) 634 if (q->io_modes & VB2_DMABUF)
632 *caps |= V4L2_BUF_CAP_SUPPORTS_DMABUF; 635 *caps |= V4L2_BUF_CAP_SUPPORTS_DMABUF;
636#ifdef CONFIG_MEDIA_CONTROLLER_REQUEST_API
633 if (q->supports_requests) 637 if (q->supports_requests)
634 *caps |= V4L2_BUF_CAP_SUPPORTS_REQUESTS; 638 *caps |= V4L2_BUF_CAP_SUPPORTS_REQUESTS;
639#endif
635} 640}
636 641
637int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) 642int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
@@ -656,7 +661,7 @@ int vb2_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
656 if (b->flags & V4L2_BUF_FLAG_REQUEST_FD) 661 if (b->flags & V4L2_BUF_FLAG_REQUEST_FD)
657 return -EINVAL; 662 return -EINVAL;
658 663
659 ret = vb2_queue_or_prepare_buf(q, mdev, b, "prepare_buf", NULL); 664 ret = vb2_queue_or_prepare_buf(q, mdev, b, true, NULL);
660 665
661 return ret ? ret : vb2_core_prepare_buf(q, b->index, b); 666 return ret ? ret : vb2_core_prepare_buf(q, b->index, b);
662} 667}
@@ -728,7 +733,7 @@ int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev,
728 return -EBUSY; 733 return -EBUSY;
729 } 734 }
730 735
731 ret = vb2_queue_or_prepare_buf(q, mdev, b, "qbuf", &req); 736 ret = vb2_queue_or_prepare_buf(q, mdev, b, false, &req);
732 if (ret) 737 if (ret)
733 return ret; 738 return ret;
734 ret = vb2_core_qbuf(q, b->index, b, req); 739 ret = vb2_core_qbuf(q, b->index, b, req);