From: Thomas Gleixner <tglx@linutronix.de>
To: lakshmi.sowjanya.d@intel.com, jstultz@google.com,
giometti@enneenne.com, corbet@lwn.net,
linux-kernel@vger.kernel.org
Cc: x86@kernel.org, netdev@vger.kernel.org,
linux-doc@vger.kernel.org, intel-wired-lan@lists.osuosl.org,
andriy.shevchenko@linux.intel.com, eddie.dong@intel.com,
christopher.s.hall@intel.com, jesse.brandeburg@intel.com,
davem@davemloft.net, alexandre.torgue@foss.st.com,
joabreu@synopsys.com, mcoquelin.stm32@gmail.com, perex@perex.cz,
linux-sound@vger.kernel.org, anthony.l.nguyen@intel.com,
peter.hilber@opensynergy.com, pandith.n@intel.com,
mallikarjunappa.sangannavar@intel.com,
subramanian.mohan@intel.com, basavaraj.goudar@intel.com,
thejesh.reddy.t.r@intel.com, lakshmi.sowjanya.d@intel.com
Subject: Re: [PATCH v5 02/11] timekeeping: Add function to convert realtime to base clock
Date: Thu, 21 Mar 2024 15:53:22 +0100 [thread overview]
Message-ID: <87le6bhc0t.ffs@tglx> (raw)
In-Reply-To: <20240319130547.4195-3-lakshmi.sowjanya.d@intel.com>
On Tue, Mar 19 2024 at 18:35, lakshmi.sowjanya.d@intel.com wrote:
> +bool ktime_real_to_base_clock(ktime_t treal, enum clocksource_ids base_id, u64 *cycles)
> +{
> + struct timekeeper *tk = &tk_core.timekeeper;
> + unsigned int seq;
> + u64 delta;
> +
> + do {
> + seq = read_seqcount_begin(&tk_core.seq);
> + delta = (u64)treal - tk->tkr_mono.base_real;
> + if (delta > tk->tkr_mono.clock->max_idle_ns)
> + return false;
I don't think this cutoff is valid. There is no guarantee that this is
linear unless:
Treal[last timekeeper update] <= treal < Treal[next timekeeper update]
Look at the dance in get_device_system_crosststamp() and
adjust_historical_crosststamp() to see why.
> + *cycles = tk->tkr_mono.cycle_last + convert_ns_to_cs(delta);
> + if (!convert_cs_to_base(cycles, base_id))
> + return false;
> + } while (read_seqcount_retry(&tk_core.seq, seq));
> +
> + return true;
> +}
> +EXPORT_SYMBOL_GPL(ktime_real_to_base_clock);
Looking at the usage site:
> +static bool pps_generate_next_pulse(struct pps_tio *tio, ktime_t expires)
> +{
> + u64 art;
> +
> + if (!ktime_real_to_base_clock(expires, CSID_X86_ART, &art)) {
> + pps_tio_disable(tio);
I'm pretty sure this can happen when there is sufficient delay between
the check for (now - expires < SAFE_TIME_NS) and the delta computation
in ktime_real_to_base_clock() if there is a timerkeeper update
interleaving which brings tkr_mono.base_real in front of expires.
Is that intentional and correct?
If so, then it's inconsistent with the behaviour of the hrtimer
callback:
> + return false;
> + }
> +
> + pps_compv_write(tio, art - ART_HW_DELAY_CYCLES);
> + return true;
> +}
> +
> +static enum hrtimer_restart hrtimer_callback(struct hrtimer *timer)
> +{
> + struct pps_tio *tio = container_of(timer, struct pps_tio, timer);
> + ktime_t expires, now;
> +
> + guard(spinlock)(&tio->lock);
> +
> + expires = hrtimer_get_expires(timer);
> + now = ktime_get_real();
> +
> + if (now - expires < SAFE_TIME_NS) {
> + if (!pps_generate_next_pulse(tio, expires + SAFE_TIME_NS))
> + return HRTIMER_NORESTART;
> + }
This safe guard does not care about time being set. I'm not familiar
with the PPS logic, but is it expected that the pulse pattern will be
like this:
---|-----|-----|-----|----------------->
P P ^ P
|
clock_settime(CLOCK_REALTIME, now - 2 seconds)
Obviously the pulse gap will be as big as the time is set
backwards, which might be way more than 2 seconds.
---|-----|-----|-----|----------------->
P P ^ P P
|
clock_settime(CLOCK_REALTIME, now + 2 seconds)
I don't see anything in this code which cares about CLOCK_REALTIME being
set via clock_settime() or adjtimex().
Aside of that I have a question about how the TIO hardware treats this
case:
ktime_real_to_base_clock(expires, &art);
-> GAP which makes @art get into the past
pps_compv_write(tio, art - ART_HW_DELAY_CYCLES);
Will the hardware ignore that already expired value or just emit a pulse
immediately? In the latter case the pulse will be at a random point in
time, which does not sound correct.
Thanks,
tglx
next prev parent reply other threads:[~2024-03-21 14:53 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-19 13:05 [PATCH v5 00/11] Add support for Intel PPS Generator lakshmi.sowjanya.d
2024-03-19 13:05 ` [PATCH v5 01/11] x86/tsc: Add base clock properties in clocksource structure lakshmi.sowjanya.d
2024-03-20 11:23 ` Thomas Gleixner
2024-03-20 11:30 ` Thomas Gleixner
2024-03-19 13:05 ` [PATCH v5 02/11] timekeeping: Add function to convert realtime to base clock lakshmi.sowjanya.d
2024-03-19 22:29 ` John Stultz
2024-03-20 11:29 ` Thomas Gleixner
2024-03-21 14:53 ` Thomas Gleixner [this message]
2024-04-01 13:07 ` D, Lakshmi Sowjanya
2024-03-19 13:05 ` [PATCH v5 03/11] e1000e: remove convert_art_to_tsc() lakshmi.sowjanya.d
2024-03-19 13:05 ` [PATCH v5 04/11] igc: " lakshmi.sowjanya.d
2024-03-19 13:05 ` [PATCH v5 05/11] stmmac: intel: " lakshmi.sowjanya.d
2024-03-19 13:05 ` [PATCH v5 06/11] ALSA: hda: " lakshmi.sowjanya.d
2024-03-19 13:05 ` [PATCH v5 07/11] ice/ptp: " lakshmi.sowjanya.d
2024-03-19 13:05 ` [PATCH v5 08/11] x86/tsc: Remove art to tsc conversion functions which are obsolete lakshmi.sowjanya.d
2024-03-19 13:05 ` [PATCH v5 09/11] pps: generators: Add PPS Generator TIO Driver lakshmi.sowjanya.d
2024-03-20 16:17 ` Rodolfo Giometti
2024-03-19 13:05 ` [PATCH v5 10/11] Documentation: driver-api: pps: Add Intel Timed I/O PPS generator lakshmi.sowjanya.d
2024-03-20 16:18 ` Rodolfo Giometti
2024-03-19 13:05 ` [PATCH v5 11/11] ABI: pps: Add ABI documentation for Intel TIO lakshmi.sowjanya.d
2024-03-20 16:09 ` Simon Horman
2024-03-19 22:48 ` [Intel-wired-lan] [PATCH v5 00/11] Add support for Intel PPS Generator Paul Menzel
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=87le6bhc0t.ffs@tglx \
--to=tglx@linutronix.de \
--cc=alexandre.torgue@foss.st.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=anthony.l.nguyen@intel.com \
--cc=basavaraj.goudar@intel.com \
--cc=christopher.s.hall@intel.com \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=eddie.dong@intel.com \
--cc=giometti@enneenne.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=jesse.brandeburg@intel.com \
--cc=joabreu@synopsys.com \
--cc=jstultz@google.com \
--cc=lakshmi.sowjanya.d@intel.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=mallikarjunappa.sangannavar@intel.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pandith.n@intel.com \
--cc=perex@perex.cz \
--cc=peter.hilber@opensynergy.com \
--cc=subramanian.mohan@intel.com \
--cc=thejesh.reddy.t.r@intel.com \
--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 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).