diff options
author | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2018-12-17 10:34:24 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2018-12-17 10:34:24 -0500 |
commit | 4bd257d884902b81493cf11531915009ab5787cf (patch) | |
tree | bf60af2fb9454154e30b888f7f86a9845ad2c4b7 /drivers/media/common | |
parent | d2b4387f3bdf016e266d23cf657465f557721488 (diff) | |
parent | 7566ec393f4161572ba6f11ad5171fd5d59b0fbd (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.c | 44 | ||||
-rw-r--r-- | drivers/media/common/videobuf2/videobuf2-v4l2.c | 13 |
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 | ||
1367 | static const struct media_request_object_ops vb2_core_req_ops = { | 1371 | static 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 | ||
334 | static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *mdev, | 334 | static 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 | ||
637 | int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) | 642 | int 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); |