Re: [PATCH] Input: Evdev - Avoid data loss when clock type is changed

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

 



Hello Mr. Torokhov,

On Tue, Aug 4, 2015 at 10:20 PM, Dmitry Torokhov
<dmitry.torokhov@xxxxxxxxx> wrote:
> Hi Aniroop,
>
> On Sat, Aug 01, 2015 at 03:58:52AM +0530, Aniroop Mathur wrote:
>> When clock type is changed, previously stored data is flushed
>> and therfore does not reach to upper layer or application.
>> Data is critically important along with the timestamp.
>> So to avoid data loss and send correct timestamp as well,
>> lets not flush data upon clock type change and
>> to send correct timestamp, store only monotonic timestamp during write
>> and change monotonic clock time to desired clock time during read.
>
> I wonder if this matters that much. The only time where this change would make
> difference is when you have a reader thread and then a controlling
> thread changing clocks. Then you probably do not want to lose events,
> but you also would not know for given event what kind of timestamp it
> uses.
>

For this case, I would like to throw some insight.
We could lose events and not know what kind of timestamp it uses but we can
know if timestamp is proper or not. If frequency of events are very high and
clock type is changed in between, it is possible that new timestamp is less
than old timestamp. Although it is a correct timestamp as per clock type but
for application it would mean that there is some problem with event timestamp
because it is ideally impossible that timestamp of new event is less than
previous event timestamp. This can happen if events are flushed or not.
But I think losing events is a bigger issue than an incorrect timestamp.

> On the other hand I expect that your application changes clock type the
> very first thing after opening the event device. In this case the
> flushing queue does not matter: you are losing events that happened
> before you opened the device, so it does not really matter if you lose a
> few more in the beginning.
>
> I guess I need better understanding of your use case.
>

Before explaining my use case, I would like to tell you about application which
checks timestamp strictly.
Application Name - CTS Verifier.
This is the application developed by Google to check functionality of android
device. It is mandatory for every android device in the world to pass all test
cases, otherwise device cannot be released in market. In the sensor module,
this application performs verifications like EventOrderVerification,
EventGapVerification, EventTimestampSynchronizationVerification, etc.
EventTimestampSynchronizationVerification verifies that the timestamp of the
event is synchronized with SystemClock.elapsedRealtimeNanos(), based on a given
threshold.
Ref Link:
https://source.android.com/compatibility/overview.html
http://androidxref.com/5.1.1_r6/xref/cts/tests/tests/hardware/src/android/
hardware/cts/helpers/sensorverification/EventTimestampSynchronizationVerification.java

My Use Case:
Like cts application, My application checks for sensor events and provide
suggestions to correct it at run time. It checks sensor working from
"kernel side" by opening up the event device and enable the sensor so that
driver starts reporting events. It reads the events and checks if there are any
event time synchronization errors, event gap errors, etc are there or
not just like cts.
Event time synchronization error is checked using api
SystemClock.elapsedRealtimeNanos(). Event time synchronization error occurs
because event timestamp and timestamp received using
SystemClock.elapsedRealtimeNanos() does not match.
If event time synchronization error occurs, the application changes the clock
type and then check if error is still occuring. Now when clock type is changed,
event time synchronization error is removed but event gap error occurs
because events are lost.
Application working dummy example:
1. data_x1, data_y1, time1... TimeSync - NOT OK, EventGap - OK'
2. data_x1, data_y1, time1... TimeSync - NOT OK, EventGap - OK
Application decides to change clock
3. data_x1, data_y1, time1... TimeSync - OK, EventGap - NOT OK
4. data_x1, data_y1, time1... TimeSync - OK, EventGap - NOT OK

So, both test cases could not be checked together and thats how I came up with
the idea that it is better not to flush the events upon clock change.

Similar use case for complete checking of driver, hal, framework where we use
original cts application and our application.
Similar use case for sensor simulator.

Like in sensor domain, there can be more use cases in other domains which other
domain team members must be aware of.

Apart from above, I have always read and learnt that kernel code should be
generic and should work fine for all application uses upon kernel upgrade.
I guess if events are lost in previous kernel version, them it should not be
lost in new version.
So, I realize that it is safer to not flush the events.

Also, I think we can add functionality to add an ioctl call using which user
space can flush the events or empty the event buffer, whenever they really
need to.

Regards,
Aniroop Mathur

> Thanks.
>
> --
> Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux