On (20/04/28 16:47), Hans Verkuil wrote:
> Hi Sergey,
> 
> On 24/04/2020 11:29, Sergey Senozhatsky wrote:

[..]

> I missed that. What should happen is that q->allow_cache_hints is set by the
> driver before vb2_queue_init is called. And the documentation should be 
> updated
> to say that the V4L2_BUF_CAP_SUPPORTS_CACHE_HINTS flag is only valid when 
> using the
> MMAP streaming I/O model.
> 
> Perhaps the flag should be renamed to V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS 
> to
> make this explicit? Other opinions are welcome.
> 
> > 
> > Second. Even if the queue is setup, we still can report wrong cache
> > hint values. Let's look at the following code
> > 
> >     fill_buf_caps(q, &p->capabilities);
> >     if (!vb2_queue_allows_cache_hints(q))
> >             p->flags &= ~V4L2_FLAG_MEMORY_NON_CONSISTENT;
> 
> The problem here is that vb2_queue_allows_cache_hints(q) uses stale 
> information:
> the current streaming mode instead of the requested streaming mode.
> 
> This should read:
> 
>       if (!q->allow_cache_hints || p->memory != V4L2_MEMORY_MMAP)
>               p->flags &= ~V4L2_FLAG_MEMORY_NON_CONSISTENT;
> 
> And V4L2_BUF_CAP_SUPPORTS_CACHE_HINTS is always set regardless of the
> memory model. It just needs to be documented that this capability applies
> to MMAP mode only.
> 
> >     ret = vb2_core_reqbufs(...);
> >     return ret;
> > 
> > The thing here is that vb2_core_reqbufs() and vb2_core_create_bufs()
> > can re-initialize the queue and invoke ->queue_setup(), possibly
> > changing its memory model, etc. so cache hints cap which we set or
> > clear before vb2_core_reqbufs() and vb2_core_create_bufs() can become
> > invalid after we call those functions. It's the same with
> > ``req->flags &= ~V4L2_FLAG_MEMORY_NON_CONSISTENT``, we cannot clear
> > it before reqbufs()/create_bufs(). Therefore I added two simple
> > functions which fixup cache hint cap and non_consistent flag after
> > reqbufs()/create_bufs(). So the code looks like this now:
> > 
> >     fill_buf_caps(q, &p->capabilities);
> >     ret = vb2_core_reqbufs(...);
> >     fixup_consistency_attr(q, &p->flags);
> >     fixup_cache_hints_cap(q, &p->capabilities);
> 
> These fixup functions are ugly, unless I missed something I think the
> approach described above works just fine.
> 
> With these changes I think it is ready to go in.

ACK to all of these.
Will send the updated patch set shortly.

        -ss

Reply via email to