From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
To: Jacob Keller <jacob.e.keller@intel.com>,
Jakub Kicinski <kuba@kernel.org>,
David Ahern <dsahern@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
"David S. Miller" <davem@davemloft.net>,
Alexander Duyck <alexanderduyck@fb.com>
Cc: netdev@vger.kernel.org, Richard Cochran <richardcochran@gmail.com>
Subject: Re: [PATCH net-next v3 3/5] eth: fbnic: add RX packets timestamping support
Date: Tue, 8 Oct 2024 18:13:06 +0100 [thread overview]
Message-ID: <fbf9e403-d21c-4652-a48a-427d9942b82e@linux.dev> (raw)
In-Reply-To: <89b40200-34b5-4c94-9e5a-2a6626d44477@intel.com>
On 08/10/2024 18:01, Jacob Keller wrote:
>
>
> On 10/8/2024 9:47 AM, Vadim Fedorenko wrote:
>> On 05/10/2024 00:14, Jacob Keller wrote:
>>>
>>>
>>> On 10/3/2024 5:39 AM, Vadim Fedorenko wrote:
>>>> Add callbacks to support timestamping configuration via ethtool.
>>>> Add processing of RX timestamps.
>>>>
>>>> Signed-off-by: Vadim Fedorenko <vadfed@meta.com>
>>>>
>>>> +/**
>>>> + * fbnic_ts40_to_ns() - convert descriptor timestamp to PHC time
>>>> + * @fbn: netdev priv of the FB NIC
>>>> + * @ts40: timestamp read from a descriptor
>>>> + *
>>>> + * Return: u64 value of PHC time in nanoseconds
>>>> + *
>>>> + * Convert truncated 40 bit device timestamp as read from a descriptor
>>>> + * to the full PHC time in nanoseconds.
>>>> + */
>>>> +static __maybe_unused u64 fbnic_ts40_to_ns(struct fbnic_net *fbn, u64 ts40)
>>>> +{
>>>> + unsigned int s;
>>>> + u64 time_ns;
>>>> + s64 offset;
>>>> + u8 ts_top;
>>>> + u32 high;
>>>> +
>>>> + do {
>>>> + s = u64_stats_fetch_begin(&fbn->time_seq);
>>>> + offset = READ_ONCE(fbn->time_offset);
>>>> + } while (u64_stats_fetch_retry(&fbn->time_seq, s));
>>>> +
>>>> + high = READ_ONCE(fbn->time_high);
>>>> +
>>>> + /* Bits 63..40 from periodic clock reads, 39..0 from ts40 */
>>>> + time_ns = (u64)(high >> 8) << 40 | ts40;
>>>> +
>>>> + /* Compare bits 32-39 between periodic reads and ts40,
>>>> + * see if HW clock may have wrapped since last read
>>>> + */
>>>> + ts_top = ts40 >> 32;
>>>> + if (ts_top < (u8)high && (u8)high - ts_top > U8_MAX / 2)
>>>> + time_ns += 1ULL << 40;
>>>> +
>>>> + return time_ns + offset;
>>>> +}
>>>> +
>>>
>>> This logic doesn't seem to match the logic used by the cyclecounter
>>> code, and Its not clear to me if this safe against a race between
>>> time_high updating and the packet timestamp arriving.
>>>
>>> the timestamp could arrive either before or after the time_high update,
>>> and the logic needs to ensure the appropriate high bits are applied in
>>> both cases.
>>
>> To avoid this race condition we decided to make sure that incoming
>> timestamps are always later then cached high bits. That will make the
>> logic above correct.
>>
>
> How do you do that? Timestamps come in asynchronously. The value is
> captured by hardware. How do you guarantee that it was captured only
> after an update to the cached high bits?
>
> I guess if it arrives before the roll-over, you handle that by the range
> check to see if the clock wrapped around.
>
> Hmm.
>
> But what happens if an Rx timestamp races with an update to the high
> value and comes in just before the 40 bit time would have overflowed,
> but the cached time_high value is captured just after it overflowed.
>
> Do you have some mechanism to ensure that this is impossible? i.e.
> either ensuring that the conversion uses the old time_high value, or
> ensuring that Rx timestamps can't come in during an update?
>
> Otherwise, I think the logic here could accidentally combine a time
> value from an Rx timestamp that is just prior to the time_high update
> and just prior to a rollover, then it would see a huge gap between the
> values and trigger the addition of another 1 << 40, which would cycle it
> even farther out of what the real value should have been.
Yes, you are absolutely correct, we have missed the situation when the
logic can bring additional (1 << 40) value on top of wrongly calculated
higher bits. This can only happen in case of overflow of lower 8 bits of
high cached value. But if we keep high cached value a bit below the real
value, this will never happen. If we subtract 16 from high value it will
translate into ~1 minute of oldness of cached value. If for any reasons
the packet processing will be delayed by 1 minute, user-space app will
definitely give up on waiting for the packet/timestamp and will ignore
wrong timestamp. In all other cases the logic in fbnic_ts40_to_ns() will
work perfectly fine.
>>> Again, I think your use case makes sense to just implement with a
>>> timecounter and cyclecounter, since you're not modifying the hardware
>>> cycle counter and are leaving it as free-running.
>>
>> After discussion with Jakub we decided to keep simple logic without
>> timecounter + cyclecounter, as it's pretty straight forward.
>
> Fair enough.
next prev parent reply other threads:[~2024-10-08 17:13 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-03 12:39 [PATCH net-next v3 0/5] eth: fbnic: add timestamping support Vadim Fedorenko
2024-10-03 12:39 ` [PATCH net-next v3 1/5] eth: fbnic: add software TX " Vadim Fedorenko
2024-10-04 22:55 ` Jacob Keller
2024-10-04 23:18 ` Jacob Keller
2024-10-07 9:56 ` Vadim Fedorenko
2024-10-07 23:52 ` Jacob Keller
2024-10-03 12:39 ` [PATCH net-next v3 2/5] eth: fbnic: add initial PHC support Vadim Fedorenko
2024-10-04 23:05 ` Jacob Keller
2024-10-07 13:07 ` Vadim Fedorenko
2024-10-07 23:09 ` Jakub Kicinski
2024-10-07 23:49 ` Jacob Keller
2024-10-08 1:16 ` Jakub Kicinski
2024-10-07 23:57 ` Jacob Keller
2024-10-03 12:39 ` [PATCH net-next v3 3/5] eth: fbnic: add RX packets timestamping support Vadim Fedorenko
2024-10-04 23:14 ` Jacob Keller
2024-10-08 16:47 ` Vadim Fedorenko
2024-10-08 17:01 ` Jacob Keller
2024-10-08 17:13 ` Vadim Fedorenko [this message]
2024-10-04 23:18 ` Jacob Keller
2024-10-07 10:26 ` Vadim Fedorenko
2024-10-07 23:51 ` Jacob Keller
2024-10-08 9:58 ` Vadim Fedorenko
2024-10-03 12:39 ` [PATCH net-next v3 4/5] eth: fbnic: add TX " Vadim Fedorenko
2024-10-03 12:39 ` [PATCH net-next v3 5/5] eth: fbnic: add ethtool timestamping statistics Vadim Fedorenko
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=fbf9e403-d21c-4652-a48a-427d9942b82e@linux.dev \
--to=vadim.fedorenko@linux.dev \
--cc=alexanderduyck@fb.com \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=jacob.e.keller@intel.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=richardcochran@gmail.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 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.