Re: RFC: Proposal to change the way pending events are handled

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 7, 2011 at 3:46 PM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote:
> On Tuesday, June 07, 2011 14:30:38 Sakari Ailus wrote:
>> Laurent Pinchart wrote:
>> > Hi Hans and David,
>> >
>> > On Tuesday 07 June 2011 13:51:38 David Cohen wrote:
>> >> On Tue, Jun 7, 2011 at 2:29 PM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote:
>> >>> While working on the control events I realized that the way we handle
>> >>> pending events is rather complicated.
>> >>>
>> >>> What currently happens internally is that you have to allocate a fixed
>> >>> sized list of events. New events are queued on the 'available' list and
>> >>> when they are processed by the application they are queued on the 'free'
>> >>> list.
>> >>>
>> >>> If the 'free' list is empty, then no new events can be queued and you
>> >>> will drop events.
>> >>>
>> >>> Dropping events can be nasty and in the case of control events can cause
>> >>> a control panel to contain stale control values if it missed a value
>> >>> change event.
>> >>
>> >> I remember it was a topic I discussed with Sakari.
>> >>
>> >>> One option is to allocate enough events, but what is 'enough' events?
>> >>> That depends on many factors. And allocating more events than is
>> >>> necessary wastes memory.
>> >>
>> >> Cases where events are lost are exception and IMO "enough" events
>> >> would be almost always waste of memory.
>> >>
>> >>> But what might be a better option is this: for each event a filehandle
>> >>> subscribes to there is only one internal v4l2_kevent allocated.
>> >>>
>> >>> This struct is either marked empty (no event was raised) or contains the
>> >>> latest state of this event. When the event is dequeued by the application
>> >>> the struct is marked empty again.
>> >>>
>> >>> So you never get duplicate events, instead, if a 'duplicate' event is
>> >>> raised it will just overwrite the 'old' event and move it to the end of
>> >>> the list of pending events. In other words, the old event is removed and
>> >>> the new event is inserted instead.
>> >>
>> >> That's an interesting proposal. Currently it will have impact at least
>> >> on statistics collection OMAP3ISP driver. It brings to my mind 2
>> >> points:
>> >> Â- OMAP3ISP triggers one event for each statistic buffers produced. If
>> >> we avoid events "duplication", userapp will miss a statistic buffer.
>> >> It's possible to bypass this problem, but the OMAP3 ISP statistics'
>> >> private interface should be updated as well.
>> >> Â- To define a standard for statistics collection is something we need
>> >> to do to avoid new ISP's to always create custom interfaces.
>> >>
>> >>> The nice thing about this is that for each subscribed event type you will
>> >>> never lose a raised event completely. You may lose intermediate events,
>> >>> but the latest event for that type will always be available.
>> >>
>> >> I may have a suggestion. If some event is affected by the number of
>> >> times it was triggered (like the statistic ones mentioned above),
>> >> instead of a bool "empty flag", it may contain a counter. Then a
>> >> "duplicated" event will be raised and will still inform how many
>> >> intermediate events were "lost". After event is dequeued once, the
>> >> counter could be reset.
>> >
>> > A counter would help mitigate events loss issues, when an application is not
>> > only interested in the last event "state" (like for HDMI hotplug for
>> > instance), but also on the intermediate events. This isn't a perfect solution
>> > though, applications can still make use of detailed event informations (such
>> > as timestamps, and event-specific data) even if they arrive "late". It really
>> > depends on the event type.
>>
>> I agree with Laurent.
>>
>> When the interface was originally defined, the assumption was that any
>> kind of event loss would be a major nuisance and should ideally never
>> happen. It's a good question what is best when there's not enough room
>> for new events.
>>
>> Definitely your proposal does have its advantages, but also causes loss
>> of information such as timestamps much more easily in cases such as the
>> OMAP 3 ISP driver where many events are generated per frame, usually one
>> per type.
>>
>> On the other hand, the importance of timestamps generally decreases when
>> as they get older. I'm uncertain whether such a change would actually
>> break something, at least I can't say it wouldn't right now.
>>
>> I wonder if it would be too complicated to pre-allocate n events per
>> event type, n being be a small natural number. This might be wasteful,
>> however.
>
> I think this is actually the best approach. It is even possible to let the
> application select 'N' when subscribing an event. This ensures that you never
> completely miss an event: e.g. if X events of type T are raised, then you
> will at least get min(N, X) events of that type.
>
> It's much nicer that way since it gives you useful guarantees that you don't
> have today. And the allocation can be done when subscribing events instead
> of having to guess some global maximum for the total number of events.

I agree with this proposal. I won't affect OMAP3ISP statistic drivers either.

Br,

David

>
> The current approach is definitely problematic since there are no guarantees
> whatsoever.
>
> Regards,
>
> Â Â Â ÂHans
>
>> Or allow at least one event per event type in the queue. Also this
>> option would have the property that not all events of a specific type
>> would be lost.
>>
>> Or, limit the number of events of certain type in queue to m, where m < n.
>>
>> Regards,
>>
>>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux