All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Stultz <john.stultz@linaro.org>
To: Feng Tang <feng.tang@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Jason Gunthorpe <jgunthorpe@obsidianresearch.com>,
	x86@kernel.org, Len Brown <lenb@kernel.org>,
	"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
	linux-kernel@vger.kernel.org, gong.chen@linux.intel.com
Subject: Re: [PATCH v4 4/4] timekeeping: utilize the suspend-nonstop clocksource to count suspended time
Date: Tue, 12 Mar 2013 14:09:08 -0700	[thread overview]
Message-ID: <513F9974.8010909@linaro.org> (raw)
In-Reply-To: <1363060608-22657-5-git-send-email-feng.tang@intel.com>

On 03/11/2013 08:56 PM, Feng Tang wrote:
> +	/*
> +	 * After system resumes, we need to calculate the suspended time and
> +	 * compensate it for the OS time. There are 3 sources that could be
> +	 * used: Nonstop clocksource during suspend, persistent clock and rtc
> +	 * device.
> +	 *
> +	 * One specific platform may have 1 or 2 or all of them, and the
> +	 * preference will be:
> +	 *	suspend-nonstop clocksource -> persistent clock -> rtc
> +	 * The less preferred source will only be tried if there is no better
> +	 * usable source. The rtc part is handled separately in rtc core code.
> +	 */
> +	cycle_now = clock->read(clock);
> +	if ((clock->flags & CLOCK_SOURCE_SUSPEND_NONSTOP) &&
> +		cycle_now > clock->cycle_last) {
> +		u64 num, max = ULLONG_MAX;
> +		u32 mult = clock->mult;
> +		u32 shift = clock->shift;
> +		s64 nsec = 0;
> +
> +		cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
> +
> +		/*
> +		 * "cycle_delta * mutl" may cause 64 bits overflow, if the
> +		 * suspended time is too long. In that case we need do the
> +		 * 64 bits math carefully
> +		 */
> +		do_div(max, mult);
> +		if (cycle_delta > max) {
> +			num = div64_u64(cycle_delta, max);
> +			nsec = (((u64) max * mult) >> shift) * num;
> +			cycle_delta -= num * max;
> +		}
> +		nsec += ((u64) cycle_delta * mult) >> shift;
> +
> +		ts_delta = ns_to_timespec(nsec);
> +		suspendtime_found = true;
> +	} else if (timespec_compare(&ts_new, &timekeeping_suspend_time) > 0) {
> +		ts_delta = timespec_sub(ts_new, timekeeping_suspend_time);
> +		suspendtime_found = true;
>   	}
> -	/* re-base the last cycle value */
> -	tk->clock->cycle_last = tk->clock->read(tk->clock);
> +
> +	if (suspendtime_found)
> +		__timekeeping_inject_sleeptime(tk, &ts_delta);
> +
> +	/* Re-base the last cycle value */
> +	clock->cycle_last = clock->read(clock);
It seems like since we unconditionally read the clock above, this last 
line could be reworked to be:
     clock->cycle_last = cycle_now;

Which would save re-reading the clocksource.

If you don't have any objections I'll fold that small change into your 
patch.

thanks
-john


  reply	other threads:[~2013-03-12 21:09 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-12  3:56 [PATCH v4 0/4] Add support for S3 non-stop TSC support Feng Tang
2013-03-12  3:56 ` [PATCH v4 1/4] x86: Add cpu capability flag X86_FEATURE_NONSTOP_TSC_S3 Feng Tang
2013-03-12 21:14   ` John Stultz
2013-03-12  3:56 ` [PATCH v4 2/4] clocksource: Add new feature flag CLOCK_SOURCE_SUSPEND_NONSTOP Feng Tang
2013-03-12  3:56 ` [PATCH v4 3/4] x86: tsc: Add support for new S3_NONSTOP feature Feng Tang
2013-03-12  3:56 ` [PATCH v4 4/4] timekeeping: utilize the suspend-nonstop clocksource to count suspended time Feng Tang
2013-03-12 21:09   ` John Stultz [this message]
2013-03-12 23:09     ` Feng Tang
2013-03-13 19:17 ` [PATCH v4 0/4] Add support for S3 non-stop TSC support John Stultz

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=513F9974.8010909@linaro.org \
    --to=john.stultz@linaro.org \
    --cc=feng.tang@intel.com \
    --cc=gong.chen@linux.intel.com \
    --cc=hpa@linux.intel.com \
    --cc=jgunthorpe@obsidianresearch.com \
    --cc=lenb@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rafael.j.wysocki@intel.com \
    --cc=tglx@linutronix.de \
    --cc=x86@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 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.