From: Arnd Bergmann <arnd@arndb.de>
To: y2038@lists.linaro.org
Cc: WEN Pingbo <pingbo.wen@linaro.org>,
dmitry.torokhov@gmail.com, linux-kernel@vger.kernel.org,
linux-input@vger.kernel.org
Subject: Re: [Y2038] [PATCH V2] hil_mlc: convert timeval to ktime_t
Date: Fri, 23 Oct 2015 11:55:07 +0200 [thread overview]
Message-ID: <33014393.CcP7q7PhGq@wuerfel> (raw)
In-Reply-To: <1445592300-30894-1-git-send-email-pingbo.wen@linaro.org>
On Friday 23 October 2015 17:24:59 WEN Pingbo wrote:
> Using struct timeval will cause time overflow in 2038, replacing it with
> ktime_t. And we don't need to handle sec and nsec separately.
>
> Since mlc->lcv_t is only interested in seconds, directly using
> time64_t here.
>
> And monotonic time is better here, since the original driver don't care
> the wall time.
>
> In addition, the original driver try to covert usec to jiffies manually in
> hilse_donode(). This is not a universal and safe way, using
> nsecs_to_jiffies() to fix that.
>
> Signed-off-by: WEN Pingbo <pingbo.wen@linaro.org>
The changelog text looks good.
> +++ b/drivers/input/serio/hil_mlc.c
> @@ -274,14 +274,12 @@ static int hilse_match(hil_mlc *mlc, int unused)
> /* An LCV used to prevent runaway loops, forces 5 second sleep when reset. */
> static int hilse_init_lcv(hil_mlc *mlc, int unused)
> {
> - struct timeval tv;
> + time64_t now = ktime_get_seconds();
>
> - do_gettimeofday(&tv);
> -
> - if (mlc->lcv && (tv.tv_sec - mlc->lcv_tv.tv_sec) < 5)
> + if (mlc->lcv && (now - mlc->lcv_t) < 5)
> return -1;
>
> - mlc->lcv_tv = tv;
> + mlc->lcv_t = now;
> mlc->lcv = 0;
>
> return 0;
This part looks good now, but as I commented in version 1, it should
really be a separate patch rather than combined with the rest that
is dealing with another use of timeval.
>
> - do_gettimeofday(&tv);
> - tv.tv_usec += USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec);
> - tv.tv_usec -= mlc->instart.tv_usec;
> - if (tv.tv_usec >= mlc->intimeout) goto sched;
> - tv.tv_usec = (mlc->intimeout - tv.tv_usec) * HZ / USEC_PER_SEC;
> - if (!tv.tv_usec) goto sched;
> - mod_timer(&hil_mlcs_kicker, jiffies + tv.tv_usec);
> + if (tmp.tv64 >= (mlc->intimeout * NSEC_PER_USEC))
> + goto sched;
> + tmp.tv64 = mlc->intimeout * NSEC_PER_USEC - tmp.tv64;
> + if (tmp.tv64 < NSEC_PER_USEC)
> + goto sched;
> + mod_timer(&hil_mlcs_kicker,
> + jiffies + nsecs_to_jiffies(tmp.tv64));
> break;
> sched:
> tasklet_schedule(&hil_mlcs_tasklet);
If I read this right, the code is executed one for each input event such
as a keypress or mouse movement. In the latter case, doing nsecs_to_jiffies()
here is actually a bit expensive, and I stil think it can be avoided
by just using jiffies.
For the (tmp.tv64 < NSEC_PER_USEC) part, did you just do that because
I said this, or did you actually prove that it is required? I'm still
confused about what the driver is trying to achieve here.
> diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c
> index d50f067..0a27b89 100644
> --- a/drivers/input/serio/hp_sdc_mlc.c
> +++ b/drivers/input/serio/hp_sdc_mlc.c
> @@ -149,7 +149,8 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout)
>
> /* Try to down the semaphore */
> if (down_trylock(&mlc->isem)) {
> - struct timeval tv;
> + ktime_t tmp = ktime_sub(ktime_get(), mlc->instart);
> +
> if (priv->emtestmode) {
> mlc->ipacket[0] =
> HIL_ERR_INT | (mlc->opacket &
Maybe give the variable a more useful name than 'tmp'?
You could also remove the variable entirely if you slightly restructure
the condition below.
> @@ -160,9 +161,8 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout)
> /* printk(KERN_DEBUG PREFIX ">[%x]\n", mlc->ipacket[0]); */
> goto wasup;
> }
> - do_gettimeofday(&tv);
> - tv.tv_usec += USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec);
> - if (tv.tv_usec - mlc->instart.tv_usec > mlc->intimeout) {
> +
> + if (tmp.tv64 > mlc->intimeout * NSEC_PER_USEC) {
> /* printk("!%i %i",
> tv.tv_usec - mlc->instart.tv_usec,
> mlc->intimeout);
As I mentioned, better use ktime_to_ns() instead of accessing the tv64 member
directly, but that is just a small style question.
Arnd
next prev parent reply other threads:[~2015-10-23 9:55 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-18 9:45 [PATCH] hil_mlc: convert timeval to timespec64 WEN Pingbo
2015-10-19 8:58 ` [Y2038] " Arnd Bergmann
2015-10-23 9:12 ` Pingbo Wen
2015-10-23 9:45 ` Arnd Bergmann
2015-10-23 12:34 ` Pingbo Wen
2015-10-24 4:00 ` [PATCH V3 1/2] hil_mlc: convert timeval to time64_t WEN Pingbo
2015-10-24 4:00 ` [PATCH V3 2/2] hil_mlc: convert timeval to jiffies WEN Pingbo
2015-10-23 9:24 ` [PATCH V2] hil_mlc: convert timeval to ktime_t WEN Pingbo
2015-10-23 9:55 ` Arnd Bergmann [this message]
2015-10-23 12:32 ` [Y2038] " Pingbo Wen
2015-10-23 13:51 ` Arnd Bergmann
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=33014393.CcP7q7PhGq@wuerfel \
--to=arnd@arndb.de \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pingbo.wen@linaro.org \
--cc=y2038@lists.linaro.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;
as well as URLs for NNTP newsgroup(s).