[Intel-wired-lan] [PATCH intel-next] ice: Don't put stale timestamps in the skb
Jesse Brandeburg
jesse.brandeburg at intel.com
Sat Nov 13 01:09:05 UTC 2021
On 11/12/2021 5:53 AM, Karol Kolacinski wrote:
> The driver has to check if it does not accidentally put the timestamp in
> the SKB before previous timestamp gets overwritten.
> Timestamp values in the PHY are read only and do not get cleared except
> at hardware reset or when a new timestamp value is captured.
> The cached_tstamp field is used to detect the case where a new timestamp
> has not yet been captured, ensuring that we avoid sending stale
> timestamp data to the stack.
Missing sign off, please run checkpatch --strict and build tests on your
patches before sending to the list.
> ---
> drivers/net/ethernet/intel/ice/ice_ptp.c | 11 ++++-------
> drivers/net/ethernet/intel/ice/ice_ptp.h | 6 ++++++
> 2 files changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
> index 2b3b2060b504..9a1a09661c78 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
> @@ -2069,19 +2069,16 @@ static void ice_ptp_tx_tstamp_work(struct kthread_work *work)
> if (err)
> continue;
>
> - /* Check if the timestamp is valid */
> - if (!(raw_tstamp & ICE_PTP_TS_VALID))
> + /* Check if the timestamp is invalid or stale */
> + if (!(raw_tstamp & ICE_PTP_TS_VALID) ||
> + raw_tstamp == tx->tstamps[idx].cached_tstamp)
> continue;
>
> - /* clear the timestamp register, so that it won't show valid
> - * again when re-used.
> - */
> - ice_clear_phy_tstamp(hw, tx->quad, phy_idx);
> -
> /* The timestamp is valid, so we'll go ahead and clear this
> * index and then send the timestamp up to the stack.
> */
> spin_lock(&tx->lock);
> + tx->tstamps[idx].cached_tstamp = raw_tstamp;
> clear_bit(idx, tx->in_use);
> skb = tx->tstamps[idx].skb;
> tx->tstamps[idx].skb = NULL;
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
> index 92b202ef3c15..eef8ec894871 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.h
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
> @@ -55,15 +55,21 @@ struct ice_perout_channel {
> * struct ice_tx_tstamp - Tracking for a single Tx timestamp
> * @skb: pointer to the SKB for this timestamp request
> * @start: jiffies when the timestamp was first requested
> + * @cached_tstamp: last read timestamp
> *
> * This structure tracks a single timestamp request. The SKB pointer is
> * provided when initiating a request. The start time is used to ensure that
> * we discard old requests that were not fulfilled within a 2 second time
> * window.
> + * Timestamp values in the PHY are read only and do not get cleared except at
> + * hardware reset or when a new timestamp value is captured. The cached_tstamp
> + * field is used to detect the case where a new timestamp has not yet been
> + * captured, ensuring that we avoid sending stale timestamp data to the stack.
> */
> struct ice_tx_tstamp {
> struct sk_buff *skb;
> unsigned long start;
> + u64 cached_tstamp;
> };
>
> /**
>
More information about the Intel-wired-lan
mailing list