From: Jonathan Cameron <jic23@kernel.org>
To: Jean-Baptiste Maneyrol via B4 Relay
<devnull+jean-baptiste.maneyrol.tdk.com@kernel.org>
Cc: jean-baptiste.maneyrol@tdk.com,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: Re: [PATCH] iio: inv_sensors: prevent timestamps going back in time in transitions
Date: Mon, 26 Oct 2026 02:36:16 +0000 [thread overview]
Message-ID: <20261026023616.02ef34db@jic23-hlaptop> (raw)
In-Reply-To: <20261020-iio-common-inv-sensors-fixes-for-preventing-timestamp-in-past-v1-1-c27be451b287@tdk.com>
On Tue, 20 Oct 2026 17:26:00 +0200
Jean-Baptiste Maneyrol via B4 Relay <devnull+jean-baptiste.maneyrol.tdk.com@kernel.org> wrote:
> From: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
>
> Ensure when computing first timestamp and when applying odr change,
> that the next timestamp will not be lower than the previous one.
>
> This way there is no risk to have a timestamp going back in time, meaning
> being lower than the previous one. It already can never happen without
> a transition because we are generating timestamps by adding the period
> to the last timestamp.
>
> Fixes: 0ecc363ccea7 ("iio: make invensense timestamp module generic")
> Cc: stable@vger.kernel.org
> Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Maybe it is just me, but it does feel like there have been a lot of
bugs in this code. It's complex fiddly stuff so perhaps not surprising.
Anyhow, applied to the fixes-togreg branch of iio.git
Thanks,
Jonathan
> ---
> drivers/iio/common/inv_sensors/inv_sensors_timestamp.c | 16 ++++++++++++----
> include/linux/iio/common/inv_sensors_timestamp.h | 3 ++-
> 2 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c b/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c
> index 8c9e81a77e68..9040da80f0c7 100644
> --- a/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c
> +++ b/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c
> @@ -133,10 +133,15 @@ void inv_sensors_timestamp_interrupt(struct inv_sensors_timestamp *ts,
> return;
>
> /* no previous data, compute theoretical value from interrupt */
> - if (ts->timestamp == 0) {
> + if (!ts->init) {
> /* elapsed time: sensor period * sensor samples number */
> interval = (s64)ts->period * (s64)sample_nb;
> - ts->timestamp = timestamp - interval;
> + delta = timestamp - interval;
> + /* prevent next timestamp to be lower than the last one */
> + if ((delta + ts->period) > ts->timestamp)
> + ts->timestamp = delta;
> + ts->init = true;
> +
> }
>
> /* update delta timestamps and estimated period */
> @@ -184,7 +189,7 @@ void inv_sensors_timestamp_apply_odr(struct inv_sensors_timestamp *ts,
> u32 fifo_period, size_t fifo_nb,
> unsigned int fifo_no)
> {
> - s64 interval;
> + s64 interval, timestamp;
> u32 fifo_mult;
>
> if (ts->new_mult == 0)
> @@ -207,7 +212,10 @@ void inv_sensors_timestamp_apply_odr(struct inv_sensors_timestamp *ts,
> fifo_period = fifo_mult * ts->chip_period.val;
> /* computes time interval between interrupt and this sample */
> interval = (s64)(fifo_nb - fifo_no) * (s64)fifo_period;
> - ts->timestamp = ts->it.up - interval;
> + timestamp = ts->it.up - interval;
> + /* prevent next timestamp to be lower than current one */
> + if ((timestamp + ts->period) > ts->timestamp)
> + ts->timestamp = timestamp;
> }
> }
> EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_apply_odr, "IIO_INV_SENSORS_TIMESTAMP");
> diff --git a/include/linux/iio/common/inv_sensors_timestamp.h b/include/linux/iio/common/inv_sensors_timestamp.h
> index 4f08204ede3b..91690778ae88 100644
> --- a/include/linux/iio/common/inv_sensors_timestamp.h
> +++ b/include/linux/iio/common/inv_sensors_timestamp.h
> @@ -66,6 +66,7 @@ struct inv_sensors_timestamp {
> u32 new_mult;
> u32 period;
> struct inv_sensors_timestamp_acc chip_period;
> + bool init;
> };
>
> void inv_sensors_timestamp_init(struct inv_sensors_timestamp *ts,
> @@ -94,7 +95,7 @@ static inline void inv_sensors_timestamp_reset(struct inv_sensors_timestamp *ts)
> ts->it = interval_init;
> ts->delta = interval_init;
> ts->delta_counter = 0;
> - ts->timestamp = 0;
> + ts->init = false;
> }
>
> #endif
>
> ---
> base-commit: 43ffda3c7f8456bbe641ae8249a077a361b97880
> change-id: 20261020-iio-common-inv-sensors-fixes-for-preventing-timestamp-in-past-8da19f683084
>
> Best regards,
> --
> Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
>
>
prev parent reply other threads:[~2026-10-26 2:36 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-20 15:26 Jean-Baptiste Maneyrol via B4 Relay
2026-10-26 2:36 ` Jonathan Cameron [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261026023616.02ef34db@jic23-hlaptop \
--to=jic23@kernel.org \
--cc=andy@kernel.org \
--cc=devnull+jean-baptiste.maneyrol.tdk.com@kernel.org \
--cc=dlechner@baylibre.com \
--cc=jean-baptiste.maneyrol@tdk.com \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nuno.sa@analog.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®