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: christopher.s.hall@intel.com, subramanian.mohan@intel.com,
lakshmi.sowjanya.d@intel.com, linux-doc@vger.kernel.org,
netdev@vger.kernel.org, pandith.n@intel.com, x86@kernel.org,
eddie.dong@intel.com, jesse.brandeburg@intel.com,
linux-sound@vger.kernel.org, alexandre.torgue@foss.st.com,
peter.hilber@opensynergy.com,
mallikarjunappa.sangannavar@intel.com, joabreu@synopsys.com,
intel-wired-lan@lists.osuosl.org, mcoquelin.stm32@gmail.com,
thejesh.reddy.t.r@intel.com, perex@perex.cz,
anthony.l.nguyen@intel.com, andriy.shevchenko@linux.intel.com,
davem@davemloft.net
Subject: Re: [Intel-wired-lan] [PATCH v4 02/11] timekeeping: Add function to convert realtime to base clock
Date: Thu, 08 Feb 2024 16:14:15 +0100 [thread overview]
Message-ID: <8734u3m1iw.ffs@tglx> (raw)
In-Reply-To: <20240207060854.6524-3-lakshmi.sowjanya.d@intel.com>
On Wed, Feb 07 2024 at 11:38, lakshmi sowjanya d. wrote:
> From: Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>
>
> Introduce an interface, ktime_real_to_base_clock() to convert realtime
> to base clock.
>
> Convert the base clock to the system clock using convert_base_to_cs() in
> get_device_system_crosststamp().
>
> Add the helper function timekeeping_clocksource_has_base(), to check
> whether the current clocksource has the same base clock.
Neither ktime_real_to_base_clock() nor
timekeeping_clocksource_has_base() are used anywhere.
What's the point of having them in the first place?
Your changelog explains the WHAT but not the WHY....
> +static bool convert_clock(u64 *val, u32 numerator, u32 denominator)
> +{
> + u64 rem, res;
> +
> + if (numerator == 0 || denominator == 0)
> + return false;
What's wrong with the usual (!numerator || !denominator) notation?
> +
> + res = div64_u64_rem(*val, denominator, &rem) * numerator;
> + *val = res + div_u64(rem * numerator, denominator);
> + return true;
> +}
> +
> +static bool convert_base_to_cs(struct system_counterval_t *scv)
> +{
> + struct clocksource *cs = tk_core.timekeeper.tkr_mono.clock;
> + struct clocksource_base *base = cs->base;
> +
> + /* The timestamp was taken from the time keeper clock source */
> + if (cs->id == scv->cs_id)
> + return true;
> +
> + /* Check whether cs_id matches the base clock */
> + if (!base || base->id != scv->cs_id)
> + return false;
> +
> + /* Avoid conversion to a less precise clock */
> + if (scv->nsecs && cs->freq_khz != 0 && base->freq_khz < cs->freq_khz) {
> + if (!convert_clock(&scv->cycles, cs->freq_khz, USEC_PER_SEC))
> + return false;
> + } else {
> + if (scv->nsecs) {
> + if (!convert_clock(&scv->cycles, base->freq_khz, USEC_PER_SEC))
> + return false;
> + }
> + if (!convert_clock(&scv->cycles, base->numerator, base->denominator))
> + return false;
> + }
The above logic makes my brain hurt.
It's a reaonable requirement that cs->freq must be != 0 when sc->base !=
NULL and then converting from nanoseconds can always use cs->freq no
matter what the value of the base frequency is. Even for the case where
the base frequency is larger than cs->freq because the double conversion
does not give you more precision, right?
> + scv->cycles += base->offset;
So the whole thing can be reduced to:
nom = scv->nsecs ? cs->freq_khz : base->numerator;
den = scv->nsecs ? USEC_PER_SEC : base->denominator;
convert(&scv->cycles, nom, den);
scv->cycles += base->offset;
Thanks,
tglx
WARNING: multiple messages have this Message-ID (diff)
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, thejesh.reddy.t.r@intel.com,
lakshmi.sowjanya.d@intel.com
Subject: Re: [PATCH v4 02/11] timekeeping: Add function to convert realtime to base clock
Date: Thu, 08 Feb 2024 16:14:15 +0100 [thread overview]
Message-ID: <8734u3m1iw.ffs@tglx> (raw)
In-Reply-To: <20240207060854.6524-3-lakshmi.sowjanya.d@intel.com>
On Wed, Feb 07 2024 at 11:38, lakshmi sowjanya d. wrote:
> From: Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>
>
> Introduce an interface, ktime_real_to_base_clock() to convert realtime
> to base clock.
>
> Convert the base clock to the system clock using convert_base_to_cs() in
> get_device_system_crosststamp().
>
> Add the helper function timekeeping_clocksource_has_base(), to check
> whether the current clocksource has the same base clock.
Neither ktime_real_to_base_clock() nor
timekeeping_clocksource_has_base() are used anywhere.
What's the point of having them in the first place?
Your changelog explains the WHAT but not the WHY....
> +static bool convert_clock(u64 *val, u32 numerator, u32 denominator)
> +{
> + u64 rem, res;
> +
> + if (numerator == 0 || denominator == 0)
> + return false;
What's wrong with the usual (!numerator || !denominator) notation?
> +
> + res = div64_u64_rem(*val, denominator, &rem) * numerator;
> + *val = res + div_u64(rem * numerator, denominator);
> + return true;
> +}
> +
> +static bool convert_base_to_cs(struct system_counterval_t *scv)
> +{
> + struct clocksource *cs = tk_core.timekeeper.tkr_mono.clock;
> + struct clocksource_base *base = cs->base;
> +
> + /* The timestamp was taken from the time keeper clock source */
> + if (cs->id == scv->cs_id)
> + return true;
> +
> + /* Check whether cs_id matches the base clock */
> + if (!base || base->id != scv->cs_id)
> + return false;
> +
> + /* Avoid conversion to a less precise clock */
> + if (scv->nsecs && cs->freq_khz != 0 && base->freq_khz < cs->freq_khz) {
> + if (!convert_clock(&scv->cycles, cs->freq_khz, USEC_PER_SEC))
> + return false;
> + } else {
> + if (scv->nsecs) {
> + if (!convert_clock(&scv->cycles, base->freq_khz, USEC_PER_SEC))
> + return false;
> + }
> + if (!convert_clock(&scv->cycles, base->numerator, base->denominator))
> + return false;
> + }
The above logic makes my brain hurt.
It's a reaonable requirement that cs->freq must be != 0 when sc->base !=
NULL and then converting from nanoseconds can always use cs->freq no
matter what the value of the base frequency is. Even for the case where
the base frequency is larger than cs->freq because the double conversion
does not give you more precision, right?
> + scv->cycles += base->offset;
So the whole thing can be reduced to:
nom = scv->nsecs ? cs->freq_khz : base->numerator;
den = scv->nsecs ? USEC_PER_SEC : base->denominator;
convert(&scv->cycles, nom, den);
scv->cycles += base->offset;
Thanks,
tglx
next prev parent reply other threads:[~2024-02-08 15:14 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-07 6:08 [Intel-wired-lan] [PATCH v4 00/11] Add support for Intel PPS Generator lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 01/11] x86/tsc: Add base clock properties in clocksource structure lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 02/11] timekeeping: Add function to convert realtime to base clock lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-08 15:14 ` Thomas Gleixner [this message]
2024-02-08 15:14 ` Thomas Gleixner
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 03/11] e10002: remove convert_art_to_tsc() lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 04/11] igc: " lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 05/11] stmmac: intel: " lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 06/11] ALSA: hda: " lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 07/11] ice/ptp: " lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 15:31 ` [Intel-wired-lan] " Thomas Gleixner
2024-02-07 15:31 ` Thomas Gleixner
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 08/11] x86/tsc: Remove art to tsc conversion functions which are obsolete lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 09/11] pps: generators: Add PPS Generator TIO Driver lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 10/11] Documentation: driver-api: pps: Add Intel Timed I/O PPS generator lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
2024-02-07 6:08 ` [Intel-wired-lan] [PATCH v4 11/11] ABI: pps: Add ABI documentation for Intel TIO lakshmi.sowjanya.d
2024-02-07 6:08 ` lakshmi.sowjanya.d
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=8734u3m1iw.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=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 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.