On 11/3/19 10:17 PM, John Hubbard wrote: > 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. > > Cc: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx> > Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx> Acked-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx> Looks good, thanks! Hans > --- > drivers/media/v4l2-core/videobuf-dma-sg.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/v4l2-core/videobuf-dma-sg.c b/drivers/media/v4l2-core/videobuf-dma-sg.c > index 66a6c6c236a7..28262190c3ab 100644 > --- a/drivers/media/v4l2-core/videobuf-dma-sg.c > +++ b/drivers/media/v4l2-core/videobuf-dma-sg.c > @@ -349,8 +349,11 @@ int videobuf_dma_free(struct videobuf_dmabuf *dma) > 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; > } >