gpio: Switch timestamps to ktime_get_ns()
authorLinus Walleij <linus.walleij@linaro.org>
Thu, 20 Feb 2020 14:56:24 +0000 (15:56 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 21 Feb 2020 15:29:38 +0000 (16:29 +0100)
The existing use of ktime_get_real_ns() in the timestamps from
the GPIO events is dubious.

We have had several discussions about this timestamp, and it is
unclear whether userspace has ever taken into account that a
timestamp from ktime_get_real_ns() can actually move backwards
in time relative the previous timetamp, and userspace is more
likely to expect a monotonic counter.

Background:
https://lore.kernel.org/linux-gpio/CAK8P3a1Skvm48sje8FNDPLYqyz9Lf8q0qX1QETWtyZTxuX4k1g@mail.gmail.com/
https://marc.info/?l=linux-gpio&m=151661955709074&w=2

The change is ABI incompatible, but incompatible in a way that
is IMO more likely to fix future bugs rather than break current
userspace. To the best of my knowledge all userspace expects
a monotonic timestamp and users are just lucky that they very
seldom move backwards in time.

Cc: Arnd Bergmann <arnd@arndb.de>
Acked-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c

index 611709fd560f0908e3bac3545b4825b2fa4a31e0..2c3a9c1c76beb02b5d69dcbd7d2a8c569eb76850 100644 (file)
@@ -954,7 +954,7 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p)
         * we didn't get the timestamp from lineevent_irq_handler().
         */
        if (!le->timestamp)
-               ge.timestamp = ktime_get_real_ns();
+               ge.timestamp = ktime_get_ns();
        else
                ge.timestamp = le->timestamp;
 
@@ -995,7 +995,7 @@ static irqreturn_t lineevent_irq_handler(int irq, void *p)
         * Just store the timestamp in hardirq context so we get it as
         * close in time as possible to the actual event.
         */
-       le->timestamp = ktime_get_real_ns();
+       le->timestamp = ktime_get_ns();
 
        return IRQ_WAKE_THREAD;
 }