On (20/03/09 12:27), Sergey Senozhatsky wrote: > On (20/03/07 12:47), Hans Verkuil wrote: > > > > Create those tests in v4l2-compliance: that's where they belong. > > > > You need these tests: > > > > For non-MMAP modes: > > > > 1) test that V4L2_BUF_CAP_SUPPORTS_CACHE_HINTS is never set. > > > > If V4L2_BUF_CAP_SUPPORTS_CACHE_HINTS is not set, then: > > > > 1) attempting to use V4L2_FLAG_MEMORY_NON_CONSISTENT will clear the flag > > upon return (test with both reqbufs and create_bufs). > > 2) attempting to use V4L2_BUF_FLAG_NO_CACHE_INVALIDATE or V4L2_BUF_FLAG_NO_CACHE_CLEAN > > will clear those flags upon return (do we actually do that in the patch series?). > > NO_CACHE_INVALIDATE/NO_CACHE_CLEAN are cleared in vb2_fill_vb2_v4l2_buffer() > [as was suggested], then the struct is copied back to user. But I think it > would be better to clear those flags when we clear > V4L2_FLAG_MEMORY_NON_CONSISTENT. We have 4 places which do something > like > "if !vb2_queue_allows_cache_hints(q) then clear flags bit". No. I'll just move NO_CACHE_INVALIDATE/NO_CACHE_CLEAN handling to set_buffer_cache_hints(). This is where we take care of q->memory and q->allow_cache_hints, this is where we set/clear the ->need_cache_sync flags, this is where we also can clear v4l2_buffer ->flags. Seems like a better place than vb2_fill_vb2_v4l2_buffer(). --- .../media/common/videobuf2/videobuf2-v4l2.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c index b4b379f3bf98..0a6bd4a1f58e 100644 --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c @@ -199,15 +199,6 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b vbuf->request_fd = -1; vbuf->is_held = false; - /* - * Clear buffer cache flags if queue does not support user space hints. - * That's to indicate to userspace that these flags won't work. - */ - if (!vb2_queue_allows_cache_hints(q)) { - b->flags &= ~V4L2_BUF_FLAG_NO_CACHE_INVALIDATE; - b->flags &= ~V4L2_BUF_FLAG_NO_CACHE_CLEAN; - } - if (V4L2_TYPE_IS_MULTIPLANAR(b->type)) { switch (b->memory) { case VB2_MEMORY_USERPTR: @@ -368,8 +359,16 @@ static void set_buffer_cache_hints(struct vb2_queue *q, vb->need_cache_sync_on_prepare = 1; vb->need_cache_sync_on_finish = 1; - if (!vb2_queue_allows_cache_hints(q)) + if (!vb2_queue_allows_cache_hints(q)) { + /* + * Clear buffer cache flags if queue does not support user + * space hints. That's to indicate to userspace that these + * flags won't work. + */ + b->flags &= ~V4L2_BUF_FLAG_NO_CACHE_INVALIDATE; + b->flags &= ~V4L2_BUF_FLAG_NO_CACHE_CLEAN; return; + } /* * ->finish() cache sync can be avoided when queue direction is -- 2.25.1