| From 3c7470b6f68434acae459482ab920d1e3fabd1c7 Mon Sep 17 00:00:00 2001 |
| From: John Hubbard <jhubbard@nvidia.com> |
| Date: Thu, 30 Jan 2020 22:12:50 -0800 |
| Subject: media/v4l2-core: set pages dirty upon releasing DMA buffers |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: John Hubbard <jhubbard@nvidia.com> |
| |
| commit 3c7470b6f68434acae459482ab920d1e3fabd1c7 upstream. |
| |
| After DMA is complete, and the device and CPU caches are synchronized, |
| it's still required to mark the CPU pages as dirty, if the data was |
| coming from the device. However, this driver was just issuing a bare |
| put_page() call, without any set_page_dirty*() call. |
| |
| Fix the problem, by calling set_page_dirty_lock() if the CPU pages were |
| potentially receiving data from the device. |
| |
| Link: http://lkml.kernel.org/r/20200107224558.2362728-11-jhubbard@nvidia.com |
| Signed-off-by: John Hubbard <jhubbard@nvidia.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Acked-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Cc: Mauro Carvalho Chehab <mchehab@kernel.org> |
| Cc: <stable@vger.kernel.org> |
| Cc: Alex Williamson <alex.williamson@redhat.com> |
| Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> |
| Cc: Björn Töpel <bjorn.topel@intel.com> |
| Cc: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Cc: Dan Williams <dan.j.williams@intel.com> |
| Cc: Ira Weiny <ira.weiny@intel.com> |
| Cc: Jan Kara <jack@suse.cz> |
| Cc: Jason Gunthorpe <jgg@mellanox.com> |
| Cc: Jason Gunthorpe <jgg@ziepe.ca> |
| Cc: Jens Axboe <axboe@kernel.dk> |
| Cc: Jerome Glisse <jglisse@redhat.com> |
| Cc: Jonathan Corbet <corbet@lwn.net> |
| Cc: Kirill A. Shutemov <kirill@shutemov.name> |
| Cc: Leon Romanovsky <leonro@mellanox.com> |
| Cc: Mike Rapoport <rppt@linux.ibm.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/v4l2-core/videobuf-dma-sg.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/media/v4l2-core/videobuf-dma-sg.c |
| +++ b/drivers/media/v4l2-core/videobuf-dma-sg.c |
| @@ -352,8 +352,11 @@ int videobuf_dma_free(struct videobuf_dm |
| BUG_ON(dma->sglen); |
| |
| if (dma->pages) { |
| - for (i = 0; i < dma->nr_pages; i++) |
| + for (i = 0; i < dma->nr_pages; i++) { |
| + if (dma->direction == DMA_FROM_DEVICE) |
| + set_page_dirty_lock(dma->pages[i]); |
| put_page(dma->pages[i]); |
| + } |
| kfree(dma->pages); |
| dma->pages = NULL; |
| } |