All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Pingbo Wen <pingbo.wen@linaro.org>
Cc: y2038@lists.linaro.org, dmitry.torokhov@gmail.com,
	linux-kernel@vger.kernel.org, linux-input@vger.kernel.org
Subject: Re: [Y2038] [PATCH] hil_mlc: convert timeval to timespec64
Date: Fri, 23 Oct 2015 11:45:59 +0200	[thread overview]
Message-ID: <5201254.PnVcGHTDmH@wuerfel> (raw)
In-Reply-To: <5629FA06.2060608@linaro.org>

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

WARNING: multiple messages have this Message-ID (diff)
From: Arnd Bergmann <arnd@arndb.de>
To: Pingbo Wen <pingbo.wen@linaro.org>
Cc: y2038@lists.linaro.org, dmitry.torokhov@gmail.com,
	linux-kernel@vger.kernel.org, linux-input@vger.kernel.org
Subject: Re: [PATCH] hil_mlc: convert timeval to timespec64
Date: Fri, 23 Oct 2015 11:45:59 +0200	[thread overview]
Message-ID: <5201254.PnVcGHTDmH@wuerfel> (raw)
In-Reply-To: <5629FA06.2060608@linaro.org>

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
_______________________________________________
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038

  reply	other threads:[~2015-10-23  9:46 UTC|newest]

Thread overview: 16+ 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 [this message]
2015-10-23  9:45       ` Arnd Bergmann
2015-10-23 12:34       ` [Y2038] " Pingbo Wen
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         ` WEN Pingbo
2015-10-24  4:00         ` [PATCH V3 2/2] hil_mlc: convert timeval to jiffies WEN Pingbo
2015-10-24  4:00           ` WEN Pingbo
2015-10-23  9:24   ` [PATCH V2] hil_mlc: convert timeval to ktime_t WEN Pingbo
2015-10-23  9:24     ` WEN Pingbo
2015-10-23  9:55     ` [Y2038] " Arnd Bergmann
2015-10-23 12:32       ` 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=5201254.PnVcGHTDmH@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.