[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <5201254.PnVcGHTDmH@wuerfel>
Date: Fri, 23 Oct 2015 11:45:59 +0200
From: Arnd Bergmann <arnd@...db.de>
To: Pingbo Wen <pingbo.wen@...aro.org>
Cc: y2038@...ts.linaro.org, dmitry.torokhov@...il.com,
linux-kernel@...r.kernel.org, linux-input@...r.kernel.org
Subject: Re: [Y2038] [PATCH] hil_mlc: convert timeval to timespec64
On Friday 23 October 2015 17:12:38 Pingbo Wen wrote:
> On Monday, October 19, 2015 04:58 PM, Arnd Bergmann wrote:
> >> - 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);
> >> + ktime_get_ts64(&ts64);
> >> + ts64.tv_nsec += NSEC_PER_SEC *
> >> + (ts64.tv_sec - mlc->instart.tv_sec);
> >> + ts64.tv_nsec -= mlc->instart.tv_nsec;
> >
> > tv_nsec will overflow here for any timeout over 4.3 seconds, where it
> > used to overflow after 4294 seconds. This is almost certainly a bug.
> >
> > You could work around that by using ktime_get_ns() to get a nanosecond
> > value right away, but a 64-bit number is more expensive to convert to
> > jiffies.
>
> You are right, I didn't notice that tv_nsec is a 32bit variable. Maybe
> we should use ktime_t here, so that handling sec and nsec separately is
> needless.
>
> Using jiffies here will need to take more codes to handle jiffies overflow
> carefully. I think coverting 64bit number to jiffies is the price we must
> take, if we use 64bit version here.
Handling the jiffies overflow is trivially done through the time_before()
and time_after() helpers, like
start = jiffies;
...
now = jiffies;
timeout = start + HZ * timeout_usec / USEC_PER_SEC;
if (time_after(now, start + timeout_jiffies)
timeout();
else
mod_timer(timer, start + timeout_jiffies);
The time_after function works because unsigned overflow is well-defined
in C (unlike signed overflow).
As a side-note, please take the time to delete any lines from the original
mail that you are not referencing when you reply.
Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists