Message ID | 20200204025641.218376-2-senozhatsky@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Implement V4L2_BUF_FLAG_NO_CACHE_* flags | expand |
On 2/4/20 3:56 AM, Sergey Senozhatsky wrote: > Extend vb2_buffer and vb2_queue structs with cache management > members. > > V4L2 UAPI already contains two buffer flags which user-space, > supposedly, can use to control buffer cache sync: > > - V4L2_BUF_FLAG_NO_CACHE_INVALIDATE > - V4L2_BUF_FLAG_NO_CACHE_CLEAN > > None of these, however, do anything at the moment. This patch > set is intended to change it. > > Since user-space cache management hints are supposed to be > implemented on a per-buffer basis we need to extend vb2_buffer > struct with two new memebers ->need_cache_sync_on_prepare and > ->need_cache_sync_on_finish, which will store corresponding > user-space hints. > > In order to preserve the existing behaviour, user-space cache > managements flags will be handled only by those drivers that > permit user-space cache hints. That's the purpose of vb2_queue > ->allow_cache_hints member. Driver must set ->allow_cache_hints > during queue initialisation to enable cache management hints > mechanism. > > Only drivers that set ->allow_cache_hints during queue initialisation > will handle user-space cache management hints. Otherwise hints > will be ignored. > > Change-Id: I52beec2a0d021b7a3715b4f6ae4bfd9dc5e94f0d > Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org> > --- > include/media/videobuf2-core.h | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h > index a2b2208b02da..026004180440 100644 > --- a/include/media/videobuf2-core.h > +++ b/include/media/videobuf2-core.h > @@ -263,6 +263,10 @@ struct vb2_buffer { > * after the 'buf_finish' op is called. > * copied_timestamp: the timestamp of this capture buffer was copied > * from an output buffer. > + * need_cache_sync_on_prepare: do not sync/invalidate cache from > + * buffer's ->prepare() callback. > + * need_cache_sync_on_finish: do not sync/invalidate cache from buffer's > + * ->finish() callback. Shouldn't 'do not' be deleted from the flag descriptions? If the flag is set, then you need to sync/validate, right? Regards, Hans > * queued_entry: entry on the queued buffers list, which holds > * all buffers queued from userspace > * done_entry: entry on the list that stores all buffers ready > @@ -273,6 +277,8 @@ struct vb2_buffer { > unsigned int synced:1; > unsigned int prepared:1; > unsigned int copied_timestamp:1; > + unsigned int need_cache_sync_on_prepare:1; > + unsigned int need_cache_sync_on_finish:1; > > struct vb2_plane planes[VB2_MAX_PLANES]; > struct list_head queued_entry; > @@ -491,6 +497,9 @@ struct vb2_buf_ops { > * @uses_requests: requests are used for this queue. Set to 1 the first time > * a request is queued. Set to 0 when the queue is canceled. > * If this is 1, then you cannot queue buffers directly. > + * @allow_cache_hints: when set user-space can pass cache management hints in > + * order to skip cache flush/invalidation on ->prepare() or/and > + * ->finish(). > * @lock: pointer to a mutex that protects the &struct vb2_queue. The > * driver can set this to a mutex to let the v4l2 core serialize > * the queuing ioctls. If the driver wants to handle locking > @@ -564,6 +573,7 @@ struct vb2_queue { > unsigned requires_requests:1; > unsigned uses_qbuf:1; > unsigned uses_requests:1; > + unsigned allow_cache_hints:1; > > struct mutex *lock; > void *owner; >
On (20/02/19 09:05), Hans Verkuil wrote: > On 2/4/20 3:56 AM, Sergey Senozhatsky wrote: [..] > > diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h > > index a2b2208b02da..026004180440 100644 > > --- a/include/media/videobuf2-core.h > > +++ b/include/media/videobuf2-core.h > > @@ -263,6 +263,10 @@ struct vb2_buffer { > > * after the 'buf_finish' op is called. > > * copied_timestamp: the timestamp of this capture buffer was copied > > * from an output buffer. > > + * need_cache_sync_on_prepare: do not sync/invalidate cache from > > + * buffer's ->prepare() callback. > > + * need_cache_sync_on_finish: do not sync/invalidate cache from buffer's > > + * ->finish() callback. > > Shouldn't 'do not' be deleted from the flag descriptions? If the flag is set, > then you need to sync/validate, right? Hmm, kind of work both ways. Maybe the wording can be more specific, e.g. "Do/skip cache sync/invalidation" even more detailed "When set perform cache sync/invalidation from ..." -ss
On 2/19/20 9:16 AM, Sergey Senozhatsky wrote: > On (20/02/19 09:05), Hans Verkuil wrote: >> On 2/4/20 3:56 AM, Sergey Senozhatsky wrote: > > [..] > >>> diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h >>> index a2b2208b02da..026004180440 100644 >>> --- a/include/media/videobuf2-core.h >>> +++ b/include/media/videobuf2-core.h >>> @@ -263,6 +263,10 @@ struct vb2_buffer { >>> * after the 'buf_finish' op is called. >>> * copied_timestamp: the timestamp of this capture buffer was copied >>> * from an output buffer. >>> + * need_cache_sync_on_prepare: do not sync/invalidate cache from >>> + * buffer's ->prepare() callback. >>> + * need_cache_sync_on_finish: do not sync/invalidate cache from buffer's >>> + * ->finish() callback. >> >> Shouldn't 'do not' be deleted from the flag descriptions? If the flag is set, >> then you need to sync/validate, right? > > Hmm, kind of work both ways. Maybe the wording can be more specific, > e.g. "Do/skip cache sync/invalidation" even more detailed "When set > perform cache sync/invalidation from ..." "When set..." works well. It's explicit. Regards, Hans > > -ss >
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index a2b2208b02da..026004180440 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -263,6 +263,10 @@ struct vb2_buffer { * after the 'buf_finish' op is called. * copied_timestamp: the timestamp of this capture buffer was copied * from an output buffer. + * need_cache_sync_on_prepare: do not sync/invalidate cache from + * buffer's ->prepare() callback. + * need_cache_sync_on_finish: do not sync/invalidate cache from buffer's + * ->finish() callback. * queued_entry: entry on the queued buffers list, which holds * all buffers queued from userspace * done_entry: entry on the list that stores all buffers ready @@ -273,6 +277,8 @@ struct vb2_buffer { unsigned int synced:1; unsigned int prepared:1; unsigned int copied_timestamp:1; + unsigned int need_cache_sync_on_prepare:1; + unsigned int need_cache_sync_on_finish:1; struct vb2_plane planes[VB2_MAX_PLANES]; struct list_head queued_entry; @@ -491,6 +497,9 @@ struct vb2_buf_ops { * @uses_requests: requests are used for this queue. Set to 1 the first time * a request is queued. Set to 0 when the queue is canceled. * If this is 1, then you cannot queue buffers directly. + * @allow_cache_hints: when set user-space can pass cache management hints in + * order to skip cache flush/invalidation on ->prepare() or/and + * ->finish(). * @lock: pointer to a mutex that protects the &struct vb2_queue. The * driver can set this to a mutex to let the v4l2 core serialize * the queuing ioctls. If the driver wants to handle locking @@ -564,6 +573,7 @@ struct vb2_queue { unsigned requires_requests:1; unsigned uses_qbuf:1; unsigned uses_requests:1; + unsigned allow_cache_hints:1; struct mutex *lock; void *owner;
Extend vb2_buffer and vb2_queue structs with cache management members. V4L2 UAPI already contains two buffer flags which user-space, supposedly, can use to control buffer cache sync: - V4L2_BUF_FLAG_NO_CACHE_INVALIDATE - V4L2_BUF_FLAG_NO_CACHE_CLEAN None of these, however, do anything at the moment. This patch set is intended to change it. Since user-space cache management hints are supposed to be implemented on a per-buffer basis we need to extend vb2_buffer struct with two new memebers ->need_cache_sync_on_prepare and ->need_cache_sync_on_finish, which will store corresponding user-space hints. In order to preserve the existing behaviour, user-space cache managements flags will be handled only by those drivers that permit user-space cache hints. That's the purpose of vb2_queue ->allow_cache_hints member. Driver must set ->allow_cache_hints during queue initialisation to enable cache management hints mechanism. Only drivers that set ->allow_cache_hints during queue initialisation will handle user-space cache management hints. Otherwise hints will be ignored. Change-Id: I52beec2a0d021b7a3715b4f6ae4bfd9dc5e94f0d Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org> --- include/media/videobuf2-core.h | 10 ++++++++++ 1 file changed, 10 insertions(+)