public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Tina Ruchandani <ruchandani.tina@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	Pete Zaitcev <zaitcev@redhat.com>
Subject: Re: [PATCH] USB: usbmon: Remove timeval usage for timestamp
Date: Tue, 05 May 2015 11:24:16 +0200	[thread overview]
Message-ID: <4936805.OkgPExQ11v@wuerfel> (raw)
In-Reply-To: <20150505061433.GA4690@tinar>

On Tuesday 05 May 2015 11:44:33 Tina Ruchandani wrote:
> 'struct timeval' uses 32-bits for its seconds field and will overflow in
> the year 2038 and beyond. This patch replaces the usage of 'struct timeval'
> in mon_get_timestamp() with timespec64 which uses a 64-bit seconds field
> and is y2038-safe. mon_get_timestamp() truncates the timestamp at 4096 seconds,
> so the correctness of the code is not affected. This patch is part of a larger
> attempt to remove instances of struct timeval and other 32-bit timekeeping
> (time_t, struct timespec) from the kernel.
> 
> Signed-off-by: Tina Ruchandani <ruchandani.tina@gmail.com>

Good description!

>  static inline unsigned int mon_get_timestamp(void)
>  {
> -	struct timeval tval;
> +	struct timespec64 now;
>  	unsigned int stamp;
>  
> -	do_gettimeofday(&tval);
> -	stamp = tval.tv_sec & 0xFFF;	/* 2^32 = 4294967296. Limit to 4096s. */
> -	stamp = stamp * 1000000 + tval.tv_usec;
> +	getnstimeofday64(&now);
> +	stamp = now.tv_sec & 0xFFF;  /* now.tv_sec is 64-bit. Limit to 4096s */
> +	stamp = stamp * USEC_PER_SEC + now.tv_nsec / NSEC_PER_USEC;
>  	return stamp;
>  }

Your conversion looks entirely correct, but the original code is a bit
odd here as it does not use the entire range of the 32-bit microsecond
value, and counts from 0 to 4096000000us instead of the more intuitive
0 to 4294967296 us range before wrapping around.

If we change the code to 

static inline unsigned int mon_get_timestamp(void)
{
	return ktime_to_us(ktime_get_real());
}

it might be more obvious what is going on, but it would slightly change
the output in the debugfs file to use the full range. Do we know what
behavior is expected by normal user space here? Pete Zaitcev submitted
a patch for this behavior in 2010, he might remember something about it.

I also wonder if we should make the output use monotonic time instead
of real time (so change it to ktime_get_ts64() or ktime_get()). The effect
of that would be to keep the time ticking monotonically across a concurrent
settimeofday() call.

	Arnd

  reply	other threads:[~2015-05-05  9:24 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-05  6:14 [PATCH] USB: usbmon: Remove timeval usage for timestamp Tina Ruchandani
2015-05-05  9:24 ` Arnd Bergmann [this message]
2015-05-05 14:59   ` Alan Stern
2015-05-05 15:33     ` Arnd Bergmann
2015-05-05 15:19   ` Pete Zaitcev
2015-05-05 15:40     ` 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=4936805.OkgPExQ11v@wuerfel \
    --to=arnd@arndb.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=ruchandani.tina@gmail.com \
    --cc=zaitcev@redhat.com \
    /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