From: Jacob Keller <jacob.e.keller@intel.com>
To: Intel Wired LAN <intel-wired-lan@lists.osuosl.org>
Cc: <netdev@vger.kernel.org>,
Maciej Machnikowski <maciej.machnikowski@intel.com>,
Anthony Nguyen <anthony.l.nguyen@intel.com>,
Przemyslaw Korba <przemyslaw.korba@intel.com>,
Grzegorz Nitka <grzegorz.nitka@intel.com>,
Petr Oros <poros@redhat.com>, <alexander.nowlin@intel.com>,
<kevin.bross@intel.com>, <ranjit.cavatur@intel.com>
Subject: Re: [PATCH iwl-net 11/12] ice: skip reading Tx ready bitmap on ports with no timestamps
Date: Mon, 24 Aug 2026 17:24:35 -0700 [thread overview]
Message-ID: <75884c38-209c-476d-9796-50255a200cbf@intel.com> (raw)
In-Reply-To: <20260821-jk-e825c-minimized-fixes-v1-11-9d0731eb4858@intel.com>
On 8/21/2026 5:13 PM, Jacob Keller wrote:
> On E82x devices, the interrupt for Tx timestamps are handled by the clock
> owner. When an interrupt with the Tx timestamp cause is fired, the clock
> owner PF iterates the list of ports and checks for timestamps across all
> ports.
>
> The existing logic reads the PHY timestamp ready bitmap before iterating
> the list of in-use timestamp indexes, even for ports which have no
> timestamps waiting in the software timestamp tracker. This has a
> significant and measurable latency impact on reporting Tx timestamps.
>
> Check the bitmap and exit early in the event that there are no timestamps
> waiting on a port. Observant reviewers may notice that the check is done
> without acquiring the lock. This is fine, as the only thread that can clear
> in_use bits is the miscellaneous interrupt handler. Whether the thread sees
> or fails to see a new outstanding timestamp does not affect correctness,
> only determining whether or not it should do extra work.
>
> Using the ice Tx timestamp traces, with a simple ptp4l setup the average
> latency appears to be around 175 to 200 microseconds with a few outliers
> taking hundreds of microseconds to be reported. With the check to skip
> empty bitmaps (and thus skip reading the ready bitmap for inactive ports),
> the average latency drops ~50 microseconds.
>
> Fixes: d938a8cca88a ("ice: Auxbus devices & driver for E822 TS")
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> ---
> drivers/net/ethernet/intel/ice/ice_ptp.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index 8c2dd83d8d6c..b337247c94e0 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -573,7 +573,7 @@ static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx)
> pf = ptp_port_to_pf(ptp_port);
> hw = &pf->hw;
>
> - if (!tx->init)
> + if (!tx->init || bitmap_empty(tx->in_use, tx->len))
> return;
>
> /* Read the Tx ready status first */
>
Sashiko says:
> This is a pre-existing issue, but could this lockless check of tx->in_use
> result in a use-after-free or NULL pointer dereference during a cross-PF
> teardown?
> In ice_ptp_release_tx_tracker(), a secondary PF undergoing reset sets
> tx->init = 0 and frees tx->in_use:
> drivers/net/ethernet/intel/ice/ice_ptp.c:ice_ptp_release_tx_tracker() {
> tx->init = 0;
> spin_unlock_irqrestore(&tx->lock, flags);
> /* wait for potentially outstanding interrupt to complete */
> synchronize_irq(pf->oicr_irq.virq);
> ...
> bitmap_free(tx->in_use);
> tx->in_use = NULL;
> }
> Since synchronize_irq() only waits on the resetting PF's IRQ, it doesn't
> block the clock owner PF which runs on a different IRQ.
> Can the clock owner PF running ice_ptp_process_tx_tstamp() evaluate
> tx->init as true, get preempted, and then dereference tx->in_use after
> it has been freed by the resetting PF?
I believe this will be fixed by the patch which removes the call to stop
clearing the tracker except on load. I will investigate if we need any
further change as there may be a similar issue with teardown. We might
need to synchronize against the clock owner IRQ for ports using the
INTERRUPT_ALL mode.
> This is also a pre-existing issue, but does adding this early return prevent
> the driver from recovering if a hardware timestamp takes too long to arrive?
> When a timestamp request takes longer than 2 seconds, the software drops it
> and clears its index from tx->in_use:
> drivers/net/ethernet/intel/ice/ice_ptp.c:ice_ptp_process_tx_tstamp() {
> ...
> if (time_is_before_jiffies(tx->tstamps[idx].start + 2 * HZ)) {
> drop_ts = true;
> ...
> skip_ts_read:
> ...
> clear_bit(idx, tx->in_use);
> }
> If the hardware subsequently completes this dropped timestamp, the ready bit
> will assert. However, with tx->in_use now being empty, the early return
> prevents the driver from calling ice_read_phy_tstamp().
> As noted in the driver comments in this same function, failing to read valid
> PHY timestamps can cause the hardware interrupt generation logic to become
> permanently stuck on some devices. Should this path ensure orphaned timestamps
> are still read and cleared from PHY memory?
If hardware somehow holds onto a timestamp for longer than 2 seconds the
logic we have already fails, but we need some cut off. It *is* possible
that a timestamp never happens if it occurs near a link event. We have
no way to be informed by hardware that it won't complete a timestamp. If
we do nothing the more common case of a missed timestamp would lock the
index indefinitely.
The assumption being made here is that 2 seconds is sufficient time to
be certain the hardware will no longer complete the timestamp. I don't
think we can make the software robust in both ways, and have to make
some trade off here.
next prev parent reply other threads:[~2026-08-25 0:24 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-22 0:13 [PATCH iwl-net 00/12] ice: E82x: timestamp processing logic fixes Jacob Keller
2026-08-22 0:13 ` [PATCH iwl-net 01/12] ice: use reference counting and RCU for PTP port access Jacob Keller
2026-08-22 4:11 ` Nowlin, Alexander
2026-08-24 23:36 ` Jacob Keller
2026-08-22 0:13 ` [PATCH iwl-net 02/12] ice: E822: keep Tx timestamps disabled during offset calibration Jacob Keller
2026-08-22 4:13 ` Nowlin, Alexander
2026-08-24 23:39 ` Jacob Keller
2026-08-22 0:13 ` [PATCH iwl-net 03/12] ice: E822: cancel offset verification work during reset preparation Jacob Keller
2026-08-22 4:14 ` Nowlin, Alexander
2026-08-22 0:13 ` [PATCH iwl-net 04/12] ice: call PTP link change only from link events Jacob Keller
2026-08-22 4:15 ` Nowlin, Alexander
2026-08-24 23:48 ` Jacob Keller
2026-08-22 0:13 ` [PATCH iwl-net 05/12] ice: E825: stop clearing PHY_REG_TX_OFFSET_READY Jacob Keller
2026-08-22 4:16 ` Nowlin, Alexander
2026-08-22 0:13 ` [PATCH iwl-net 06/12] ice: E825: clear PHY_REG_TX_MEMORY_STATUS prior to soft reset Jacob Keller
2026-08-22 4:16 ` Nowlin, Alexander
2026-08-24 9:29 ` Loktionov, Aleksandr
2026-08-24 23:51 ` Jacob Keller
2026-08-22 0:13 ` [PATCH iwl-net 07/12] ice: E825: perform a soft reset when starting the PHY timer Jacob Keller
2026-08-22 4:17 ` Nowlin, Alexander
2026-08-24 23:54 ` Jacob Keller
2026-08-22 0:13 ` [PATCH iwl-net 08/12] ice: wait for in-flight Tx timestamps before flushing the tracker Jacob Keller
2026-08-22 4:17 ` Nowlin, Alexander
2026-08-25 0:09 ` Jacob Keller
2026-08-22 0:13 ` [PATCH iwl-net 09/12] ice: keep Tx timestamp slots tracked until completion or timeout Jacob Keller
2026-08-22 4:18 ` Nowlin, Alexander
2026-08-25 0:11 ` Jacob Keller
[not found] ` <20260821-jk-e825c-minimized-fixes-v1-11-9d0731eb4858@intel.com>
2026-08-22 4:19 ` [PATCH iwl-net 11/12] ice: skip reading Tx ready bitmap on ports with no timestamps Nowlin, Alexander
2026-08-25 0:24 ` Jacob Keller [this message]
[not found] ` <20260821-jk-e825c-minimized-fixes-v1-12-9d0731eb4858@intel.com>
2026-08-22 4:20 ` [PATCH iwl-net 12/12] ice: don't clear in_use until HW clears ready bitmap Nowlin, Alexander
2026-08-24 10:09 ` Loktionov, Aleksandr
2026-08-25 0:36 ` Jacob Keller
[not found] ` <20260821-jk-e825c-minimized-fixes-v1-10-9d0731eb4858@intel.com>
2026-08-22 4:19 ` [PATCH iwl-net 10/12] ice: remove unnecessary discarding of timestamps after clock adjust Nowlin, Alexander
2026-08-25 0:17 ` Jacob Keller
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=75884c38-209c-476d-9796-50255a200cbf@intel.com \
--to=jacob.e.keller@intel.com \
--cc=alexander.nowlin@intel.com \
--cc=anthony.l.nguyen@intel.com \
--cc=grzegorz.nitka@intel.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=kevin.bross@intel.com \
--cc=maciej.machnikowski@intel.com \
--cc=netdev@vger.kernel.org \
--cc=poros@redhat.com \
--cc=przemyslaw.korba@intel.com \
--cc=ranjit.cavatur@intel.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